Quellcode-Repräsentation in Eclipse

Werbung
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
Herunterladen