Проверьте, является ли функция виртуальной - PullRequest
1 голос
/ 12 марта 2019

Есть ли способ проверить, является ли функция виртуальной или нет из AST Eclipse CDT?

Я пытался выполнить такую ​​проверку с помощью посетителя на узле ICPPASTFunctionDeclarator . Он имеет следующие методы: isOverride () , isPureVirtual () , isFinal () и т. Д. Что-то вроде isVirtual () is отсутствует.

1 Ответ

2 голосов
/ 12 марта 2019

Грамматика C ++ имеет некоторые странности.Одна из них заключается в том, что объявление функции охватывает только часть объявления функции, начиная с имени функции (технически оно также включает в себя любые операторы указателя из типа, возвращаемого функцией, предшествующегоимя функции) и заканчивается в конце объявления функции (или в начале тела функции).

Тип возврата функции (опять-таки, за исключением операторов указателя ) и другихСпецификаторы, которые идут в начале объявления (включая virtual), являются частью одноуровневого узла, называемого decl-спецификатор .

Итак, если ваша отправная точка - Декларатор функции , вам нужно перейти к decl-спецификатору через его родителя.Родителем может быть либо простое объявление (в случае объявления функции без тела), либо определение функции (объявление с телом), и вы должны проверять каждый случай.

Если у вас есть decl-спецификатор , вы можете проверить виртуальный, используя ICPPASTDeclSpecifier.isVirtual().

В коде:

// declarator is your ICPPASTFunctionDeclarator
ICPPASTDeclSpecifier declSpec = null;
if (declarator.getParent() instanceof IASTSimpleDeclaration) {
    declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration) declarator.getParent()).getDeclSpecifier();
} else if (declarator.getParent() instanceof IASTFunctionDefinition) {
    declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition) declarator.getParent()).getDeclSpecifier();
}
if (declSpec != null) {
    boolean isVirtual = declSpec.isVirtual();
}

Наконец, обратите внимание, что вышеизложенное говорит вам о том, появляется ли ключевое слово virtual в объявлении функции.

Функция может быть виртуальной без ключевого слова virtual, появляющегося в ее объявлении, если это функция впроизводный класс, переопределяющий виртуальную функцию в базовом классе.

Если вы действительно хотите знать, является ли функция виртуальной, даже если ключевое слово virtual не используется, это более сложная задача.Я не думаю, что есть простой способ сделать это с помощью общедоступных API-интерфейсов CDT, но легче, если вы захотите использовать внутренние API-интерфейсы.Дайте мне знать, если вы заинтересованы в этом, я могу предоставить более подробную информацию.

...