1db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison#include "clang-c/CXCompilationDatabase.h" 2db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison#include "CXString.h" 3f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "clang/Tooling/CompilationDatabase.h" 49af20d8187384b841a6244ab81c8a57b010d72d0Dmitri Gribenko#include <cstdio> 5db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 6db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonusing namespace clang; 7db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonusing namespace clang::tooling; 8db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 9db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonextern "C" { 10db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: do something more useful 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 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AllocatedCXCompileCommands(std::vector<CompileCommand> Cmd) 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : CCmd(std::move(Cmd)) {} 45db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}; 46db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 47db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXCompileCommands 48c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb, 49c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaison const char *CompleteFileName) 50db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{ 51db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::vector<CompileCommand> CCmd(db->getCompileCommands(CompleteFileName)); 53db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (!CCmd.empty()) 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new AllocatedCXCompileCommands(std::move(CCmd)); 55db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison } 56db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 57ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return nullptr; 58db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} 59db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 607e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios KyrtzidisCXCompileCommands 617e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidisclang_CompilationDatabase_getAllCompileCommands(CXCompilationDatabase CDb) { 627e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::vector<CompileCommand> CCmd(db->getAllCompileCommands()); 647e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis if (!CCmd.empty()) 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new AllocatedCXCompileCommands(std::move(CCmd)); 667e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis } 677e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis 68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return nullptr; 697e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis} 707e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis 71db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonvoid 72c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_dispose(CXCompileCommands Cmds) 73db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{ 74db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison delete static_cast<AllocatedCXCompileCommands *>(Cmds); 75db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} 76db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 77db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonunsigned 78c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_getSize(CXCompileCommands Cmds) 79db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{ 80db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (!Cmds) 81db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison return 0; 82db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 83db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison AllocatedCXCompileCommands *ACC = 84db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison static_cast<AllocatedCXCompileCommands *>(Cmds); 85db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 86db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison return ACC->CCmd.size(); 87db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} 88db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 89db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXCompileCommand 90c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I) 91db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{ 92db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (!Cmds) 93ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return nullptr; 94db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 95db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison AllocatedCXCompileCommands *ACC = 96db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison static_cast<AllocatedCXCompileCommands *>(Cmds); 97db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 98db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (I >= ACC->CCmd.size()) 99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return nullptr; 100db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 101db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison return &ACC->CCmd[I]; 102db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} 103db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 104db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXString 105c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getDirectory(CXCompileCommand CCmd) 106db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{ 107db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (!CCmd) 108dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko return cxstring::createNull(); 109db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 110db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); 1110c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko return cxstring::createRef(cmd->Directory.c_str()); 112db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} 113db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 114db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonunsigned 115c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getNumArgs(CXCompileCommand CCmd) 116db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{ 117db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (!CCmd) 118db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison return 0; 119db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 120db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison return static_cast<CompileCommand *>(CCmd)->CommandLine.size(); 121db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} 122db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 123db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXString 124c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg) 125db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{ 126db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (!CCmd) 127dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko return cxstring::createNull(); 128db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 129db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 130db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 131db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison if (Arg >= Cmd->CommandLine.size()) 132dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko return cxstring::createNull(); 133db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 1340c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko return cxstring::createRef(Cmd->CommandLine[Arg].c_str()); 135db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} 136db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 137f88536af2cbbea3444c6488a1889520538250efbManuel Klimekunsigned 138f88536af2cbbea3444c6488a1889520538250efbManuel Klimekclang_CompileCommand_getNumMappedSources(CXCompileCommand CCmd) 139f88536af2cbbea3444c6488a1889520538250efbManuel Klimek{ 140f88536af2cbbea3444c6488a1889520538250efbManuel Klimek if (!CCmd) 141f88536af2cbbea3444c6488a1889520538250efbManuel Klimek return 0; 142f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 143f88536af2cbbea3444c6488a1889520538250efbManuel Klimek return static_cast<CompileCommand *>(CCmd)->MappedSources.size(); 144f88536af2cbbea3444c6488a1889520538250efbManuel Klimek} 145f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 146f88536af2cbbea3444c6488a1889520538250efbManuel KlimekCXString 147f88536af2cbbea3444c6488a1889520538250efbManuel Klimekclang_CompileCommand_getMappedSourcePath(CXCompileCommand CCmd, unsigned I) 148f88536af2cbbea3444c6488a1889520538250efbManuel Klimek{ 149f88536af2cbbea3444c6488a1889520538250efbManuel Klimek if (!CCmd) 150f88536af2cbbea3444c6488a1889520538250efbManuel Klimek return cxstring::createNull(); 151f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 152f88536af2cbbea3444c6488a1889520538250efbManuel Klimek CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 153f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 154f88536af2cbbea3444c6488a1889520538250efbManuel Klimek if (I >= Cmd->MappedSources.size()) 155f88536af2cbbea3444c6488a1889520538250efbManuel Klimek return cxstring::createNull(); 156f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 157f88536af2cbbea3444c6488a1889520538250efbManuel Klimek return cxstring::createRef(Cmd->MappedSources[I].first.c_str()); 158f88536af2cbbea3444c6488a1889520538250efbManuel Klimek} 159f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 160f88536af2cbbea3444c6488a1889520538250efbManuel KlimekCXString 161f88536af2cbbea3444c6488a1889520538250efbManuel Klimekclang_CompileCommand_getMappedSourceContent(CXCompileCommand CCmd, unsigned I) 162f88536af2cbbea3444c6488a1889520538250efbManuel Klimek{ 163f88536af2cbbea3444c6488a1889520538250efbManuel Klimek if (!CCmd) 164f88536af2cbbea3444c6488a1889520538250efbManuel Klimek return cxstring::createNull(); 165f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 166f88536af2cbbea3444c6488a1889520538250efbManuel Klimek CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 167f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 168f88536af2cbbea3444c6488a1889520538250efbManuel Klimek if (I >= Cmd->MappedSources.size()) 169f88536af2cbbea3444c6488a1889520538250efbManuel Klimek return cxstring::createNull(); 170f88536af2cbbea3444c6488a1889520538250efbManuel Klimek 171f88536af2cbbea3444c6488a1889520538250efbManuel Klimek return cxstring::createRef(Cmd->MappedSources[I].second.c_str()); 172f88536af2cbbea3444c6488a1889520538250efbManuel Klimek} 173db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison 174db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} // end: extern "C" 175