# Methodenverwendung in Quelltext oder Class-Objekt suchen?



## Novanic (3. Aug 2007)

Hi Leute,

ich habe ein recht spezielles Problem. Und zwar habe ich einen Quelltext oder auch ein Class-Objekt und möchte nach einer Methodenverwendung suchen.

Beispiel - Quelltext:

```
public class Test
{

  public String getFirstSign(String aString) {
    return aString.substring(0, 1);
  }

}
```
Und nun möchte ich prüfen, ob die Methode "substring" der Klasse String in dem Quelltext verwendet wird.

Selber einen Algorithmus zu schreiben, wäre wohl viel zu komplex. Gibt es vielleicht eine API/Framework mit der man einen Quelltext auf soetwas untersuchen kann? Die ganzen IDEs machen sowas ja auch.

Danke schonmal. 

Gruß Nova[/code]


----------



## Wildcard (3. Aug 2007)

Dafür brauchst du ein AST Modell der zu durchsuchenden Klassen.
Ein Eclipse PlugIn zu schreiben dürfte die einfachste Alternative darstellen.


----------



## Novanic (3. Aug 2007)

Hm, ja, ne, von eclipse würde ich ganz gerne unabhängig bleiben.

Gibt es denn ein gutes AST-Framework für Java mit dem ich mein Ziel relativ simpel lösen kann? (Opensource)

Danke für die Hilfe.

Gruß Nova


----------



## Wildcard (3. Aug 2007)

Java Grammatik für ANTLR
http://www.antlr.org/grammar/1152141644268/Java.g


----------



## Guest (3. Aug 2007)

mmh täusche ich mich da oder machen es die ide's mit reflection ???? 


was in deinem fall ja nicht möglich ist, weil du alle methoden kennen must, schade!


----------



## Wildcard (3. Aug 2007)

Du täuschst dich
http://www-128.ibm.com/developerworks/opensource/library/os-ast/


----------



## Guest (3. Aug 2007)

hehe ja gut eclipse fährt ja sowieso immer eine sonderschiene, wahrscheinlich wird dafür auch wieder irgendeine native bibliothek verwendet genau wie bei swt.... 

nei im ernst: das sieht echt cool aus, muss ich mir auch mal reinziehen


----------



## Marco13 (4. Aug 2007)

Ähm  ???:L  beim JBuilder macht man da auf das "substring" einen Rechtsklick, wählt im Menü "Find references", und bekommt dann aufgelistet, wo die Methode aufgerufen wird - das muss es doch bei Eclipse auch geben  ???:L


----------



## HoaX (4. Aug 2007)

in eclipse bei standardeinstellung tuts strg+shift+g, der vollständigkeit halber


----------



## Wildcard (4. Aug 2007)

Marco13 hat gesagt.:
			
		

> Ähm  ???:L  beim JBuilder macht man da auf das "substring" einen Rechtsklick, wählt im Menü "Find references", und bekommt dann aufgelistet, wo die Methode aufgerufen wird - das muss es doch bei Eclipse auch geben  ???:L


In Eclipse JDT ist es Rechtsklick -> search for References in Workspace.
Das JBuilder nur ein Eclipse PlugIn ist weißt du aber, oder?  ???:L


----------



## Marco13 (4. Aug 2007)

Nur der neueste, 2007er. Davor war das AFAIK aber schon eine eigenständige IDE von Borland. (Und eine IMHO sehr gute, nur mal nebenbei gesagt)


----------



## Wildcard (4. Aug 2007)

Ja, davor war's eigenständig.
Hab ihn nie selbst versucht, wüsste aber auch nicht weshalb, denn IntelliJ ist billiger und laut Umfragen auch besser....


----------



## Novanic (4. Aug 2007)

Ja, IntelliJ ist super und mächtig. 

Also mir erscheint das mit dem AST alles zu oversized. Die Lösung sollte auch sehr performant sein. Und es geht wirklich "nur" darum zu prüfen ob in einem Quelltext eine bestimmte Methode verwendet wird (nur in einer Datei soll gesucht werden).
Aber einen zuverlässigen Algoritmus selbst zu schreiben fällt mir jetzt auch nicht gerade super leicht. Hat sowas nicht schonmal jemand gemacht? 

Danke schonmal.

Gruß Nova


----------



## Wildcard (4. Aug 2007)

Bist du der Meinung mit einem RegEx eine 100%ige Trefferquote erzielen zu können?
Wohl eher nicht.
Wie macht man's stattdessen?
Richtig, mit einem AST  :roll:


----------



## Novanic (6. Aug 2007)

Also ich komm einfach nicht weiter.

Ich hab mich jetzt mit zwei Frameworks beschäftigt: "antlr" und "javacc".
Beide funktionieren nicht.
Für javacc hab ich kein jjt-File (JJTree) gefunden, sodass nur eine Parser generiert werden kann was mir aber reichlich wenig bringt, da der Parser dank final-Methoden nicht erweitert werden kann (AST wird dadurch auch nicht gebaut).
Und für antlr soll es angeblich eine Option geben "buildAST", damit die Klassen für AST generiert werden, die ist aber in der Java-Grammar-File nicht aktiviert und wenn ich sie aktivieren, fliegt mir der Compiler mit "illegal option buildAST" um die Ohren. Dann hab ich noch Beispiele gefunden, bei denen eine Klasse angegeben wurde, aber das nimmt der antlr-Compiler auch nicht an.

Also die beiden Teile können mich in keinsterweise überzeugen. Ich habe es nur geschafft die Parser-Klassen zu generieren, aber von einem AST ist bei Weitem nichts in Sicht und nach mindestens 2 Tagen recherche rumprobieren, verlier ich auch langsam die lust und gedult mit den Frameworks...

Habt ihr noch andere Frameworks oder Ideen wie ich an meine Problemlösung komme oder hat jemand eine Java-Grammar-File mit der ihr es geschafft habt einen AST/AST-Parser zu generieren?

Danke schonmal.

Gruß Nova


----------

