Roslyn - 如果添加尾随琐事,则SyntaxNode"消失"

Mii*_*ite 6 .net c# roslyn roslyn-code-analysis

我正在研究一小段roslyn代码,尝试在Visual Studio for MAC扩展项目中进行一些简单的重构.

我想重构这段代码:

public class Test
{
    private const object a = null; 


    public const int c = 0;

}
Run Code Online (Sandbox Code Playgroud)

进入这段代码

public class Test
{
    public const int c = 0;
    private const object a = null; 

}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我设法得到一个代表我的常量的ISymbol列表,正确地命令它们,然后将它们转换成一个SyntaxNode列表,就像这样

var orderedMembers = orderer.OrderAll(classMembers);
var nodes = orderedMembers.Select(o => o.DeclaringSyntaxReferences.FirstOrDefault().GetSyntax())
                                  .Where(node => node != null)
                                  .ToList();
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.输出是这样的

public class Test
{
    public const int c = 0;
    private const object a = null; 
}
Run Code Online (Sandbox Code Playgroud)

现在我的最后一步是在我的最后一个常量之后添加几行,以定义我的常量和可能的后续内容之间的分离.

我似乎可以通过在我的一个SyntaxNode中添加一个Trailing/Leading琐事来做到这一点.所以我尝试了这个(现在硬编码为简单):

nodes[1] = nodes[1].WithTrailingTrivia(SyntaxFactory.CarriageReturnLineFeed);
Run Code Online (Sandbox Code Playgroud)

然后我将我的新节点插入到我的"Test"类声明节点中,并将其转换为字符串(此处"editor"是Microsoft.CodeAnalysis.Editing.DocumentEditor的一个实例,表示我使用vs为mac IDE打开的文件):

editor.InsertMembers(classNode, 0, nodes);
var newDocument = editor.GetChangedDocument();
(await newDocument.GetTextAsync()).ToString();
Run Code Online (Sandbox Code Playgroud)

这就是它产生的:

public class Test
{
    public const int c = 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试添加Trivia的SyntaxNode,在我新编辑的Document上调用GetTextAsync时没有生成.

这是我第一次和Roslyn一起玩,所以我想我错过了使用Trivia的重要内容,但我似乎无法找到它.有关如何在定义的SyntaxNode之后添加一些新行的任何想法?