Удалить все узлы SyntaxTrivia из Roslyn SyntaxTree - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь удалить все узлы типа SyntaxTrivia из SyntaxTree с помощью Roslyn.

Я пытался использовать класс 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 голосов
/ 07 ноября 2018

Полагаю, вам нужно переписать SyntaxNode, вызывая Microsoft.CodeAnalysis.SyntaxNodeExtensions.WithoutTrivia(...), который удалит все пустяки вместо попытки переписать SyntaxtTrivia.

Upd. @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;
}
...