Domanda

Dato un numero di riga di un particolare codice sorgente della classe (Java / C #) - c'è un modo semplice per ottenere il nome del metodo in cui rientra? (Se rientra in uno) (Presumibilmente usando un albero di sintassi astratto)

(Ciò sarebbe utile nel limitare l'output di checkstyle al solo metodo toccato).

Suppongo che dovresti usare un albero di sintassi astratto per fare Line # - > MethodName.

È stato utile?

Soluzione

(specifica per Java)

Se il file di classe è stato compilato con le informazioni di debug, la tabella dei numeri di riga conterrà una mappatura del codice < - > numero di riga. Non credo che ci sia un'API integrata per arrivare a questo in fase di esecuzione, anche se sono sicuro che probabilmente avrai a che fare con alcune delle librerie di ingegneria bytecode là fuori come ASM o BCEL.

Altri suggerimenti

Non conosco Java, ma gli assembly .NET non hanno numeri di riga memorizzati nelle loro tabelle dei metadati - per quel tipo di informazioni è necessario un file PDB (Database di programma).

Sì, come hai detto, usando il giusto tipo di AST. Il DMS Software Reengineering Toolkit può creare AST per Java e per C #. Ogni nodo AST è decorato con i dati del numero di riga. Ogni nodo AST corrisponde a una regola grammaticale.

Quindi il problema di determinare il nome del metodo per un numero di riga è piuttosto semplice: trova un nodo nell'AST con il corrispondente numero di riga e scala l'albero fino a trovare un nodo AST che rappresenta una dichiarazione di metodo; trova la sottostruttura nome-metodo da quel nodo e stampala.

Questo trucco è ampiamente utilizzato negli strumenti di analisi statica creati utilizzando DMS, per segnalare un nome di metodo offensivo per un problema diagnosticato in un determinato numero di riga. DMS è progettato per consentire ad altri di costruire tali strumenti di analisi statica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top