如何使用Roslyn修改源代码?我无法创建SyntaxNode并在SyntaxTree中插入。 或使用替代品(Antrl,NRefactory或其他)?如何使用Roslyn修改源代码?
5
A
回答
3
您可以使用SyntaxFactory
创建SyntaxNode
。
而且您不能修改现有的语法树(因为它是不可变的),但是您可以创建一个包含您的节点的新树。请看With-
和Add-
方法,ReplaceNode
和CSharpSyntaxVisitor
。很难说哪一个最适合您的需求。
2
svick如何回答你 - 你不能修改现有的语法树。 Sytnax树是不可变的,但您可以基于现有的创建另一个树。为此,您必须创建节点并替换现有节点。下面你可以简单的例子(使用变更):
var name = Syntax.QualifiedName(Syntax.IdentifierName("System"), Syntax.IdentifierName("Collections"));
name = Syntax.QualifiedName(name, Syntax.IdentifierName("Generic"));
SyntaxTree tree = SyntaxTree.ParseText(
@"using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello, World!"");
}
}
}");
var root = (CompilationUnitSyntax)tree.GetRoot();
var oldUsing = root.Usings[1];
var newUsing = oldUsing.WithName(name);
root = root.ReplaceNode(oldUsing, newUsing);
Console.WriteLine(root.GetText());
在这里永恒不变的情况下,从入门文档记:
的罗斯林API的一个基本原则是不可改变的。由于不可变的数据结构在创建后无法更改,因此可以由多个消费者同时安全地共享和分析它们,而不会以不可预知的方式影响另一个工具的危险。不需要锁定或其他并发性措施。这适用于Roslyn API中的语法树,编译,符号,语义模型和所有其他数据结构。新的对象不是修改而是根据旧指定的差异创建。您将此概念应用于语法树来创建树转换!
+0
我假设这段代码需要像using'using Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;'这样的using语句进行编译。 – Anssssss 2017-08-14 18:39:03
相关问题
- 1. 使用Roslyn编译时源代码修改
- 2. 如何使用JDT修改源代码?
- 3. Roslyn CTP - 随机代码修改
- 4. 如何在附加源代码时修改源代码
- 5. 如何修改openCV源代码?
- 6. 修改OpenCV源代码
- 7. 修改源代码hadoop
- 8. 更改Roslyn的部分源代码中的背景颜色
- 9. 如何修改后的应用程序的源代码? xCode-Sparkle
- 10. 修改Roslyn的方法体
- 11. 修改饼图的Kibana源代码
- 12. 取代android源码包与修改包
- 13. Python硒 - 修改网页的源代码
- 14. 修改Ruby源代码 - 无法修改方法
- 15. 使用ANTLR分析和修改源代码;我做错了吗?
- 16. 使用源代码修改Chrome扩展程序
- 17. 如何修改火花源代码并生成
- 18. C# - 如何识别修改后的文件及其源代码
- 19. 如何将HTMLDocument分配到JEditorPane中以修改为源代码?
- 20. Ajax:如何正确修改jQuery源代码?
- 21. 如何在Python中加载代码源修改包?
- 22. 使用Node.js修改前端HTML代码
- 23. 使用Javascript修改OnClick中的代码
- 24. 修改代码,而不是使用SimpleCursor
- 25. 修改BubbleSort代码
- 26. 修改DomainService代码?
- 27. 修改JQuery代码
- 28. greasemonkey代码修改
- 29. Python代码修改
- 30. 手风琴组如何修改代码
感谢您的回答。我找到了NodeOrTokenList。如何将NodeOrTokenList转换为SyntaxNode? – user3382135 2014-10-20 09:58:05
@ user3382135你没有,我不明白你为什么要这么做。我想你应该问一个新问题,解释你想做什么,为什么你认为你需要NodeOrTokenList。 – svick 2014-10-20 10:13:57