2012-12-12 24 views
4

我正在使用Roslyn的2012年9月CTP。Roslyn:如何獲得未解決的類型

什麼是最優雅的方式來獲得未解決的類型在C#代碼文檔?例如。類型Guid需要System名稱空間。目前我有這樣的事情:

  var semanticModel = (SemanticModel)document.GetSemanticModel(); 
      var tree = (SyntaxTree)document.GetSyntaxTree(); 

      //get unresolved types 
      var unresolvedTypes = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>() 
       .Where(x => semanticModel.GetSymbolInfo(x).Symbol == null); 

使用IdentifierNameSyntax和GetSymbolInfo是否正確?

也就是GetSymbolInfo的區別GetTypeInfo的,他們看起來非常相似,我。

回答

8

這裏有幾個問題。

問:使用IdentifierNameSyntax是否正確?
答:您可能想使用SimpleNameSyntax來處理解析泛型類型。此外,你可能不想看ALL SimpleNameSyntax元素。你會得到假陽性的事情,其實不是一個類型的上下文(例如,想像這樣var x = Console();

Q一些代碼:這是正確使用GetSymbolInfo,並檢查空
?答:是的,這是在這裏檢查正確的事情

問:是什麼GetSymbolInfoGetTypeInfo的區別
?答:對於代表一個類型名稱,沒有任何區別。然而,對於任意表達式語法GetSymbolInfo代表的特定符號表達式(例如,方法調用,索引器訪問,數組訪問,重載操作符等)和GetTypeInfo表示結果類型(這樣,如果爲表達式添加聲明,您將知道生成的類型)。以「myString.GetHashCode()」的InvocationExpressionSyntax爲例。 GetSymbolInfo將返回方法符號GetHashCode(),而GetTypeInfo將返回System.Int32

+0

像'var x = Console();'這樣的東西是不可編譯的,所以可以檢查這種代碼的正確性,對吧?如果不是,應該避免使用什麼'SimpleNameSyntax'元素? – Skyblade

相關問題