0

我想达到什么

我想编写一个代码分析器,可以处理以下任何内容 ObjectCreationExpression

FruitMix fm = new FruitMix();

并允许我找出该类型实现的接口,如果找到特定接口则执行操作。

我试过的

我通过以下方式注册 SyntaxNodeAction 拦截了分析:

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(c=> AnalyzeObjectCreation(c), SyntaxKind.ObjectCreationExpression);         
}

为了获得接口 ITypeSymbol 似乎是我试图在注册方法中获得的方式:

private static void AnalyzeObjectCreation(SyntaxNodeAnalysisContext context)
{
    ObjectCreationExpressionSyntax objectCreation = (ObjectCreationExpressionSyntax) context.Node;

    //How do I get an INamedTypeSymbol here?

    //INamedTypeSymbol typeSyntax = (INamedTypeSymbol)objectCreation.Type;
    //ISymbol test = typeSyntax.AssociatedSymbol;    
    //ISymbol test = context.SemanticModel.GetDeclaredSymbol(context.Node);
    //SymbolInfo symbolInfo = context.SemanticModel.GetDeclaredSymbol()
}

如您所见,我已经尝试了所有可以在网上找到的方法,但均无济于事。也许我根本不应该寻找 INamedTypeSymbol - 如果是这样,我需要什么?

你能指出我正确的方向吗?

4

1 回答 1

4

你会想要SemanticModel.GetSymbolInfo()ObjectCreationSyntax.

(在您的示例中,您可以使用SemanticModelon context,这只是一个独立的示例)

var tree = CSharpSyntaxTree.ParseText(@"
using System;
public class MyClass
{
    public MyClass()
    {
    }
}
public class Program
{
    public static void Main()
    {
        var x = new MyClass();  
    }   
}");

var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { mscorlib });

var model = compilation.GetSemanticModel(tree);
var objectCreationSyntax = tree.GetRoot().DescendantNodes().OfType<ObjectCreationExpressionSyntax>().Single();

var namedTypeSymbol = model.GetSymbolInfo(objectCreationSyntax).Symbol;

看起来您正在玩弄GetDeclaredSymbol()可能返回 null 的东西。我喜欢使用的规则是:

  • 用于名称中GetDeclaredSymbol()包含名称的任何语法DeclarationSyntax
  • 用于GetSymbolInfo()所有其他语法。
于 2016-03-16T02:29:29.193 回答