有沒有簡單的方法從樹中刪除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()'的參數是什麼? –