【问题标题】:How to get symbol info from semantic model in roslyn?如何从 roslyn 的语义模型中获取符号信息?
【发布时间】:2018-10-17 23:12:55
【问题描述】:

我正在尝试在 Roslyn 中创建代码分析器,我需要分析项目中的 SqlCommand 使用情况。我已经编写了分析器,当我在 Visual Studio 项目中对其进行测试时它工作正常,但是当我编写单元测试并且我试图从 SemanticModel 获取 SymbolInfo 并且总是得到空值时。

我错过了什么?

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,我尝试的任何东西都带有空符号。

【问题讨论】:

  • 检查编译错误。
  • 感谢@SLaks 我错过了添加 using 语句。我期待 roslyn 编译会抛出错误,看来我错了。
  • @SriHarshaVelicheti 你是如何解决这个问题的?

标签: c# roslyn


【解决方案1】:

另一个可能的原因是被调用方法的源文件没有经过语法分析并添加到编译中。您始终可以在调用者的语法树中获得有关正在调用的方法的一些信息,但除非被调用的方法已经添加到编译中,否则它在语义模型中将不可用。这一点在考虑了一会儿之后就很明显了。当然,语义模型不会包含有关尚未处理的方法的信息。可以使用 AddSyntaxTrees() 方法将多个语法树添加到单个编译中。请注意,此方法返回一个 new 编译实例。

希望这会为某人节省一点时间,而且我发布这个答案并没有让自己太尴尬。

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2021-07-04
    相关资源
    最近更新 更多