summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2019-12-18 22:35:46 +0000
committerStephen Kelly <steveire@gmail.com>2019-12-26 20:00:59 +0000
commit6a3ecf4dc7ec299394e71b3124df2b3a34ed4ac3 (patch)
treee540a5fd8d6137071253489d4d1ea0a0652dab65 /clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
parentbe4704bd41a4dd8bb5c4dd5a614744c69fb3cf8e (diff)
downloadbcm5719-llvm-6a3ecf4dc7ec299394e71b3124df2b3a34ed4ac3.tar.gz
bcm5719-llvm-6a3ecf4dc7ec299394e71b3124df2b3a34ed4ac3.zip
Allow newlines in AST Matchers in clang-query files
Reviewers: aaron.ballman Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D71842
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