Skip to content

Commit 9f97480

Browse files
committed
[libTooling] Small changes in Transformer API.
Summary: * Rename `transformer::change` to `transformer::changeTo`, make `change` forward to `changeTo` and mark it deprecated. * Mark `transformer::text` and `transformer::selection` deprecated and migrate references to them in tests. Reviewers: ilya-biryukov Subscribers: gribozavr, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D69896
1 parent 7cea0ce commit 9f97480

File tree

3 files changed

+57
-46
lines changed

3 files changed

+57
-46
lines changed

clang/include/clang/Tooling/Transformer/RewriteRule.h

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,18 @@ using TextGenerator = MatchConsumer<std::string>;
5555
// `ASTEdit` should be built using the `change` convenience functions. For
5656
// example,
5757
// \code
58-
// change(name(fun), text("Frodo"))
58+
// changeTo(name(fun), cat("Frodo"))
5959
// \endcode
6060
// Or, if we use Stencil for the TextGenerator:
6161
// \code
6262
// using stencil::cat;
63-
// change(statement(thenNode), cat("{", thenNode, "}"))
64-
// change(callArgs(call), cat(x, ",", y))
63+
// changeTo(statement(thenNode), cat("{", thenNode, "}"))
64+
// changeTo(callArgs(call), cat(x, ",", y))
6565
// \endcode
6666
// Or, if you are changing the node corresponding to the rule's matcher, you can
6767
// use the single-argument override of \c change:
6868
// \code
69-
// change(cat("different_expr"))
69+
// changeTo(cat("different_expr"))
7070
// \endcode
7171
struct ASTEdit {
7272
RangeSelector TargetRange;
@@ -141,7 +141,7 @@ inline RewriteRule makeRule(ast_matchers::internal::DynTypedMatcher M,
141141
/// could write:
142142
/// \code
143143
/// auto R = makeRule(callExpr(callee(functionDecl(hasName("foo")))),
144-
/// change(text("bar()")));
144+
/// changeTo(cat("bar()")));
145145
/// AddInclude(R, "path/to/bar_header.h");
146146
/// AddInclude(R, "vector", IncludeFormat::Angled);
147147
/// \endcode
@@ -190,28 +190,36 @@ void addInclude(RewriteRule &Rule, llvm::StringRef Header,
190190
RewriteRule applyFirst(ArrayRef<RewriteRule> Rules);
191191

192192
/// Replaces a portion of the source text with \p Replacement.
193-
ASTEdit change(RangeSelector Target, TextGenerator Replacement);
193+
ASTEdit changeTo(RangeSelector Target, TextGenerator Replacement);
194+
/// DEPRECATED: use \c changeTo.
195+
inline ASTEdit change(RangeSelector Target, TextGenerator Replacement) {
196+
return changeTo(std::move(Target), std::move(Replacement));
197+
}
194198

195199
/// Replaces the entirety of a RewriteRule's match with \p Replacement. For
196200
/// example, to replace a function call, one could write:
197201
/// \code
198202
/// makeRule(callExpr(callee(functionDecl(hasName("foo")))),
199-
/// change(text("bar()")))
203+
/// changeTo(cat("bar()")))
200204
/// \endcode
205+
inline ASTEdit changeTo(TextGenerator Replacement) {
206+
return changeTo(node(RewriteRule::RootID), std::move(Replacement));
207+
}
208+
/// DEPRECATED: use \c changeTo.
201209
inline ASTEdit change(TextGenerator Replacement) {
202-
return change(node(RewriteRule::RootID), std::move(Replacement));
210+
return changeTo(std::move(Replacement));
203211
}
204212

205213
/// Inserts \p Replacement before \p S, leaving the source selected by \S
206214
/// unchanged.
207215
inline ASTEdit insertBefore(RangeSelector S, TextGenerator Replacement) {
208-
return change(before(std::move(S)), std::move(Replacement));
216+
return changeTo(before(std::move(S)), std::move(Replacement));
209217
}
210218

211219
/// Inserts \p Replacement after \p S, leaving the source selected by \S
212220
/// unchanged.
213221
inline ASTEdit insertAfter(RangeSelector S, TextGenerator Replacement) {
214-
return change(after(std::move(S)), std::move(Replacement));
222+
return changeTo(after(std::move(S)), std::move(Replacement));
215223
}
216224

217225
/// Removes the source selected by \p S.

clang/include/clang/Tooling/Transformer/Stencil.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,11 @@ template <typename... Ts> Stencil cat(Ts &&... Parts) {
108108
// Functions for conveniently building stencils.
109109
//
110110

111+
/// DEPRECATED: Use `cat` instead.
111112
/// \returns exactly the text provided.
112113
Stencil text(llvm::StringRef Text);
113114

115+
/// DEPRECATED: Use `cat` instead.
114116
/// \returns the source corresponding to the selected range.
115117
Stencil selection(RangeSelector Selector);
116118

clang/unittests/Tooling/TransformerTest.cpp

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ static RewriteRule ruleStrlenSize() {
147147
on(expr(hasType(isOrPointsTo(StringType)))
148148
.bind(StringExpr)),
149149
callee(cxxMethodDecl(hasName("c_str")))))),
150-
change(text("REPLACED")), text("Use size() method directly on string."));
150+
changeTo(cat("REPLACED")), cat("Use size() method directly on string."));
151151
return R;
152152
}
153153

