12b3c8603SArnaud A. de Grandmaison #include "clang-c/CXCompilationDatabase.h" 22b3c8603SArnaud A. de Grandmaison #include "clang/Tooling/CompilationDatabase.h" 32b3c8603SArnaud A. de Grandmaison #include "CXString.h" 42b3c8603SArnaud A. de Grandmaison 52b3c8603SArnaud A. de Grandmaison using namespace clang; 62b3c8603SArnaud A. de Grandmaison using namespace clang::tooling; 72b3c8603SArnaud A. de Grandmaison using namespace clang::cxstring; 82b3c8603SArnaud A. de Grandmaison 92b3c8603SArnaud A. de Grandmaison extern "C" { 102b3c8603SArnaud A. de Grandmaison 112b3c8603SArnaud A. de Grandmaison // FIXME: do something more usefull with the error message 122b3c8603SArnaud A. de Grandmaison CXCompilationDatabase 13*fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_fromDirectory(const char *BuildDir, 142b3c8603SArnaud A. de Grandmaison CXCompilationDatabase_Error *ErrorCode) 152b3c8603SArnaud A. de Grandmaison { 162b3c8603SArnaud A. de Grandmaison std::string ErrorMsg; 172b3c8603SArnaud A. de Grandmaison CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError; 182b3c8603SArnaud A. de Grandmaison 192b3c8603SArnaud A. de Grandmaison CompilationDatabase *db = CompilationDatabase::loadFromDirectory(BuildDir, 202b3c8603SArnaud A. de Grandmaison ErrorMsg); 212b3c8603SArnaud A. de Grandmaison 222b3c8603SArnaud A. de Grandmaison if (!db) { 232b3c8603SArnaud A. de Grandmaison fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str()); 242b3c8603SArnaud A. de Grandmaison Err = CXCompilationDatabase_CanNotLoadDatabase; 252b3c8603SArnaud A. de Grandmaison } 262b3c8603SArnaud A. de Grandmaison 272b3c8603SArnaud A. de Grandmaison if (ErrorCode) 282b3c8603SArnaud A. de Grandmaison *ErrorCode = Err; 292b3c8603SArnaud A. de Grandmaison 302b3c8603SArnaud A. de Grandmaison return db; 312b3c8603SArnaud A. de Grandmaison } 322b3c8603SArnaud A. de Grandmaison 332b3c8603SArnaud A. de Grandmaison void 34*fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_dispose(CXCompilationDatabase CDb) 352b3c8603SArnaud A. de Grandmaison { 362b3c8603SArnaud A. de Grandmaison delete static_cast<CompilationDatabase *>(CDb); 372b3c8603SArnaud A. de Grandmaison } 382b3c8603SArnaud A. de Grandmaison 392b3c8603SArnaud A. de Grandmaison struct AllocatedCXCompileCommands 402b3c8603SArnaud A. de Grandmaison { 412b3c8603SArnaud A. de Grandmaison std::vector<CompileCommand> CCmd; 422b3c8603SArnaud A. de Grandmaison 432b3c8603SArnaud A. de Grandmaison AllocatedCXCompileCommands(const std::vector<CompileCommand>& Cmd) 442b3c8603SArnaud A. de Grandmaison : CCmd(Cmd) 452b3c8603SArnaud A. de Grandmaison { } 462b3c8603SArnaud A. de Grandmaison }; 472b3c8603SArnaud A. de Grandmaison 482b3c8603SArnaud A. de Grandmaison CXCompileCommands 49*fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb, 502b3c8603SArnaud A. de Grandmaison const char *CompleteFileName) 512b3c8603SArnaud A. de Grandmaison { 522b3c8603SArnaud A. de Grandmaison if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { 532b3c8603SArnaud A. de Grandmaison const std::vector<CompileCommand> 542b3c8603SArnaud A. de Grandmaison CCmd(db->getCompileCommands(CompleteFileName)); 552b3c8603SArnaud A. de Grandmaison if (!CCmd.empty()) 562b3c8603SArnaud A. de Grandmaison return new AllocatedCXCompileCommands( CCmd ); 572b3c8603SArnaud A. de Grandmaison } 582b3c8603SArnaud A. de Grandmaison 592b3c8603SArnaud A. de Grandmaison return 0; 602b3c8603SArnaud A. de Grandmaison } 612b3c8603SArnaud A. de Grandmaison 622b3c8603SArnaud A. de Grandmaison void 63*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_dispose(CXCompileCommands Cmds) 642b3c8603SArnaud A. de Grandmaison { 652b3c8603SArnaud A. de Grandmaison delete static_cast<AllocatedCXCompileCommands *>(Cmds); 662b3c8603SArnaud A. de Grandmaison } 672b3c8603SArnaud A. de Grandmaison 682b3c8603SArnaud A. de Grandmaison unsigned 69*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_getSize(CXCompileCommands Cmds) 702b3c8603SArnaud A. de Grandmaison { 712b3c8603SArnaud A. de Grandmaison if (!Cmds) 722b3c8603SArnaud A. de Grandmaison return 0; 732b3c8603SArnaud A. de Grandmaison 742b3c8603SArnaud A. de Grandmaison AllocatedCXCompileCommands *ACC = 752b3c8603SArnaud A. de Grandmaison static_cast<AllocatedCXCompileCommands *>(Cmds); 762b3c8603SArnaud A. de Grandmaison 772b3c8603SArnaud A. de Grandmaison return ACC->CCmd.size(); 782b3c8603SArnaud A. de Grandmaison } 792b3c8603SArnaud A. de Grandmaison 802b3c8603SArnaud A. de Grandmaison CXCompileCommand 81*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I) 822b3c8603SArnaud A. de Grandmaison { 832b3c8603SArnaud A. de Grandmaison if (!Cmds) 842b3c8603SArnaud A. de Grandmaison return 0; 852b3c8603SArnaud A. de Grandmaison 862b3c8603SArnaud A. de Grandmaison AllocatedCXCompileCommands *ACC = 872b3c8603SArnaud A. de Grandmaison static_cast<AllocatedCXCompileCommands *>(Cmds); 882b3c8603SArnaud A. de Grandmaison 892b3c8603SArnaud A. de Grandmaison if (I >= ACC->CCmd.size()) 902b3c8603SArnaud A. de Grandmaison return 0; 912b3c8603SArnaud A. de Grandmaison 922b3c8603SArnaud A. de Grandmaison return &ACC->CCmd[I]; 932b3c8603SArnaud A. de Grandmaison } 942b3c8603SArnaud A. de Grandmaison 952b3c8603SArnaud A. de Grandmaison CXString 96*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getDirectory(CXCompileCommand CCmd) 972b3c8603SArnaud A. de Grandmaison { 982b3c8603SArnaud A. de Grandmaison if (!CCmd) 992b3c8603SArnaud A. de Grandmaison return createCXString((const char*)NULL); 1002b3c8603SArnaud A. de Grandmaison 1012b3c8603SArnaud A. de Grandmaison CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); 1022b3c8603SArnaud A. de Grandmaison return createCXString(cmd->Directory); 1032b3c8603SArnaud A. de Grandmaison } 1042b3c8603SArnaud A. de Grandmaison 1052b3c8603SArnaud A. de Grandmaison unsigned 106*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getNumArgs(CXCompileCommand CCmd) 1072b3c8603SArnaud A. de Grandmaison { 1082b3c8603SArnaud A. de Grandmaison if (!CCmd) 1092b3c8603SArnaud A. de Grandmaison return 0; 1102b3c8603SArnaud A. de Grandmaison 1112b3c8603SArnaud A. de Grandmaison return static_cast<CompileCommand *>(CCmd)->CommandLine.size(); 1122b3c8603SArnaud A. de Grandmaison } 1132b3c8603SArnaud A. de Grandmaison 1142b3c8603SArnaud A. de Grandmaison CXString 115*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg) 1162b3c8603SArnaud A. de Grandmaison { 1172b3c8603SArnaud A. de Grandmaison if (!CCmd) 1182b3c8603SArnaud A. de Grandmaison return createCXString((const char*)NULL); 1192b3c8603SArnaud A. de Grandmaison 1202b3c8603SArnaud A. de Grandmaison CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 1212b3c8603SArnaud A. de Grandmaison 1222b3c8603SArnaud A. de Grandmaison if (Arg >= Cmd->CommandLine.size()) 1232b3c8603SArnaud A. de Grandmaison return createCXString((const char*)NULL); 1242b3c8603SArnaud A. de Grandmaison 1252b3c8603SArnaud A. de Grandmaison return createCXString(Cmd->CommandLine[Arg]); 1262b3c8603SArnaud A. de Grandmaison } 1272b3c8603SArnaud A. de Grandmaison 1282b3c8603SArnaud A. de Grandmaison 1292b3c8603SArnaud A. de Grandmaison } // end: extern "C" 130