从Roslyn SyntaxTree中删除所有SyntaxTrivia节点

时间:2018-11-06 21:01:01

标签: c# syntax formatting roslyn

我正在尝试使用Roslyn从SyntaxTrivia中删除类型为SyntaxTree的所有节点。

我尝试使用SyntaxRewriter类,但是由于SyntaxTrivia是不可为空的,因此无法使用:

public class WhitespaceRemover : CSharpSyntaxRewriter
{
   public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia)
   {
       // Cannot convert null to 'SyntaxTrivia' because it is a non-nullable value type
       return null;
   }
}

完成此操作的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我想您需要重写SyntaxNode并调用Microsoft.CodeAnalysis.SyntaxNodeExtensions.WithoutTrivia(...),这将删除所有琐事,而不是尝试重写SyntaxtTrivia

已更新。 @Emiswelt正确地提到应覆盖Visit方法,并在注释中附加覆盖VisitTrivia,这可以从SyntaxTree

删除未连接的琐事。

您可以在语法重写中使用它,它看起来像这样:

public class WhitespaceRemover : CSharpSyntaxRewriter
{
    public override SyntaxNode Visit(SyntaxNode node) => base.Visit(node).WithoutTrivia();

    public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia) => default;
}