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