12b3c8603SArnaud A. de Grandmaison #include "clang-c/CXCompilationDatabase.h" 22b3c8603SArnaud A. de Grandmaison #include "CXString.h" 3cc0694c8SChandler Carruth #include "clang/Tooling/CompilationDatabase.h" 4*ab458a13SDmitri Gribenko #include <cstdio> 52b3c8603SArnaud A. de Grandmaison 62b3c8603SArnaud A. de Grandmaison using namespace clang; 72b3c8603SArnaud A. de Grandmaison using namespace clang::tooling; 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 13fa6d73ccSArnaud 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 34fa6d73ccSArnaud 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 49fa6d73ccSArnaud 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 62251ad5e0SArgyrios Kyrtzidis CXCompileCommands 63251ad5e0SArgyrios Kyrtzidis clang_CompilationDatabase_getAllCompileCommands(CXCompilationDatabase CDb) { 64251ad5e0SArgyrios Kyrtzidis if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { 65251ad5e0SArgyrios Kyrtzidis const std::vector<CompileCommand> CCmd(db->getAllCompileCommands()); 66251ad5e0SArgyrios Kyrtzidis if (!CCmd.empty()) 67251ad5e0SArgyrios Kyrtzidis return new AllocatedCXCompileCommands( CCmd ); 68251ad5e0SArgyrios Kyrtzidis } 69251ad5e0SArgyrios Kyrtzidis 70251ad5e0SArgyrios Kyrtzidis return 0; 71251ad5e0SArgyrios Kyrtzidis } 72251ad5e0SArgyrios Kyrtzidis 732b3c8603SArnaud A. de Grandmaison void 74fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_dispose(CXCompileCommands Cmds) 752b3c8603SArnaud A. de Grandmaison { 762b3c8603SArnaud A. de Grandmaison delete static_cast<AllocatedCXCompileCommands *>(Cmds); 772b3c8603SArnaud A. de Grandmaison } 782b3c8603SArnaud A. de Grandmaison 792b3c8603SArnaud A. de Grandmaison unsigned 80fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_getSize(CXCompileCommands Cmds) 812b3c8603SArnaud A. de Grandmaison { 822b3c8603SArnaud A. de Grandmaison if (!Cmds) 832b3c8603SArnaud A. de Grandmaison return 0; 842b3c8603SArnaud A. de Grandmaison 852b3c8603SArnaud A. de Grandmaison AllocatedCXCompileCommands *ACC = 862b3c8603SArnaud A. de Grandmaison static_cast<AllocatedCXCompileCommands *>(Cmds); 872b3c8603SArnaud A. de Grandmaison 882b3c8603SArnaud A. de Grandmaison return ACC->CCmd.size(); 892b3c8603SArnaud A. de Grandmaison } 902b3c8603SArnaud A. de Grandmaison 912b3c8603SArnaud A. de Grandmaison CXCompileCommand 92fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I) 932b3c8603SArnaud A. de Grandmaison { 942b3c8603SArnaud A. de Grandmaison if (!Cmds) 952b3c8603SArnaud A. de Grandmaison return 0; 962b3c8603SArnaud A. de Grandmaison 972b3c8603SArnaud A. de Grandmaison AllocatedCXCompileCommands *ACC = 982b3c8603SArnaud A. de Grandmaison static_cast<AllocatedCXCompileCommands *>(Cmds); 992b3c8603SArnaud A. de Grandmaison 1002b3c8603SArnaud A. de Grandmaison if (I >= ACC->CCmd.size()) 1012b3c8603SArnaud A. de Grandmaison return 0; 1022b3c8603SArnaud A. de Grandmaison 1032b3c8603SArnaud A. de Grandmaison return &ACC->CCmd[I]; 1042b3c8603SArnaud A. de Grandmaison } 1052b3c8603SArnaud A. de Grandmaison 1062b3c8603SArnaud A. de Grandmaison CXString 107fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getDirectory(CXCompileCommand CCmd) 1082b3c8603SArnaud A. de Grandmaison { 1092b3c8603SArnaud A. de Grandmaison if (!CCmd) 110f98dfbaeSDmitri Gribenko return cxstring::createNull(); 1112b3c8603SArnaud A. de Grandmaison 1122b3c8603SArnaud A. de Grandmaison CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); 1133c66b0beSDmitri Gribenko return cxstring::createRef(cmd->Directory.c_str()); 1142b3c8603SArnaud A. de Grandmaison } 1152b3c8603SArnaud A. de Grandmaison 1162b3c8603SArnaud A. de Grandmaison unsigned 117fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getNumArgs(CXCompileCommand CCmd) 1182b3c8603SArnaud A. de Grandmaison { 1192b3c8603SArnaud A. de Grandmaison if (!CCmd) 1202b3c8603SArnaud A. de Grandmaison return 0; 1212b3c8603SArnaud A. de Grandmaison 1222b3c8603SArnaud A. de Grandmaison return static_cast<CompileCommand *>(CCmd)->CommandLine.size(); 1232b3c8603SArnaud A. de Grandmaison } 1242b3c8603SArnaud A. de Grandmaison 1252b3c8603SArnaud A. de Grandmaison CXString 126fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg) 1272b3c8603SArnaud A. de Grandmaison { 1282b3c8603SArnaud A. de Grandmaison if (!CCmd) 129f98dfbaeSDmitri Gribenko return cxstring::createNull(); 1302b3c8603SArnaud A. de Grandmaison 1312b3c8603SArnaud A. de Grandmaison CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 1322b3c8603SArnaud A. de Grandmaison 1332b3c8603SArnaud A. de Grandmaison if (Arg >= Cmd->CommandLine.size()) 134f98dfbaeSDmitri Gribenko return cxstring::createNull(); 1352b3c8603SArnaud A. de Grandmaison 1363c66b0beSDmitri Gribenko return cxstring::createRef(Cmd->CommandLine[Arg].c_str()); 1372b3c8603SArnaud A. de Grandmaison } 1382b3c8603SArnaud A. de Grandmaison 1392b3c8603SArnaud A. de Grandmaison 1402b3c8603SArnaud A. de Grandmaison } // end: extern "C" 141