收集源代码更改列表,然后将其应用于Roslyn

时间:2014-05-12 12:34:04

标签: c# roslyn

我正在使用Roslyn实现不同的源代码转换。 (代码上下文将是一个独立的命令行util,而不是一个VS CodeAction)

执行此操作以实现CSharpSyntaxRewriter实现以及访问特定节点时,最简单的方法是应用 然而,这种方法可能会或可能不会产生副作用导致不稳定的结果。在更改树时,我们也在更改语义模型,因此先前获得的语义模型可能会失效。没有进入细节,有点类似的事情,比如更改列表,同时枚举没有 notifiyng 枚举器关于此。

(是的,我知道树是不可变的,但这是重点:当重载方法返回替换节点而不是原始节点时,访问者更改它。)

所以我得到了这个想法:我们必须在2次传递中进行转换:首先收集更改,第二次实际应用更改。

  • 第一遍显然是一个CSharpSyntaxRewriter(访问者)实际上不会重写任何只是产生一个变更列表。 (也许一些较低的基础访客类别会比重写者做得更好,因为实际上不会在此通道中重写任何内容)
  • 第二次传递是更改列表应用程序,适用于第一次传递中收集的更改。

下一个有趣的想法是,第二遍不必操纵树本身:它可以直接操作原始源文本(第一遍可以构建具有确切源代码位置的更改列表,因为Span信息可用于每个节点和令牌。)

对于这个冗长的解释感到抱歉,现在的问题是:

我不想重新发明轮子:Roslyn中是否已经实现了任何源代码操作基础设施(有一个更改列表,(例如基于Spans)和在源代码上应用(...)它?

提前谢谢

1 个答案:

答案 0 :(得分:4)

找到所描述的内容:

SourceText类有一个WithChanges(...)方法,该方法返回的是应用更改转换的新SourceText实例。这些更改采用TextChange列表的形式,TextChange基本上是TextSpan周围的一个薄包装器,包含span本身和替换文本。

感谢任何花时间与此相关的人。