]> granicus.if.org Git - clang/commitdiff
Allows retrieving all files in a CompilationDatabase.
authorManuel Klimek <klimek@google.com>
Fri, 13 Jul 2012 12:31:45 +0000 (12:31 +0000)
committerManuel Klimek <klimek@google.com>
Fri, 13 Jul 2012 12:31:45 +0000 (12:31 +0000)
Patch by Tobias Koenig, some test changes by myself.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160167 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Tooling/CompilationDatabase.h
lib/Tooling/CompilationDatabase.cpp
unittests/Tooling/CompilationDatabaseTest.cpp

index 143c65e313a45968b709a3ad17beea8bcdd21835..f78ffaed284ce4718d593a6ec03f8ae66daa3bb6 100644 (file)
@@ -106,6 +106,9 @@ public:
   /// lines for a.cc and b.cc and only the first command line for t.cc.
   virtual std::vector<CompileCommand> getCompileCommands(
     StringRef FilePath) const = 0;
+
+  /// \brief Returns the list of all files available in the compilation database.
+  virtual std::vector<std::string> getAllFiles() const = 0;
 };
 
 /// \brief A compilation database that returns a single compile command line.
@@ -155,6 +158,11 @@ public:
   virtual std::vector<CompileCommand> getCompileCommands(
     StringRef FilePath) const;
 
+  /// \brief Returns the list of all files available in the compilation database.
+  ///
+  /// Note: This is always an empty list for the fixed compilation database.
+  virtual std::vector<std::string> getAllFiles() const;
+
 private:
   /// This is built up to contain a single entry vector to be returned from
   /// getCompileCommands after adding the positional argument.
@@ -201,6 +209,11 @@ public:
   virtual std::vector<CompileCommand> getCompileCommands(
     StringRef FilePath) const;
 
+  /// \brief Returns the list of all files available in the compilation database.
+  ///
+  /// These are the 'file' entries of the JSON objects.
+  virtual std::vector<std::string> getAllFiles() const;
+
 private:
   /// \brief Constructs a JSON compilation database on a memory buffer.
   JSONCompilationDatabase(llvm::MemoryBuffer *Database)
index d54a5e79ebdc05bcf5e6bbd7221aa1a36ee01eca..802a4c3ea45afb833786feea7a6c4115dd7ce3ad 100644 (file)
@@ -199,6 +199,11 @@ FixedCompilationDatabase::getCompileCommands(StringRef FilePath) const {
   return Result;
 }
 
+std::vector<std::string>
+FixedCompilationDatabase::getAllFiles() const {
+  return std::vector<std::string>();
+}
+
 JSONCompilationDatabase *
 JSONCompilationDatabase::loadFromFile(StringRef FilePath,
                                       std::string &ErrorMessage) {
@@ -249,6 +254,21 @@ JSONCompilationDatabase::getCompileCommands(StringRef FilePath) const {
   return Commands;
 }
 
+std::vector<std::string>
+JSONCompilationDatabase::getAllFiles() const {
+  std::vector<std::string> Result;
+
+  llvm::StringMap< std::vector<CompileCommandRef> >::const_iterator
+    CommandsRefI = IndexByFile.begin();
+  const llvm::StringMap< std::vector<CompileCommandRef> >::const_iterator
+    CommandsRefEnd = IndexByFile.end();
+  for (; CommandsRefI != CommandsRefEnd; ++CommandsRefI) {
+    Result.push_back(CommandsRefI->first().str());
+  }
+
+  return Result;
+}
+
 bool JSONCompilationDatabase::parse(std::string &ErrorMessage) {
   llvm::yaml::document_iterator I = YAMLStream.begin();
   if (I == YAMLStream.end()) {
index 7753c154100f2b8131549290b8a10ec5d113bd09..591d48dbbd61b5a62d4fc87989e29e717c1d9897 100644 (file)
@@ -38,6 +38,35 @@ TEST(JSONCompilationDatabase, ErrsOnInvalidFormat) {
   expectFailure("[{\"command\":\"\",\"file\":\"\"}]", "Missing directory");
 }
 
+static std::vector<std::string> getAllFiles(StringRef JSONDatabase,
+                                            std::string &ErrorMessage) {
+  llvm::OwningPtr<CompilationDatabase> Database(
+      JSONCompilationDatabase::loadFromBuffer(JSONDatabase, ErrorMessage));
+  if (!Database) {
+    ADD_FAILURE() << ErrorMessage;
+    return std::vector<std::string>();
+  }
+  return Database->getAllFiles();
+}
+
+TEST(JSONCompilationDatabase, GetAllFiles) {
+  std::string ErrorMessage;
+  EXPECT_EQ(std::vector<std::string>(),
+            getAllFiles("[]", ErrorMessage)) << ErrorMessage;
+
+  std::vector<std::string> expected_files;
+  expected_files.push_back("file1");
+  expected_files.push_back("file2");
+  EXPECT_EQ(expected_files, getAllFiles(
+    "[{\"directory\":\"dir\","
+      "\"command\":\"command\","
+      "\"file\":\"file1\"},"
+    " {\"directory\":\"dir\","
+      "\"command\":\"command\","
+      "\"file\":\"file2\"}]",
+    ErrorMessage)) << ErrorMessage;
+}
+
 static CompileCommand findCompileArgsInJsonDatabase(StringRef FileName,
                                                     StringRef JSONDatabase,
                                                     std::string &ErrorMessage) {
@@ -255,6 +284,15 @@ TEST(FixedCompilationDatabase, ReturnsFixedCommandLine) {
   EXPECT_EQ(ExpectedCommandLine, Result[0].CommandLine);
 }
 
+TEST(FixedCompilationDatabase, GetAllFiles) {
+  std::vector<std::string> CommandLine;
+  CommandLine.push_back("one");
+  CommandLine.push_back("two");
+  FixedCompilationDatabase Database(".", CommandLine);
+
+  EXPECT_EQ(0ul, Database.getAllFiles().size());
+}
+
 TEST(ParseFixedCompilationDatabase, ReturnsNullOnEmptyArgumentList) {
   int Argc = 0;
   llvm::OwningPtr<FixedCompilationDatabase> Database(