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

时间:2011-10-02 20:02:30

标签: c# code-generation

是否已存在跟踪用户对其输出的更改的模板/代码生成器?我甚至不认为这是有道理的 - 但是我认为这样的空间学员认为这可能是一种有趣的变化跟踪,它比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>
  }
}

- &GT;模板更改为:

<# 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>
  }
}
<# } #>

2 个答案:

答案 0 :(得分:1)

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

在这种情况下跟踪用户更改也可称为“往返”工程:双向更改。

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

答案 1 :(得分:0)

有些工具可以在xml文档上进行差异化。如果您可以将代码转换为以xml表示的ast,则可以在文档上应用这些工具,然后将其转换回代码。