使用SyntaxRewriter删除代码中的冗余分号

时间:2014-08-14 13:14:39

标签: c# roslyn

我正在尝试使用自定义语法重写器删除代码中的冗余分号。

public class Sample
{
   public void Foo()
   {
      Console.WriteLine("Foo");
      ;
   }
}

以下语法重写器涵盖了Sample类中的大多数场景。

public class EmptyStatementRemoval : CSharpSyntaxRewriter
{
  public override SyntaxNode VisitEmptyStatement(EmptyStatementSyntax node)
  {
    return null;
  }
}

但是,当分号具有前导或尾随琐事时,从VisitEmptyStatement方法返回null会删除琐事,这是无意的。

public class Sample
{
   public void Foo()
   {
      Console.WriteLine("Foo");
      #region SomeRegion
      //Some other code
      #endregion
      ;
   }
}

我无法确定如何返回只有前导和尾随琐事删除分号的节点。我尝试使用node.WithSemicolonToken(SyntaxToken)方法将分号标记替换为另一个标记,该方法仅接受SyntaxKind.SemicolonToken类型的标记或抛出ArgumentException。

1 个答案:

答案 0 :(得分:7)

可行的一种方法是用缺少的分号标记替换分号标记:

public override SyntaxNode VisitEmptyStatement(EmptyStatementSyntax node)
{
    return node.WithSemicolonToken(
        SyntaxFactory.MissingToken(SyntaxKind.SemicolonToken)
            .WithLeadingTrivia(node.SemicolonToken.LeadingTrivia)
            .WithTrailingTrivia(node.SemicolonToken.TrailingTrivia));
}

对于#region示例,结果如下所示(注意只包含分号所在空格的行):

public class Sample
{
    public void Foo()
    {
        Console.WriteLine("Foo");
        #region SomeRegion
        //Some other code
        #endregion

    }
}