| #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(); |
| } |