summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/unittests/clang-query/QueryParserTest.cpp')
-rw-r--r--clang-tools-extra/unittests/clang-query/QueryParserTest.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp b/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
index 01c65452b03..4725789f29f 100644
--- a/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
+++ b/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
@@ -230,3 +230,104 @@ TEST_F(QueryParserTest, Complete) {
EXPECT_EQ("et ", Comps[0].TypedText);
EXPECT_EQ("let", Comps[0].DisplayText);
}
+
+TEST_F(QueryParserTest, Multiline) {
+
+ // Single string with multiple commands
+ QueryRef Q = parse(R"matcher(
+set bind-root false
+set output dump
+ )matcher");
+
+ ASSERT_TRUE(isa<SetQuery<bool>>(Q));
+
+ Q = parse(Q->RemainingContent);
+ ASSERT_TRUE(isa<SetExclusiveOutputQuery>(Q));
+
+ // Missing newline
+ Q = parse(R"matcher(
+set bind-root false set output dump
+ )matcher");
+
+ ASSERT_TRUE(isa<InvalidQuery>(Q));
+ EXPECT_EQ("unexpected extra input: ' set output dump\n '",
+ cast<InvalidQuery>(Q)->ErrStr);
+
+ // Commands which do their own parsing
+ Q = parse(R"matcher(
+let fn functionDecl(hasName("foo"))
+match callExpr(callee(functionDecl()))
+ )matcher");
+
+ ASSERT_TRUE(isa<LetQuery>(Q));
+
+ Q = parse(Q->RemainingContent);
+ ASSERT_TRUE(isa<MatchQuery>(Q));
+
+ // Multi-line matcher
+ Q = parse(R"matcher(
+match callExpr(callee(
+ functionDecl().bind("fn")
+ ))
+
+ )matcher");
+
+ ASSERT_TRUE(isa<MatchQuery>(Q));
+
+ // Comment locations
+ Q = parse(R"matcher(
+#nospacecomment
+# Leading comment
+match callExpr ( # Trailing comment
+ # Comment alone on line
+
+ callee(
+ functionDecl(
+ ).bind(
+ "fn"
+ )
+ )) # Comment trailing close
+# Comment after match
+ )matcher");
+
+ ASSERT_TRUE(isa<MatchQuery>(Q));
+
+ // \r\n
+ Q = parse("set bind-root false\r\nset output dump");
+
+ ASSERT_TRUE(isa<SetQuery<bool>>(Q));
+
+ Q = parse(Q->RemainingContent);
+ ASSERT_TRUE(isa<SetExclusiveOutputQuery>(Q));
+
+ // Leading and trailing space in lines
+ Q = parse(" set bind-root false \r\n set output dump ");
+
+ ASSERT_TRUE(isa<SetQuery<bool>>(Q));
+
+ Q = parse(Q->RemainingContent);
+ ASSERT_TRUE(isa<SetExclusiveOutputQuery>(Q));
+
+ // Incomplete commands
+ Q = parse("set\nbind-root false");
+
+ ASSERT_TRUE(isa<InvalidQuery>(Q));
+ EXPECT_EQ("expected variable name", cast<InvalidQuery>(Q)->ErrStr);
+
+ Q = parse("set bind-root\nfalse");
+
+ ASSERT_TRUE(isa<InvalidQuery>(Q));
+ EXPECT_EQ("expected 'true' or 'false', got ''",
+ cast<InvalidQuery>(Q)->ErrStr);
+
+ Q = parse(R"matcher(
+match callExpr
+(
+)
+ )matcher");
+
+ ASSERT_TRUE(isa<InvalidQuery>(Q));
+ EXPECT_EQ("1:9: Error parsing matcher. Found token <NewLine> "
+ "while looking for '('.",
+ cast<InvalidQuery>(Q)->ErrStr);
+}
OpenPOWER on IntegriCloud