Skip to content

Commit 314b243

Browse files
committed
[Refactoring] Maintain backticks from type members when generating memberwise initializer
Previously, we were dropping backticks, which might lead to invalid code if the type member was a keyword. rdar://81888671
1 parent da62398 commit 314b243

File tree

5 files changed

+20
-11
lines changed

5 files changed

+20
-11
lines changed

lib/IDE/Refactoring.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3147,12 +3147,12 @@ bool RefactoringActionLocalizeString::performChange() {
31473147
}
31483148

31493149
struct MemberwiseParameter {
3150-
Identifier Name;
3150+
CharSourceRange NameRange;
31513151
Type MemberType;
31523152
Expr *DefaultExpr;
31533153

3154-
MemberwiseParameter(Identifier name, Type type, Expr *initialExpr)
3155-
: Name(name), MemberType(type), DefaultExpr(initialExpr) {}
3154+
MemberwiseParameter(CharSourceRange nameRange, Type type, Expr *initialExpr)
3155+
: NameRange(nameRange), MemberType(type), DefaultExpr(initialExpr) {}
31563156
};
31573157

31583158
static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
@@ -3164,7 +3164,7 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
31643164
auto insertMember = [&SM](const MemberwiseParameter &memberData,
31653165
raw_ostream &OS, bool wantsSeparator) {
31663166
{
3167-
OS << memberData.Name << ": ";
3167+
OS << SM.extractText(memberData.NameRange) << ": ";
31683168
// Unconditionally print '@escaping' if we print out a function type -
31693169
// the assignments we generate below will escape this parameter.
31703170
if (isa<AnyFunctionType>(memberData.MemberType->getCanonicalType())) {
@@ -3204,7 +3204,8 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
32043204
OS << ") {\n";
32053205
for (auto &member : memberVector) {
32063206
// self.<property> = <property>
3207-
OS << "self." << member.Name << " = " << member.Name << "\n";
3207+
auto name = SM.extractText(member.NameRange);
3208+
OS << "self." << name << " = " << name << "\n";
32083209
}
32093210
OS << "}\n";
32103211

@@ -3233,6 +3234,8 @@ collectMembersForInit(const ResolvedCursorInfo &CursorInfo,
32333234
if (!targetLocation.isValid())
32343235
return SourceLoc();
32353236

3237+
SourceManager &SM = nominalDecl->getASTContext().SourceMgr;
3238+
32363239
for (auto member : nominalDecl->getMembers()) {
32373240
auto varDecl = dyn_cast<VarDecl>(member);
32383241
if (!varDecl) {
@@ -3261,8 +3264,9 @@ collectMembersForInit(const ResolvedCursorInfo &CursorInfo,
32613264
defaultInit = patternBinding->getOriginalInit(i);
32623265
}
32633266

3264-
memberVector.emplace_back(varDecl->getName(),
3265-
varDecl->getType(), defaultInit);
3267+
auto NameRange =
3268+
Lexer::getCharSourceRangeFromSourceRange(SM, varDecl->getNameLoc());
3269+
memberVector.emplace_back(NameRange, varDecl->getType(), defaultInit);
32663270
}
32673271

32683272
return targetLocation;

test/refactoring/MemberwiseInit/Outputs/generate_memberwise/class_members.swift.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ struct Place {
3535
let plusFour: Int?
3636
let callback: Callback
3737
@MyWrapper var wrapped: String
38+
var `protocol`: String
3839
}
3940

4041
protocol Thing {

test/refactoring/MemberwiseInit/Outputs/generate_memberwise/only_computed_members.swift.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct Place {
2323
let plusFour: Int?
2424
let callback: Callback
2525
@MyWrapper var wrapped: String
26+
var `protocol`: String
2627
}
2728

2829
protocol Thing {

test/refactoring/MemberwiseInit/Outputs/generate_memberwise/struct_members.swift.expected

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class Person {
1313
}
1414

1515
struct Place {
16-
internal init(person: Person, street: String, apartment: Optional<String> = nil, city: String, state: String, postalCode: Int, plusFour: Int? = nil, callback: @escaping Place.Callback, wrapped: String) {
16+
internal init(person: Person, street: String, apartment: Optional<String> = nil, city: String, state: String, postalCode: Int, plusFour: Int? = nil, callback: @escaping Place.Callback, wrapped: String, `protocol`: String) {
1717
self.person = person
1818
self.street = street
1919
self.apartment = apartment
@@ -23,6 +23,7 @@ self.postalCode = postalCode
2323
self.plusFour = plusFour
2424
self.callback = callback
2525
self.wrapped = wrapped
26+
self.`protocol` = `protocol`
2627
}
2728

2829
typealias Callback = () -> ()
@@ -35,6 +36,7 @@ self.wrapped = wrapped
3536
let plusFour: Int?
3637
let callback: Callback
3738
@MyWrapper var wrapped: String
39+
var `protocol`: String
3840
}
3941

4042
protocol Thing {

test/refactoring/MemberwiseInit/generate_memberwise.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct Place {
2323
let plusFour: Int?
2424
let callback: Callback
2525
@MyWrapper var wrapped: String
26+
var `protocol`: String
2627
}
2728

2829
protocol Thing {
@@ -50,9 +51,9 @@ struct MyWrapper {
5051
// RUN: %refactor -memberwise-init -source-filename %s -pos=15:8 > %t.result/struct_members.swift
5152
// RUN: diff -u %S/Outputs/generate_memberwise/struct_members.swift.expected %t.result/struct_members.swift
5253

53-
// RUN: %refactor -memberwise-init -source-filename %s -pos=36:8 > %t.result/only_computed_members.swift
54+
// RUN: %refactor -memberwise-init -source-filename %s -pos=37:8 > %t.result/only_computed_members.swift
5455
// RUN: diff -u %S/Outputs/generate_memberwise/only_computed_members.swift.expected %t.result/only_computed_members.swift
5556

56-
// RUN: not %refactor -memberwise-init -source-filename %s -pos=24:10 > %t.result/protocol_members.swift
57-
// RUN: not %refactor -memberwise-init -source-filename %s -pos=28:6 > %t.result/enum_members.swift
57+
// RUN: not %refactor -memberwise-init -source-filename %s -pos=29:10 > %t.result/protocol_members.swift
58+
// RUN: not %refactor -memberwise-init -source-filename %s -pos=33:6 > %t.result/enum_members.swift
5859

0 commit comments

Comments
 (0)