1*2b3c8603SArnaud A. de Grandmaison #include "clang-c/CXCompilationDatabase.h" 2*2b3c8603SArnaud A. de Grandmaison #include "clang/Tooling/CompilationDatabase.h" 3*2b3c8603SArnaud A. de Grandmaison #include "CXString.h" 4*2b3c8603SArnaud A. de Grandmaison 5*2b3c8603SArnaud A. de Grandmaison using namespace clang; 6*2b3c8603SArnaud A. de Grandmaison using namespace clang::tooling; 7*2b3c8603SArnaud A. de Grandmaison using namespace clang::cxstring; 8*2b3c8603SArnaud A. de Grandmaison 9*2b3c8603SArnaud A. de Grandmaison extern "C" { 10*2b3c8603SArnaud A. de Grandmaison 11*2b3c8603SArnaud A. de Grandmaison // FIXME: do something more usefull with the error message 12*2b3c8603SArnaud A. de Grandmaison CXCompilationDatabase 13*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompilationDatabase_fromDirectory( 14*2b3c8603SArnaud A. de Grandmaison const char *BuildDir, 15*2b3c8603SArnaud A. de Grandmaison CXCompilationDatabase_Error *ErrorCode) 16*2b3c8603SArnaud A. de Grandmaison { 17*2b3c8603SArnaud A. de Grandmaison std::string ErrorMsg; 18*2b3c8603SArnaud A. de Grandmaison CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError; 19*2b3c8603SArnaud A. de Grandmaison 20*2b3c8603SArnaud A. de Grandmaison CompilationDatabase *db = CompilationDatabase::loadFromDirectory(BuildDir, 21*2b3c8603SArnaud A. de Grandmaison ErrorMsg); 22*2b3c8603SArnaud A. de Grandmaison 23*2b3c8603SArnaud A. de Grandmaison if (!db) { 24*2b3c8603SArnaud A. de Grandmaison fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str()); 25*2b3c8603SArnaud A. de Grandmaison Err = CXCompilationDatabase_CanNotLoadDatabase; 26*2b3c8603SArnaud A. de Grandmaison } 27*2b3c8603SArnaud A. de Grandmaison 28*2b3c8603SArnaud A. de Grandmaison if (ErrorCode) 29*2b3c8603SArnaud A. de Grandmaison *ErrorCode = Err; 30*2b3c8603SArnaud A. de Grandmaison 31*2b3c8603SArnaud A. de Grandmaison return db; 32*2b3c8603SArnaud A. de Grandmaison } 33*2b3c8603SArnaud A. de Grandmaison 34*2b3c8603SArnaud A. de Grandmaison void 35*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompilationDatabase_dispose(CXCompilationDatabase CDb) 36*2b3c8603SArnaud A. de Grandmaison { 37*2b3c8603SArnaud A. de Grandmaison delete static_cast<CompilationDatabase *>(CDb); 38*2b3c8603SArnaud A. de Grandmaison } 39*2b3c8603SArnaud A. de Grandmaison 40*2b3c8603SArnaud A. de Grandmaison struct AllocatedCXCompileCommands 41*2b3c8603SArnaud A. de Grandmaison { 42*2b3c8603SArnaud A. de Grandmaison std::vector<CompileCommand> CCmd; 43*2b3c8603SArnaud A. de Grandmaison 44*2b3c8603SArnaud A. de Grandmaison AllocatedCXCompileCommands(const std::vector<CompileCommand>& Cmd) 45*2b3c8603SArnaud A. de Grandmaison : CCmd(Cmd) 46*2b3c8603SArnaud A. de Grandmaison { } 47*2b3c8603SArnaud A. de Grandmaison }; 48*2b3c8603SArnaud A. de Grandmaison 49*2b3c8603SArnaud A. de Grandmaison CXCompileCommands 50*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb, 51*2b3c8603SArnaud A. de Grandmaison const char *CompleteFileName) 52*2b3c8603SArnaud A. de Grandmaison { 53*2b3c8603SArnaud A. de Grandmaison if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { 54*2b3c8603SArnaud A. de Grandmaison const std::vector<CompileCommand> 55*2b3c8603SArnaud A. de Grandmaison CCmd(db->getCompileCommands(CompleteFileName)); 56*2b3c8603SArnaud A. de Grandmaison if (!CCmd.empty()) 57*2b3c8603SArnaud A. de Grandmaison return new AllocatedCXCompileCommands( CCmd ); 58*2b3c8603SArnaud A. de Grandmaison } 59*2b3c8603SArnaud A. de Grandmaison 60*2b3c8603SArnaud A. de Grandmaison return 0; 61*2b3c8603SArnaud A. de Grandmaison } 62*2b3c8603SArnaud A. de Grandmaison 63*2b3c8603SArnaud A. de Grandmaison void 64*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommands_dispose(CXCompileCommands Cmds) 65*2b3c8603SArnaud A. de Grandmaison { 66*2b3c8603SArnaud A. de Grandmaison delete static_cast<AllocatedCXCompileCommands *>(Cmds); 67*2b3c8603SArnaud A. de Grandmaison } 68*2b3c8603SArnaud A. de Grandmaison 69*2b3c8603SArnaud A. de Grandmaison unsigned 70*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommands_getSize(CXCompileCommands Cmds) 71*2b3c8603SArnaud A. de Grandmaison { 72*2b3c8603SArnaud A. de Grandmaison if (!Cmds) 73*2b3c8603SArnaud A. de Grandmaison return 0; 74*2b3c8603SArnaud A. de Grandmaison 75*2b3c8603SArnaud A. de Grandmaison AllocatedCXCompileCommands *ACC = 76*2b3c8603SArnaud A. de Grandmaison static_cast<AllocatedCXCompileCommands *>(Cmds); 77*2b3c8603SArnaud A. de Grandmaison 78*2b3c8603SArnaud A. de Grandmaison return ACC->CCmd.size(); 79*2b3c8603SArnaud A. de Grandmaison } 80*2b3c8603SArnaud A. de Grandmaison 81*2b3c8603SArnaud A. de Grandmaison CXCompileCommand 82*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I) 83*2b3c8603SArnaud A. de Grandmaison { 84*2b3c8603SArnaud A. de Grandmaison if (!Cmds) 85*2b3c8603SArnaud A. de Grandmaison return 0; 86*2b3c8603SArnaud A. de Grandmaison 87*2b3c8603SArnaud A. de Grandmaison AllocatedCXCompileCommands *ACC = 88*2b3c8603SArnaud A. de Grandmaison static_cast<AllocatedCXCompileCommands *>(Cmds); 89*2b3c8603SArnaud A. de Grandmaison 90*2b3c8603SArnaud A. de Grandmaison if (I >= ACC->CCmd.size()) 91*2b3c8603SArnaud A. de Grandmaison return 0; 92*2b3c8603SArnaud A. de Grandmaison 93*2b3c8603SArnaud A. de Grandmaison return &ACC->CCmd[I]; 94*2b3c8603SArnaud A. de Grandmaison } 95*2b3c8603SArnaud A. de Grandmaison 96*2b3c8603SArnaud A. de Grandmaison CXString 97*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommand_getDirectory(CXCompileCommand CCmd) 98*2b3c8603SArnaud A. de Grandmaison { 99*2b3c8603SArnaud A. de Grandmaison if (!CCmd) 100*2b3c8603SArnaud A. de Grandmaison return createCXString((const char*)NULL); 101*2b3c8603SArnaud A. de Grandmaison 102*2b3c8603SArnaud A. de Grandmaison CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); 103*2b3c8603SArnaud A. de Grandmaison return createCXString(cmd->Directory); 104*2b3c8603SArnaud A. de Grandmaison } 105*2b3c8603SArnaud A. de Grandmaison 106*2b3c8603SArnaud A. de Grandmaison unsigned 107*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommand_getNumArgs(CXCompileCommand CCmd) 108*2b3c8603SArnaud A. de Grandmaison { 109*2b3c8603SArnaud A. de Grandmaison if (!CCmd) 110*2b3c8603SArnaud A. de Grandmaison return 0; 111*2b3c8603SArnaud A. de Grandmaison 112*2b3c8603SArnaud A. de Grandmaison return static_cast<CompileCommand *>(CCmd)->CommandLine.size(); 113*2b3c8603SArnaud A. de Grandmaison } 114*2b3c8603SArnaud A. de Grandmaison 115*2b3c8603SArnaud A. de Grandmaison CXString 116*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg) 117*2b3c8603SArnaud A. de Grandmaison { 118*2b3c8603SArnaud A. de Grandmaison if (!CCmd) 119*2b3c8603SArnaud A. de Grandmaison return createCXString((const char*)NULL); 120*2b3c8603SArnaud A. de Grandmaison 121*2b3c8603SArnaud A. de Grandmaison CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 122*2b3c8603SArnaud A. de Grandmaison 123*2b3c8603SArnaud A. de Grandmaison if (Arg >= Cmd->CommandLine.size()) 124*2b3c8603SArnaud A. de Grandmaison return createCXString((const char*)NULL); 125*2b3c8603SArnaud A. de Grandmaison 126*2b3c8603SArnaud A. de Grandmaison return createCXString(Cmd->CommandLine[Arg]); 127*2b3c8603SArnaud A. de Grandmaison } 128*2b3c8603SArnaud A. de Grandmaison 129*2b3c8603SArnaud A. de Grandmaison 130*2b3c8603SArnaud A. de Grandmaison } // end: extern "C" 131