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