C# 分析器,获取调用操作的实例类型

问题描述 投票:0回答:1

我目前想编写一个小型分析器,用于验证一些可链接的方法调用。

使用

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
的实例。

c# analyzer
1个回答
0
投票

询问 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。

© www.soinside.com 2019 - 2024. All rights reserved.