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