为什么lookupsymbols api的结果不同?

时间:2017-02-16 06:45:32

标签: .net roslyn roslyn-code-analysis

我将在方法体中获取局部变量的符号,因此我使用semanticModel.LookupSymbols。但结果与本地变量无关。 代码是:

var workspace = MSBuildWorkspace.Create();
var solution = workspace.OpenSolutionAsync(soluPath).Result;
var doc = solution.Projects[0].Documents[0];
var tree = doc.getSyntaxTreeASync().Result;
var semanticModel = doc.getSemanticModelASync().Result;
var symbols = semanticModel.LookupSymbols(tree.Length);

但如果我尝试另一种方式,结果就有了它。代码是:

var tree=SyntaxFactory.ParseSyntaxTree(source);
var compilation = VisualBasicCompilation.Create("m",new []{tree},new[]{mscorlib});
var semanticModel = compilation.GetSemanticModel(tree);
var symbols=model.LookupSymbols(tree.Length);

示例来源:

Class C
End Class
Moudle Program
    Private i As Integer = 0

    Public Sub Main()
        DIm j as Integer = 0 : j += i
    End Sub
End Module

第一个代码输出:

C
Program
Public Sub Main()

第二个代码输出:

C
j
Microsoft
Private i As Integer
Program
Public Sub Main()
System
Windows

我的目标是本地变量" j"。   他们有什么不同? 感谢〜

1 个答案:

答案 0 :(得分:1)

这里有两件事:

  1. 您提供树的参数.Length是您要查询的位置。您的本地变量在该位置无法显示。
  2. 您的编辑必须混淆为一个代码示例,或另一个,或两者。当您进行编辑时,请调用GetDiagnostics()并查看其他内容是否有问题。由于某种原因,您可能没有在MSBuildWorkspace案例中获得引用。