我正在尝试使用自定义语法重写器删除代码中的冗余分号。
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。
答案 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
}
}