Поиск, содержащий MethodDeclarationSyntax для данного SyntaxNode - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующий исходный код:

public void MethodAssignment_WithIndexQuery_1(Customer from1, Customer to1, decimal amount) 
{
     var customers = _customerRepository.GetWhere(to1.Age);
     Customer indexCustomer1 = customers[(from1.Age + to1.Age)* to1.Age];
}

, и у меня есть данный синтаксический узел: node = from1.Age выражения в аргументе индекса.

Выполнение этого приводит к нулю:

MethodDeclarationSyntax callingMethod = node
                .GetLocation()
                .SourceTree
                .GetRoot()
                .FindToken(location.SourceSpan.Start)
                .Parent
                .AncestorsAndSelf()
                .OfType<MethodDeclarationSyntax>()
                .FirstOrDefault();

Выполнение node.Parent.Parent возвращает BinaryExpressionSyntax AddExpression from1.Age * to2.Age+ to1.Age * to2.Age и выполнение Родитель этого дает null .

Как я могу найти MethodDeclaration, который охватывает данный синтаксический узел?

Ответы [ 2 ]

0 голосов
/ 19 июня 2018

Вы можете получить метод включения узла с помощью Ancestors():

MethodDeclarationSyntax callingMethod = node
                .Ancestors()
                .OfType<MethodDeclarationSyntax>()
                .FirstOrDefault();
0 голосов
/ 30 мая 2018

A SyntaxWalker позволяет найти определенные узлы.Вот пример того, как вы выбираете все узлы AddExpression:

public class MethodDeclarationSyntaxWalker : CSharpSyntaxWalker
{
    private readonly IList<MethodDeclarationSyntax> _matches;

    public MethodDeclarationSyntaxWalker( IList<MethodDeclarationSyntax> matches )
    {
        _matches = matches;
    }

    public override void VisitBinaryExpression( BinaryExpressionSyntax node )
    {
        if ( node.Kind() == SyntaxKind.AddExpression )
            _matches.Add( node.FirstAncestorOrSelf<MethodDeclarationSyntax>() );

        base.VisitBinaryExpression( node );
    }
}

Если вы передадите это в функцию Accept синтаксиса декларации, и она соберет совпадения для данного узла.Например:

var classDeclaration = ( ClassDeclarationSyntax )analysisContext.Node;
var matches = new List<MethodDeclarationSyntax>();
classDeclaration.Accept( new MethodDeclarationSyntaxWalker( matches ) );
...