2014-02-17 3 views
9

Я пытаюсь построить график вызовов методов и свойств C#. Это по сути означает, что я ищу проект для узлов MethodDeclarationSyntax и PropertyDeclarationSyntax. Я тогда строить связи между этими узлами с помощью поиска вызовов методов с помощью:Найти свойство «invocations» с Roslyn

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

Есть ли подобный метод или рекомендуемый способ найти все имущество «вызовы», а? Я считаю, что компилятор C# разбивает свойства на функции Getter и Setter при компиляции.

Каков наилучший способ определения использования свойств с помощью Roslyn?

ответ

6

Модель Roslyn следует за источником, а не IL, и поэтому индивидуальные вызовы методов get и set не представлены.

Для этого вам необходимо найти все узлы MemberAccessExpression и IdentifierNameSyntax и вызвать GetSymbolInfo, чтобы узнать, относятся ли они к свойству.

В качестве альтернативы вам следует подумать о том, чтобы поднять уровень, чтобы использовать модель рабочей области, и вместо этого использовать API FindReferences.

+0

Что-то изменилось? Я вижу некоторые общедоступные API-интерфейсы, касающиеся не-исходного кода (свойства getters/seters): http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis/Symbols/IMethodSymbol.cs,1630ca4680652d53, ссылки – JoshVarty

+0

Нет, мы всегда были такие, потому что иногда вам все равно нужно их найти. Например, если у вас есть свойство X, вам нужно знать, что имена get_X и set_X теперь недействительны. Это не тот случай, когда мы * только * представляем вещи, которые появляются в источнике (мы также представляем неявные преобразования), но в целом философия следующего источника все еще применяется. –

Смежные вопросы