CXCompilationDatabase.cpp revision 651f13cea278ec967336033dd032faef0e9fc2ec
15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "clang-c/CXCompilationDatabase.h" 25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "CXString.h" 35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "clang/Tooling/CompilationDatabase.h" 45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include <cstdio> 55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulusing namespace clang; 75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulusing namespace clang::tooling; 85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulextern "C" { 105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul// FIXME: do something more useful with the error message 125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCXCompilationDatabase 135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompilationDatabase_fromDirectory(const char *BuildDir, 145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CXCompilationDatabase_Error *ErrorCode) 155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul std::string ErrorMsg; 175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError; 185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 19fc552c530fa663b47961b947be5600a061a0b116Eric Anholt CompilationDatabase *db = CompilationDatabase::loadFromDirectory(BuildDir, 20fc552c530fa663b47961b947be5600a061a0b116Eric Anholt ErrorMsg); 21fc552c530fa663b47961b947be5600a061a0b116Eric Anholt 22fc552c530fa663b47961b947be5600a061a0b116Eric Anholt if (!db) { 23fc552c530fa663b47961b947be5600a061a0b116Eric Anholt fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str()); 24fc552c530fa663b47961b947be5600a061a0b116Eric Anholt Err = CXCompilationDatabase_CanNotLoadDatabase; 25fc552c530fa663b47961b947be5600a061a0b116Eric Anholt } 265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (ErrorCode) 285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *ErrorCode = Err; 295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return db; 315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid 345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompilationDatabase_dispose(CXCompilationDatabase CDb) 355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul delete static_cast<CompilationDatabase *>(CDb); 375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct AllocatedCXCompileCommands 405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul std::vector<CompileCommand> CCmd; 425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul AllocatedCXCompileCommands(std::vector<CompileCommand> Cmd) 445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul : CCmd(std::move(Cmd)) {} 455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCXCompileCommands 485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb, 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const char *CompleteFileName) 505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { 525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul std::vector<CompileCommand> CCmd(db->getCompileCommands(CompleteFileName)); 535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!CCmd.empty()) 545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return new AllocatedCXCompileCommands(std::move(CCmd)); 555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return 0; 585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCXCompileCommands 615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompilationDatabase_getAllCompileCommands(CXCompilationDatabase CDb) { 625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { 635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul std::vector<CompileCommand> CCmd(db->getAllCompileCommands()); 645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!CCmd.empty()) 655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return new AllocatedCXCompileCommands(std::move(CCmd)); 665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return 0; 695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid 725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommands_dispose(CXCompileCommands Cmds) 735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul delete static_cast<AllocatedCXCompileCommands *>(Cmds); 755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulunsigned 785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommands_getSize(CXCompileCommands Cmds) 795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!Cmds) 815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return 0; 825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul AllocatedCXCompileCommands *ACC = 845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul static_cast<AllocatedCXCompileCommands *>(Cmds); 855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return ACC->CCmd.size(); 875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCXCompileCommand 905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I) 915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!Cmds) 935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return 0; 945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul AllocatedCXCompileCommands *ACC = 965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul static_cast<AllocatedCXCompileCommands *>(Cmds); 975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (I >= ACC->CCmd.size()) 995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return 0; 1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return &ACC->CCmd[I]; 1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCXString 1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommand_getDirectory(CXCompileCommand CCmd) 1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!CCmd) 1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createNull(); 1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); 1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createRef(cmd->Directory.c_str()); 1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulunsigned 1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommand_getNumArgs(CXCompileCommand CCmd) 1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!CCmd) 1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return 0; 1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return static_cast<CompileCommand *>(CCmd)->CommandLine.size(); 1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCXString 1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg) 1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!CCmd) 1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createNull(); 1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (Arg >= Cmd->CommandLine.size()) 1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createNull(); 1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createRef(Cmd->CommandLine[Arg].c_str()); 1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulunsigned 1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommand_getNumMappedSources(CXCompileCommand CCmd) 139f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg{ 1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!CCmd) 1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return 0; 1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return static_cast<CompileCommand *>(CCmd)->MappedSources.size(); 1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 146fbdd7a5e7487849bfe06a7bef68b4dad75f5d58cDave AirlieCXString 1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommand_getMappedSourcePath(CXCompileCommand CCmd, unsigned I) 1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!CCmd) 1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createNull(); 1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (I >= Cmd->MappedSources.size()) 1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createNull(); 1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createRef(Cmd->MappedSources[I].first.c_str()); 1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCXString 1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulclang_CompileCommand_getMappedSourceContent(CXCompileCommand CCmd, unsigned I) 1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!CCmd) 1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return cxstring::createNull(); 165 166 CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); 167 168 if (I >= Cmd->MappedSources.size()) 169 return cxstring::createNull(); 170 171 return cxstring::createRef(Cmd->MappedSources[I].second.c_str()); 172} 173 174} // end: extern "C" 175