Как найти узлы перед данным узлом с Roslyn?

Я разрабатываю анализатор Roslyn для обнаружения использования определенного метода, method1, Я хочу разрешить использование этого метода в for а также while зацикливается и создает проблему во всех других случаях в коде.

Как я могу это сделать? Код, который я разработал, обнаруживает method1 везде. Теперь я хочу, чтобы каждый раз, когда я нахожу функцию, проверял, в цикле она или нет, и генерировал ошибку, только если она не в цикле.

1 ответ

Решение

Вызов метода будет потомком объявления цикла, если он внутри него. Вы можете получить доступ к Ancestors собственность любого SyntaxNode, Начни подниматься среди предков MethodInvocation узел, который вы обнаружили, пока не попадете в цикл или объявление члена.

Если вы нажмете на петлю (ForStatementSyntax или же WhileStatementSyntax) тогда ты хороший. Если вы нажмете MemberDeclarationSyntax узел, который означает, что вы достигли начала любого блока, в котором ваш method1 вызывается и, вероятно, должен выдать ошибку.

На данный момент ваша непосредственная проблема в основном решена, и вы должны решить, сколько угловых случаев вы хотите охватить. Что если он вызывается из лямбда-выражения? Что делать, если метод, который вызывает method1 вызывается из цикла? Или из рекурсивного метода?

Вы можете обнаружить все эти случаи, но вы должны решить, стоит ли это усилий.

Другие вопросы по тегам