diff options
-rw-r--r-- | lib/Tooling/JSONCompilationDatabase.cpp | 17 | ||||
-rw-r--r-- | unittests/Tooling/CompilationDatabaseTest.cpp | 6 |
2 files changed, 20 insertions, 3 deletions
diff --git a/lib/Tooling/JSONCompilationDatabase.cpp b/lib/Tooling/JSONCompilationDatabase.cpp index 9013f2143f..254b069952 100644 --- a/lib/Tooling/JSONCompilationDatabase.cpp +++ b/lib/Tooling/JSONCompilationDatabase.cpp @@ -49,7 +49,9 @@ class CommandLineArgumentParser { bool parseStringInto(std::string &String) { do { if (*Position == '"') { - if (!parseQuotedStringInto(String)) return false; + if (!parseDoubleQuotedStringInto(String)) return false; + } else if (*Position == '\'') { + if (!parseSingleQuotedStringInto(String)) return false; } else { if (!parseFreeStringInto(String)) return false; } @@ -57,7 +59,7 @@ class CommandLineArgumentParser { return true; } - bool parseQuotedStringInto(std::string &String) { + bool parseDoubleQuotedStringInto(std::string &String) { if (!next()) return false; while (*Position != '"') { if (!skipEscapeCharacter()) return false; @@ -67,12 +69,21 @@ class CommandLineArgumentParser { return next(); } + bool parseSingleQuotedStringInto(std::string &String) { + if (!next()) return false; + while (*Position != '\'') { + String.push_back(*Position); + if (!next()) return false; + } + return next(); + } + bool parseFreeStringInto(std::string &String) { do { if (!skipEscapeCharacter()) return false; String.push_back(*Position); if (!next()) return false; - } while (*Position != ' ' && *Position != '"'); + } while (*Position != ' ' && *Position != '"' && *Position != '\''); return true; } diff --git a/unittests/Tooling/CompilationDatabaseTest.cpp b/unittests/Tooling/CompilationDatabaseTest.cpp index 5a35875c3e..c453b056d2 100644 --- a/unittests/Tooling/CompilationDatabaseTest.cpp +++ b/unittests/Tooling/CompilationDatabaseTest.cpp @@ -391,6 +391,12 @@ TEST(unescapeJsonCommandLine, ParsesQuotedStringWithoutClosingQuote) { EXPECT_EQ("", Empty[0]); } +TEST(unescapeJsonCommandLine, ParsesSingleQuotedString) { + std::vector<std::string> Args = unescapeJsonCommandLine("a'\\\\b \\\"c\\\"'"); + ASSERT_EQ(1ul, Args.size()); + EXPECT_EQ("a\\b \"c\"", Args[0]); +} + TEST(FixedCompilationDatabase, ReturnsFixedCommandLine) { std::vector<std::string> CommandLine; CommandLine.push_back("one"); |