[英]How to get symbol info from semantic model in roslyn?
我正在尝试在Roslyn中创建代码分析器,我需要分析项目中的SqlCommand用法。 我已经编写了分析器,当我在Visual Studio项目中测试它时它工作正常,但是当我编写单元测试时,我正在尝试从SemanticModel
获取SymbolInfo
并且总是变为null。
我错过了什么?
string test = @"public class TestClass
{
public void SomeMethod(int x)
{
var command = new SqlCommand(""Some COmmabnd"",new SqlConnection(""conn string""));
command.ExecuteReader();
}
}";
var tree = CSharpSyntaxTree.ParseText(test);
var systemDataReference = MetadataReference.CreateFromFile(typeof(System.Data.IDbCommand).Assembly.Location);
var systemConfigurationReference = MetadataReference.CreateFromFile(typeof(ConfigurationManager).Assembly.Location);
var systemTransactionReference = MetadataReference.CreateFromFile(typeof(Transaction).Assembly.Location);
var systemXmlnReference = MetadataReference.CreateFromFile(typeof(XPathDocument).Assembly.Location);
var system = MetadataReference.CreateFromFile(typeof(Uri).Assembly.Location);
var mscorRef = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var systemCore = MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location);
var systemNumerics = MetadataReference.CreateFromFile(typeof(BigInteger).Assembly.Location);
var compilation = CSharpCompilation.Create("TestCompilatin", new[] {tree},
new[]
{
mscorRef, system, systemXmlnReference, systemTransactionReference, systemDataReference,
systemConfigurationReference,systemCore,systemNumerics
});
var semanticModel = compilation.GetSemanticModel(tree);
var invocationExpressions = tree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>();
foreach (var invocationExpressionSyntax in invocationExpressions)
{
var memeber = invocationExpressionSyntax.Expression as MemberAccessExpressionSyntax;
var symbolInfo = semanticModel.GetSymbolInfo(memeber);
}
semanticModel.GetSymbolInfo()
为我尝试的任何东西返回带有空符号的SymbolInfo
。
另一个可能的原因是调用方法的源文件尚未在语法上解析并添加到编译中。 您始终可以获取有关在调用者的语法树中调用的方法的一些信息,但除非已将调用的方法添加到编译中,否则它将无法在语义模型中使用。 在考虑了一下之后,这是非常明显的。 当然,语义模型将不具有关于尚未处理的方法的信息。 可以使用AddSyntaxTrees()方法将多个语法树添加到单个编译中。 请注意,此方法返回一个新的编译实例。
希望这会节省一些时间,我没有通过发布这个答案来羞辱自己。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.