@@ -171,7 +171,7 @@ TEST_F(TransformerTest, Flag) {
171171
hasName("proto::ProtoCommandLineFlag"))))
172172
.bind(Flag)),
173173
unless(callee(cxxMethodDecl(hasName("GetProto"))))),
174-
change(node(Flag), text("EXPR")));
174+
changeTo(node(Flag), cat("EXPR")));
175175

176176
std::string Input = R"cc(
177177
proto::ProtoCommandLineFlag flag;
@@ -189,7 +189,7 @@ TEST_F(TransformerTest, Flag) {
189189

190190
TEST_F(TransformerTest, AddIncludeQuoted) {
191191
RewriteRule Rule = makeRule(callExpr(callee(functionDecl(hasName("f")))),
192-
change(text("other()")));
192+
changeTo(cat("other()")));
193193
addInclude(Rule, "clang/OtherLib.h");
194194

195195
std::string Input = R"cc(
@@ -207,7 +207,7 @@ TEST_F(TransformerTest, AddIncludeQuoted) {
207207

208208
TEST_F(TransformerTest, AddIncludeAngled) {
209209
RewriteRule Rule = makeRule(callExpr(callee(functionDecl(hasName("f")))),
210-
change(text("other()")));
210+
changeTo(cat("other()")));
211211
addInclude(Rule, "clang/OtherLib.h", transformer::IncludeFormat::Angled);
212212

213213
std::string Input = R"cc(
@@ -226,7 +226,7 @@ TEST_F(TransformerTest, AddIncludeAngled) {
226226
TEST_F(TransformerTest, NodePartNameNamedDecl) {
227227
StringRef Fun = "fun";
228228
RewriteRule Rule = makeRule(functionDecl(hasName("bad")).bind(Fun),
229-
change(name(Fun), text("good")));
229+
changeTo(name(Fun), cat("good")));
230230

231231
std::string Input = R"cc(
232232
int bad(int x);
@@ -258,7 +258,7 @@ TEST_F(TransformerTest, NodePartNameDeclRef) {
258258

259259
StringRef Ref = "ref";
260260
testRule(makeRule(declRefExpr(to(functionDecl(hasName("bad")))).bind(Ref),
261-
change(name(Ref), text("good"))),
261+
changeTo(name(Ref), cat("good"))),
262262
Input, Expected);
263263
}
264264

@@ -276,7 +276,7 @@ TEST_F(TransformerTest, NodePartNameDeclRefFailure) {
276276

277277
StringRef Ref = "ref";
278278
Transformer T(makeRule(declRefExpr(to(functionDecl())).bind(Ref),
279-
change(name(Ref), text("good"))),
279+
changeTo(name(Ref), cat("good"))),
280280
consumer());
281281
T.registerMatchers(&MatchFinder);
282282
EXPECT_FALSE(rewrite(Input));
@@ -285,7 +285,7 @@ TEST_F(TransformerTest, NodePartNameDeclRefFailure) {
285285
TEST_F(TransformerTest, NodePartMember) {
286286
StringRef E = "expr";
287287
RewriteRule Rule = makeRule(memberExpr(member(hasName("bad"))).bind(E),
288-
change(member(E), text("good")));
288+
changeTo(member(E), cat("good")));
289289

290290
std::string Input = R"cc(
291291
struct S {
@@ -338,7 +338,7 @@ TEST_F(TransformerTest, NodePartMemberQualified) {
338338
)cc";
339339

340340
StringRef E = "expr";
341-
testRule(makeRule(memberExpr().bind(E), change(member(E), text("good"))),
341+
testRule(makeRule(memberExpr().bind(E), changeTo(member(E), cat("good"))),
342342
Input, Expected);
343343
}
344344

@@ -370,7 +370,7 @@ TEST_F(TransformerTest, NodePartMemberMultiToken) {
370370

371371
StringRef MemExpr = "member";
372372
testRule(makeRule(memberExpr().bind(MemExpr),
373-
change(member(MemExpr), text("good"))),
373+
changeTo(member(MemExpr), cat("good"))),
374374
Input, Expected);
375375
}
376376

@@ -389,7 +389,7 @@ TEST_F(TransformerTest, InsertBeforeEdit) {
389389

390390
StringRef Ret = "return";
391391
testRule(makeRule(returnStmt().bind(Ret),
392-
insertBefore(statement(Ret), text("int y = 3;"))),
392+
insertBefore(statement(Ret), cat("int y = 3;"))),
393393
Input, Expected);
394394
}
395395

@@ -410,7 +410,7 @@ TEST_F(TransformerTest, InsertAfterEdit) {
410410

411411
StringRef Decl = "decl";
412412
testRule(makeRule(declStmt().bind(Decl),
413-
insertAfter(statement(Decl), text("int y = 3;"))),
413+
insertAfter(statement(Decl), cat("int y = 3;"))),
414414
Input, Expected);
415415
}
416416

@@ -451,9 +451,9 @@ TEST_F(TransformerTest, MultiChange) {
451451
StringRef C = "C", T = "T", E = "E";
452452
testRule(makeRule(ifStmt(hasCondition(expr().bind(C)),
453453
hasThen(stmt().bind(T)), hasElse(stmt().bind(E))),
454-
{change(node(C), text("true")),
455-
change(statement(T), text("{ /* then */ }")),
456-
change(statement(E), text("{ /* else */ }"))}),
454+
{changeTo(node(C), cat("true")),
455+
changeTo(statement(T), cat("{ /* then */ }")),
456+
changeTo(statement(E), cat("{ /* else */ }"))}),
457457
Input, Expected);
458458
}
459459

