代码之家  ›  专栏  ›  技术社区  ›  LOST

如何更好地构建Roslyn语法树访问者?

  •  0
  • LOST  · 技术社区  · 7 年前

    我正在努力提高我的罗斯林赋。我有一个简单的访客 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 所有类的修饰符,由 定义扫描器 .

    问题是:我不知道如何重写我的路径跟踪访问者,这样我就可以在两者中重用它,同时尽可能少地重复代码。

    这一事实使问题更加复杂,这是人们通常会想到的 定义扫描器 实施 CSharpSyntaxWalker 但是 局部清除器 应该是 CSharpSyntaxRewriter ,这使得它们不可能有公共基类。而且,无论如何,组合比继承更好。

    0 回复  |  直到 7 年前