我正在尝试使用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;
}
}
完成此操作的正确方法是什么?
答案 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;
}