【问题标题】:Remove all SyntaxTrivia nodes from Roslyn SyntaxTree从 Roslyn SyntaxTree 中删除所有 SyntaxTrivia 节点
【发布时间】:2020-02-08 02:07:06
【问题描述】:

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

我尝试使用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;
   }
}

实现此目的的正确方法是什么?

【问题讨论】:

  • 你试过return default(SyntaxTrivia);吗?
  • 我确定你想重写 SyntaxNode 调用 Microsoft.CodeAnalysis.SyntaxNodeExtensions.WithoutTrivia(...) 就可以了,而不是 SyntaxtTrivia
  • @GeorgeAlexandria 好吧。那讲得通。请给它一个答案,然后我可以接受。
  • 为了在此给予更多肯定,@Christian.K 的建议适用于删除未附加到语法节点的琐事标记。

标签: c# syntax formatting roslyn


【解决方案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;
}

【讨论】:

  • 正确的覆盖方法是Visit,需要调用base.Visit(...),还需要覆盖VisitTrivia才能返回一个空的SyntaxTrivia令牌。考虑到所有这些,它可以工作并去除所有空白。
猜你喜欢
  • 2019-03-05
  • 2013-01-24
  • 2022-08-19
  • 1970-01-01
  • 2012-11-29
  • 2018-06-13
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多