Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Nyílt fejlesztőrendszerek Az Eclipse Editor framework Nyilas Gergely fóliái.

Hasonló előadás


Az előadások a következő témára: "Nyílt fejlesztőrendszerek Az Eclipse Editor framework Nyilas Gergely fóliái."— Előadás másolata:

1 Nyílt fejlesztőrendszerek Az Eclipse Editor framework Nyilas Gergely fóliái

2 Az editor célja, fogalma „Ablak, amibe szöveget írunk” „Ablak, amibe szöveget írunk” Az információ reprezentálása sokféle lehet Az információ reprezentálása sokféle lehet Dokumentumok, fájlok létrehozása és szerkesztése Dokumentumok, fájlok létrehozása és szerkesztése Különböző adatstruktúrák szabályszerű manipulálása Különböző adatstruktúrák szabályszerű manipulálása Átláthatóság növelése, kényelmi szolgáltatások Átláthatóság növelése, kényelmi szolgáltatások

3 Közös editor minták Eclipse- ben Az editor megnyitása ugyanúgy történik Az editor megnyitása ugyanúgy történik Meghatározott helyük van a Workspace- en Meghatározott helyük van a Workspace- en Saját névvel rendelkeznek Saját névvel rendelkeznek Közös főmenü és toolbar Közös főmenü és toolbar Maximalizálhatóak és minimalizálhatóak Maximalizálhatóak és minimalizálhatóak Explicit save, azaz a felhasználónak kell a műveletet kérnie Explicit save, azaz a felhasználónak kell a műveletet kérnie

4 Egyszerű szövegszerkesztő EMACS,Notepad,vi... EMACS,Notepad,vi... Azonos alapfunkcionalitások: Azonos alapfunkcionalitások: Save/Load Save/Load Copy/Paste Copy/Paste Undo/Redo Undo/Redo Esetleg betűszínek, stílusok Esetleg betűszínek, stílusok Eclipse-ben ezeket a JFace Text valósítja meg, ami az alapértelmezett szövegszerkesztő Eclipse-ben ezeket a JFace Text valósítja meg, ami az alapértelmezett szövegszerkesztő

5 Editor framework alapok Az Eclipse Workbench 3 fő entitása: Az Eclipse Workbench 3 fő entitása: Editors Editors Views Views Perspectives Perspectives

6 Editor framework alapok 2.

7 Editor framework alapok 3. Minden editornak implementálnia kell az org.eclipse.ui.IEditorPart interface-t Minden editornak implementálnia kell az org.eclipse.ui.IEditorPart interface-t A WorkbenchPart-on keresztül részben közös viselkedésminták a View entitásokkal A WorkbenchPart-on keresztül részben közös viselkedésminták a View entitásokkal Sok lényeges különbség! Sok lényeges különbség! Open-Modify-Save paradigma Open-Modify-Save paradigma Editor area Editor area Az editorok tipikusan egy erőforráson dolgoznak Az editorok tipikusan egy erőforráson dolgoznak org.eclipse.ui.IEditorReference – lusta inicializálás org.eclipse.ui.IEditorReference – lusta inicializálás

8 Editorok típusai Szöveges editorok Szöveges editorok Egyszerű szövegszerkesztő (plain text editor) Egyszerű szövegszerkesztő (plain text editor) Forráskód szerkesztő (source editor) Forráskód szerkesztő (source editor) Grafikus editorok Grafikus editorok Az Eclipse-ben lehetőség van ún. multi- page editorok létrehozására is Az Eclipse-ben lehetőség van ún. multi- page editorok létrehozására is A fenti típusok tetszőleges kombinációja A fenti típusok tetszőleges kombinációja Több és többféle editor, egy adatmodell Több és többféle editor, egy adatmodell

9 Egyszerű editor implementálása 1. Plugin-t írunk, ezért első lépésben egy új plugin projectet kell nyitnunk Plugin-t írunk, ezért első lépésben egy új plugin projectet kell nyitnunk Extension point: Extension point: <editor name=“MyEditor” <editor name=“MyEditor” icon=“icons/sample.gif” icon=“icons/sample.gif” extensions=“myfile” extensions=“myfile” contributorClass=“org.eclipse. ui.editors.text.TextEditorActionContributor” contributorClass=“org.eclipse. ui.editors.text.TextEditorActionContributor” class=“hu.bme.mit.test.editor.MyEditor” class=“hu.bme.mit.test.editor.MyEditor” id=“hu.bme.mit.test.editor.MyEditor”> id=“hu.bme.mit.test.editor.MyEditor”>

