我正在研究一小段roslyn代码,以尝试在Visual Studio for MAC扩展项目中进行一些简单的重构。
我要重构此代码:
public class Test
{
private const object a = null;
public const int c = 0;
}
输入此代码
public class Test
{
public const int c = 0;
private const object a = null;
}
到目前为止,我设法获得了代表我的常量的ISymbol列表,对其进行了正确排序,然后将其转换为这样的SyntaxNode列表
var orderedMembers = orderer.OrderAll(classMembers);
var nodes = orderedMembers.Select(o => o.DeclaringSyntaxReferences.FirstOrDefault().GetSyntax())
.Where(node => node != null)
.ToList();
到目前为止,一切都很好。输出是这样的
public class Test
{
public const int c = 0;
private const object a = null;
}
现在,我的最后一步是,在我的最后一个常量之后添加几行,以定义我的常量和后续内容之间的分隔。
看来我可以通过向我的SyntaxNode之一添加尾随/领先琐事来做到这一点。所以我尝试了一下(现在为简单起见进行了硬编码):
nodes[1] = nodes[1].WithTrailingTrivia(SyntaxFactory.CarriageReturnLineFeed);
然后,将新节点插入“ Test”类声明节点,并将其插入字符串(此处的“ editor”是Microsoft.CodeAnalysis.Editing.DocumentEditor的实例,该实例代表我使用vs for mac打开的文件IDE):
editor.InsertMembers(classNode, 0, nodes);
var newDocument = editor.GetChangedDocument();
(await newDocument.GetTextAsync()).ToString();
这就是它生成的:
public class Test
{
public const int c = 0;
}
因此,当我在新编辑的文档上调用GetTextAsync时,不会生成我尝试添加Trivia的SyntaxNode。
这是我第一次与罗斯林(Roslyn)一起玩,所以我想我缺少使用Trivia的重要信息,但我似乎找不到它。关于如何在定义的SyntaxNode之后添加一些新行的任何想法?