我目前想编写一个小型分析器,用于验证一些可链接的方法调用。
使用
context.RegisterOperationAction(AnalyzeOperationAction, OperationKind.Invocation);
时,我能够挂钩 x = test.doSth()
形式的所有内容,并且可以从语义上下文中检索大量信息,例如 test
、doSth()
、doSth() is from class XY
、doSth() returns a string
等.
但是我想知道
test
的类型 - 仅使用信息 doSth() is from class XY
不适用于扩展方法。
完整示例:
class TestClazz
{
public List<String> test2 { get; set; }
}
static void Main(string[] args)
{
var test = new TestClazz();
var x = test.test2.ToArray();
}
下面的分析器代码是我到目前为止得到的,但即使几个小时后我也无法从“测试”“跳转”到类型“TestClazz”
private static void AnalyzeOperationAction(OperationAnalysisContext context)
{
var wholeExpression = context.Operation.Syntax; // test.test2.ToArray()
var instance = wholeExpression.GetFirstToken(); // test
//Invalid: 'Microsoft.CodeAnalysis.SyntaxToken' to 'Microsoft.CodeAnalysis.SyntaxNode'
var type = context.Operation.SemanticModel.GetSymbolInfo(instance);
var diagnostic = Diagnostic.Create(MissingInitCallDescriptor, context.Operation.Syntax.GetLocation(), type);
context.ReportDiagnostic(diagnostic);
}
任何想法,如何从“Microsoft.CodeAnalysis.SyntaxToken”跳转到“Microsoft.CodeAnalysis.SyntaxNode”?
我基本上想在进行实际检查和创建诊断之前验证
test
是 TestClazz
的实例。
询问 SO 总是有帮助的 - 总是在 5 分钟后找到答案 :P
var wholeExpression = context.Operation.Syntax; //test.test2.ToArray();
var instance = wholeExpression.GetFirstToken(); //test
var type = context.Operation.SemanticModel.GetTypeInfo(instance.Parent).Type; //App.Programm.TestClazz
(
Microsoft.CodeAnalysis.SyntaxToken
是Microsoft.CodeAnalysis.SyntaxNode
的一部分,或者说,每个节点都是由多个Token组成的。因此,token.parent
提供了所需的Node-Type。