diff options
author | Sam McCall <sam.mccall@gmail.com> | 2017-11-24 12:13:55 +0000 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2017-11-24 12:13:55 +0000 |
commit | b50a36c8bc71a7c1ac9f47a08688ac7175684743 (patch) | |
tree | 991b7b66d6516f749c686edc81c66bb7e4f0a2b8 /clang | |
parent | 70cec59e237fcd2d26da3e5994ed5572a87130d1 (diff) | |
download | bcm5719-llvm-b50a36c8bc71a7c1ac9f47a08688ac7175684743.tar.gz bcm5719-llvm-b50a36c8bc71a7c1ac9f47a08688ac7175684743.zip |
[Tooling] Acknowledge that many CompilationDatabases don't support enumeration.
Summary: Provide default implementations so that only getCompileCommands() is mandatory.
Reviewers: ioeric
Subscribers: cfe-commits, bkramer, klimek
Differential Revision: https://reviews.llvm.org/D40409
llvm-svn: 318943
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Tooling/CompilationDatabase.h | 32 | ||||
-rw-r--r-- | clang/lib/Tooling/CompilationDatabase.cpp | 19 |
2 files changed, 24 insertions, 27 deletions
diff --git a/clang/include/clang/Tooling/CompilationDatabase.h b/clang/include/clang/Tooling/CompilationDatabase.h index e2245798ede..bc3e67b77de 100644 --- a/clang/include/clang/Tooling/CompilationDatabase.h +++ b/clang/include/clang/Tooling/CompilationDatabase.h @@ -64,10 +64,12 @@ struct CompileCommand { /// \brief Interface for compilation databases. /// -/// A compilation database allows the user to retrieve all compile command lines -/// that a specified file is compiled with in a project. -/// The retrieved compile command lines can be used to run clang tools over -/// a subset of the files in a project. +/// A compilation database allows the user to retrieve compile command lines +/// for the files in a project. +/// +/// Many implementations are enumerable, allowing all command lines to be +/// retrieved. These can be used to run clang tools over a subset of the files +/// in a project. class CompilationDatabase { public: virtual ~CompilationDatabase(); @@ -114,7 +116,10 @@ public: StringRef FilePath) const = 0; /// \brief Returns the list of all files available in the compilation database. - virtual std::vector<std::string> getAllFiles() const = 0; + /// + /// By default, returns nothing. Implementations should override this if they + /// can enumerate their source files. + virtual std::vector<std::string> getAllFiles() const { return {}; } /// \brief Returns all compile commands for all the files in the compilation /// database. @@ -122,7 +127,10 @@ public: /// 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<CompileCommand> getAllCompileCommands() const = 0; + /// + /// By default, this is implemented in terms of getAllFiles() and + /// getCompileCommands(). Subclasses may override this for efficiency. + virtual std::vector<CompileCommand> getAllCompileCommands() const; }; /// \brief Interface for compilation database plugins. @@ -149,6 +157,7 @@ public: /// \brief A compilation database that returns a single compile command line. /// /// Useful when we want a tool to behave more like a compiler invocation. +/// This compilation database is not enumerable: getAllFiles() returns {}. class FixedCompilationDatabase : public CompilationDatabase { public: /// \brief Creates a FixedCompilationDatabase from the arguments after "--". @@ -199,17 +208,6 @@ public: std::vector<CompileCommand> getCompileCommands(StringRef FilePath) const override; - /// \brief Returns the list of all files available in the compilation database. - /// - /// Note: This is always an empty list for the fixed compilation database. - std::vector<std::string> getAllFiles() const override; - - /// \brief Returns all compile commands for all the files in the compilation - /// database. - /// - /// Note: This is always an empty list for the fixed compilation database. - std::vector<CompileCommand> getAllCompileCommands() const override; - private: /// This is built up to contain a single entry vector to be returned from /// getCompileCommands after adding the positional argument. diff --git a/clang/lib/Tooling/CompilationDatabase.cpp b/clang/lib/Tooling/CompilationDatabase.cpp index f252ef0b722..92b76b157dc 100644 --- a/clang/lib/Tooling/CompilationDatabase.cpp +++ b/clang/lib/Tooling/CompilationDatabase.cpp @@ -112,6 +112,15 @@ CompilationDatabase::autoDetectFromDirectory(StringRef SourceDir, return DB; } +std::vector<CompileCommand> CompilationDatabase::getAllCompileCommands() const { + std::vector<CompileCommand> Result; + for (const auto &File : getAllFiles()) { + auto C = getCompileCommands(File); + std::move(C.begin(), C.end(), std::back_inserter(Result)); + } + return Result; +} + CompilationDatabasePlugin::~CompilationDatabasePlugin() {} namespace { @@ -342,16 +351,6 @@ FixedCompilationDatabase::getCompileCommands(StringRef FilePath) const { return Result; } -std::vector<std::string> -FixedCompilationDatabase::getAllFiles() const { - return std::vector<std::string>(); -} - -std::vector<CompileCommand> -FixedCompilationDatabase::getAllCompileCommands() const { - return std::vector<CompileCommand>(); -} - namespace { class FixedCompilationDatabasePlugin : public CompilationDatabasePlugin { |