跟踪/合并用户更改的基于模板的代码生成



是否已经存在一个模板/代码生成器来跟踪用户对其输出的更改?我甚至不确定这是否有意义,但我认为这样的东西可能是一种有趣的变化跟踪,比SCM更紧密地集成到代码中…

Data.xml

<Classes>
 <Class>Class1</Class>
</Classes>
模板

<# for(var c in XDocument.Load("Data.xml").Element("Classes").Elements("Class")) { #>
     class <#=c.Value#> {
       public <#=c.Value#>() {
         // <InsertPoint>
         // </InsertPoint>
       }
     }
<# } #>

输出
class Class1 {
  public Class1() {
    // <InsertPoint>
    // </InsertPoint>
  }
}

用户改变

class Class1 {
  public Class1() {
    // <InsertPoint>
    System.Console.WriteLine("I am Class1");
    // </InsertPoint>
  }
}

->模板变成如下:

<# for(var c in XDocument.Load("Data.xml").Element("Classes").Elements("Class")) { #>
class <#=c.Value#> {
  public <#=c.Value#>() {
  // <UserInsert id="1">
  System.Console.WriteLine("I am Class1");
  // </UserInsert>
  // <InsertPoint>
  // </InsertPoint>
  }
}
<# } #>

data.xml中的内容通常被称为模型。在XML中完成,我们可以称之为"树模型"。换句话说,您正在根据预定义的模型应用(执行)模板。

在这种情况下跟踪用户的变化也可以称为"往返"工程:一个双向的变化。

ABSE项目(免责声明:我是项目负责人)定义了一种非常接近您要求的模型驱动代码生成方法:它使用可执行模板并通过树模型(但不是XML)生成代码。但是,您可以直接在模型中添加自己的代码,而不是检测代码中的更改,这样就可以跳过"往返"步骤。

有用于区分xml文档的工具。如果可以将代码转换成以xml表示的ast,则可以在文档上应用这些工具,然后将其转换回代码。