Есть ли простой способ удалить SyntaxNode (то есть метод) из дерева, но сохранив при этом структурированные мелочи?
В следующем коде я хочу удалить MethodA:
public class Sample
{
#region SomeRegion
public void MethodA()
{
}
#endregion
}
Я использую CSharpSyntaxRewriter для перезаписи SyntaxTree. В методе VisitMethodDeclaration я просто возвращаю null для MethodA. Проблема с этим подходом заключается в том, что StructuredTrivia тега #region также удаляется. Это результат результата:
public class Sample
{
#endregion
}
В моем CSharpSyntaxRewriter:
public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
{
if (...)
return null;
else
return node;
}
EDIT: как упоминалось в одном из ответов ниже, я мог бы использовать SyntaxNode.RemoveNodes с параметром SyntaxRemoveOptions.KeepDirectives. У этого решения есть два больших недостатка:
- Мне нужно знать, какие типы SyntaxNode могут содержать этот дочерний тип. Например, метод может быть объявлен в структуре, классе, интерфейсе и т. д. Это означает, что мне нужно выполнять фильтрацию в нескольких местах.
- Я теряю возможность строить синтаксическое дерево снизу вверх. Это создает проблемы при сравнении объектов SyntaxTree. Все последующие вызовы методов посетителя уже видят новые узлы, созданные в методе «RemoveNodes». С помощью метода SyntaxNode.RemoveNodes можно указать SyntaxRemoveOptions.KeepDirectives, но возможно ли это также с помощью CSharpSyntaxRewriter?
EDIT2: вот код того, что я пытаюсь сделать: https://dotnetfiddle.net/1Cg6UZ
SyntaxNode
из этого ввода? - person stakx - no longer contributing   schedule 05.08.2016RemoveNode()
? - person Jeroen Vannevel   schedule 05.08.2016