diff options
author | Stephen Kelly <steveire@gmail.com> | 2019-12-18 22:35:46 +0000 |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2019-12-27 15:25:57 +0000 |
commit | f0722333dd167245eb3c2b4263529a1ce3679b5c (patch) | |
tree | e2bb3191dedf0f83247cbd6eedb7cf8af92d3f82 /clang-tools-extra/unittests/clang-query | |
parent | 2abda66848e5b7f502f978f030254118ec6751d6 (diff) | |
download | bcm5719-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.cpp | 101 |
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); +} |