2014-02-17 42 views
9

我正在嘗試構建C#方法和屬性的調用圖。這基本上意味着我在項目中搜索了MethodDeclarationSyntaxPropertyDeclarationSyntax節點。與Roslyn查找屬性「invocations」

SyntaxNode node = ...; //Some syntax node 
var methodInvocations = node.DescendantNodesAndSelf().OfType<InvocationExpressionSyntax>(); 
//Process these method invocations 

是否有類似的方法或建議的方式找到所有的財產「調用」以及:然後我通過通過尋找方法調用建立這些節點之間的連接?我相信C#編譯器會在編譯時將屬性分解爲Getter和Setter函數。

什麼是檢測Roslyn屬性使用情況的最佳方法?

回答

6

Roslyn模型遵循源代碼,而不是IL,因此對get和set方法的單個調用沒有表示。

爲了做到這一點,您需要找到所有的MemberAccessExpressionIdentifierNameSyntax節點並調用GetSymbolInfo來查看它們是否引用該屬性。

或者,您應該考慮使用工作空間模型來提升級別,然後調用FindReferences API。

+0

有事變了嗎?我看到一些公開的API處理非源代碼(屬性獲取/設置器):http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis/Symbols/IMethodSymbol.cs,1630ca4680652d53,references – JoshVarty

+0

不,我們已經總是有這些,因爲有時你需要找到那些。例如,如果您有屬性X,則需要知道名稱get_X和set_X現在無效。我們並不僅僅表示出現在源代碼中的東西(我們也表示隱式轉換),但總的來說,後續源代碼的哲學仍然適用。 –