From: Manuel Klimek Date: Wed, 13 Nov 2013 13:23:27 +0000 (+0000) Subject: Add an optional mapping from source paths to source contents. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f88536af2cbbea3444c6488a1889520538250efb;p=clang Add an optional mapping from source paths to source contents. This allows compilation database implementations for distributed build systems to hand all data to the client to make parsing independent of the file system. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194571 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/CXCompilationDatabase.h b/include/clang-c/CXCompilationDatabase.h index 198fd73bf8..fd65418f60 100644 --- a/include/clang-c/CXCompilationDatabase.h +++ b/include/clang-c/CXCompilationDatabase.h @@ -141,6 +141,24 @@ clang_CompileCommand_getNumArgs(CXCompileCommand); CINDEX_LINKAGE CXString clang_CompileCommand_getArg(CXCompileCommand, unsigned I); +/** + * \brief Get the number of source mappings for the compiler invocation. + */ +CINDEX_LINKAGE unsigned +clang_CompileCommand_getNumMappedSources(CXCompileCommand); + +/** + * \brief Get the I'th mapped source path for the compiler invocation. + */ +CINDEX_LINKAGE CXString +clang_CompileCommand_getMappedSourcePath(CXCompileCommand, unsigned I); + +/** + * \brief Get the I'th mapped source content for the compiler invocation. + */ +CINDEX_LINKAGE CXString +clang_CompileCommand_getMappedSourceContent(CXCompileCommand, unsigned I); + /** * @} */ diff --git a/include/clang/Tooling/CompilationDatabase.h b/include/clang/Tooling/CompilationDatabase.h index 7a8054ffc3..8cca3296f9 100644 --- a/include/clang/Tooling/CompilationDatabase.h +++ b/include/clang/Tooling/CompilationDatabase.h @@ -50,6 +50,16 @@ struct CompileCommand { /// \brief The command line that was executed. std::vector CommandLine; + + /// \brief An optional mapping from each file's path to its content for all + /// files needed for the compilation that are not available via the file + /// system. + /// + /// Note that a tool implementation is required to fall back to the file + /// system if a source file is not provided in the mapped sources, as + /// compilation databases will usually not provide all files in mapped sources + /// for performance reasons. + std::vector > MappedSources; }; /// \brief Interface for compilation databases. @@ -108,6 +118,10 @@ public: /// \brief Returns all compile commands for all the files in the compilation /// database. + /// + /// FIXME: Add a layer in Tooling that provides an interface to run a tool + /// over all files in a compilation database. Not all build systems have the + /// ability to provide a feasible implementation for \c getAllCompileCommands. virtual std::vector getAllCompileCommands() const = 0; }; diff --git a/tools/libclang/CXCompilationDatabase.cpp b/tools/libclang/CXCompilationDatabase.cpp index 76e8924978..433caecd38 100644 --- a/tools/libclang/CXCompilationDatabase.cpp +++ b/tools/libclang/CXCompilationDatabase.cpp @@ -136,5 +136,41 @@ clang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg) return cxstring::createRef(Cmd->CommandLine[Arg].c_str()); } +unsigned +clang_CompileCommand_getNumMappedSources(CXCompileCommand CCmd) +{ + if (!CCmd) + return 0; + + return static_cast(CCmd)->MappedSources.size(); +} + +CXString +clang_CompileCommand_getMappedSourcePath(CXCompileCommand CCmd, unsigned I) +{ + if (!CCmd) + return cxstring::createNull(); + + CompileCommand *Cmd = static_cast(CCmd); + + if (I >= Cmd->MappedSources.size()) + return cxstring::createNull(); + + return cxstring::createRef(Cmd->MappedSources[I].first.c_str()); +} + +CXString +clang_CompileCommand_getMappedSourceContent(CXCompileCommand CCmd, unsigned I) +{ + if (!CCmd) + return cxstring::createNull(); + + CompileCommand *Cmd = static_cast(CCmd); + + if (I >= Cmd->MappedSources.size()) + return cxstring::createNull(); + + return cxstring::createRef(Cmd->MappedSources[I].second.c_str()); +} } // end: extern "C"