ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-29 16:08:44  阅读:160  来源: 互联网

标签:roslyn c


我正在与Roslyn一起实现不同的源代码转换.
(代码上下文将是独立的命令行工具,而不是VS CodeAction)

实现CSharpSyntaxRewriter实现的最简单方法是在访问特定节点时动态应用更改.但是,此方法可能会导致副作用,也可能没有副作用.在更改树时,我们也在更改语义模型,因此先前获得的语义模型可能会失效.不详细介绍它的类似内容,例如在不通知枚举程序的情况下枚举列表时更改列表.

(是的,我知道树是不可变的,但这就是重点:当重载的方法返回一个替换节点而不是原始节点时,访问者将对其进行更改.)

所以我有了一个主意:我们必须分两步进行转换:首先收集更改,然后第二次实际应用更改.

>第一遍显然是CSharpSyntaxRewriter(访问者),实际上不重写任何内容只是产生一个更改列表. (也许一些较低级别的访问者类会比重写器做得更好,因为实际上在此过程中不会重写任何内容)
>第二遍是更改列表应用者,它应用在第一遍中收集的更改.

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

很抱歉提供冗长的解释,现在的问题是:

我不想重新发明轮子:Roslyn中是否已经实现了任何源代码处理基础结构(有一个更改列表(例如,基于Spans)并在源代码上应用(…)?

提前Thx

解决方法:

准确找到描述内容:

SourceText类具有WithChanges(…)方法,该方法通过应用更改随新SourceText实例transformad返回.更改采用TextChange列表的形式,该列表基本上是TextSpan的薄包装,其中包含跨度本身和替换文本.

感谢所有花时间在此上的人.

标签:roslyn,c
来源: https://codeday.me/bug/20191029/1960937.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有