ymandel updated this revision to Diff 281268. ymandel added a comment. updated comment
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D84315/new/ https://reviews.llvm.org/D84315 Files: clang/include/clang/Tooling/Transformer/RangeSelector.h clang/lib/Tooling/Transformer/Parsing.cpp clang/unittests/Tooling/RangeSelectorTest.cpp
Index: clang/unittests/Tooling/RangeSelectorTest.cpp =================================================================== --- clang/unittests/Tooling/RangeSelectorTest.cpp +++ clang/unittests/Tooling/RangeSelectorTest.cpp @@ -193,8 +193,33 @@ HasValue(EqualsCharSourceRange(ExpectedAfter))); } +TEST(RangeSelectorTest, BetweenOp) { + StringRef Code = R"cc( + int f(int x, int y, int z) { return 3; } + int g() { return f(3, /* comment */ 7 /* comment */, 9); } + )cc"; + auto Matcher = callExpr(hasArgument(0, expr().bind("a0")), + hasArgument(1, expr().bind("a1"))); + RangeSelector R = between(node("a0"), node("a1")); + TestMatch Match = matchCode(Code, Matcher); + EXPECT_THAT_EXPECTED(select(R, Match), HasValue(", /* comment */ ")); +} + +TEST(RangeSelectorTest, BetweenOpParsed) { + StringRef Code = R"cc( + int f(int x, int y, int z) { return 3; } + int g() { return f(3, /* comment */ 7 /* comment */, 9); } + )cc"; + auto Matcher = callExpr(hasArgument(0, expr().bind("a0")), + hasArgument(1, expr().bind("a1"))); + auto R = parseRangeSelector(R"rs(between(node("a0"), node("a1")))rs"); + ASSERT_THAT_EXPECTED(R, llvm::Succeeded()); + TestMatch Match = matchCode(Code, Matcher); + EXPECT_THAT_EXPECTED(select(*R, Match), HasValue(", /* comment */ ")); +} + // Node-id specific version. -TEST(RangeSelectorTest, RangeOpNodes) { +TEST(RangeSelectorTest, EncloseOpNodes) { StringRef Code = R"cc( int f(int x, int y, int z) { return 3; } int g() { return f(/* comment */ 3, 7 /* comment */, 9); } @@ -206,7 +231,7 @@ EXPECT_THAT_EXPECTED(select(R, Match), HasValue("3, 7")); } -TEST(RangeSelectorTest, RangeOpGeneral) { +TEST(RangeSelectorTest, EncloseOpGeneral) { StringRef Code = R"cc( int f(int x, int y, int z) { return 3; } int g() { return f(/* comment */ 3, 7 /* comment */, 9); } @@ -218,7 +243,7 @@ EXPECT_THAT_EXPECTED(select(R, Match), HasValue("3, 7")); } -TEST(RangeSelectorTest, RangeOpNodesParsed) { +TEST(RangeSelectorTest, EncloseOpNodesParsed) { StringRef Code = R"cc( int f(int x, int y, int z) { return 3; } int g() { return f(/* comment */ 3, 7 /* comment */, 9); } @@ -231,7 +256,7 @@ EXPECT_THAT_EXPECTED(select(*R, Match), HasValue("3, 7")); } -TEST(RangeSelectorTest, RangeOpGeneralParsed) { +TEST(RangeSelectorTest, EncloseOpGeneralParsed) { StringRef Code = R"cc( int f(int x, int y, int z) { return 3; } int g() { return f(/* comment */ 3, 7 /* comment */, 9); } Index: clang/lib/Tooling/Transformer/Parsing.cpp =================================================================== --- clang/lib/Tooling/Transformer/Parsing.cpp +++ clang/lib/Tooling/Transformer/Parsing.cpp @@ -109,14 +109,14 @@ static const llvm::StringMap<RangeSelectorOp<std::string, std::string>> & getBinaryStringSelectors() { static const llvm::StringMap<RangeSelectorOp<std::string, std::string>> M = { - {"encloseNodes", range}}; + {"encloseNodes", encloseNodes}}; return M; } static const llvm::StringMap<RangeSelectorOp<RangeSelector, RangeSelector>> & getBinaryRangeSelectors() { static const llvm::StringMap<RangeSelectorOp<RangeSelector, RangeSelector>> - M = {{"enclose", range}}; + M = {{"enclose", enclose}, {"between", between}}; return M; } Index: clang/include/clang/Tooling/Transformer/RangeSelector.h =================================================================== --- clang/include/clang/Tooling/Transformer/RangeSelector.h +++ clang/include/clang/Tooling/Transformer/RangeSelector.h @@ -56,6 +56,11 @@ /// * the TokenRange [B,E'] where the token at E' spans the range [E',E). RangeSelector after(RangeSelector Selector); +/// Selects the range between `R1` and `R2. +inline RangeSelector between(RangeSelector R1, RangeSelector R2) { + return enclose(after(std::move(R1)), before(std::move(R2))); +} + /// Selects a node, including trailing semicolon (for non-expression /// statements). \p ID is the node's binding in the match result. RangeSelector node(std::string ID);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits