c++ - poo - miembros de una clase en programacion orientada a objetos
Obtener una lista de métodos en clase usando clang (1)
Revisé este tutorial http://clang.llvm.org/docs/LibASTMatchersTutorial.html y encontré algunas cosas bastante útiles allí, esto es lo que se me ocurrió:
Tuve que cambiar el nombre de mi archivo de IFoo.h
a IFoo.hpp
para detectarlo como Cxx y no como código C.
Tuve que llamar a mi programa con -x c++
para que mi archivo IFoo.h
fuera reconocido como código C ++ en lugar de código C (clang interpreta *.h
archivos como C por defecto:
~/Development/llvm-build/bin/mytool ~/IFoo.h -- -x c++
Este es mi código para volcar todas las funciones virtuales de la clase proporcionada:
// Declares clang::SyntaxOnlyAction.
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
#include "clang/ASTMatchers/ASTMatchers.h"
// Declares llvm::cl::extrahelp.
#include "llvm/Support/CommandLine.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include <cstdio>
using namespace clang;
using namespace clang::ast_matchers;
using namespace clang::tooling;
using namespace llvm;
DeclarationMatcher methodMatcher = methodDecl(isVirtual()).bind("methods");
class MethodPrinter : public MatchFinder::MatchCallback {
public :
virtual void run(const MatchFinder::MatchResult &Result) {
if (const CXXMethodDecl *md = Result.Nodes.getNodeAs<clang::CXXMethodDecl>("methods")) {
md->dump();
}
}
};
// CommonOptionsParser declares HelpMessage with a description of the common
// command-line options related to the compilation database and input files.
// It''s nice to have this help message in all tools.
static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
// A help message for this specific tool can be added afterwards.
static cl::extrahelp MoreHelp("/nMore help text...");
int main(int argc, const char **argv) {
cl::OptionCategory cat("myname", "mydescription");
CommonOptionsParser optionsParser(argc, argv, cat, 0);
ClangTool tool(optionsParser.getCompilations(), optionsParser.getSourcePathList());
MethodPrinter printer;
MatchFinder finder;
finder.addMatcher(methodMatcher, &printer);
return tool.run(newFrontendActionFactory(&finder));
}
La salida se ve así, cuando pasa el archivo IFoo.h
:
CXXDestructorDecl 0x1709c30 <~/IFoo.h:5:3, col:20> ~IFoo ''void (void)'' virtual
`-CompoundStmt 0x1758128 <col:19, col:20>
CXXMethodDecl 0x1757e60 <~/IFoo.h:6:3, col:24> bar ''void (void)'' virtual pure
En IDEs comunes (elija uno) a menudo tiene una vista de esquema que le muestra la lista de métodos para una clase específica.
Supongamos que tengo una clase de interfaz C ++ en IFoo.h
que se ve así:
#ifndef IFOO_H_
#define IFOO_H_
class IFoo {
public:
virtual ~IFoo() {}
virtual void bar() = 0;
};
#endif
¿Cómo (programáticamente) puedo obtener una lista IDE outliner para mi archivo IFoo.h
arriba utilizando quizás las bibliotecas clang? Para empezar, me ayudaría si pudiera obtener una lista de nombres de funciones.
Específicamente intento utilizar clang, por lo que cualquier ayuda sobre cómo analizar el archivo de mi encabezado con clang sería muy apreciada.
Mientras tanto, echaré un vistazo al tutorial clang aquí: https://github.com/loarabia/Clang-tutorial
Gracias de antemano por tu ayuda.