Skip to content

Commit 8862e01

Browse files
committed
[Refactoring] If type has no memberwise initializable members, generate an empty initializer instead of failing
1 parent acf8082 commit 8862e01

File tree

5 files changed

+75
-11
lines changed

5 files changed

+75
-11
lines changed

lib/IDE/Refactoring.cpp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3160,8 +3160,6 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
31603160
ArrayRef<MemberwiseParameter> memberVector,
31613161
SourceLoc targetLocation) {
31623162

3163-
assert(!memberVector.empty());
3164-
31653163
EditConsumer.accept(SM, targetLocation, "\ninternal init(");
31663164
auto insertMember = [&SM](const MemberwiseParameter &memberData,
31673165
raw_ostream &OS, bool wantsSeparator) {
@@ -3197,13 +3195,11 @@ static void generateMemberwiseInit(SourceEditConsumer &EditConsumer,
31973195
// Process the initial list of members, inserting commas as appropriate.
31983196
std::string Buffer;
31993197
llvm::raw_string_ostream OS(Buffer);
3200-
for (const auto &memberData : memberVector.drop_back()) {
3201-
insertMember(memberData, OS, /*wantsSeparator*/ true);
3198+
for (const auto &memberData : llvm::enumerate(memberVector)) {
3199+
bool wantsSeparator = (memberData.index() != memberVector.size() - 1);
3200+
insertMember(memberData.value(), OS, wantsSeparator);
32023201
}
32033202

3204-
// Process the last (or perhaps, only) member.
3205-
insertMember(memberVector.back(), OS, /*wantsSeparator*/ false);
3206-
32073203
// Synthesize the body.
32083204
OS << ") {\n";
32093205
for (auto &member : memberVector) {
@@ -3269,10 +3265,6 @@ collectMembersForInit(const ResolvedCursorInfo &CursorInfo,
32693265
varDecl->getType(), defaultInit);
32703266
}
32713267

3272-
if (memberVector.empty()) {
3273-
return SourceLoc();
3274-
}
3275-
32763268
return targetLocation;
32773269
}
32783270

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ enum Idea {
4545
var subject: String { fatalError() }
4646
}
4747

48+
struct OnlyComputed {
49+
lazy var idea: Idea = { fatalError() }()
50+
var computed: String { "hi" }
51+
}
52+
4853
@propertyWrapper
4954
struct MyWrapper {
5055
let wrappedValue: String
@@ -53,3 +58,4 @@ struct MyWrapper {
5358

5459

5560

61+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
class Person {
2+
var firstName: String!
3+
var lastName: String!
4+
var age: Int!
5+
var planet = "Earth", solarSystem = "Milky Way"
6+
var avgHeight = 175
7+
let line = #line, file = #file, handle = #dsohandle
8+
lazy var idea: Idea = { fatalError() }()
9+
var location: () -> Place = { fatalError() }
10+
var secondLocation: (() -> Place)!
11+
@MyWrapper var wrapped: String = ""
12+
var computed: String { "hi" }
13+
}
14+
15+
struct Place {
16+
typealias Callback = () -> ()
17+
let person: Person
18+
let street: String
19+
let apartment: Optional<String>
20+
let city: String
21+
let state: String
22+
let postalCode: Int
23+
let plusFour: Int?
24+
let callback: Callback
25+
@MyWrapper var wrapped: String
26+
}
27+
28+
protocol Thing {
29+
var idea: Idea { get }
30+
}
31+
32+
enum Idea {
33+
var subject: String { fatalError() }
34+
}
35+
36+
struct OnlyComputed {
37+
internal init() {
38+
}
39+
40+
lazy var idea: Idea = { fatalError() }()
41+
var computed: String { "hi" }
42+
}
43+
44+
@propertyWrapper
45+
struct MyWrapper {
46+
let wrappedValue: String
47+
}
48+
49+
50+
51+
52+

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ enum Idea {
4545
var subject: String { fatalError() }
4646
}
4747

48+
struct OnlyComputed {
49+
lazy var idea: Idea = { fatalError() }()
50+
var computed: String { "hi" }
51+
}
52+
4853
@propertyWrapper
4954
struct MyWrapper {
5055
let wrappedValue: String
@@ -53,3 +58,4 @@ struct MyWrapper {
5358

5459

5560

61+

test/refactoring/MemberwiseInit/generate_memberwise.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ enum Idea {
3333
var subject: String { fatalError() }
3434
}
3535

36+
struct OnlyComputed {
37+
lazy var idea: Idea = { fatalError() }()
38+
var computed: String { "hi" }
39+
}
40+
3641
@propertyWrapper
3742
struct MyWrapper {
3843
let wrappedValue: String
@@ -45,6 +50,9 @@ struct MyWrapper {
4550
// RUN: %refactor -memberwise-init -source-filename %s -pos=15:8 > %t.result/struct_members.swift
4651
// RUN: diff -u %S/Outputs/generate_memberwise/struct_members.swift.expected %t.result/struct_members.swift
4752

53+
// RUN: %refactor -memberwise-init -source-filename %s -pos=36:8 > %t.result/only_computed_members.swift
54+
// RUN: diff -u %S/Outputs/generate_memberwise/only_computed_members.swift.expected %t.result/only_computed_members.swift
55+
4856
// RUN: not %refactor -memberwise-init -source-filename %s -pos=24:10 > %t.result/protocol_members.swift
4957
// RUN: not %refactor -memberwise-init -source-filename %s -pos=28:6 > %t.result/enum_members.swift
5058

0 commit comments

Comments
 (0)