Index: lib/Tooling/JSONCompilationDatabase.cpp =================================================================== --- lib/Tooling/JSONCompilationDatabase.cpp +++ lib/Tooling/JSONCompilationDatabase.cpp @@ -62,7 +62,7 @@ bool parseDoubleQuotedStringInto(std::string &String) { if (!next()) return false; while (*Position != '"') { - if (!skipEscapeCharacter()) return false; + if (!skipEscapeForDoubleQuote()) return false; String.push_back(*Position); if (!next()) return false; } @@ -80,16 +80,18 @@ bool parseFreeStringInto(std::string &String) { do { - if (!skipEscapeCharacter()) return false; + if (!skipEscapeForDoubleQuote()) return false; String.push_back(*Position); if (!next()) return false; } while (*Position != ' ' && *Position != '"' && *Position != '\''); return true; } - bool skipEscapeCharacter() { + bool skipEscapeForDoubleQuote() { if (*Position == '\\') { - return next(); + if (next() && *Position == '"') + return true; + --Position; } return true; } Index: unittests/Tooling/CompilationDatabaseTest.cpp =================================================================== --- unittests/Tooling/CompilationDatabaseTest.cpp +++ unittests/Tooling/CompilationDatabaseTest.cpp @@ -90,10 +90,10 @@ StringRef Directory1("//net/dir1"); StringRef FileName1("file1"); - StringRef Command1("command1"); + StringRef Command1(R"(command1 -DFOO=\"1\\2\\\" \" -DBAR=\\)"); StringRef Directory2("//net/dir2"); StringRef FileName2("file1"); - StringRef Command2("command1"); + StringRef Command2(R"(command2 \"with spaces\")"); std::vector Commands = getAllCompileCommands( ("[{\"directory\":\"" + Directory1 + "\"," + @@ -103,13 +103,16 @@ "\"command\":\"" + Command2 + "\"," "\"file\":\"" + FileName2 + "\"}]").str(), ErrorMessage); - EXPECT_EQ(2U, Commands.size()) << ErrorMessage; + EXPECT_EQ(2u, Commands.size()) << ErrorMessage; EXPECT_EQ(Directory1, Commands[0].Directory) << ErrorMessage; - ASSERT_EQ(1u, Commands[0].CommandLine.size()); - EXPECT_EQ(Command1, Commands[0].CommandLine[0]) << ErrorMessage; + ASSERT_EQ(3u, Commands[0].CommandLine.size()); + EXPECT_EQ("command1", Commands[0].CommandLine[0]) << ErrorMessage; + EXPECT_EQ(R"(-DFOO=1\2" )", Commands[0].CommandLine[1]) << ErrorMessage; + EXPECT_EQ(R"(-DBAR=\)", Commands[0].CommandLine[2]) << ErrorMessage; EXPECT_EQ(Directory2, Commands[1].Directory) << ErrorMessage; - ASSERT_EQ(1u, Commands[1].CommandLine.size()); - EXPECT_EQ(Command2, Commands[1].CommandLine[0]) << ErrorMessage; + ASSERT_EQ(2u, Commands[1].CommandLine.size()); + EXPECT_EQ("command2", Commands[1].CommandLine[0]) << ErrorMessage; + EXPECT_EQ("with spaces", Commands[1].CommandLine[1]) << ErrorMessage; } static CompileCommand findCompileArgsInJsonDatabase(StringRef FileName,