Skip to content

Commit 01b965f

Browse files
committed
[IDE] Use Identifier for printing member name in generateMemberwiseInit
Avoid relying on the source text and print the identifier, escaping if needed.
1 parent 442a11b commit 01b965f

File tree

5 files changed

+28
-15
lines changed

5 files changed

+28
-15
lines changed

lib/Refactoring/MemberwiseInitLocalRefactoring.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,23 @@ using namespace swift::refactoring;
1616

1717
namespace {
1818
struct MemberwiseParameter {
19-
CharSourceRange NameRange;
19+
Identifier Name;
2020
Type MemberType;
2121
Expr *DefaultExpr;
2222

23-
MemberwiseParameter(CharSourceRange nameRange, Type type, Expr *initialExpr)
24-
: NameRange(nameRange), MemberType(type), DefaultExpr(initialExpr) {}
23+
MemberwiseParameter(Identifier name, Type type, Expr *initialExpr)
24+
: Name(name), MemberType(type), DefaultExpr(initialExpr) {}
2525
};
2626
} // namespace
2727

28+
static void printMemberName(Identifier name, llvm::raw_ostream &OS) {
29+
if (escapeIdentifierInContext(name, PrintNameContext::TypeMember)) {
30+
OS << '`' << name << '`';
31+
} else {
32+
OS << name;
33+
}
34+
}
35+
2836
static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
2937
SourceManager &SM,
3038
ArrayRef<MemberwiseParameter> memberVector,
@@ -34,7 +42,8 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
3442
auto insertMember = [&SM](const MemberwiseParameter &memberData,
3543
raw_ostream &OS, bool wantsSeparator) {
3644
{
37-
OS << SM.extractText(memberData.NameRange) << ": ";
45+
printMemberName(memberData.Name, OS);
46+
OS << ": ";
3847
// Unconditionally print '@escaping' if we print out a function type -
3948
// the assignments we generate below will escape this parameter.
4049
if (isa<AnyFunctionType>(memberData.MemberType->getCanonicalType())) {
@@ -73,8 +82,11 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
7382
OS << ") {\n";
7483
for (auto &member : memberVector) {
7584
// self.<property> = <property>
76-
auto name = SM.extractText(member.NameRange);
77-
OS << "self." << name << " = " << name << "\n";
85+
OS << "self.";
86+
printMemberName(member.Name, OS);
87+
OS << " = ";
88+
printMemberName(member.Name, OS);
89+
OS << "\n";
7890
}
7991
OS << "}\n";
8092

@@ -104,8 +116,6 @@ collectMembersForInit(ResolvedCursorInfoPtr CursorInfo,
104116
if (!targetLocation.isValid())
105117
return SourceLoc();
106118

107-
SourceManager &SM = nominalDecl->getASTContext().SourceMgr;
108-
109119
for (auto member : nominalDecl->getMemberwiseInitProperties()) {
110120
auto varDecl = dyn_cast<VarDecl>(member);
111121
if (!varDecl) {
@@ -130,9 +140,7 @@ collectMembersForInit(ResolvedCursorInfoPtr CursorInfo,
130140
defaultInit = patternBinding->getOriginalInit(i);
131141
}
132142

133-
auto NameRange =
134-
Lexer::getCharSourceRangeFromSourceRange(SM, varDecl->getNameLoc());
135-
memberVector.emplace_back(NameRange, varDecl->getTypeInContext(),
143+
memberVector.emplace_back(varDecl->getName(), varDecl->getTypeInContext(),
136144
defaultInit);
137145
}
138146

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ struct Place {
4444
let callback: Callback
4545
@MyWrapper var wrapped: String
4646
var `protocol`: String
47+
var `some raw identifier`: Int
4748
}
4849

4950
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
@@ -31,6 +31,7 @@ struct Place {
3131
let callback: Callback
3232
@MyWrapper var wrapped: String
3333
var `protocol`: String
34+
var `some raw identifier`: Int
3435
}
3536

3637
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
@@ -20,7 +20,7 @@ class Person {
2020
}
2121

2222
struct Place {
23-
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) {
23+
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, `some raw identifier`: Int) {
2424
self.person = person
2525
self.street = street
2626
self.apartment = apartment
@@ -31,6 +31,7 @@ self.plusFour = plusFour
3131
self.callback = callback
3232
self.wrapped = wrapped
3333
self.`protocol` = `protocol`
34+
self.`some raw identifier` = `some raw identifier`
3435
}
3536

3637
typealias Callback = () -> ()
@@ -44,6 +45,7 @@ self.`protocol` = `protocol`
4445
let callback: Callback
4546
@MyWrapper var wrapped: String
4647
var `protocol`: String
48+
var `some raw identifier`: Int
4749
}
4850

4951
protocol Thing {

test/refactoring/MemberwiseInit/generate_memberwise.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct Place {
3131
let callback: Callback
3232
@MyWrapper var wrapped: String
3333
var `protocol`: String
34+
var `some raw identifier`: Int
3435
}
3536

3637
protocol Thing {
@@ -58,9 +59,9 @@ struct MyWrapper {
5859
// RUN: %refactor -memberwise-init -source-filename %s -pos=22:8 > %t.result/struct_members.swift
5960
// RUN: diff -u %S/Outputs/generate_memberwise/struct_members.swift.expected %t.result/struct_members.swift
6061

61-
// RUN: %refactor -memberwise-init -source-filename %s -pos=44:8 > %t.result/only_computed_members.swift
62+
// RUN: %refactor -memberwise-init -source-filename %s -pos=45:8 > %t.result/only_computed_members.swift
6263
// RUN: diff -u %S/Outputs/generate_memberwise/only_computed_members.swift.expected %t.result/only_computed_members.swift
6364

64-
// RUN: not %refactor -memberwise-init -source-filename %s -pos=36:10 > %t.result/protocol_members.swift
65-
// RUN: not %refactor -memberwise-init -source-filename %s -pos=40:6 > %t.result/enum_members.swift
65+
// RUN: not %refactor -memberwise-init -source-filename %s -pos=37:10 > %t.result/protocol_members.swift
66+
// RUN: not %refactor -memberwise-init -source-filename %s -pos=41:6 > %t.result/enum_members.swift
6667

0 commit comments

Comments
 (0)