我正在尝试创建一个分析器,该分析器将查找每个方法调用的来源,尤其是方法定义的类。
假设我们有以下代码:
Movie myMovie = new Movie();
myMovie.Rent();
到目前为止,我的分析器可以将表达式myMovie.Rent()
返回为ExpressionSyntax
我要的是在这种情况下分析器找到了使用对象myMovie.Rent()
进行方法调用的地方,返回了定义方法并在这种情况下实例化该对象的类是Movie
我很抱歉,如果您有任何想法或代码示例,为什么不为它编写任何代码,我对此表示感谢。
答案 0 :(得分:1)
首先,在分析器类的Initialize
方法内,您应该注册语法节点操作 :
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(SyntaxNodeAnalyze, SyntaxKind.InvocationExpression);
}
在此方法中,我们注册了SyntaxNodeAnalyze
方法以从分析器获取回调。在此方法内部,通过使用'SyntaxNodeAnalysisContext',我们可以查询有关semantic objects
的信息。在以下示例中,我使用SemanticModel
来枚举已声明的自定义属性,现在,在方法声明上方使用了它们。
private static void SyntaxNodeAnalyze(SyntaxNodeAnalysisContext context)
{
SemanticModel semanticModel = context.SemanticModel;
InvocationExpressionSyntax method = (InvocationExpressionSyntax)context.Node;
var info = semanticModel.GetSymbolInfo(method).Symbol;
if (info == null)
return new List<AttributeData>();
var attribs = info.GetAttributes().Where(f => f.AttributeClass.MetadataName.Equals(typeof(ThrowsExceptionAttribute).Name));
foreach (var attrib in attribs)
{
...
}
}
如您在上面的代码中看到的,我们可以使用'SemanticModel'的GetSymbolInfo
方法来收集有用的信息。您可以使用此方法获取有关方法,属性和其他语义对象的信息。