2009-02-10 10 views
13

¿Hay alguna forma de anular los números de línea en Java (por ejemplo, mediante el uso de algún tipo de directiva de preprocesador)?Anulando el número de línea en la fuente Java generada

Estoy "compilando" un lenguaje de alto nivel, hasta el código de bytes Java usando Janino. Necesito errores del compilador para informar la línea del archivo original, no el código Java generado.

C# tiene la directiva #line, y la exploté exitosamente para asignar los números de línea de un archivo fuente al resultado compilado. Necesito lo mismo para Java.

Gracias!

+0

Si está compilando código de bytes Java, debe conocer los números de línea. ¿O quiere decir que está compilando en Java y el compilador de Java está tomando eso y compilando código de bytes? – jdigital

Respuesta

3

Usando Janino se puede derivar de Scanner y reemplazar el método location(). Este método devuelve un objeto Location. Puede anular el método read() para buscar anotaciones, por ejemplo, en los comentarios (agregados durante la generación del código) que contienen información del número de línea.

Simplemente pase su escáner al método SimpleCompiler.cook() y puede controlar qué nombre de archivo, línea y columna se informan en caso de error.

4

Lamentablemente, no, no existe una directiva equivalente #line en Java. Lo mejor que puede hacer es modificar la fuente después de que se haya generado eliminando/insertando líneas nuevas para que coincida con la fuente real (o modifique el generador de códigos). O bien, puede modificar los números de línea almacenados en los archivos de clase binarios después de que se hayan compilado, pero eso probablemente sea aún más doloroso.

1

No hay una solución simple. Una solución alternativa sería generar un mapa de número de línea desde [su idioma] a Java cuando genere el código. Puede canalizar la salida del compilador y usar el mapa para reemplazar los números de línea de Java con sus números de línea.

8

Nunca lo he visto usado para otro que no sea JSP, pero JSR-45 fue diseñado para ser utilizado con este propósito para cualquier idioma fuente. El proceso implica la creación de un segundo archivo en un formato especial ("SMAP") que asigna los números de línea en la fuente original a los números de línea en el código fuente Java generado.

3

En lugar de generar código Java como su idioma intermedio, puede intentar usar el ensamblador JVM. Jasmin tiene buena sintaxis, y puede insertar directivas .line en los lugares apropiados de su código. También puede especificar el archivo fuente original utilizando la directiva .source.

Por supuesto, tomar la ruta de ensamblador puede ser más problemas de lo que vale :)

Cuestiones relacionadas