Как найти узлы перед данным узлом с Roslyn?
Я разрабатываю анализатор Roslyn для обнаружения использования определенного метода, method1
, Я хочу разрешить использование этого метода в for
а также while
зацикливается и создает проблему во всех других случаях в коде.
Как я могу это сделать? Код, который я разработал, обнаруживает method1
везде. Теперь я хочу, чтобы каждый раз, когда я нахожу функцию, проверял, в цикле она или нет, и генерировал ошибку, только если она не в цикле.
1 ответ
Вызов метода будет потомком объявления цикла, если он внутри него. Вы можете получить доступ к Ancestors
собственность любого SyntaxNode
, Начни подниматься среди предков MethodInvocation
узел, который вы обнаружили, пока не попадете в цикл или объявление члена.
Если вы нажмете на петлю (ForStatementSyntax
или же WhileStatementSyntax
) тогда ты хороший. Если вы нажмете MemberDeclarationSyntax
узел, который означает, что вы достигли начала любого блока, в котором ваш method1
вызывается и, вероятно, должен выдать ошибку.
На данный момент ваша непосредственная проблема в основном решена, и вы должны решить, сколько угловых случаев вы хотите охватить. Что если он вызывается из лямбда-выражения? Что делать, если метод, который вызывает method1
вызывается из цикла? Или из рекурсивного метода?
Вы можете обнаружить все эти случаи, но вы должны решить, стоит ли это усилий.