Я пытаюсь улучшить мой Roslyn-fu.У меня реализован простой посетитель-посетитель PathTracker
, который отслеживает полный путь к текущему члену, тело которого выглядит следующим образом:
readonly StringBuilder fullPath = new StringBuilder();
public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node) {
int len = this.fullPath.Length;
this.fullPath.Append('.');
this.fullPath.Append(node.Name.ToFullString());
base.VisitNamespaceDeclaration(node);
this.fullPath.Length = len;
}
public override void VisitClassDeclaration(ClassDeclarationSyntax node) {
this.fullPath.Append('.');
this.fullPath.Append(node.Identifier.Text);
base.VisitClassDeclaration(node);
this.fullPath.Length -= node.Identifier.Text.Length + 1;
}
Теперь я хочу повторно использовать отслеживание пути у двух других посетителей:DefinitionScanner
для сбора всех классов, которые определены только один раз, и PartialRemover
для удаления модификатора partial
из всех классов, собранных с помощью DefinitionScanner
.
Проблема в том, что я не могу понять, какпереписать моего посетителя с отслеживанием пути, чтобы я мог повторно использовать его в обоих из них с минимальным дублированием кода.
В идеале, я ожидал бы, что можно будет каким-то образом составить два посетителя, чтобы один мог обработатьвход и выход в узел, а другой вызывается между ними.
Проблема дополнительно усложняется тем фактом, что обычно можно ожидать, что DefinitionScanner
будет реализовывать CSharpSyntaxWalker
, но PartialRemover
должно быть CSharpSyntaxRewriter
, что лишает их возможности иметь общий базовый класс.И, во всяком случае, состав был бы лучше, чем наследство.