我们有一个从给定模型生成源代码(用于 C#、Java、IOS 等)的工具。为代码生成器缺少的任何功能手动编辑代码。每当对模型进行任何更改并需要从中生成源代码时,对先前版本执行的手动更改都会丢失。
为了最大限度地减少损失,用户编辑的代码块(方法、类、属性等)用自定义属性(比如CUSTCODE
)标记。在生成新版本的源代码时,如果(用户)提到了旧版本的路径,系统将比较两个源代码并合并内容如下(在这种情况下以旧版本为基础):
- 删除以前版本中可用但新版本中不可用且未标记为 CUSTCODE 的任何代码块。
- 将两个版本中可用且未标记为 CUSTCODE 的任何代码块替换为最新版本代码。
- 从最新代码中添加缺失的代码块。
为此,我们正在使用Microsoft Roslyn
C# 并且正在按预期工作(当然会执行诸如 usings 之类的附加检查)
[注意:我可以使用 Java / C# 进行合并应用程序。系统将通过传递参数来调用任何应用程序。使用ASTRewriter
Java 也是如此]
现在的挑战是 JS 和 HTML。目前我们专注于JS。我们检查了几个 AST JavaScript 解析器,如 Rhino、IronJS、astify 等。但我在使用它们时遇到了一些问题。
所以我想建立一个自定义合并。由于 JavaScript 是如此动态,我们将(将要)为 JS 代码设置指南。
- 将所有代码包含在命名函数中,该函数充当唯一标识符以进行匹配和合并。
- 当系统需要在合并时保持函数不变时,在方法顶部添加带有“CUSTCODE”的注释。
我们的目的是遵循以下方法:
- 将 jQuery 中找到的匿名函数移动到命名函数中,并在 jQuery 中调用它们
- 命名任何匿名函数,例如 var v = function()...
- 将所有 jQueries 和独立代码片段包装到命名的自可执行函数中,同时保持顺序不变。
- 将所有全局变量移动到 JS 文件的顶部。(不要包含在任何函数中)
合并过程如下:
- 捕获所有字符串(单引号、双引号)、注释(内联、块)并替换为一些唯一标识符。(标有“CUSTCODE”的除外)
- 捕获函数体(基于 '{' 和 '}' 的计数)并替换为唯一标识符。阅读上一行,如果是“CUSTCODE”则标记方法
- 将捕获的函数体适当地比较和替换为最新版本的内容。
- 恢复所有捕获以生成最终输出。
我想知道是否还有什么需要考虑的。