Skip to content

Commit 8fbb2ca

Browse files
authored
Sema: missing switch case fixits should print payload names explicitly instead of printing underscores. rdar://32121806 (#10409) (#10417)
1 parent c7fc620 commit 8fbb2ca

File tree

2 files changed

+36
-21
lines changed

2 files changed

+36
-21
lines changed

lib/Sema/TypeCheckSwitchStmt.cpp

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ namespace {
7676
private:
7777
SpaceKind Kind;
7878
llvm::PointerIntPair<Type, 1, bool> TypeAndVal;
79+
80+
// In type space, we reuse HEAD to help us print meaningful name, e.g.,
81+
// tuple element name in fixits.
7982
Identifier Head;
8083
std::forward_list<Space> Spaces;
8184

@@ -134,8 +137,8 @@ namespace {
134137
}
135138

136139
public:
137-
explicit Space(Type T)
138-
: Kind(SpaceKind::Type), TypeAndVal(T, false), Head(Identifier()),
140+
explicit Space(Type T, Identifier NameForPrinting)
141+
: Kind(SpaceKind::Type), TypeAndVal(T, false), Head(NameForPrinting),
139142
Spaces({}){}
140143
explicit Space(Type T, Identifier H, bool downgrade,
141144
SmallVectorImpl<Space> &SP)
@@ -189,6 +192,12 @@ namespace {
189192
return Head;
190193
}
191194

195+
Identifier getPrintingName() const {
196+
assert(getKind() == SpaceKind::Type
197+
&& "Wrong kind of space tried to access printing name");
198+
return Head;
199+
}
200+
192201
const std::forward_list<Space> &getSpaces() const {
193202
assert((getKind() == SpaceKind::Constructor
194203
|| getKind() == SpaceKind::Disjunct)
@@ -750,7 +759,11 @@ namespace {
750759
if (!forDisplay) {
751760
getType()->print(buffer);
752761
}
753-
buffer << "_";
762+
Identifier Name = getPrintingName();
763+
if (Name.empty())
764+
buffer << "_";
765+
else
766+
buffer << tok::kw_let << " " << Name.str();
754767
break;
755768
}
756769
}
@@ -865,10 +878,11 @@ namespace {
865878
TTy->getElements().end(),
866879
std::back_inserter(constElemSpaces),
867880
[&](TupleTypeElt ty){
868-
return Space(ty.getType());
881+
return Space(ty.getType(), ty.getName());
869882
});
870883
} else if (auto *TTy = dyn_cast<ParenType>(eedTy.getPointer())) {
871-
constElemSpaces.push_back(Space(TTy->getUnderlyingType()));
884+
constElemSpaces.push_back(Space(TTy->getUnderlyingType(),
885+
Identifier()));
872886
}
873887
}
874888
return Space(tp, eed->getName(),
@@ -882,7 +896,7 @@ namespace {
882896
std::transform(TTy->getElements().begin(), TTy->getElements().end(),
883897
std::back_inserter(constElemSpaces),
884898
[&](TupleTypeElt ty){
885-
return Space(ty.getType());
899+
return Space(ty.getType(), ty.getName());
886900
});
887901
// Create an empty constructor head for the tuple space.
888902
arr.push_back(Space(tp, Identifier(), /*canDowngrade*/false,
@@ -943,7 +957,7 @@ namespace {
943957
}
944958
}
945959

946-
Space totalSpace(Switch->getSubjectExpr()->getType());
960+
Space totalSpace(Switch->getSubjectExpr()->getType(), Identifier());
947961
Space coveredSpace(spaces);
948962
size_t totalSpaceSize = totalSpace.getSize(TC);
949963
if (totalSpaceSize > Space::getMaximumSize()) {
@@ -1218,8 +1232,9 @@ namespace {
12181232
bool &sawDowngradablePattern) {
12191233
switch (item->getKind()) {
12201234
case PatternKind::Any:
1235+
return Space(item->getType(), Identifier());
12211236
case PatternKind::Named:
1222-
return Space(item->getType());
1237+
return Space(item->getType(), cast<NamedPattern>(item)->getBoundName());
12231238
case PatternKind::Bool: {
12241239
return Space(cast<BoolPattern>(item)->getValue());
12251240
}
@@ -1231,7 +1246,7 @@ namespace {
12311246
// These coercions are irrefutable. Project with the original type
12321247
// instead of the cast's target type to maintain consistency with the
12331248
// scrutinee's type.
1234-
return Space(IP->getType());
1249+
return Space(IP->getType(), Identifier());
12351250
case CheckedCastKind::Unresolved:
12361251
case CheckedCastKind::ValueCast:
12371252
case CheckedCastKind::ArrayDowncast:
@@ -1316,7 +1331,7 @@ namespace {
13161331
|| SP->getKind() == PatternKind::Tuple) {
13171332
if (auto *TTy = SP->getType()->getAs<TupleType>()) {
13181333
for (auto ty : TTy->getElements()) {
1319-
conArgSpace.push_back(Space(ty.getType()));
1334+
conArgSpace.push_back(Space(ty.getType(), ty.getName()));
13201335
}
13211336
} else {
13221337
conArgSpace.push_back(projectPattern(TC, SP,

test/FixCode/fixits-switch.swift.result

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,19 @@ func foo4(_ e : E2) -> Int {
5555
switch e {
5656
case .e2:
5757
return 1
58-
case .e1(_, _):
58+
case .e1(let a, let s):
5959
<#code#>
60-
case .e3(_):
60+
case .e3(let a):
6161
<#code#>
6262
case .e4(_):
6363
<#code#>
6464
case .e5(_, _):
6565
<#code#>
66-
case .e6(_, _):
66+
case .e6(let a, _):
6767
<#code#>
6868
case .e7:
6969
<#code#>
70-
case .e8(_, _, _):
70+
case .e8(let a, _, _):
7171
<#code#>
7272
case .e9(_, _, _):
7373
<#code#>
@@ -93,19 +93,19 @@ func foo6(_ e : E2) -> Int {
9393
switch e {
9494
case let .e1(x, y):
9595
return x + y
96-
case .e2(_):
96+
case .e2(let a):
9797
<#code#>
98-
case .e3(_):
98+
case .e3(let a):
9999
<#code#>
100100
case .e4(_):
101101
<#code#>
102102
case .e5(_, _):
103103
<#code#>
104-
case .e6(_, _):
104+
case .e6(let a, _):
105105
<#code#>
106106
case .e7:
107107
<#code#>
108-
case .e8(_, _, _):
108+
case .e8(let a, _, _):
109109
<#code#>
110110
case .e9(_, _, _):
111111
<#code#>
@@ -117,17 +117,17 @@ func foo7(_ e : E2) -> Int {
117117
case .e2(1): return 0
118118
case .e1: return 0
119119
case .e3: return 0
120-
case .e2(_):
120+
case .e2(let a):
121121
<#code#>
122122
case .e4(_):
123123
<#code#>
124124
case .e5(_, _):
125125
<#code#>
126-
case .e6(_, _):
126+
case .e6(let a, _):
127127
<#code#>
128128
case .e7:
129129
<#code#>
130-
case .e8(_, _, _):
130+
case .e8(let a, _, _):
131131
<#code#>
132132
case .e9(_, _, _):
133133
<#code#>

0 commit comments

Comments
 (0)