2014-02-17 4 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

가지가 변경 되었습니까? 비 소스 코드 (속성 getters/setters)를 다루는 공개 API를 볼 수 있습니다. http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis/Symbols/IMethodSymbol.cs,1630ca4680652d53,references – JoshVarty

+0

아니요. 어쨌든 그것들을 찾을 필요가 있기 때문에 항상 그러한 것들이 있습니다. 예를 들어, X 속성이있는 경우 get_X 및 set_X 이름이 현재 유효하지 않음을 알아야합니다. 우리가 근원에 나타나는 것 (우리는 또한 암시 적 전환을 나타냄)을 나타내는 경우는 아니지만, 일반적으로 소스를 따르는 철학이 여전히 적용됩니다. –

관련 문제