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 に答える