有没有简单的方法从树中删除SyntaxNode(即方法),但保留结构化的琐事?删除节点时保留结构化的琐事
在下面的代码我想删除治法:
public class Sample
{
#region SomeRegion
public void MethodA()
{
}
#endregion
}
我用CSharpSyntaxRewriter重写SyntaxTree。在VisitMethodDeclaration方法中,我简单地为MethodA返回null。这种方法的问题是#region标签的StructuredTrivia也被删除。这是结果的结果:
public class Sample
{
#endregion
}
在我CSharpSyntaxRewriter:
public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
{
if (...)
return null;
else
return node;
}
编辑: 正如下面的答案之一提到的,我可以用SyntaxNode.RemoveNodes与SyntaxRemoveOptions.KeepDirectives选项。此解决方案有两大缺点:
- 我需要知道哪些SyntaxNode类型可以包含此子类型。例如,一个方法可以在Struct,Class,Interface等中声明......这意味着我需要在多个位置上进行过滤。
- 我放弃了自下而上构建语法树的能力。比较SyntaxTree对象时会出现问题。随后对访问者方法的所有调用都会看到在“RemoveNodes”方法中创建的新节点。 使用SyntaxNode.RemoveNodes方法可以指定SyntaxRemoveOptions.KeepDirectives,但这也可以用CSharpSyntaxRewriter?
EDIT2:下面是一些代码,使我想要做的事:https://dotnetfiddle.net/1Cg6UZ
关于_“但是当我这样做时”_:你究竟做了什么?你可以添加一个(最小完整的)代码示例,显示你如何从该输入中删除一个'SyntaxNode'? – stakx
我使用CSharpSyntaxRewriter来重写SyntaxTree。在VisitMethodDeclaration方法中,我简单地为MethodA返回null。公众覆盖SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax节点) \t \t { \t \t \t如果(...) \t \t \t \t返回NULL; \t \t \t else \t \t \t \t return node; \t \t} – TWT
你传递给'RemoveNode()'的参数是什么? –