2017-10-03 2 views
2

Ich suche nach einer Bibliothek oder Werkzeugen, die Funktionalität zum Aufbau einer Datenstruktur bieten, mit der ich Variablen- oder Methodendeklarationen finden kann, die in einer Klasse in einem anderen Bereich verwendet werden.Ortungsmethode/Variablendeklaration in Java mit Rascal

Beispielcode:

class A 
{ 
    public void methodA() 
    { 
     B external = new B(); 
     external.methodB(); // I would like to know the name/location where this method is declared. something like: classB.java ... line 3 
    } 
} 

class B 
{ 
    public void methodB() 
    { 

    } 
}` 

Wäre Rascal ein guter Kandidat, diese Art von Informationen abzurufen? Ich habe das Tool schon einmal benutzt. Soweit ich weiß, kann ich eine AST erstellen, aber dies wird nicht genügend Informationen enthalten, um den Geltungsbereich bestimmter Variablen/Methoden zu bestimmen. Wenn dies nicht der richtige Kandidat wäre, irgendwelche Ideen zu Alternativen? Meine Liste der Kandidaten, die ich derzeit untersuche, sind: Antlr/symtab; JavaParser/JavaSymbolSolver; Löffel; Schlingel; JDT

Antwort

0

Ja, es gibt sicherlich mehrere Möglichkeiten herauszufinden, wo etwas deklariert ist.

Die erste Antwort ist die decl Informationen von jedem Knoten im AST wie so abgerufen wird, zum Beispiel:

rascal>myTree.decl 
loc: |java+parameter:///myClass/fac(int)/n| 

Vom Standort Wert, den Sie sehen, dass dies der Parameter n in dem Verfahren fac benannt benannt ist in der Klasse myClass.

Jetzt können Sie den Standort disect die Eltern gehen zu finden, indem die Zugriffsfelder und Funktion für Standorte, wie myTree.decl.path etc, oder Sie können Ihre Informationen weiter in einem M3-Modell, das der AST-Builder kann auch konstruieren finden:

model = createM3FromEclipseProject(|project://myProject); 

Dieses Modell enthält die Beziehungen wie folgt aus: rel[loc, loc] containment, alle hier definiert:

Um die Eltern im Containment Beziehung finden Sie dies versuchen könnten:

model.containment[myTree.decl] 

oder diese für den Reverse-Lookup:

invert(model.containment)[myTree.decl] 

Für Ihre spezielle Frage der rel[loc src, loc name] uses Beziehung Interessant ist auch, welche vollständig qualifizierten Deklarationsnamen dem Quellort zugeordnet werden, und rel[loc name, loc src] declarations, die die qualifizierten Namen auf w abbildet hier werden sie erklärt.

+0

Ich habe deine Antwort in meinem eigenen Beispiel ausprobiert, aber einige Dinge sind mir nicht ganz klar. Was hast du in myTree eingegeben und wie funktioniert myTree.decl? Am nähesten kam ich zu Ihrem Beispiel ist [email protected], wobei unit eine compilationUnit ist, die von createAstsFromEclipseProject kommt Mit diesem konnte ich Model @ containment [unit @ decl] Dies scheint zu dem, was Sie oben beschrieben führen. Können Sie vielleicht erklären, warum Sie den Feldoperator (.) I.s.o. die Anmerkungen, die ich verwende. – Patrick

+0

Ich denke, ich verwende den neuesten Continuous Build und Sie verwenden möglicherweise eine ältere stabile Version. Wir haben das M3-Modell kürzlich von der Verwendung von Annotationen in "Keyword-Felder" umgestellt, daher der Wechsel von "@" zu "." – jurgenv

Verwandte Themen