diff --git a/lib/Refactoring/MemberwiseInitLocalRefactoring.cpp b/lib/Refactoring/MemberwiseInitLocalRefactoring.cpp index 72027f86bfa..c1a1737f49e 100644 --- a/lib/Refactoring/MemberwiseInitLocalRefactoring.cpp +++ b/lib/Refactoring/MemberwiseInitLocalRefactoring.cpp @@ -16,15 +16,23 @@ using namespace swift::refactoring; namespace { struct MemberwiseParameter { - CharSourceRange NameRange; + Identifier Name; Type MemberType; Expr *DefaultExpr; - MemberwiseParameter(CharSourceRange nameRange, Type type, Expr *initialExpr) - : NameRange(nameRange), MemberType(type), DefaultExpr(initialExpr) {} + MemberwiseParameter(Identifier name, Type type, Expr *initialExpr) + : Name(name), MemberType(type), DefaultExpr(initialExpr) {} }; } // namespace +static void printMemberName(Identifier name, llvm::raw_ostream &OS) { + if (escapeIdentifierInContext(name, PrintNameContext::TypeMember)) { + OS << '`' << name << '`'; + } else { + OS << name; + } +} + static void generateMemberwiseInit(SourceEditConsumer &EditConsumer, SourceManager &SM, ArrayRef memberVector, @@ -34,7 +42,8 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer, auto insertMember = [&SM](const MemberwiseParameter &memberData, raw_ostream &OS, bool wantsSeparator) { { - OS << SM.extractText(memberData.NameRange) << ": "; + printMemberName(memberData.Name, OS); + OS << ": "; // Unconditionally print '@escaping' if we print out a function type - // the assignments we generate below will escape this parameter. if (isa(memberData.MemberType->getCanonicalType())) { @@ -73,8 +82,11 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer, OS << ") {\n"; for (auto &member : memberVector) { // self. = - auto name = SM.extractText(member.NameRange); - OS << "self." << name << " = " << name << "\n"; + OS << "self."; + printMemberName(member.Name, OS); + OS << " = "; + printMemberName(member.Name, OS); + OS << "\n"; } OS << "}\n"; @@ -104,8 +116,6 @@ collectMembersForInit(ResolvedCursorInfoPtr CursorInfo, if (!targetLocation.isValid()) return SourceLoc(); - SourceManager &SM = nominalDecl->getASTContext().SourceMgr; - for (auto member : nominalDecl->getMemberwiseInitProperties()) { auto varDecl = dyn_cast(member); if (!varDecl) { @@ -130,9 +140,7 @@ collectMembersForInit(ResolvedCursorInfoPtr CursorInfo, defaultInit = patternBinding->getOriginalInit(i); } - auto NameRange = - Lexer::getCharSourceRangeFromSourceRange(SM, varDecl->getNameLoc()); - memberVector.emplace_back(NameRange, varDecl->getTypeInContext(), + memberVector.emplace_back(varDecl->getName(), varDecl->getTypeInContext(), defaultInit); } diff --git a/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/class_members.swift.expected b/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/class_members.swift.expected index 6a081df89d8..5d7de8785f8 100644 --- a/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/class_members.swift.expected +++ b/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/class_members.swift.expected @@ -44,6 +44,7 @@ struct Place { let callback: Callback @MyWrapper var wrapped: String var `protocol`: String + var `some raw identifier`: Int } protocol Thing { diff --git a/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/only_computed_members.swift.expected b/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/only_computed_members.swift.expected index a8a37fe1b02..5008379633e 100644 --- a/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/only_computed_members.swift.expected +++ b/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/only_computed_members.swift.expected @@ -31,6 +31,7 @@ struct Place { let callback: Callback @MyWrapper var wrapped: String var `protocol`: String + var `some raw identifier`: Int } protocol Thing { diff --git a/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/struct_members.swift.expected b/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/struct_members.swift.expected index 570669c9acb..567bb9c9f18 100644 --- a/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/struct_members.swift.expected +++ b/test/refactoring/MemberwiseInit/Outputs/generate_memberwise/struct_members.swift.expected @@ -20,7 +20,7 @@ class Person { } struct Place { -internal init(person: Person, street: String, apartment: Optional = nil, city: String, state: String, postalCode: Int, plusFour: Int? = nil, callback: @escaping Place.Callback, wrapped: String, `protocol`: String) { +internal init(person: Person, street: String, apartment: Optional = nil, city: String, state: String, postalCode: Int, plusFour: Int? = nil, callback: @escaping Place.Callback, wrapped: String, `protocol`: String, `some raw identifier`: Int) { self.person = person self.street = street self.apartment = apartment @@ -31,6 +31,7 @@ self.plusFour = plusFour self.callback = callback self.wrapped = wrapped self.`protocol` = `protocol` +self.`some raw identifier` = `some raw identifier` } typealias Callback = () -> () @@ -44,6 +45,7 @@ self.`protocol` = `protocol` let callback: Callback @MyWrapper var wrapped: String var `protocol`: String + var `some raw identifier`: Int } protocol Thing { diff --git a/test/refactoring/MemberwiseInit/generate_memberwise.swift b/test/refactoring/MemberwiseInit/generate_memberwise.swift index 8bb6ff3ca65..e3dfebf846a 100644 --- a/test/refactoring/MemberwiseInit/generate_memberwise.swift +++ b/test/refactoring/MemberwiseInit/generate_memberwise.swift @@ -31,6 +31,7 @@ struct Place { let callback: Callback @MyWrapper var wrapped: String var `protocol`: String + var `some raw identifier`: Int } protocol Thing { @@ -58,9 +59,9 @@ struct MyWrapper { // RUN: %refactor -memberwise-init -source-filename %s -pos=22:8 > %t.result/struct_members.swift // RUN: diff -u %S/Outputs/generate_memberwise/struct_members.swift.expected %t.result/struct_members.swift -// RUN: %refactor -memberwise-init -source-filename %s -pos=44:8 > %t.result/only_computed_members.swift +// RUN: %refactor -memberwise-init -source-filename %s -pos=45:8 > %t.result/only_computed_members.swift // RUN: diff -u %S/Outputs/generate_memberwise/only_computed_members.swift.expected %t.result/only_computed_members.swift -// RUN: not %refactor -memberwise-init -source-filename %s -pos=36:10 > %t.result/protocol_members.swift -// RUN: not %refactor -memberwise-init -source-filename %s -pos=40:6 > %t.result/enum_members.swift +// RUN: not %refactor -memberwise-init -source-filename %s -pos=37:10 > %t.result/protocol_members.swift +// RUN: not %refactor -memberwise-init -source-filename %s -pos=41:6 > %t.result/enum_members.swift