From 1a963b825c36012200d5bdb5ea2c2d6285980d29 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Tue, 22 Sep 2015 17:22:33 +0000 Subject: [PATCH] [tooling] Provide the compile commands of the JSON database in the order that they were provided in the JSON file. This is useful for debugging of issues and reduction of test cases. For example, an issue may show up due to the order that some commands were processed. It is convenient to be able to remove commands from the file and still preserve the order that they are returned, instead of getting a completely different order when removing a few commands. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@248292 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../clang/Tooling/JSONCompilationDatabase.h | 4 ++++ lib/Tooling/JSONCompilationDatabase.cpp | 11 ++++------- unittests/Tooling/CompilationDatabaseTest.cpp | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/include/clang/Tooling/JSONCompilationDatabase.h b/include/clang/Tooling/JSONCompilationDatabase.h index 0e6c893969..2a13fc155c 100644 --- a/include/clang/Tooling/JSONCompilationDatabase.h +++ b/include/clang/Tooling/JSONCompilationDatabase.h @@ -116,6 +116,10 @@ private: // Maps file paths to the compile command lines for that file. llvm::StringMap> IndexByFile; + /// All the compile commands in the order that they were provided in the + /// JSON stream. + std::vector AllCommands; + FileMatchTrie MatchTrie; std::unique_ptr Database; diff --git a/lib/Tooling/JSONCompilationDatabase.cpp b/lib/Tooling/JSONCompilationDatabase.cpp index dd4d7a8f08..299fbdc149 100644 --- a/lib/Tooling/JSONCompilationDatabase.cpp +++ b/lib/Tooling/JSONCompilationDatabase.cpp @@ -206,11 +206,7 @@ JSONCompilationDatabase::getAllFiles() const { std::vector JSONCompilationDatabase::getAllCompileCommands() const { std::vector Commands; - for (llvm::StringMap< std::vector >::const_iterator - CommandsRefI = IndexByFile.begin(), CommandsRefEnd = IndexByFile.end(); - CommandsRefI != CommandsRefEnd; ++CommandsRefI) { - getCommands(CommandsRefI->getValue(), Commands); - } + getCommands(AllCommands, Commands); return Commands; } @@ -337,8 +333,9 @@ bool JSONCompilationDatabase::parse(std::string &ErrorMessage) { } else { llvm::sys::path::native(FileName, NativeFilePath); } - IndexByFile[NativeFilePath].push_back( - CompileCommandRef(Directory, File, *Command)); + auto Cmd = CompileCommandRef(Directory, File, *Command); + IndexByFile[NativeFilePath].push_back(Cmd); + AllCommands.push_back(Cmd); MatchTrie.insert(NativeFilePath); } return true; diff --git a/unittests/Tooling/CompilationDatabaseTest.cpp b/unittests/Tooling/CompilationDatabaseTest.cpp index b7e7a72d23..380d86fc56 100644 --- a/unittests/Tooling/CompilationDatabaseTest.cpp +++ b/unittests/Tooling/CompilationDatabaseTest.cpp @@ -118,6 +118,25 @@ TEST(JSONCompilationDatabase, GetAllCompileCommands) { EXPECT_EQ(FileName2, Commands[1].Filename) << ErrorMessage; ASSERT_EQ(1u, Commands[1].CommandLine.size()); EXPECT_EQ(Command2, Commands[1].CommandLine[0]) << ErrorMessage; + + // Check that order is preserved. + Commands = getAllCompileCommands( + ("[{\"directory\":\"" + Directory2 + "\"," + + "\"command\":\"" + Command2 + "\"," + "\"file\":\"" + FileName2 + "\"}," + " {\"directory\":\"" + Directory1 + "\"," + + "\"command\":\"" + Command1 + "\"," + "\"file\":\"" + FileName1 + "\"}]").str(), + ErrorMessage); + EXPECT_EQ(2U, Commands.size()) << ErrorMessage; + EXPECT_EQ(Directory2, Commands[0].Directory) << ErrorMessage; + EXPECT_EQ(FileName2, Commands[0].Filename) << ErrorMessage; + ASSERT_EQ(1u, Commands[0].CommandLine.size()); + EXPECT_EQ(Command2, Commands[0].CommandLine[0]) << ErrorMessage; + EXPECT_EQ(Directory1, Commands[1].Directory) << ErrorMessage; + EXPECT_EQ(FileName1, Commands[1].Filename) << ErrorMessage; + ASSERT_EQ(1u, Commands[1].CommandLine.size()); + EXPECT_EQ(Command1, Commands[1].CommandLine[0]) << ErrorMessage; } static CompileCommand findCompileArgsInJsonDatabase(StringRef FileName, -- 2.40.0