@@ -464,7 +464,7 @@ TEST_F(TransformerTest, OrderedRuleUnrelated) {
464464
hasName("proto::ProtoCommandLineFlag"))))
465465
.bind(Flag)),
466466
unless(callee(cxxMethodDecl(hasName("GetProto"))))),
467-
change(node(Flag), text("PROTO")));
467+
changeTo(node(Flag), cat("PROTO")));
468468

469469
std::string Input = R"cc(
470470
proto::ProtoCommandLineFlag flag;
@@ -498,10 +498,10 @@ TEST_F(TransformerTest, OrderedRuleRelated) {
498498

499499
RewriteRule ReplaceF1 =
500500
makeRule(callExpr(callee(functionDecl(hasName("f1")))),
501-
change(text("REPLACE_F1")));
501+
changeTo(cat("REPLACE_F1")));
502502
RewriteRule ReplaceF1OrF2 =
503503
makeRule(callExpr(callee(functionDecl(hasAnyName("f1", "f2")))),
504-
change(text("REPLACE_F1_OR_F2")));
504+
changeTo(cat("REPLACE_F1_OR_F2")));
505505
testRule(applyFirst({ReplaceF1, ReplaceF1OrF2}), Input, Expected);
506506
}
507507

@@ -523,10 +523,10 @@ TEST_F(TransformerTest, OrderedRuleRelatedSwapped) {
523523

524524
RewriteRule ReplaceF1 =
525525
makeRule(callExpr(callee(functionDecl(hasName("f1")))),
526-
change(text("REPLACE_F1")));
526+
changeTo(cat("REPLACE_F1")));
527527
RewriteRule ReplaceF1OrF2 =
528528
makeRule(callExpr(callee(functionDecl(hasAnyName("f1", "f2")))),
529-
change(text("REPLACE_F1_OR_F2")));
529+
changeTo(cat("REPLACE_F1_OR_F2")));
530530
testRule(applyFirst({ReplaceF1OrF2, ReplaceF1}), Input, Expected);
531531
}
532532

