Я пишу анализатор, чтобы определить, вызывается ли определенный метод из абстрактного класса в конкретном методе или через вложенность.
Используя семантическую модель и синтаксис объявления метода, я могу достичь его первого предка:
private void MethodA()
{
AbstractA();
}
Я должен быть в состоянии произвести диагностику, если AbstractA()
вызван внутри MethodA()
. Если код такой, как показано выше, то через FirstAncestorOrSelf
это возможно, но что если:
private void MethodA()
{
MethodB();
}
private void MethodB()
{
AbstractA()
}
Я должен быть в состоянии обнаружить, вызван ли AbstractA()
через MethodB()
в MethodA()
и произвести диагностику.
Или просто, если AbstractA()
вызывается с нескольких уровней вложенности:
private void MethodA()
{
MethodB();
}
private void MethodB()
{
MethodC();
}
private void MethodC()
{
AbstractA();
}
В этом случае я также смогу произвести диагностику.