【发布时间】:2016-08-05 09:24:21
【问题描述】:
有没有一种简单的方法可以从树中删除 SyntaxNode(即方法),但保留结构化的琐事?
在下面的代码中我要删除 MethodA:
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 类型可以包含这个子类型。例如,可以在结构、类、接口等中声明方法……这意味着我需要在多个位置进行过滤。
- 我失去了自下而上构建语法树的能力。这在比较 SyntaxTree 对象时会出现问题。对访问者方法的所有后续调用已经看到在“RemoveNodes”方法中创建的新节点。 使用 SyntaxNode.RemoveNodes 方法可以指定 SyntaxRemoveOptions.KeepDirectives,但使用 CSharpSyntaxRewriter 也可以吗?
EDIT2:这是我正在尝试做的一些代码:https://dotnetfiddle.net/1Cg6UZ
【问题讨论】:
-
关于“但是当我这样做时”:你到底在做什么?您能否添加一个(至少完整的)代码示例,展示您如何尝试从该输入中删除
SyntaxNode? -
我使用 CSharpSyntaxRewriter 重写 SyntaxTree。在 VisitMethodDeclaration 方法中,我只为 MethodA 返回 null。 public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node) { if (...) return null;否则返回节点; }
-
你传递给
RemoveNode()的参数是什么? -
我使用的不是 RemoveNodes,而是 CSharpSyntaxRewriter。请参阅我更新的问题。
标签: c# roslyn roslyn-code-analysis