Pregunta

Dado un número de línea de un código fuente de clase particular (Java / C #), ¿hay alguna manera fácil de obtener el nombre del método en el que se encuentra? (Si cae dentro de uno) (Presumiblemente usando un Árbol de sintaxis abstracta)

(Esto sería útil para limitar la salida del estilo de verificación solo al método tocado).

Supongo que tendrías que usar un árbol de sintaxis abstracta para hacer la línea # - > MethodName.

¿Fue útil?

Solución

(específico de Java)

Si el archivo de clase se compiló con información de depuración, la tabla de números de línea contendrá una asignación de código < - > número de línea. No creo que haya una API incorporada para llegar a esto en tiempo de ejecución, aunque estoy seguro de que probablemente pueda hacerlo con algunas de las bibliotecas de ingeniería de bytecode, como ASM o BCEL.

Otros consejos

No sé acerca de Java, pero los ensamblados .NET no tienen números de línea almacenados en sus tablas de metadatos; necesitaría un archivo PDB (Program Database) para ese tipo de información.

Sí, como dijiste, usando el tipo correcto de AST. El DMS Software Reengineering Toolkit puede crear AST para Java y para C #. Cada nodo AST está decorado con datos de número de línea. Cada nodo AST corresponde a una regla gramatical.

Entonces, el problema de determinar el nombre del método para un número de línea es bastante fácil: encuentre un nodo en el AST con el número de línea correspondiente y suba el árbol hasta que se encuentre un nodo AST que represente una declaración de método; encuentre el subárbol de nombre de método de ese nodo e imprímalo.

Este truco se usa mucho en herramientas de análisis estático creadas con DMS, para informar un nombre de método ofensivo para un problema diagnosticado en un número de línea particular. DMS es diseñado para permitir que otros creen herramientas de análisis estático.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top