Skip to content

Commit c7efed9

Browse files
authored
Merge pull request swiftlang#32285 from CodaFi/escape-velocity
[Refactoring] Print @escaping For Closures In Generated Memberwise Initializer
2 parents f80d6ab + 0d1f6ae commit c7efed9

File tree

4 files changed

+29
-5
lines changed

4 files changed

+29
-5
lines changed

lib/IDE/Refactoring.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3126,7 +3126,7 @@ struct MemberwiseParameter {
31263126
Expr *DefaultExpr;
31273127

31283128
MemberwiseParameter(Identifier name, Type type, Expr *initialExpr)
3129-
: Name(name), MemberType(type), DefaultExpr(initialExpr) {}
3129+
: Name(name), MemberType(type), DefaultExpr(initialExpr) {}
31303130
};
31313131

31323132
static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
@@ -3139,7 +3139,16 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
31393139
EditConsumer.accept(SM, targetLocation, "\ninternal init(");
31403140
auto insertMember = [&SM](const MemberwiseParameter &memberData,
31413141
llvm::raw_ostream &OS, bool wantsSeparator) {
3142-
OS << memberData.Name << ": " << memberData.MemberType.getString();
3142+
{
3143+
OS << memberData.Name << ": ";
3144+
// Unconditionally print '@escaping' if we print out a function type -
3145+
// the assignments we generate below will escape this parameter.
3146+
if (isa<AnyFunctionType>(memberData.MemberType->getCanonicalType())) {
3147+
OS << "@" << TypeAttributes::getAttrName(TAK_escaping) << " ";
3148+
}
3149+
OS << memberData.MemberType.getString();
3150+
}
3151+
31433152
if (auto *expr = memberData.DefaultExpr) {
31443153
if (isa<NilLiteralExpr>(expr)) {
31453154
OS << " = nil";

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
class Person {
2-
internal init(firstName: String? = nil, lastName: String? = nil, age: Int? = nil, planet: String = "Earth", solarSystem: String = "Milky Way", avgHeight: Int = 175) {
2+
internal init(firstName: String? = nil, lastName: String? = nil, age: Int? = nil, planet: String = "Earth", solarSystem: String = "Milky Way", avgHeight: Int = 175, location: @escaping () -> Place = { fatalError() }, secondLocation: (() -> Place)? = nil) {
33
self.firstName = firstName
44
self.lastName = lastName
55
self.age = age
66
self.planet = planet
77
self.solarSystem = solarSystem
88
self.avgHeight = avgHeight
9+
self.location = location
10+
self.secondLocation = secondLocation
911
}
1012

1113
var firstName: String!
@@ -15,16 +17,20 @@ self.avgHeight = avgHeight
1517
var avgHeight = 175
1618
let line = #line, file = #file, handle = #dsohandle
1719
lazy var idea: Idea = { fatalError() }()
20+
var location: () -> Place = { fatalError() }
21+
var secondLocation: (() -> Place)!
1822
}
1923

2024
struct Place {
25+
typealias Callback = () -> ()
2126
let person: Person
2227
let street: String
2328
let apartment: Optional<String>
2429
let city: String
2530
let state: String
2631
let postalCode: Int
2732
let plusFour: Int?
33+
let callback: Callback
2834
}
2935

3036
protocol Thing {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,31 @@ class Person {
66
var avgHeight = 175
77
let line = #line, file = #file, handle = #dsohandle
88
lazy var idea: Idea = { fatalError() }()
9+
var location: () -> Place = { fatalError() }
10+
var secondLocation: (() -> Place)!
911
}
1012

1113
struct Place {
12-
internal init(person: Person, street: String, apartment: Optional<String>, city: String, state: String, postalCode: Int, plusFour: Int?) {
14+
internal init(person: Person, street: String, apartment: Optional<String>, city: String, state: String, postalCode: Int, plusFour: Int?, callback: @escaping Place.Callback) {
1315
self.person = person
1416
self.street = street
1517
self.apartment = apartment
1618
self.city = city
1719
self.state = state
1820
self.postalCode = postalCode
1921
self.plusFour = plusFour
22+
self.callback = callback
2023
}
2124

25+
typealias Callback = () -> ()
2226
let person: Person
2327
let street: String
2428
let apartment: Optional<String>
2529
let city: String
2630
let state: String
2731
let postalCode: Int
2832
let plusFour: Int?
33+
let callback: Callback
2934
}
3035

3136
protocol Thing {

test/refactoring/MemberwiseInit/generate_memberwise.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@ class Person {
66
var avgHeight = 175
77
let line = #line, file = #file, handle = #dsohandle
88
lazy var idea: Idea = { fatalError() }()
9+
var location: () -> Place = { fatalError() }
10+
var secondLocation: (() -> Place)!
911
}
1012

1113
struct Place {
14+
typealias Callback = () -> ()
1215
let person: Person
1316
let street: String
1417
let apartment: Optional<String>
1518
let city: String
1619
let state: String
1720
let postalCode: Int
1821
let plusFour: Int?
22+
let callback: Callback
1923
}
2024

2125
protocol Thing {
@@ -30,7 +34,7 @@ enum Idea {
3034
// RUN: %refactor -memberwise-init -source-filename %s -pos=1:8 > %t.result/generate_memberwise.swift
3135
// RUN: diff -u %S/Outputs/generate_memberwise/class_members.swift.expected %t.result/generate_memberwise.swift
3236

33-
// RUN: %refactor -memberwise-init -source-filename %s -pos=11:8 > %t.result/struct_members.swift
37+
// RUN: %refactor -memberwise-init -source-filename %s -pos=13:8 > %t.result/struct_members.swift
3438
// RUN: diff -u %S/Outputs/generate_memberwise/struct_members.swift.expected %t.result/struct_members.swift
3539

3640
// RUN: not %refactor -memberwise-init -source-filename %s -pos=21:10 > %t.result/protocol_members.swift

0 commit comments

Comments
 (0)