@@ -551,12 +551,12 @@ TEST_F(TransformerTest, OrderedRuleMultipleKinds) {
551551

552552
RewriteRule ReplaceF1 =
553553
makeRule(callExpr(callee(functionDecl(hasName("f1")))),
554-
change(text("REPLACE_F1")));
554+
changeTo(cat("REPLACE_F1")));
555555
RewriteRule ReplaceF1OrF2 =
556556
makeRule(callExpr(callee(functionDecl(hasAnyName("f1", "f2")))),
557-
change(text("REPLACE_F1_OR_F2")));
557+
changeTo(cat("REPLACE_F1_OR_F2")));
558558
RewriteRule DeclRule = makeRule(functionDecl(hasName("f2")).bind("fun"),
559-
change(name("fun"), text("DECL_RULE")));
559+
changeTo(name("fun"), cat("DECL_RULE")));
560560

561561
RewriteRule Rule = applyFirst({ReplaceF1, DeclRule, ReplaceF1OrF2});
562562
EXPECT_EQ(transformer::detail::buildMatchers(Rule).size(), 2UL);
@@ -576,8 +576,9 @@ TEST_F(TransformerTest, TextGeneratorFailure) {
576576
-> llvm::Expected<std::string> {
577577
return llvm::createStringError(llvm::errc::invalid_argument, "ERROR");
578578
};
579-
Transformer T(makeRule(binaryOperator().bind(O), change(node(O), AlwaysFail)),
580-
consumer());
579+
Transformer T(
580+
makeRule(binaryOperator().bind(O), changeTo(node(O), AlwaysFail)),
581+
consumer());
581582
T.registerMatchers(&MatchFinder);
582583
EXPECT_FALSE(rewrite(Input));
583584
EXPECT_THAT(Changes, IsEmpty());
@@ -590,8 +591,8 @@ TEST_F(TransformerTest, OverlappingEditsInRule) {
590591
// Try to change the whole binary-operator expression AND one its operands:
591592
StringRef O = "O", L = "L";
592593
Transformer T(makeRule(binaryOperator(hasLHS(expr().bind(L))).bind(O),
593-
{change(node(O), text("DELETE_OP")),
594-
change(node(L), text("DELETE_LHS"))}),
594+
{changeTo(node(O), cat("DELETE_OP")),
595+
changeTo(node(L), cat("DELETE_LHS"))}),
595596
consumer());
596597
T.registerMatchers(&MatchFinder);
597598
EXPECT_FALSE(rewrite(Input));
@@ -604,7 +605,7 @@ TEST_F(TransformerTest, OverlappingEditsMultipleMatches) {
604605
std::string Input = "int conflictOneRule() { return -7; }";
605606
// Try to change the whole binary-operator expression AND one its operands:
606607
StringRef E = "E";
607-
Transformer T(makeRule(expr().bind(E), change(node(E), text("DELETE_EXPR"))),
608+
Transformer T(makeRule(expr().bind(E), changeTo(node(E), cat("DELETE_EXPR"))),
608609
consumer());
609610
T.registerMatchers(&MatchFinder);
610611
// The rewrite process fails because the changes conflict with each other...
@@ -618,7 +619,7 @@ TEST_F(TransformerTest, ErrorOccurredMatchSkipped) {
618619
// Syntax error in the function body:
619620
std::string Input = "void errorOccurred() { 3 }";
620621
Transformer T(makeRule(functionDecl(hasName("errorOccurred")),
621-
change(text("DELETED;"))),
622+
changeTo(cat("DELETED;"))),
622623
consumer());
623624
T.registerMatchers(&MatchFinder);
624625
// The rewrite process itself fails...
@@ -642,7 +643,7 @@ TEST_F(TransformerTest, SimpleMacro) {
642643

643644
StringRef zero = "zero";
644645
RewriteRule R = makeRule(integerLiteral(equals(0)).bind(zero),
645-
change(node(zero), text("999")));
646+
changeTo(node(zero), cat("999")));
646647
testRule(R, Input, Expected);
647648
}
648649

@@ -722,7 +723,7 @@ TEST_F(TransformerTest, TwoChangesInOneMacroExpansion) {
722723
int f() { return PLUS(LIT, LIT); }
723724
)cc";
724725

725-
testRule(makeRule(integerLiteral(), change(text("LIT"))), Input, Expected);
726+
testRule(makeRule(integerLiteral(), changeTo(cat("LIT"))), Input, Expected);
726727
}
727728

728729
// Tests case where the rule's match spans both source from the macro and its
@@ -739,7 +740,7 @@ TEST_F(TransformerTest, MatchSpansMacroTextButChangeDoesNot) {
739740

740741
StringRef E = "expr";
741742
testRule(makeRule(binaryOperator(hasLHS(expr().bind(E))),
742-
change(node(E), text("LIT"))),
743+
changeTo(node(E), cat("LIT"))),
743744
Input, Expected);
744745
}
745746

