从 ObjectCreationExpressionSyntax 获取 ITypeSymbol
Getting an ITypeSymbol from an ObjectCreationExpressionSyntax
我想达到的目标
我想编写一个代码分析器来处理任何 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 - 如果是这样,我需要什么?
你能给我指出正确的方向吗?
您需要在 ObjectCreationSyntax
上使用 SemanticModel.GetSymbolInfo()
。
(在您的示例中,您可以在 context
上使用 SemanticModel
,这只是一个独立的示例)
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。我喜欢使用的规则是:
- 对名称中包含
DeclarationSyntax
的任何语法使用 GetDeclaredSymbol()
- 对所有其他语法使用
GetSymbolInfo()
。
我想达到的目标
我想编写一个代码分析器来处理任何 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 - 如果是这样,我需要什么?
你能给我指出正确的方向吗?
您需要在 ObjectCreationSyntax
上使用 SemanticModel.GetSymbolInfo()
。
(在您的示例中,您可以在 context
上使用 SemanticModel
,这只是一个独立的示例)
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。我喜欢使用的规则是:
- 对名称中包含
DeclarationSyntax
的任何语法使用GetDeclaredSymbol()
- 对所有其他语法使用
GetSymbolInfo()
。