Skip to content

Commit c757701

Browse files
committed
[CodeComplete] Improve ExpectsNonVoid computation
If we know we have a Void expected type, or if the result is unused, don't don't set `ExpectsNonVoid` to `true`.
1 parent 4bf5a34 commit c757701

5 files changed

+37
-23
lines changed

lib/IDE/PostfixCompletion.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -194,20 +194,20 @@ void PostfixCompletionCallback::sawSolutionImpl(
194194
ExpectedTypes.push_back(ExpectedTy);
195195
}
196196

197-
bool ExpectsNonVoid = false;
198-
ExpectsNonVoid |= ExpectedTy && !ExpectedTy->isVoid();
199-
ExpectsNonVoid |=
200-
!ParentExpr && CS.getContextualTypePurpose(CompletionExpr) != CTP_Unused;
201-
202-
for (auto SAT : S.targets) {
203-
if (ExpectsNonVoid) {
204-
// ExpectsNonVoid is already set. No need to iterate further.
205-
break;
197+
auto isUnused = [&]() {
198+
if (!ParentExpr &&
199+
CS.getContextualTypePurpose(CompletionExpr) == CTP_Unused) {
200+
return true;
206201
}
207-
if (SAT.second.getAsExpr() == CompletionExpr) {
208-
ExpectsNonVoid |= SAT.second.getExprContextualTypePurpose() != CTP_Unused;
202+
for (auto SAT : S.targets) {
203+
if (SAT.second.getAsExpr() == CompletionExpr)
204+
return SAT.second.getExprContextualTypePurpose() == CTP_Unused;
209205
}
210-
}
206+
// No contextual type purpose, assume it's used.
207+
return false;
208+
};
209+
210+
bool ExpectsNonVoid = ExpectedTy && !ExpectedTy->isVoid() && !isUnused();
211211

212212
bool IsImplicitSingleExpressionReturn =
213213
isImplicitSingleExpressionReturn(CS, CompletionExpr);

test/IDE/complete_enum_elements.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ enum BarEnum {
9898
// BAR_ENUM_NO_DOT-DAG: Decl[EnumElement]/CurrNominal: .Bar12({#Int#}, {#(Float, Double)#})[#BarEnum#]{{; name=.+$}}
9999
// BAR_ENUM_NO_DOT-DAG: Decl[InstanceMethod]/CurrNominal: .barInstanceFunc({#(self): &BarEnum#})[#() -> Void#]{{; name=.+$}}
100100
// BAR_ENUM_NO_DOT-DAG: Decl[StaticVar]/CurrNominal: .staticVar[#Int#]{{; name=.+$}}
101-
// BAR_ENUM_NO_DOT-DAG: Decl[StaticMethod]/CurrNominal/TypeRelation[Invalid]: .barStaticFunc()[#Void#]{{; name=.+$}}
101+
// BAR_ENUM_NO_DOT-DAG: Decl[StaticMethod]/CurrNominal: .barStaticFunc()[#Void#]{{; name=.+$}}
102102
// BAR_ENUM_NO_DOT-DAG: Keyword[self]/CurrNominal: .self[#BarEnum.Type#]; name=self
103103
// BAR_ENUM_NO_DOT-DAG: Keyword/CurrNominal: .Type[#BarEnum.Type#]; name=Type
104104

@@ -118,7 +118,7 @@ enum BarEnum {
118118
// BAR_ENUM_DOT-DAG: Decl[EnumElement]/CurrNominal: Bar12({#Int#}, {#(Float, Double)#})[#BarEnum#]{{; name=.+$}}
119119
// BAR_ENUM_DOT-DAG: Decl[InstanceMethod]/CurrNominal: barInstanceFunc({#(self): &BarEnum#})[#() -> Void#]{{; name=.+$}}
120120
// BAR_ENUM_DOT-DAG: Decl[StaticVar]/CurrNominal: staticVar[#Int#]{{; name=.+$}}
121-
// BAR_ENUM_DOT-DAG: Decl[StaticMethod]/CurrNominal/TypeRelation[Invalid]: barStaticFunc()[#Void#]{{; name=.+$}}
121+
// BAR_ENUM_DOT-DAG: Decl[StaticMethod]/CurrNominal: barStaticFunc()[#Void#]{{; name=.+$}}
122122

123123
enum BazEnum<T> {
124124
case Baz1
@@ -140,7 +140,7 @@ enum BazEnum<T> {
140140
// BAZ_INT_ENUM_NO_DOT-DAG: Decl[InstanceMethod]/CurrNominal: .bazInstanceFunc({#(self): &BazEnum<Int>#})[#() -> Void#]{{; name=.+$}}
141141
// BAZ_INT_ENUM_NO_DOT-DAG: Decl[StaticVar]/CurrNominal: .staticVar[#Int#]{{; name=.+$}}
142142
// BAZ_INT_ENUM_NO_DOT-DAG: Decl[StaticVar]/CurrNominal: .staticVarT[#Int#]{{; name=.+$}}
143-
// BAZ_INT_ENUM_NO_DOT-DAG: Decl[StaticMethod]/CurrNominal/TypeRelation[Invalid]: .bazStaticFunc()[#Void#]{{; name=.+$}}
143+
// BAZ_INT_ENUM_NO_DOT-DAG: Decl[StaticMethod]/CurrNominal: .bazStaticFunc()[#Void#]{{; name=.+$}}
144144
// BAZ_INT_ENUM_NO_DOT-DAG: Keyword[self]/CurrNominal: .self[#BazEnum<Int>.Type#]; name=self
145145
// BAZ_INT_ENUM_NO_DOT-DAG: Keyword/CurrNominal: .Type[#BazEnum<Int>.Type#]; name=Type
146146

@@ -149,7 +149,7 @@ enum BazEnum<T> {
149149
// BAZ_T_ENUM_NO_DOT-DAG: Decl[InstanceMethod]/CurrNominal: .bazInstanceFunc({#(self): &BazEnum<_>#})[#() -> Void#]{{; name=.+$}}
150150
// BAZ_T_ENUM_NO_DOT-DAG: Decl[StaticVar]/CurrNominal: .staticVar[#Int#]{{; name=.+$}}
151151
// BAZ_T_ENUM_NO_DOT-DAG: Decl[StaticVar]/CurrNominal: .staticVarT[#_#]{{; name=.+$}}
152-
// BAZ_T_ENUM_NO_DOT-DAG: Decl[StaticMethod]/CurrNominal/TypeRelation[Invalid]: .bazStaticFunc()[#Void#]{{; name=.+$}}
152+
// BAZ_T_ENUM_NO_DOT-DAG: Decl[StaticMethod]/CurrNominal: .bazStaticFunc()[#Void#]{{; name=.+$}}
153153
// BAZ_T_ENUM_NO_DOT-DAG: Keyword[self]/CurrNominal: .self[#BazEnum<_>.Type#]; name=self
154154
// BAZ_T_ENUM_NO_DOT-DAG: Keyword/CurrNominal: .Type[#BazEnum<_>.Type#]; name=Type
155155

@@ -161,7 +161,7 @@ enum BazEnum<T> {
161161
// BAZ_INT_ENUM_DOT-DAG: Decl[InstanceMethod]/CurrNominal: bazInstanceFunc({#(self): &BazEnum<Int>#})[#() -> Void#]{{; name=.+$}}
162162
// BAZ_INT_ENUM_DOT-DAG: Decl[StaticVar]/CurrNominal: staticVar[#Int#]{{; name=.+$}}
163163
// BAZ_INT_ENUM_DOT-DAG: Decl[StaticVar]/CurrNominal: staticVarT[#Int#]{{; name=.+$}}
164-
// BAZ_INT_ENUM_DOT-DAG: Decl[StaticMethod]/CurrNominal/TypeRelation[Invalid]: bazStaticFunc()[#Void#]{{; name=.+$}}
164+
// BAZ_INT_ENUM_DOT-DAG: Decl[StaticMethod]/CurrNominal: bazStaticFunc()[#Void#]{{; name=.+$}}
165165

166166
// BAZ_T_ENUM_DOT: Begin completions, 8 items
167167
// BAZ_T_ENUM_DOT-DAG: Keyword[self]/CurrNominal: self[#BazEnum<_>.Type#]; name=self
@@ -171,7 +171,7 @@ enum BazEnum<T> {
171171
// BAZ_T_ENUM_DOT-DAG: Decl[InstanceMethod]/CurrNominal: bazInstanceFunc({#(self): &BazEnum<_>#})[#() -> Void#]{{; name=.+$}}
172172
// BAZ_T_ENUM_DOT-DAG: Decl[StaticVar]/CurrNominal: staticVar[#Int#]{{; name=.+$}}
173173
// BAZ_T_ENUM_DOT-DAG: Decl[StaticVar]/CurrNominal: staticVarT[#_#]{{; name=.+$}}
174-
// BAZ_T_ENUM_DOT-DAG: Decl[StaticMethod]/CurrNominal/TypeRelation[Invalid]: bazStaticFunc()[#Void#]{{; name=.+$}}
174+
// BAZ_T_ENUM_DOT-DAG: Decl[StaticMethod]/CurrNominal: bazStaticFunc()[#Void#]{{; name=.+$}}
175175

176176
enum QuxEnum : Int {
177177
case Qux1 = 10

test/IDE/complete_multiple_trailingclosure.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,15 +173,15 @@ func testFallbackPostfix() {
173173
} #^INIT_FALLBACK_1^#
174174
// INIT_FALLBACK_1: Begin completions, 3 items
175175
// INIT_FALLBACK_1-DAG: Keyword[self]/CurrNominal: .self[#MyStruct4<Int>#]; name=self
176-
// INIT_FALLBACK_1-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: .testStructMethod()[#Void#]; name=testStructMethod()
176+
// INIT_FALLBACK_1-DAG: Decl[InstanceMethod]/CurrNominal: .testStructMethod()[#Void#]; name=testStructMethod()
177177
// INIT_FALLBACK_1-DAG: Pattern/Local/Flair[ArgLabels]: {#arg1: Int#}[#Int#]; name=arg1:
178178
let _ = MyStruct4(name: "test") {
179179
""
180180
} arg3: {
181181
1
182182
} #^INIT_FALLBACK_2^#
183183
// INIT_FALLBACK_2: Begin completions
184-
// INIT_FALLBACK_2-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: .testStructMethod()[#Void#];
184+
// INIT_FALLBACK_2-DAG: Decl[InstanceMethod]/CurrNominal: .testStructMethod()[#Void#];
185185
// INIT_FALLBACK_2-DAG: Keyword[self]/CurrNominal: .self[#MyStruct4<Int>#];
186186
}
187187

@@ -194,7 +194,7 @@ struct TestNominalMember: P {
194194

195195
// MEMBERDECL_SAMELINE: Begin completions, 4 items
196196
// MEMBERDECL_SAMELINE-DAG: Pattern/Local/Flair[ArgLabels]: {#fn2: (() -> String)? {|}#}[#(() -> String)?#]; name=fn2:
197-
// MEMBERDECL_SAMELINE-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: .enumFunc()[#Void#]; name=enumFunc()
197+
// MEMBERDECL_SAMELINE-DAG: Decl[InstanceMethod]/CurrNominal: .enumFunc()[#Void#]; name=enumFunc()
198198
// MEMBERDECL_SAMELINE-DAG: Decl[InfixOperatorFunction]/OtherModule[Swift]/IsSystem: [' ']+ {#SimpleEnum#}[#SimpleEnum#]; name=+
199199
// MEMBERDECL_SAMELINE-DAG: Keyword[self]/CurrNominal: .self[#SimpleEnum#]; name=self
200200

@@ -216,7 +216,7 @@ func testInitializedVarDecl() {
216216
// INITIALIZED_VARDECL_SAMELINE-NOT: localVal
217217
// INITIALIZED_VARDECL_SAMELINE-DAG: Pattern/Local/Flair[ArgLabels]: {#fn2: () -> String {|}#}[#() -> String#];
218218
// INITIALIZED_VARDECL_SAMELINE-DAG: Pattern/Local/Flair[ArgLabels]: {#fn3: () -> String {|}#}[#() -> String#];
219-
// INITIALIZED_VARDECL_SAMELINE-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: .testStructMethod()[#Void#];
219+
// INITIALIZED_VARDECL_SAMELINE-DAG: Decl[InstanceMethod]/CurrNominal: .testStructMethod()[#Void#];
220220
// INITIALIZED_VARDECL_SAMELINE-DAG: Keyword[self]/CurrNominal: .self[#TestStruct#];
221221
// INITIALIZED_VARDECL_SAMELINE-NOT: localVal
222222

test/IDE/complete_single_expression_return.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,20 @@ struct TestSingleExprFunc {
190190
// TestSingleExprFunc-DAG: Decl[InstanceMethod]/CurrNominal: void()[#Void#];
191191
}
192192

193+
struct TestSingleExprFuncReturnVoid {
194+
func void() -> Void {}
195+
func str() -> String { return "" }
196+
func int() -> Int { return 0 }
197+
198+
func test() {
199+
return self.#^TestSingleExprFuncReturnVoid^#
200+
}
201+
202+
// TestSingleExprFuncReturnVoid-DAG: Decl[InstanceMethod]/CurrNominal: str()[#String#];
203+
// TestSingleExprFuncReturnVoid-DAG: Decl[InstanceMethod]/CurrNominal: int()[#Int#];
204+
// TestSingleExprFuncReturnVoid-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: void()[#Void#];
205+
}
206+
193207
struct TestSingleExprFuncUnresolved {
194208
enum MyEnum { case myEnum }
195209
enum NotMine { case notMine }

test/IDE/complete_with_trailing_closure.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,4 @@ func foo() {
3535

3636
// CHECK: Begin completions, 2 items
3737
// CHECK-DAG: Keyword[self]/CurrNominal: self[#MyArray#];
38-
// CHECK-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: map({#transform: (ItemWrapper) -> Int##(ItemWrapper) -> Int#})[#Void#];
38+
// CHECK-DAG: Decl[InstanceMethod]/CurrNominal: map({#transform: (ItemWrapper) -> Int##(ItemWrapper) -> Int#})[#Void#];

0 commit comments

Comments
 (0)