Quellcode-Repräsentation in Eclipse Seminarvortrag PG Reclipse Jan Rieke Gliederung Motivation Architektur von Eclipse Quelltext-Repräsentation in Eclipse Java-Modell Java DOM/AST Zusätzliche Konzepte Ausblick Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 2 / 28 Motivation Modell des Java- Quelltextes notwendig Konsistenzhaltung bei Änderungen an Modell oder Quelltext; Round Trip Engineering Reverse Engineering Code-Generierung Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 3 / 28 Java Development Tools Eclipse - Kern programmiersprachen - unabhängig JDT ist eine voll funktionsfähige Java- IDE für Eclipse Spezialisiert auf Java - Funktionalität Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 4 / 28 Java Development Tools JDT Core: Infrastruktur für Compiling und Java-Code-Manipulation JDT UI: User Interface für die IDE. JDT Debug: Programmstart & DebugUnterstützung speziell für Java Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 5 / 28 Quelltext-Repräsentation Verschiedene Verfahren zur QuelltextRepräsentation, -Erzeugung oder -Veränderung Hier erläutert: Java-Modell Java DOM/AST Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 6 / 28 Java-Modell Java - Modell von Eclipse ist in der IDE direkt sichtbar IOpenable im Package Explorer Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 7 / 28 Java-Modell Java - Modell von Eclipse ist in der IDE direkt sichtbar: Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 8 / 28 Java-Modell Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 9 / 28 Suche im Java-Modell Rekursive Suche im Java-Modell: IJavaElement element; IJavaElement[] children; if (element instanceof IParent) { IParent parent= (IParent)element; children= parent.getChildren(); } Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 10 / 28 Suche im Java-Modell Rekursive Suche im Java-Modell: if (children[0] instanceof IMethod) { IMethod meth= (IMethod)children[0]; if (meth.getElementName().equals("testMethod") meth.rename(…); } if (children[0] instanceof IType) { IType typ= (IType)children[0]; if (typ.getElementName().equals("testType") typ.createMethod(…); } Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 11 / 28 Zusammenfassung Java-Modell Hohe Abstraktionsebene Auf einzelnen Java-Elementen Operationen (wie Umbenennen, Hinzufügen von Methoden, Variablen etc.) leicht durchführbar Basiert u.a. auf Analyse des Quellcodes Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 12 / 28 Vom Quelltext zum AST Siehe auch Vortrag „Vom Quellcode zum Modell“ (Fabian Christ) vom 16.11.04 Compiler-Techniken anwenden, um vom Quelltext zum Modell zu kommen Kurzwiederholung: Scanner, Parser, Syntaxmodelle (AST) Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 13 / 28 Compiler-Struktur Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 14 / 28 AST in Eclipse TypeDeclaration SimpleName „TestClass“ FieldDeclaration PrimitiveType „int“ SimpleName „member“ public class TestClass { VariableDeclarationFragment private int member = 1; /** NumberLiteral „1“ * Methodenbeschreibung MethodDeclaration */ Javadoc public void method(int parameter) { //body PrimitiveType „void“ } SimpleName „method“ } SingleVariableDeclaration PrimitiveType „int“ SimpleName „par Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 15 / 28 AST-Klassen in Eclipse AST-Elemente erben von ASTNode: Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 16 / 28 AST generieren AST aus existierendem Code: Instanz von ASTParser mit erstellen Sourcecode an ASTParser übergeben AST aus Sourcecode (Zeichenkette) erstellen AST aus Classfile erstellen AST aus Compilation Unit erstellen Der eigentliche AST wird durch createAST() erstellt Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 17 / 28 Code-Manipulation im AST Durchlaufen des AST mittels Visitors TypeDeclaration TypeDeclaration class TypeDeclaration CountingVisitor extends ASTVisitor { SimpleName SimpleName „TestClass“ „TestClass“ int count= 0; FieldDeclaration FieldDeclaration FieldDeclaration public void postVisit(ASTNode node) { PrimitiveType „int“ „int“ PrimitiveType count++; SimpleName „member“ „member“ SimpleName } VariableDeclarationFragment VariableDeclarationFragment public int getCount() { NumberLiteral „1“ „1“ NumberLiteral return count; MethodDeclaration MethodDeclaration MethodDeclaration } Javadoc Javadoc Javadoc PrimitiveType „void“ „void“ } PrimitiveType PrimitiveType „void“ SimpleName„method“ „method“ SimpleName SimpleName „method“ SingleVariableDeclaration SingleVariableDeclaration CompilationUnit cu; PrimitiveType „int“ „int“ PrimitiveType CountingVisitor visitor= new CountingVisitor(); SimpleName „par „par SimpleName cu.accept(visitor); System.out.println(visitor.getCount()); Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 18 / 28 Zusammenfassung AST Geringere Abstraktion als das Java-Modell Bildet kompletten Sourcecode ab Semantische Analyse wahlweise Basiert auf Java-Compiler Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 19 / 28 Zusätzliche Konzepte Working Copies Beobachten von Veränderungen am Quelltext Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 20 / 28 Working Copies Zwei Möglichkeiten Direkte Änderung der Ressource (und damit der Datei) „Working Copy“-Konzept: Arbeitskopie einer CompilationUnit holen Änderungen an der Arbeitskopie vornehmen Optional: Änderungen prüfen Eventuell zurückschreiben Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 21 / 28 Veränderungen beobachten Bei Änderungen am Code muss das Modell angepasst werden Plugin registriert Listener, entweder für Resources oder Java-Elemente Listener empfängt Events, die sog. Deltas enthalten, mit dessen Hilfe die Veränderung nachvollzogen werden kann Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 22 / 28 Observer Pattern Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 23 / 28 Veränderungen beobachten Resource-Delta: Java-Element-Delta ähnlich, nur auf JavaElemente spezialisiert Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 24 / 28 FUJABA-Eclipse-Plugin Aktueller Stand: Plugin verwendet inkrementellen Compiler von FUJABA Möglichkeiten von Eclipse für FUJABA ausnutzen Methoden zur Quelltexterkennung und -manipulation in FUJABA-Plugin integrieren Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 25 / 28 Ausblick PG: Arbeit mit Quelltext und Modellen, eventuell Umstellung von FUJABA auf den Eclipse-AST Verwendung von Triple-GraphGrammatiken Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 26 / 28 Vielen Dank Vielen Dank für die Aufmerksamkeit Noch Fragen? Quellen: Gamma, Beck: Contributing to Eclipse Kastens: Vorlesung Programming Languages and Compilers Eclipse Gamma, etc.: Design Patterns Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 27 / 28 Konkretes Beispiel Vorführung und Erklärung Beispiel-Plugin Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 28 / 28 Suche im Java-Modell Suche über die Such-Funktion der API org.eclipse.jdt.core.search bietet vielfältige Suchmöglichkeiten Einschränkung z.B. auf lokale VariablenDeklarationen, oder über IJavaSearchScope, mit dem man den Suchbereich beschränken kann Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 29 / 28 Veränderungen beobachten public class MyJavaElementChangeReporter implements IElementChangedListener { public void elementChanged(ElementChangedEvent event) { IJavaElementDelta delta= event.getDelta(); if (delta != null) { System.out.println("delta received: "); System.out.print(delta); } } } JavaCore.addElementChangedListener(new MyJavaElementChangeReporter()); Motivation | Architektur | QT-Repräsentation | zus. Konzepte | Ausblick 30 / 28