2017-02-16 103 views
0

我會在方法體中的局部變量的符號,所以我用semanticModel.LookupSymbols.but結果有任何關於本地變量。 的代碼是:爲什麼lookupsymbols api的結果不同?

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」。 它們有什麼區別? 感謝〜

+0

有什麼不同?你期望看到什麼,你實際看到了什麼? – JoshVarty

+0

'tree.Length'不會有任何有用的符號。 – SLaks

+0

如果tree.Length是無益的,參數應該是什麼? –

回答

1

有兩件事情怎麼回事:

  1. 你給tree.Length的參數是你查詢的位置。您的本地變量在該位置不可見。
  2. 你的編譯必須搞砸了一個代碼示例,或其他的,或兩者兼而有之。在編譯時,調用GetDiagnostics()並查看其他內容是否看起來不正確。出於某種原因,您可能沒有在MSBuildWorkspace案例中找到引用。
相關問題