0

我们有一个从给定模型生成源代码(用于 C#、Java、IOS 等)的工具。为代码生成器缺少的任何功能手动编辑代码。每当对模型进行任何更改并需要从中生成源代码时,对先前版本执行的手动更改都会丢失。

为了最大限度地减少损失,用户编辑的代码块(方法、类、属性等)用自定义属性(比如CUSTCODE)标记。在生成新版本的源代码时,如果(用户)提到了旧版本的路径,系统将比较两个源代码并合并内容如下(在这种情况下以旧版本为基础):

  1. 删除以前版本中可用但新版本中不可用且未标记为 CUSTCODE 的任何代码块。
  2. 将两个版本中可用且未标记为 CUSTCODE 的任何代码块替换为最新版本代码。
  3. 从最新代码中添加缺失的代码块。

为此,我们正在使用Microsoft RoslynC# 并且正在按预期工作(当然会执​​行诸如 usings 之类的附加检查)

[注意:我可以使用 Java / C# 进行合并应用程序。系统将通过传递参数来调用任何应用程序。使用ASTRewriterJava 也是如此]

现在的挑战是 JS 和 HTML。目前我们专注于JS。我们检查了几个 AST JavaScript 解析器,如 Rhino、IronJS、astify 等。但我在使用它们时遇到了一些问题。

所以我想建立一个自定义合并。由于 JavaScript 是如此动态,我们将(将要)为 JS 代码设置指南。

  1. 将所有代码包含在命名函数中,该函数充当唯一标识符以进行匹配和合并。
  2. 当系统需要在合并时保持函数不变时,在方法顶部添加带有“CUSTCODE”的注释。

我们的目的是遵循以下方法:

  1. 将 jQuery 中找到的匿名函数移动到命名函数中,并在 jQuery 中调用它们
  2. 命名任何匿名函数,例如 var v = function()...
  3. 将所有 jQueries 和独立代码片段包装到命名的自可执行函数中,同时保持顺序不变。
  4. 将所有全局变量移动到 JS 文件的顶部。(不要包含在任何函数中)

合并过程如下:

  1. 捕获所有字符串(单引号、双引号)、注释(内联、块)并替换为一些唯一标识符。(标有“CUSTCODE”的除外)
  2. 捕获函数体(基于 '{' 和 '}' 的计数)并替换为唯一标识符。阅读上一行,如果是“CUSTCODE”则标记方法
  3. 将捕获的函数体适当地比较和替换为最新版本的内容。
  4. 恢复所有捕获以生成最终输出。

我想知道是否还有什么需要考虑的。

4

0 回答 0