AST walker似乎无法正常工作

时间:2015-10-10 09:02:21

标签: c# roslyn

我正在使用Roslyn并且我创建了一个AST walker,以便检测何时遍历某些节点。

我想解析的来源如下:

var source = string.Format(@"
    using System;
    using System.Collections;
    using System.Linq;
    using System.Text;

    namespace HelloWorld
      {{
         class {0} : {1}
         {{
            static void Main(string[] args)
            {{
               Console.WriteLine(""Hello, World!"");
            }}
         }}
      }}", "MyClass", "MyBaseClass");

这是步行者:

namespace MyStuff
{
    using System;
    using Microsoft.CodeAnalysis;
    using Microsoft.CodeAnalysis.CSharp;
    using Microsoft.CodeAnalysis.CSharp.Syntax;

    public class MyWalker : CSharpSyntaxWalker
    {
        public MyWalker(SyntaxNode node) :
          base(SyntaxWalkerDepth.StructuredTrivia)
        {
            this.Root = node;
        }

        public SyntaxNode Root { get; private set; }

        public void Start()
        {
            this.Visit(this.Root);
        }

        sealed public override void VisitAccessorDeclaration(AccessorDeclarationSyntax node)
        {
            this.DoSomething(node, this.type.IsInstanceOfType(node));
        }

        ...

        sealed public override void VisitYieldStatement(YieldStatementSyntax node)
        {
            this.DoSomething(node, this.type.IsInstanceOfType(node));
        }

        // BREAKPOINT IN THE BODY OF THIS FUNCTION!
        private void DoSomething(SyntaxNode node)
        {
            ...
        }       
    }
}

我从VisitAccessorDeclarationVisitYieldStatement按字母顺序排列所有访问方法。我这样做只是为了尝试一些东西,而不是真正的应用程序,我知道这是非常废话。

访问

我跑了:

SyntaxNode root = CSharpSyntaxTree.ParseText(source).GetRoot();

然后跑步者:

var astWalker = new MyWalker(this.Root);
astExecutor.Start();
// NEXT OPERATION

会发生什么?我在函数DoSomething上设置了断点,我希望它很多次。实际上它不会发生。它只发生在一个节点上:VisitCompilationUnit。在控制流传递到// NEXT OPERATION之后就是这样。

我错过了什么?感谢

1 个答案:

答案 0 :(得分:2)

在您的覆盖中,您需要调用要覆盖的方法的基本版本。我们允许你停止散步。通过不调用base,如果您尝试仅访问特定节点,则可以控制它。