| #include "clang-c/CXCompilationDatabase.h" | 
 | #include "CXString.h" | 
 | #include "clang/Tooling/CompilationDatabase.h" | 
 | #include <cstdio> | 
 |  | 
 | using namespace clang; | 
 | using namespace clang::tooling; | 
 |  | 
 | // FIXME: do something more useful with the error message | 
 | CXCompilationDatabase | 
 | clang_CompilationDatabase_fromDirectory(const char *BuildDir, | 
 |                                         CXCompilationDatabase_Error *ErrorCode) | 
 | { | 
 |   std::string ErrorMsg; | 
 |   CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError; | 
 |  | 
 |   std::unique_ptr<CompilationDatabase> db = | 
 |       CompilationDatabase::loadFromDirectory(BuildDir, ErrorMsg); | 
 |  | 
 |   if (!db) { | 
 |     fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str()); | 
 |     Err = CXCompilationDatabase_CanNotLoadDatabase; | 
 |   } | 
 |  | 
 |   if (ErrorCode) | 
 |     *ErrorCode = Err; | 
 |  | 
 |   return db.release(); | 
 | } | 
 |  | 
 | void | 
 | clang_CompilationDatabase_dispose(CXCompilationDatabase CDb) | 
 | { | 
 |   delete static_cast<CompilationDatabase *>(CDb); | 
 | } | 
 |  | 
 | struct AllocatedCXCompileCommands | 
 | { | 
 |   std::vector<CompileCommand> CCmd; | 
 |  | 
 |   AllocatedCXCompileCommands(std::vector<CompileCommand> Cmd) | 
 |       : CCmd(std::move(Cmd)) {} | 
 | }; | 
 |  | 
 | CXCompileCommands | 
 | clang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb, | 
 |                                              const char *CompleteFileName) | 
 | { | 
 |   if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { | 
 |     std::vector<CompileCommand> CCmd(db->getCompileCommands(CompleteFileName)); | 
 |     if (!CCmd.empty()) | 
 |       return new AllocatedCXCompileCommands(std::move(CCmd)); | 
 |   } | 
 |  | 
 |   return nullptr; | 
 | } | 
 |  | 
 | CXCompileCommands | 
 | clang_CompilationDatabase_getAllCompileCommands(CXCompilationDatabase CDb) { | 
 |   if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { | 
 |     std::vector<CompileCommand> CCmd(db->getAllCompileCommands()); | 
 |     if (!CCmd.empty()) | 
 |       return new AllocatedCXCompileCommands(std::move(CCmd)); | 
 |   } | 
 |  | 
 |   return nullptr; | 
 | } | 
 |  | 
 | void | 
 | clang_CompileCommands_dispose(CXCompileCommands Cmds) | 
 | { | 
 |   delete static_cast<AllocatedCXCompileCommands *>(Cmds); | 
 | } | 
 |  | 
 | unsigned | 
 | clang_CompileCommands_getSize(CXCompileCommands Cmds) | 
 | { | 
 |   if (!Cmds) | 
 |     return 0; | 
 |  | 
 |   AllocatedCXCompileCommands *ACC = | 
 |     static_cast<AllocatedCXCompileCommands *>(Cmds); | 
 |  | 
 |   return ACC->CCmd.size(); | 
 | } | 
 |  | 
 | CXCompileCommand | 
 | clang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I) | 
 | { | 
 |   if (!Cmds) | 
 |     return nullptr; | 
 |  | 
 |   AllocatedCXCompileCommands *ACC = | 
 |     static_cast<AllocatedCXCompileCommands *>(Cmds); | 
 |  | 
 |   if (I >= ACC->CCmd.size()) | 
 |     return nullptr; | 
 |  | 
 |   return &ACC->CCmd[I]; | 
 | } | 
 |  | 
 | CXString | 
 | clang_CompileCommand_getDirectory(CXCompileCommand CCmd) | 
 | { | 
 |   if (!CCmd) | 
 |     return cxstring::createNull(); | 
 |  | 
 |   CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); | 
 |   return cxstring::createRef(cmd->Directory.c_str()); | 
 | } | 
 |  | 
 | CXString | 
 | clang_CompileCommand_getFilename(CXCompileCommand CCmd) | 
 | { | 
 |   if (!CCmd) | 
 |     return cxstring::createNull(); | 
 |  | 
 |   CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); | 
 |   return cxstring::createRef(cmd->Filename.c_str()); | 
 | } | 
 |  | 
 | unsigned | 
 | clang_CompileCommand_getNumArgs(CXCompileCommand CCmd) | 
 | { | 
 |   if (!CCmd) | 
 |     return 0; | 
 |  | 
 |   return static_cast<CompileCommand *>(CCmd)->CommandLine.size(); | 
 | } | 
 |  | 
 | CXString | 
 | clang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg) | 
 | { | 
 |   if (!CCmd) | 
 |     return cxstring::createNull(); | 
 |  | 
 |   CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); | 
 |  | 
 |   if (Arg >= Cmd->CommandLine.size()) | 
 |     return cxstring::createNull(); | 
 |  | 
 |   return cxstring::createRef(Cmd->CommandLine[Arg].c_str()); | 
 | } | 
 |  | 
 | unsigned | 
 | clang_CompileCommand_getNumMappedSources(CXCompileCommand CCmd) | 
 | { | 
 |   // Left here for backward compatibility. No mapped sources exists in the C++ | 
 |   // backend anymore. | 
 |   return 0; | 
 | } | 
 |  | 
 | CXString | 
 | clang_CompileCommand_getMappedSourcePath(CXCompileCommand CCmd, unsigned I) | 
 | { | 
 |   // Left here for backward compatibility. No mapped sources exists in the C++ | 
 |   // backend anymore. | 
 |   return cxstring::createNull(); | 
 | } | 
 |  | 
 | CXString | 
 | clang_CompileCommand_getMappedSourceContent(CXCompileCommand CCmd, unsigned I) | 
 | { | 
 |   // Left here for backward compatibility. No mapped sources exists in the C++ | 
 |   // backend anymore. | 
 |   return cxstring::createNull(); | 
 | } |