[Java] Ist es möglich, die Code-Indizierungsfunktionen von Eclipse zu entkoppeln?


Answers

Die Operation, nach der Sie suchen, indexiert nicht genau. Die Indizierung erfolgt, um eine Volltextsuche zu ermöglichen. Das Auffinden der Superklasse einer gegebenen Klasse ist kaum Textsuche.

Sie möchten ein Eclipse-Plugin schreiben (ziemlich einfach, vielleicht nur ein paar Klassen), das JDT verwendet. Sie müssen einen AST-Besucher (Abstract Syntax Tree) schreiben, der zur Analyse Ihres Codes verwendet wird. Sie können dann Typen auflösen und die Klassenhierarchie mithilfe der JDT-Funktionen problemlos durchlaufen.

Überprüfen Sie meine Antwort auf diese Frage .

Question

Ich suche einen statischen Analysator für eine Universitätsklasse zu schreiben. Um mehr Leistung für das Werkzeug zu haben, möchte ich in der Lage sein, die Aufrufhierarchie nachzuschlagen (wie es Strg + Alt + H in Eclipse tut). Dies müsste auch eine schnelle Operation sein, so dass die Suche wahrscheinlich gegen einen Index anstelle eines Bytecode-Scans durchgeführt werden müsste.

Ein Eclipse-Plugin zu schreiben wäre jedoch zu ehrgeizig, denke ich. Stattdessen würde ich eher die Teile von Eclipse entkoppeln, die den Code-Index erzeugen, und eine Bibliothek verwenden, um Nachschlagevorgänge durchzuführen. Die Schnittstelle zu dem Benutzer wäre in der Befehlszeile, um die Implementierung zu vereinfachen.

Ich habe gelesen, dass Eclipse Lucene für die Indizierung verwendet [1], aber es muss eine erhebliche Menge an Arbeit über Lucene für die Fähigkeiten, die Eclipse ermöglicht, sein.

Die Frage ist, ist es möglich, die Indizierungsfunktionen von Eclipse zur Wiederverwendung zu entkoppeln? Wenn nicht, gibt es andere, leicht verfügbare Bibliotheken, die die Art von Verarbeitung durchführen könnten, die ich besprochen habe?

[1] Lucene in Aktion (IIRC)

BEARBEITEN

Ich denke, es gab einige Missverständnisse. Ich möchte die Klassenhierarchie nicht untersuchen, ich möchte die Aufrufhierarchie überprüfen. Deshalb kommt das Suchen und Indizieren (irgendwie, obwohl das vielleicht nicht der richtige Begriff ist) in die Diskussion. Die Überprüfung der Klassenhierarchie ist wahrscheinlich wesentlich kostengünstiger als die Überprüfung der Aufrufhierarchie.

Was das Schreiben eines Eclipse-Plugins angeht, ja, ich würde es gerne tun, aber da diese Aufgabe nur sehr kurz ist, ist es wahrscheinlich unwahrscheinlich, dass ich es schaffen werde. Aber es ist eine nützliche Information, dass einige von euch das Gefühl haben, dass das nicht so schwierig ist, wie ich es für möglich halte.

Vielleicht habe ich zu viel Gewicht auf Eclipse gelegt, es ist mir eingefallen, dass ich wirklich nach einem Tool suche, das eine API zur Überprüfung eines Aufrufgraphen durch den Bytecode bereitstellt.

Danke für deine Antworten bis jetzt!




Ich würde Eclipse vollkommen ignorieren: es wird dich nur ablenken.

Wenn Sie eine statische Analyse durchführen, werden Sie höchstwahrscheinlich Bytecode analysieren wollen. Um die Aufrufhierarchie zu finden, suchen Sie nach den InvokeInstance- , Invokestatic- und InvokeSpecento- Bytecodes (siehe JVM-Spezifikation ). Diese verweisen auf eine vollständig qualifizierte Klasse / einen Methodennamen, und Sie können Ihre Map<FuncRef,Set<FuncRef>> mithilfe einer Map<FuncRef,Set<FuncRef>> , wobei FuncRef eine Klasse ist, die Sie definieren, um die Methodenaufrufinformationen zu FuncRef .

BCEL kann Ihnen beim Bytecode-Scannen helfen.

Sie müssen jedoch mehr Arbeit als das tun, insbesondere mit InvokeInstance , da Sie nicht wissen, was die tatsächliche Instanz sein könnte. Manchmal können Sie im Code nach hinten schauen, um eine Aufgabe zu finden, aber wahrscheinlich werden Sie raten - das ist die Achillesferse der statischen Analyse.




Eclipse Plugins sind wirklich nicht so schwer; Sie brauchen etwas gewöhnungsbedürftig, aber nicht zu lange.

Denken Sie darüber nach, der Eclipse-IDE die gewünschten Funktionen hinzuzufügen. Sie können andere Plugin-Funktionen nutzen (z. B. JDT, das die Suchfunktionalität enthält, nach der Sie suchen).

Sie können dann Ihre Plugins für alle Eclipse-Benutzer bereitstellen, anstatt ein anderes eigenständiges Tool zu entwickeln.




Sehen Sie sich das WALA- Framework von IBM an. Unter anderem können Sie den Call Graph (CG) für Ihre Codebasis generieren. In der Tat beginnt so ziemlich alles in WALA damit, den CG zu bauen. Sie können ihre Beispiele ändern und die Testdaten durch Ihre eigenen ersetzen.