martes, abril 04, 2006

Como depurar en la plantilla de generacion de codigo

Uno de los problemas mas comunes a la hora de ponernos con la generacion de código es la Navegabilidad dentro de la propia plantilla de generacion de código. Es decir, como hacer los bucles foreach, como nos movemos entre clases, qué propiedades tenemos accesibles,...
Todo esto en principio nos puede parecer trivial, puesto que hemos estado mucho tiempo modelando el diseñador, pero cuando tenemos algo puntual y sobre todo cuando nuestro modelo ya se va haciendo grande y dificil de acordarse de esos pequeños detalles, nos viene bien poder hacer breakpoints en la propia generacion de código.

Es muy sencillo, lo único que tenemos que tener presente es que lo que vamos a depurar no es la plantilla en sí, sino el código que mediante Sofware Factories se ha generado en C# a partir de nuestro fichero de template, y que generará nuestro archivo de salida. Parece lioso de entender pero si relees la frase anterior lo entenderas.

La idea general es la siguiente:

  • nuestroTextTemplate.Template -> codigoIntermedioC#.cs -> nuestroFicheroOutput.sql

Como veis, se hace en 3 pasos y lo que atañe a la depuracion lo tendremos en codigoIntermedioC#.cs que es el que depuraremos.

Lo que tenemos que hacer es bien sencillo:

  • Activar el flag debug="true" en la directiva "template"

<#@ template inherits="...ModelingTextTransformation" debug="true" #>

  • Importar el espacio de nombres System.Diagnostics

<#@ import namespace="System.Diagnostics" #>

  • Utilizar un bloque de expresion donde llamemos a la clase Debugger y hagamos un Breakpoint

<# Debugger.Break(); #>

Ahora, cuando pongamos el bloque "Expression", al guardar o darle al boton "GenerateAllTemplates", podremos pararnos en aquel punto marcado por nosotros. Pero recordad que lo que vereis sera el código C# intermedio generado mediante Sofware Factories.

Voy a poner un ejemplo de una prueba de plantilla de generacion de código simple con un breakpoint y luego parte de lo que veriamos en el Visual Studio con el debugger:


<# Debugger.Break(); #>
<# foreach(Clase clase in this.Esquema.classRole) { #>
<#=clase.Name#>
<# } #>

Aqui podemos ver una captura en plena depuracion:



1 comentario:

Anónimo dijo...
Este comentario ha sido eliminado por un administrador del blog.