10 Egyszerű editor implementálása 2. A MyEditor osztály kódja: A MyEditor osztály kódja: public class MyEditor extends TextEditor { { public MyEditor() public MyEditor(){ super(); super(); setDocumentProvider(new MyDocumentProvider()); setDocumentProvider(new MyDocumentProvider()); setSourceViewerConfiguration(new MySourceViewerConfiguration()); setSourceViewerConfiguration(new MySourceViewerConfiguration());}} TextEditor, EditorPart,MultiPageEditorPart,AbstractTextEditor TextEditor, EditorPart,MultiPageEditorPart,AbstractTextEditor A SourceViewerConfiguration-ban a plusz funkciók definiálása történik, a DocumentProvider-ről később lesz szó A SourceViewerConfiguration-ban a plusz funkciók definiálása történik, a DocumentProvider-ről később lesz szó Melyek ezek? Melyek ezek?

11 Source editor 1. Plusz elvárások egy source editorral szemben: Plusz elvárások egy source editorral szemben: A kódolás gyorsítása ún. „okos kiegészítéssel” (Content Assist) A kódolás gyorsítása ún. „okos kiegészítéssel” (Content Assist) A kulcsszavak, szintaktikai elemek, megjegyzések kiemelése eltérő színezéssel (Syntax highlight) A kulcsszavak, szintaktikai elemek, megjegyzések kiemelése eltérő színezéssel (Syntax highlight) A tartalom automatikus formázása (Formatter,Indent) A tartalom automatikus formázása (Formatter,Indent) Az átláthatóság növelése az épp nem releváns kódrészletek elrejthetőségével (Folding) Az átláthatóság növelése az épp nem releváns kódrészletek elrejthetőségével (Folding) A compiler, debugger gyors és kényelmes elérése, azaz a megfelelő action-ok megléte A compiler, debugger gyors és kényelmes elérése, azaz a megfelelő action-ok megléte Szintaktiai és szemantikai hibák jelzése, esetleg javítása is Szintaktiai és szemantikai hibák jelzése, esetleg javítása is Egy adatstruktúra többféle ábrázolása (Outline view) Egy adatstruktúra többféle ábrázolása (Outline view) Tooltipek, plusz információ megjelenítése(Hover) Tooltipek, plusz információ megjelenítése(Hover)

12 Source editor 2.

13 Az MVC architektúra Model-View-Controller Model-View-Controller A source editorok a szolgáltatások nagy részét valamilyen mögöttes adatstruktúra, modell segítségével valósítják meg A source editorok a szolgáltatások nagy részét valamilyen mögöttes adatstruktúra, modell segítségével valósítják meg A modellt nem csak az editor módosíthatja! A modellt nem csak az editor módosíthatja! Egy modellt többféle viewer és editor is használhat, ráadásul egyszerre Egy modellt többféle viewer és editor is használhat, ráadásul egyszerre A konzisztenciát biztosítani kell A konzisztenciát biztosítani kell

14 Model-View-Controller

15 DocumentProvider 1. Szerepe: Szerepe: Létrehozza és felügyeli a dokumentum tartalmát Létrehozza és felügyeli a dokumentum tartalmát Értesíti az egyes editorokat a dokumentum modell változásairól Értesíti az egyes editorokat a dokumentum modell változásairól Létrehozza az ún. annotation modellt a dokumentumhoz, és kezeli a markereket (pl. error, warning, bookmark jelek) Létrehozza az ún. annotation modellt a dokumentumhoz, és kezeli a markereket (pl. error, warning, bookmark jelek) Az annotation model a vertical ruler tartalmáért felelős Az annotation model a vertical ruler tartalmáért felelős

16 DocumentProvider 2. Típusai: Típusai: FileDocumentProvider : file jellegű erőforrások kezelésére FileDocumentProvider : file jellegű erőforrások kezelésére StorageDocumentProvider : stream jellegű erőforrások kezelésére, pl. egy socket StorageDocumentProvider : stream jellegű erőforrások kezelésére, pl. egy socket Általában mindkettőt megvalósítják az editorban, a későbbi esetleges bővítés, újrafelhasználhatóság érdekében Általában mindkettőt megvalósítják az editorban, a későbbi esetleges bővítés, újrafelhasználhatóság érdekében

17 DocumentProvider 3. Egy jellegzetes alap implementáció: Egy jellegzetes alap implementáció: public class MyDocumentProvider extends FileDocumentProvider { protected Idocument createDocument(Object element) throws CoreException { Idocument document = super.createDocument(element); Idocument document = super.createDocument(element); if (document!=null) if (document!=null) { IDocumentPartitioner partitioner = createMyPartitioner(); IDocumentPartitioner partitioner = createMyPartitioner();partitioner.connect(document); document.setDocumentPartitioner(partitioner); document.setDocumentPartitioner(partitioner); }}} Itt található még az annotationmodel testreszabásának kódja is Itt található még az annotationmodel testreszabásának kódja is Partíciók, általános dokumentumszerkezet Partíciók, általános dokumentumszerkezet

18 Dokumentum tulajdonságok Dokumentum tulajdonságok A dokumentumok legtöbbször rendelkeznek valamilyen belső struktúrával, azaz azonosíthatóak bennük különböző szemantikájú részek A dokumentumok legtöbbször rendelkeznek valamilyen belső struktúrával, azaz azonosíthatóak bennük különböző szemantikájú részek Egy szöveges dokumentumnak lehet címe, paragrafusai, lábjegyzete, stb. Egy szöveges dokumentumnak lehet címe, paragrafusai, lábjegyzete, stb. Egy forráskódnak lehet kód, megjegyzés, preprocesszor instrukciók, idegen kód része Egy forráskódnak lehet kód, megjegyzés, preprocesszor instrukciók, idegen kód része Ezen eltérő szemantikájú részek a partíciók Ezen eltérő szemantikájú részek a partíciók Azonosításuk alapvető feltétele az egyes formatterek és a content assist megfelelő működésének Azonosításuk alapvető feltétele az egyes formatterek és a content assist megfelelő működésének

19 A Document osztály Definiálja a szövegmodellt Definiálja a szövegmodellt Tartalommódosító eljárások gyűjteménye Tartalommódosító eljárások gyűjteménye Replace,remove,insert,set... Replace,remove,insert,set... Pozíciók,sorok nyilvántartása Pozíciók,sorok nyilvántartása Partícionálás támogatása Partícionálás támogatása Keresés Keresés Változások kezelése Változások kezelése addDocumentListener,addDocumentPartitioningListe nr addDocumentListener,addDocumentPartitioningListe nr

20 DocumentPartitioner Az Eclipse-ben a dokumentumokat DocumentPartitioner objektumok osztják partíciókra, előzetesen megadott szabályok alapján Az Eclipse-ben a dokumentumokat DocumentPartitioner objektumok osztják partíciókra, előzetesen megadott szabályok alapján A particionálót a DocumentProvider-ben hoztuk létre (createMyPartitioner() metódus) A particionálót a DocumentProvider-ben hoztuk létre (createMyPartitioner() metódus) A partícionálónak a szabályokat egy PartitionScanner létrehozásával és konfigurálásával lehet megadni A partícionálónak a szabályokat egy PartitionScanner létrehozásával és konfigurálásával lehet megadni A partícionáló minden egyes dokumentummódosításnál lefut, és módosítja a partíciók határait ha kell A partícionáló minden egyes dokumentummódosításnál lefut, és módosítja a partíciók határait ha kell

21 PartitionScanner 1. Tokenek sorozatával tér vissza Tokenek sorozatával tér vissza A tokenek az egyes partíciókat reprezentálják A tokenek az egyes partíciókat reprezentálják Működését szabályok, ún. rule-ok vezérlik Működését szabályok, ún. rule-ok vezérlik Az Eclipse-ben sokféle beépített rule van, pl: Az Eclipse-ben sokféle beépített rule van, pl: SingleLineRule SingleLineRule MultiLineRule MultiLineRule EndOfLineRule EndOfLineRule NumberRule NumberRule Természetesen saját szabályokat is lehet gyártani Természetesen saját szabályokat is lehet gyártani

22 PartitionScanner 2. Példa SQL forrás partícionálására: Példa SQL forrás partícionálására: public class SQLPartitionScanner extends RuleBasedPartitionScanner { public final static String SQL_COMMENT = “sql_comment”; public SQLPartitionScanner() { super(); super(); IToken comment = new Token(SQL_COMMENT); IToken comment = new Token(SQL_COMMENT); List rules = new ArrayList(); List rules = new ArrayList(); rules.add(new MultiLineRule(“/*”,”*/”,comment)); rules.add(new MultiLineRule(“/*”,”*/”,comment)); rules.add(new SingleLineRule(“’”,”’”,Token.UNDEFINED,’\\’)); rules.add(new SingleLineRule(“’”,”’”,Token.UNDEFINED,’\\’));...... IPredicateRule[] result = new IPredicateRule[rules.size()]; IPredicateRule[] result = new IPredicateRule[rules.size()]; rules.toArray(result); rules.toArray(result); setPredicateRules(result); setPredicateRules(result);}}

23 EditorActionContributor 1. A TextEditorActionContributor leszármazottja A TextEditorActionContributor leszármazottja Az editor extension pont megadásakor adtuk meg az osztály nevét, amely megvalósítja Az editor extension pont megadásakor adtuk meg az osztály nevét, amely megvalósítja Segítségével létrehozhatunk saját menüt, vagy lézető menük új menüpontjait az editorunknak Segítségével létrehozhatunk saját menüt, vagy lézető menük új menüpontjait az editorunknak A leggyakoribb action-ok: A leggyakoribb action-ok: Content Assist (CRTL+SPACE) Content Assist (CRTL+SPACE) Content Format Content Format Content Assist Tip Content Assist Tip

24 EditorActionContributor 2. Példa implementáció: Példa implementáció: public class MyEditorContributor extends TextEditorActionContributor { protected RetargetTextEditorAction fContentAssistProposal; public MyEditorContributor() {super(); fContentAssistProposal = new RetargerTextEditorAction (“Content Assist”); } public void init(IActionBars bars) {super.init(bars); IMenuManager menuManager = bars.getMenuManager(); IMenuManager editMenu = menuManager. findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);editMenu.add(fContantAssistProposal);}... // setActiveEditor!!! }

25 EditorActionContributor 3. A MyEditorContributor implementálása után még felül kell írni a TextEditor createActions() metódusát a MyEditor osztályban A MyEditorContributor implementálása után még felül kell írni a TextEditor createActions() metódusát a MyEditor osztályban Ezzel az editor regisztrál egy handler-t a contributor-ban megadott műveletekhez Ezzel az editor regisztrál egy handler-t a contributor-ban megadott műveletekhez A kiválasztott műveletet mindig az aktív editorpéldány hajtja végre A kiválasztott műveletet mindig az aktív editorpéldány hajtja végre

26 SourceViewerConfiguration 1. Az editor plusz szolgáltatásainak regisztrációja Az editor plusz szolgáltatásainak regisztrációja Content Assistant létrehozása Content Assistant létrehozása Completion Processor-ok megadása Completion Processor-ok megadása DoubleClickStrategy megadása DoubleClickStrategy megadása PresentationReconciler beállítása PresentationReconciler beállítása Reconciler beállítása Reconciler beállítása SourceViewer beállítása (Folding) SourceViewer beállítása (Folding)

27 SourceViewerConfiguration 2.

28 Content Assist 1. Egy prefix alapján az adott kontextusban lehetséges karaktersorozatok Egy prefix alapján az adott kontextusban lehetséges karaktersorozatok összegyűjtése összegyűjtése rendezése rendezése felajánlása felajánlása Partíciótípusonként eltérő lehet Partíciótípusonként eltérő lehet „Buta” megvalósítása egyszerű „Buta” megvalósítása egyszerű “Okos” megvalósítása bonyolultabb “Okos” megvalósítása bonyolultabb

29 Content Assist 2.

30 Content Assist 3. Megvalósítási lépések: Megvalósítási lépések: A SourceViewerConfiguration getContentAssistant() metódusának felülírása A SourceViewerConfiguration getContentAssistant() metódusának felülírása ContentAssistant objektum létrehozása ContentAssistant objektum létrehozása Partícionálás hozzárendelése Partícionálás hozzárendelése Az egyes partíciótípusokhoz CompletionProcessorok hozzárendelése Az egyes partíciótípusokhoz CompletionProcessorok hozzárendelése A megjelenő ablak tulajdonságainak beállítása A megjelenő ablak tulajdonságainak beállítása

31 CompletionProcessor 1. A Content Assistant „lelke” A Content Assistant „lelke” Fő funkciói Fő funkciói A jelöltek (proposals) meghatározása A jelöltek (proposals) meghatározása A jelöltek sorbarendezése A jelöltek sorbarendezése A jelöltek szűrése A jelöltek szűrése A jelöltek visszaadása A jelöltek visszaadása Az IContentAssistProcessor interface-t implementálja Az IContentAssistProcessor interface-t implementálja

32 CompletionProcessor 2. „Buta” Content Assist: „Buta” Content Assist: Adott az összes lehetséges kulcsszó Adott az összes lehetséges kulcsszó A kapott prefix alapján szelektál A kapott prefix alapján szelektál A találatokat rendezi és visszaadja A találatokat rendezi és visszaadja Előnyei: Előnyei: Egyszerű implementálni Egyszerű implementálni Gyors Gyors Hátrányai: Hátrányai: Csak az előre megadott kulcsszavakat tudja Csak az előre megadott kulcsszavakat tudja Nem veszi figyelembe az aktuális kontextust Nem veszi figyelembe az aktuális kontextust Már egy kevésbé bonyolult nyelvnél is elégtelen Már egy kevésbé bonyolult nyelvnél is elégtelen

33 CompletionProcessor 3. Implementálása: Implementálása: public class MyCompletionProcessor implements IContentAssistProcessor { protected final static String[] proposals = { “keyword1”,”keyword2”,”keyword3”,...}; public ICompletionProposal[] computeCompletionProposal (ITextViewer viewer,int documentOffset) { WordPartDetector wordPart = new WordPartDetector(viewer,documentOffset); WordPartDetector wordPart = new WordPartDetector(viewer,documentOffset); for (int i=0;i<proposals.length();i++) for (int i=0;i<proposals.length();i++) { if (proposals[i].startsWith(wordPart.getString())) if (proposals[i].startsWith(wordPart.getString()))proposalList.add(proposals[i]); } return proposalList; return proposalList;}}

34 CompletionProcessor 4. „Okos” Content Assist kellékei: „Okos” Content Assist kellékei: Az összes lehetséges kulcsszó Az összes lehetséges kulcsszó Egy speciális parser extra funkciókkal Egy speciális parser extra funkciókkal A parser által épített AST(Abstract Syntax Tree) A parser által épített AST(Abstract Syntax Tree) Megfelelő AST bejáró mechanizmus Megfelelő AST bejáró mechanizmus Kibővített AST megfelelő scope információval Kibővített AST megfelelő scope információval Egyéb lehetséges jelöltek más forrásból (pl. VIATRA ModelSpace entitások) Egyéb lehetséges jelöltek más forrásból (pl. VIATRA ModelSpace entitások)

35 CompletionProcessor 5. Előnyei: Előnyei: Intelligens Intelligens Megfelelően implementálva flexibilis és bővíthető Megfelelően implementálva flexibilis és bővíthető Komplex programozási nyelvekhez is jó Komplex programozási nyelvekhez is jó Hátrányai: Hátrányai: Átgondolt tervezést igényel(parser és AST) Átgondolt tervezést igényel(parser és AST) Rosszul implementálva lassú lehet Rosszul implementálva lassú lehet

36 CompletionProcessor 6. Egy bevált tervezési minta: Egy bevált tervezési minta:

37 Syntax highlighting 1. Syntax-Based Color Highlighting Syntax-Based Color Highlighting A szöveg bizonyos részei színekkel kiemelve A szöveg bizonyos részei színekkel kiemelve Melyek ezek a részek? Melyek ezek a részek? Content Assist Content Assist Változó dokumentum, változó színezés Változó dokumentum, változó színezés Damager,Repairer Damager,Repairer

38 Syntax Highlighting 2.

39 Syntax Highlighting 3. A megvalósítás lépései: A megvalósítás lépései: WordDetector, WhiteSpaceDetector megírása WordDetector, WhiteSpaceDetector megírása Kódscannerek implementálása Kódscannerek implementálása getPresentationReconciler() metódus felülírása getPresentationReconciler() metódus felülírása DefaultDamagerRepairer beállítása a kívánt partíciókra a megfelelő scannerekkel paraméterezve DefaultDamagerRepairer beállítása a kívánt partíciókra a megfelelő scannerekkel paraméterezve Minden partíciótípushoz külön megadható Damager és Repairer Minden partíciótípushoz külön megadható Damager és Repairer

40 Syntax Highlighting 4. WordDetector: WordDetector: public class MyWordDetector implements IWordDetector { public boolean isWordPart(char c) { return Character.isJavaIdentifierPart(c); } public boolean isWordStart(char c) { return Character.isJavaIdentifierStart(c); }} WhiteSpaceDetectornál isWhiteSpace(c) WhiteSpaceDetectornál isWhiteSpace(c)

41 Syntax Highlighting 5. Kódscanner: Kódscanner: Ugyanúgy rule-ok vezérlik mint a PartitionScannert Ugyanúgy rule-ok vezérlik mint a PartitionScannert Érdemes egy ColorProvider-t is implementálni Érdemes egy ColorProvider-t is implementálni Minden különböző típushoz különböző szín és token Minden különböző típushoz különböző szín és token Beépített rule-ok Beépített rule-ok WhiteSpace WhiteSpace Number Number Vowel Vowel Keyword Keyword

42 Syntax Highlighting 6. MyCodeScanner: MyCodeScanner: public MyCodeScanner() { ColorProvider provider = MyPlugin.getDefault().getColorProvider(); IToken keyword = new Token(new TextAttribute (provider.getColor(ColorProvider.KEYWORD),SWT.BOLD)); List rules = new ArrayList(); rules.add(new SingleLineRule(...)); WordRule wordRule = new WordRule(new MyWordDetector(),other); //Token for(int i=0;i<keywords.length;i++) {wordRule.addWord(keywords[i],keyword);}rules.add(wordRule);...}

43 Syntax Highlighting 7. A getPresentationReconciler() felülírása: A getPresentationReconciler() felülírása: public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { PresentationReconciler reconciler = new PresentationReconciler(); DefaultDamagerRepairer dr = new DefaultDamagerRepairer(MyEditor.getMyCodeScanner()); reconciler.setDamager(dr,IDocument.DEFAULT_CONTENT_TYPE);reconciler.setRepairer(dr,IDocument.DEFAULT_CONTENT_TYPE);… return reconciler }

44 Content Formatting 1. Szövegrészek automatikus formázása Szövegrészek automatikus formázása Partíciótípusonként külön megadható Partíciótípusonként külön megadható Stratégiákat kell megadnunk Stratégiákat kell megadnunk

45 Content Formatting 2. MyFormattingStrategy MyFormattingStrategy public String format(String content,boolean isLineStart,String indentation) { return keyWordsToUpper(content); } getContentFormatter() felülírása getContentFormatter() felülírása public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) { ContentFormatter formatter = new ContentFormatter(); IFormattingStrategy keyword = new MyWordStrategy(); formatter.setFormattingStrategy(keyword,Idocument.DEFAULT_CONTENT_TYPE)}

46 Outline 1. Biztosítja a jobb átláthatóságot Biztosítja a jobb átláthatóságot Egyfajta „kivonat” Egyfajta „kivonat” Egy view, a TreeViewer-en alapul Egy view, a TreeViewer-en alapul Saját action-okat definiálhatunk hozzá Saját action-okat definiálhatunk hozzá Sorting, Show/Don’t show Sorting, Show/Don’t show Az adatok forrása általában a source modell, de van más megoldás is Az adatok forrása általában a source modell, de van más megoldás is Szoros együttműködés az editorral Szoros együttműködés az editorral

47 Outline 2.

48 Resource markerek 1. Speciális információk a szerkesztett forrással kapcsolatban Speciális információk a szerkesztett forrással kapcsolatban Erőforráshoz rendelhetőek Erőforráshoz rendelhetőek IMarker marker = file.createMarker(IMarker.TASK) IMarker marker = file.createMarker(IMarker.TASK) Workspace root-hoz is rendelhető marker Workspace root-hoz is rendelhető marker Alaptípusai: Alaptípusai: Task Task Bookmark Bookmark Problem Problem

49 Resource markerek 2.

50 Resource markerek 3. Markerek használata source editorok esetén: Markerek használata source editorok esetén: Milyen markerek szükségesek? Milyen markerek szükségesek? Task Task Warning Warning Error Error Hol és hogyan szeretnénk jelezni? Hol és hogyan szeretnénk jelezni? Szöveg aláhúzása Szöveg aláhúzása Ikon a vertical ruler-en Ikon a vertical ruler-en Problem view Problem view Markerek forrása és életciklusa : nem triviális feladat Markerek forrása és életciklusa : nem triviális feladat

51 Resource markerek 4. Markerek forrása: Markerek forrása: A source modell és a parser együttműködésével A source modell és a parser együttműködésével Probléma gyűjtő és jelentő mechanizmus Probléma gyűjtő és jelentő mechanizmus Speciális parser kell error-recovery mechanizmussal Speciális parser kell error-recovery mechanizmussal Egyértelmű source-offset - modelelement megfeleltetés Egyértelmű source-offset - modelelement megfeleltetés Markerek életciklusa Markerek életciklusa Mikor frissítsük? Mikor frissítsük? Reconciler Reconciler Builder Builder

52 A source modell 1. Az adott dokumentum mögöttes modellje Az adott dokumentum mögöttes modellje Metainformációk a forráskód által leírt entitásokról Metainformációk a forráskód által leírt entitásokról Tartalmaznia kell az egyes entitások Tartalmaznia kell az egyes entitások Nevét Nevét A forráskódbeli reprezentáció (karaktersorozat) kezdetét és végét A forráskódbeli reprezentáció (karaktersorozat) kezdetét és végét Attribútumait Attribútumait Típusát Típusát Referenciát a szülő entitásra Referenciát a szülő entitásra Referenciát az összes gyermek entitásra Referenciát az összes gyermek entitásra Egyéb szükséges információkat Egyéb szükséges információkat Minden pillanatban komzisztensnek kell lennie Minden pillanatban komzisztensnek kell lennie

53 A source modell 2.

54 A source modell 3.

55 A source modell 4. A parser építi, ám az építésnél körültekintően kell eljárni A parser építi, ám az építésnél körültekintően kell eljárni Mikor építsük? Mikor építsük? Az egészet, vagy csak egy részét? Az egészet, vagy csak egy részét? Az egész modell újraépítése minden alkalommal Az egész modell újraépítése minden alkalommal Előnyei: Előnyei: A legegyszerűbb módszer A legegyszerűbb módszer Nem igényel újabb parser üzemmódot Nem igényel újabb parser üzemmódot Egyszerűbb model builder Egyszerűbb model builder Hátrányai: Hátrányai: Nem túl elegáns Nem túl elegáns Nagy modellnél nagyon lassú lehet Nagy modellnél nagyon lassú lehet

56 A source modell 5. Meglévő modell karbantartása Meglévő modell karbantartása Előnyei: Előnyei: Gyors és elegáns Gyors és elegáns Komplex modellnél is használható Komplex modellnél is használható Hátrányai: Hátrányai: Új parser üzemmódot igényel (SELECTION_PARSE) Új parser üzemmódot igényel (SELECTION_PARSE) A model builder bonyolult A model builder bonyolult Egy Java bonyolultságú nyelvnél már csak ez jöhet szóba Egy Java bonyolultságú nyelvnél már csak ez jöhet szóba Cache mechanizmus erősen ajánlott Cache mechanizmus erősen ajánlott

57 Parserek 1. A fejlesztői környezet „agya” A fejlesztői környezet „agya” Speciális parserre van szükség Speciális parserre van szükség Content Assist Content Assist Outline vezérlés Outline vezérlés Hibakezelés, gyűjtés, jelentés Hibakezelés, gyűjtés, jelentés Fordítás Fordítás Modellépítés Modellépítés Mindezt figyelembe véve kell megvalósítani Mindezt figyelembe véve kell megvalósítani Nagy tapasztalat szükséges! Nagy tapasztalat szükséges!

58 Parserek 2. Megvalósítási lehetőségek: Megvalósítási lehetőségek: Kódolás előzetes tervezés alapján Kódolás előzetes tervezés alapján Nagy gyakorlat, tapasztalat szükséges Nagy gyakorlat, tapasztalat szükséges Csak az adott nyelvre működik Csak az adott nyelvre működik Parser generátor használata Parser generátor használata Csak a nyelvtant kell megírni Csak a nyelvtant kell megírni Automatikus parser generálás Automatikus parser generálás JavaCC,ANTLR,CUP,Yacc... JavaCC,ANTLR,CUP,Yacc... Önmagában ez NEM ELÉG! Önmagában ez NEM ELÉG!

59 Parserek 3. Problémák a parser generátorokkal Problémák a parser generátorokkal A generált parser nem támogatja a A generált parser nem támogatja a Content Assist-ot Content Assist-ot Hibakezelő mechanizmusokat Hibakezelő mechanizmusokat Outline vezérlő módot Outline vezérlő módot Megfelelő modell építését Megfelelő modell építését Modell módosítását Modell módosítását Mindezeket utólag kell beleépítenünk! Mindezeket utólag kell beleépítenünk! Design pattern a beépítendő funkciókra? Design pattern a beépítendő funkciókra? Gyorsaság? Gyorsaság?

60 Inside CDT C Development Tools C Development Tools A JDT-vel egyenértékű C/C++ fejlesztői környezet A JDT-vel egyenértékű C/C++ fejlesztői környezet Számos mechanizmust átvett a JDT-től Számos mechanizmust átvett a JDT-től Ennek megfelelően nagyon jól kihasználja az Eclipse által nyújtott lehetőségeket Ennek megfelelően nagyon jól kihasználja az Eclipse által nyújtott lehetőségeket

61 CDT Adatmodell 1. A modell gyökere a Workspace Root A modell gyökere a Workspace Root A Resource Model bővítése és testreszabása A Resource Model bővítése és testreszabása Bővítés: Bővítés: Class declaration Class declaration Method declaration Method declaration Member declaration Member declaration A Resource delta mechanizmust is kibővíti A Resource delta mechanizmust is kibővíti

62 CDT Adatmodell 2. A bővítések által lehetővé válik a source modell karbantartása A bővítések által lehetővé válik a source modell karbantartása Kiterjesztett Resource Delta Kiterjesztett Resource Delta A változás jól behatárolható A változás jól behatárolható A parser csak a megváltozott részt nézi meg A parser csak a megváltozott részt nézi meg ModelBuilder ModelBuilder

63 CDT C/C++ Parser 1. A C/C++ Parser módjai: A C/C++ Parser módjai: FULL_PARSE FULL_PARSE COMPLETION_PARSE COMPLETION_PARSE QUICK_PARSE QUICK_PARSE SELECTION_PARSE SELECTION_PARSE A jelenlegi verzió gyors és kifinomult, fejlett hibakezelő funkciókkal A jelenlegi verzió gyors és kifinomult, fejlett hibakezelő funkciókkal Az általa kínált interface azonban feleslegesen bonyolult Az általa kínált interface azonban feleslegesen bonyolult

64 CDT C/C++ Parser 2. FULL_PARSE FULL_PARSE A teljes, részletes AST előállítása A teljes, részletes AST előállítása Fordításhoz Fordításhoz COMPLETION_PARSE COMPLETION_PARSE Content Assist Content Assist Parse megadott offsetig Parse megadott offsetig Információk gyűjtése és visszaadása Információk gyűjtése és visszaadása CompletionNode CompletionNode

65 CDT C/C++ Parser 3. QUICK_PARSE QUICK_PARSE Az outline view vezérlésére használható Az outline view vezérlésére használható Csak adott mélységig dolgozza fel a forrást Csak adott mélységig dolgozza fel a forrást SELECTION_PARSE SELECTION_PARSE Megadott intervallumot dolgoz fel Megadott intervallumot dolgoz fel A source model karbantartására használható A source model karbantartására használható A futás eredménye AST csomópontok listája A futás eredménye AST csomópontok listája Ezeket a Model Builder dolgozza fel Ezeket a Model Builder dolgozza fel

66 Irodalom: EScript forráskód EScript forráskód CDT/JDT forráskód CDT/JDT forráskód JavaCC FAQ JavaCC FAQ Addison-Wesley : Building Commercial Quality Eclipse Plugins, 2004 Addison-Wesley : Building Commercial Quality Eclipse Plugins, 2004 Addison-Wesley : Official Eclipse 3.0 FAQ Addison-Wesley : Official Eclipse 3.0 FAQ The Java Developers Guide To Eclipse The Java Developers Guide To Eclipse

67 Vége Nyilas Gergely Sándor nyilg@freemail.hu


Letölteni ppt "Nyílt fejlesztőrendszerek Az Eclipse Editor framework Nyilas Gergely fóliái."

Hasonló előadás


Google Hirdetések