Roslyn-如果添加了尾随琐事,SyntaxNode将“消失”

时间:2019-02-14 11:05:26

标签: c# .net roslyn roslyn-code-analysis

我正在研究一小段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之后添加一些新行的任何想法?

0 个答案:

没有答案