Eclipse plugin 检查函数是否为虚拟函数

Eclipse plugin 检查函数是否为虚拟函数,eclipse-plugin,eclipse-cdt,Eclipse Plugin,Eclipse Cdt,有没有办法通过EclipseCDT的AST检查函数是否是虚拟的 我试图通过使用ICPPASTFunctionDeclarator节点上的访问者来执行这种检查。它有以下方法:ISOULIDRIEW()、ISPURIVALILL()、ISFAILL()等。缺少ISSuffar()之类的东西。 < P> C++语法有一些奇怪之处。其中之一是,函数声明器产品仅涵盖函数声明的一部分,该部分从函数名开始(从技术上讲,它还包括函数名之前的函数返回类型中的任何指针运算符),并在函数声明的结尾(或函数体的开头)结

有没有办法通过EclipseCDT的AST检查函数是否是虚拟的


我试图通过使用ICPPASTFunctionDeclarator节点上的访问者来执行这种检查。它有以下方法:ISOULIDRIEW()、ISPURIVALILL()、ISFAILL()等。缺少ISSuffar()之类的东西。

< P> C++语法有一些奇怪之处。其中之一是,函数声明器产品仅涵盖函数声明的一部分,该部分从函数名开始(从技术上讲,它还包括函数名之前的函数返回类型中的任何指针运算符),并在函数声明的结尾(或函数体的开头)结束

函数的返回类型(指针运算符除外)和声明开头的其他说明符(包括
virtual
)是称为decl说明符的同级节点的一部分

因此,如果您的起点是一个函数声明符,那么您必须通过其父级导航到decl说明符。父级可以是一个简单声明(如果函数声明没有主体),也可以是一个函数定义(带有主体的声明),您必须检查每种情况

拥有decl说明符后,可以使用
icppastdeclsspecifier.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
关键字,也需要更多的考虑。我认为使用CDT的公共API并不是一个简单的方法,但如果您愿意使用内部API,它会变得更容易。如果您对此感兴趣,请告诉我,我可以提供更多详细信息。

非常感谢您的明确解释。我认为我将使用您的第一个解决方案生存下来,因为我至少需要检测顶级虚拟功能(这总是可能的)。我不确定我是否可以使用内部API,因为我在使用Codan的访问(…)方法,所以我想CDT的公共API是唯一可以做到这一点的方法。你能告诉我CDT AST有没有AST查看器吗?@temp35234:CDT中没有内置AST查看器。有一组扩展包含AST查看器,但我从未尝试过。