Как лучше составить синтаксическое дерево посетителей Roslyn? - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь улучшить мой 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, что лишает их возможности иметь общий базовый класс.И, во всяком случае, состав был бы лучше, чем наследство.

...