@@ -757,7 +758,7 @@ TEST_F(TransformerTest, MatchSpansMacroTextButChangeDoesNotAnchoredInMacro) {
757758

758759
StringRef E = "expr";
759760
testRule(makeRule(binaryOperator(hasRHS(expr().bind(E))),
760-
change(node(E), text("LIT"))),
761+
changeTo(node(E), cat("LIT"))),
761762
Input, Expected);
762763
}
763764

@@ -772,7 +773,7 @@ TEST_F(TransformerTest, NoPartialRewriteOMacroExpansion) {
772773

773774
StringRef zero = "zero";
774775
RewriteRule R = makeRule(integerLiteral(equals(0)).bind(zero),
775-
change(node(zero), text("0")));
776+
changeTo(node(zero), cat("0")));
776777
testRule(R, Input, Input);
777778
}
778779

@@ -794,11 +795,11 @@ TEST_F(TransformerTest, NoPartialRewriteOfMacroExpansionForMacroArgs) {
794795
// Verifies that `Type` and `QualType` are not allowed as top-level matchers in
795796
// rules.
796797
TEST(TransformerDeathTest, OrderedRuleTypes) {
797-
RewriteRule QualTypeRule = makeRule(qualType(), change(text("Q")));
798+
RewriteRule QualTypeRule = makeRule(qualType(), changeTo(cat("Q")));
798799
EXPECT_DEATH(transformer::detail::buildMatchers(QualTypeRule),
799800
"Matcher must be.*node matcher");
800801

801-
RewriteRule TypeRule = makeRule(arrayType(), change(text("T")));
802+
RewriteRule TypeRule = makeRule(arrayType(), changeTo(cat("T")));
802803
EXPECT_DEATH(transformer::detail::buildMatchers(TypeRule),
803804
"Matcher must be.*node matcher");
804805
}

0 commit comments

Comments
 (0)