summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/unittests/clang-query
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2019-12-18 22:35:46 +0000
committerStephen Kelly <steveire@gmail.com>2019-12-27 15:25:57 +0000
commitf0722333dd167245eb3c2b4263529a1ce3679b5c (patch)
treee2bb3191dedf0f83247cbd6eedb7cf8af92d3f82 /clang-tools-extra/unittests/clang-query
parent2abda66848e5b7f502f978f030254118ec6751d6 (diff)
downloadbcm5719-llvm-f0722333dd167245eb3c2b4263529a1ce3679b5c.tar.gz
bcm5719-llvm-f0722333dd167245eb3c2b4263529a1ce3679b5c.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')
-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