我正在使用Roslyn实现不同的源代码转换。 (代码上下文将是一个独立的命令行util,而不是一个VS CodeAction)
执行此操作以实现CSharpSyntaxRewriter实现以及访问特定节点时,最简单的方法是应用 然而,这种方法可能会或可能不会产生副作用导致不稳定的结果。在更改树时,我们也在更改语义模型,因此先前获得的语义模型可能会失效。没有进入细节,有点类似的事情,比如更改列表,同时枚举没有 notifiyng 枚举器关于此。
(是的,我知道树是不可变的,但这是重点:当重载方法返回替换节点而不是原始节点时,访问者将更改它。)
所以我得到了这个想法:我们必须在2次传递中进行转换:首先收集更改,第二次实际应用更改。
下一个有趣的想法是,第二遍不必操纵树本身:它可以直接操作原始源文本(第一遍可以构建具有确切源代码位置的更改列表,因为Span信息可用于每个节点和令牌。)
对于这个冗长的解释感到抱歉,现在的问题是:
我不想重新发明轮子:Roslyn中是否已经实现了任何源代码操作基础设施(有一个更改列表,(例如基于Spans)和在源代码上应用(...)它?
提前谢谢
答案 0 :(得分:4)
找到所描述的内容:
SourceText类有一个WithChanges(...)方法,该方法返回的是应用更改转换的新SourceText实例。这些更改采用TextChange列表的形式,TextChange基本上是TextSpan周围的一个薄包装器,包含span本身和替换文本。
感谢任何花时间与此相关的人。