2010-12-11 6 views
4

Ich programmiere einen AST-Besucher (Eclipse JDT).Wie kann ich in einem AST-Besucher wissen, welche Eigenschaft des Knotens ich besuche?

Ein EnumDeclaration Knoten enthält die folgenden Struktureigenschaften:

JAVADOC, MODIFIERS, NAME, SUPER_INTERFACE_TYPES, ENUM_CONSTANTS und BODY_DECLARATIONS.

Wenn ich einen Kindknoten von EnumDeclaration (ein SimpleName Knoten zum Beispiel) besuche, ist es möglich zu wissen, welche der Listen der Knoten, die ich besuche? Kann man unterscheiden?

Ich möchte einen Knoten unterschiedlich verarbeiten, je nachdem, ob ich ihn in ENUM_CONSTANTS oder BODY_DECLARATIONS gefunden habe.

Antwort

2

fand ich eine Lösung. Explizites Besuchen der Knoten in der Liste (WITH accept(), nicht visit()). So etwas wie (für die Super Schnittstellen zu besuchen):

List<Type> superInterfaces = enumDecNode.superInterfaceTypes(); 
for(Type superInterface: superInterfaces) 
    superInterface.accept(this); 

Beachten Sie, dass es nicht möglich ist, zu verwenden:

this.visit(superInterface); 

weil Type ist ein Dach abstrakte Klasse, für die keine visit(Type node) Implementierung existiert.

Dies erzwingt auch die Kinder der Knoten in der superInterfaces Liste besucht werden, sobald ihre Eltern besucht werden. Problem gelöst.

Wenn Sie bereits alle Kinder eines Knotens über diese Listen bearbeiten, können Sie dem Besucher verbieten, seine Kinder erneut zu besuchen, indem Sie false zurückgeben.

1

Ihre Knoten sollten entsprechende Methoden aufrufen.

MODIFIERS -> visitModifiers 
NAME -> visitNAME 

und so weiter

+0

Aber diese Methoden müssen von mir programmiert werden, nicht wahr? –

+0

@John Assymptoth, wie es im Besuchermuster sein sollte. Zeigen Sie an, wie Sie über EnumDeclaration-Knoten iterieren. –

+0

Danke. Jetzt verstehe ich, was du meintest. Mein Problem war, diese Methoden zu programmieren. –

0

Eine weitere alternative Lösung (dank Markus Keller @ Eclipse JDT Forum):

Use "node.getLocationInParent() == EnumDeclaration.NAME_PROPERTY" oder andere * _PROPERTY Konstanten.

Markus