我在使用Roslyn识别上下文关键字(var,yield,async等)时遇到了一些困难。我继承自CSharpSyntaxWalker
并覆盖VisitToken
。 SyntaxToken
公开了一种扩展方法IsContextualKeyword()
,但它总是返回false。
这是一个应该在语法树中输出所有上下文关键字的示例:
public class TokenWalker : CSharpSyntaxWalker
{
public TokenWalker() : base(SyntaxWalkerDepth.Token) { }
public override void VisitToken(SyntaxToken token)
{
//Trying to determine if we're visiting a contextual keyword
if (token.IsContextualKeyword())
{
Console.WriteLine(token.ToString());
}
base.VisitToken(token);
}
}
使用此课程如下:
public static void TaggingVarKeyword()
{
var tree = CSharpSyntaxTree.ParseText(@"
public class MyClass
{
public void MyMethod()
{
var var = 4;
}
}
");
var walker = new TokenWalker();
walker.Visit(tree.GetRoot());
}
我希望输出' var',但我根本没有输出。
如果我在VisitToken()
处设置断点,我会看到var以IdentifierToken
而不是TypeVarKeyword
传入。
是否可以在纯粹的语法层面确定上下文关键字?如果是这样,你知道我该怎么做吗?