2009-06-22 8 views
4

Gegeben eine Zeilennummer eines bestimmten Klassenquellcodes (Java/C#) - gibt es einen einfachen Weg, den Namen der Methode zu erhalten, in die er fällt? (Wenn es in eins fällt) (Vermutlich unter Verwendung eines abstrakten Syntaxbaums)Methodenname von Zeilennummer

(Dies wäre nützlich, um die Ausgabe von Checkstyle auf die berührte Methode zu beschränken).

Ich nehme an, Sie müssten einen abstrakten Syntaxbaum verwenden, um Zeile # -> MethodName zu tun.

Antwort

2

(Java-spezifisch)

Wenn die Klassendatei mit Debug-Informationen kompiliert wurde dann die Zeilennummer Tabelle, die eine Zuordnung von Code < enthalten -> Zeilennummer. Ich denke nicht, dass es eine eingebaute API gibt, um dies zur Laufzeit zu erreichen, obwohl ich sicher bin, dass Sie wahrscheinlich mit einigen der Bytecode-Engineering-Bibliotheken wie ASM oder BCEL umgehen können.

2

Ich weiß nicht über Java, aber .NET-Assemblies haben keine Zeilennummern in ihren Metadatentabellen gespeichert - Sie benötigen eine PDB-Datei (Program Database) für diese Art von Informationen.

0

Ja, wie Sie sagten, mit der richtigen Art von AST. Die DMS Software Reengineering Toolkit kann ASTs für Java und für C# erstellen. Jeder AST-Knoten ist mit Zeilennummerdaten versehen. Jeder AST-Knoten entspricht einer Grammatikregel.

So ist das Problem des Bestimmens des Methodennamens für eine Zeilennummer ziemlich einfach: Suchen Sie einen Knoten im AST mit der entsprechenden Zeilennummer und klettern Sie den Baum, bis ein AST-Knoten gefunden wird, der eine Methodendeklaration darstellt; Finde den Methodennamen-Unterbaum von diesem Knoten und drucke ihn aus.

Dieser Trick wird in statischen Analysetools, die mit DMS erstellt wurden, stark verwendet, um einen problematischen Methodennamen für ein Problem zu melden, das an einer bestimmten Zeilennummer diagnostiziert wurde. DMS ist entworfen, um anderen zu ermöglichen, solche statischen Analysetools zu erstellen.

Verwandte Themen