2015-07-03 64 views
0

我試圖從ObjectCreationExpressionSyntax對象獲取符號信息但失敗。SemanticModel.GetSymbolInfo for ObjectCreationExpressionSyntax返回null

這裏是例子重現該問題:

public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() 
{ 
    foreach (var kvp in _hm.Where(x => x.Key.IsAlive)) 
    { 
     yield return new KeyValuePair<TKey, TValue>(kvp.Key.Target, kvp.Value); 
    } 
} 

GET 「new KeyValuePair<TKey, TValue>(kvp.Key.Target, kvp.Value)」 符號失敗 但使用羅斯林語法展示臺可以得到它。

我寫了一個方法,例如。

public static T GetRawSymbol<T>(SemanticModel semanticModel, SyntaxNode syntax) where T : class, ISymbol 
    { 
     var symbol = semanticModel.GetSymbolInfo(syntax).Symbol; 
     if (symbol == null) 
      symbol = semanticModel.GetDeclaredSymbol(syntax); 
     if (symbol == null) 
     { 
      symbol = semanticModel.GetPreprocessingSymbolInfo(syntax).Symbol; 
     } 
     if (symbol == null) 
      return symbol as T; 
     else 
      return symbol.OriginalDefinition as T; 
    } 

GetSymbolInfo, GetDeclaredSymbol, GetPreprocessingSymbolInfo都返回NULL

+1

根據https://github.com/dotnet/roslyn/issues/3825在這種情況下,GetDeclaredSymbol應該返回null,而返回null的GetSymbolInfo似乎是一個錯誤。 'GetPreprocessingSymbolInfo'可能有自己的故事。 – Grault

回答

1

ObjectCreationExpressionSyntax本身不具有的象徵。您需要從Type屬性中獲取符號,該屬性返回new關鍵字後面的類型的語法節點。

+0

因此沒有辦法獲得被調用構造函數的符號? – svick

+0

但是我不能只有這個符號,其他ObjectCreationExpressionSyntax我可以得到符號,例如。 A a = new A();這個符號不是null,你能告訴我爲什麼有些可以,另一個不可以? – bigbaldy

+1

Type屬性的符號是被調用的構造函數的類符號而不是構造函數的符號 – bigbaldy