AST walker 似乎不能正常工作
AST walker doesn't seem to work fine
我正在使用 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)
{
...
}
}
}
我正在覆盖所有访问方法,按字母顺序从 VisitAccessorDeclaration
到 VisitYieldStatement
。我这样做只是为了尝试,而不是为了实际应用,我知道这是胡说八道。
来访
我运行它:
SyntaxNode root = CSharpSyntaxTree.ParseText(source).GetRoot();
然后运行助行器:
var astWalker = new MyWalker(this.Root);
astExecutor.Start();
// NEXT OPERATION
会发生什么?我在函数 DoSomething
上设置了一个断点,我希望它会出现很多次。实际上它不会发生。它只发生在一个节点上:VisitCompilationUnit
。控制流在 // NEXT OPERATION
上传递后就是这样。
我错过了什么?谢谢
在您的覆盖中,您需要调用您正在覆盖的方法的基础版本。我们允许您停止步行。通过不调用 base,这样如果您只尝试访问特定节点,您可以控制它。
我正在使用 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)
{
...
}
}
}
我正在覆盖所有访问方法,按字母顺序从 VisitAccessorDeclaration
到 VisitYieldStatement
。我这样做只是为了尝试,而不是为了实际应用,我知道这是胡说八道。
来访
我运行它:
SyntaxNode root = CSharpSyntaxTree.ParseText(source).GetRoot();
然后运行助行器:
var astWalker = new MyWalker(this.Root);
astExecutor.Start();
// NEXT OPERATION
会发生什么?我在函数 DoSomething
上设置了一个断点,我希望它会出现很多次。实际上它不会发生。它只发生在一个节点上:VisitCompilationUnit
。控制流在 // NEXT OPERATION
上传递后就是这样。
我错过了什么?谢谢
在您的覆盖中,您需要调用您正在覆盖的方法的基础版本。我们允许您停止步行。通过不调用 base,这样如果您只尝试访问特定节点,您可以控制它。