Skip to content

Commit dc85084

Browse files
committed
[CodeCompletion] Show bound generic types for enum elements
We weren't displaying bound generic types for enum elements. It's inconsistent with functions and initializiers.
1 parent 25f9b88 commit dc85084

File tree

3 files changed

+38
-33
lines changed

3 files changed

+38
-33
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2661,22 +2661,21 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
26612661
setClangDeclKeywords(EED, Pairs, Builder);
26622662
addLeadingDot(Builder);
26632663
Builder.addTextChunk(EED->getName().str());
2664-
if (auto *params = EED->getParameterList()) {
2664+
2665+
// Enum element is of function type; (Self.type) -> Self or
2666+
// (Self.Type) -> (Args...) -> Self.
2667+
Type EnumType = getTypeOfMember(EED);
2668+
if (EnumType->is<AnyFunctionType>())
2669+
EnumType = EnumType->castTo<AnyFunctionType>()->getResult();
2670+
2671+
if (EnumType->is<FunctionType>()) {
26652672
Builder.addLeftParen();
2666-
addParameters(Builder, params);
2673+
addParamPatternFromFunction(Builder, EnumType->castTo<FunctionType>(),
2674+
nullptr);
26672675
Builder.addRightParen();
2668-
}
26692676

2670-
if (!EED->hasInterfaceType())
2671-
return;
2672-
2673-
// Enum element is of function type; (Self.type) -> Self or
2674-
// (Self.Type) -> (Args...) -> Self. We should show only 'Self' part.
2675-
Type EnumType = EED->getInterfaceType();
2676-
if (auto FuncType = EnumType->getAs<AnyFunctionType>()) {
2677-
EnumType = FuncType->getResult();
2678-
if (auto FuncType = EnumType->getAs<FunctionType>())
2679-
EnumType = FuncType->getResult();
2677+
// Extract result as the enum type.
2678+
EnumType = EnumType->castTo<FunctionType>()->getResult();
26802679
}
26812680

26822681
addTypeAnnotation(Builder, EnumType);
@@ -3678,6 +3677,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
36783677
auto Ty = Switch->getSubjectExpr()->getType();
36793678
if (!Ty)
36803679
return;
3680+
ExprType = Ty;
36813681
auto *TheEnumDecl = dyn_cast_or_null<EnumDecl>(Ty->getAnyNominal());
36823682
if (!TheEnumDecl)
36833683
return;

test/IDE/complete_enum_elements.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,13 @@ enum BazEnum<T> {
214214
}
215215

216216
// BAZ_ENUM_TYPE_CONTEXT: Begin completions
217-
// BAZ_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Baz1[#BazEnum<T>#]{{; name=.+$}}
218-
// BAZ_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Baz2({#T#})[#BazEnum<T>#]{{; name=.+$}}
217+
// BAZ_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Baz1[#BazEnum<Int>#]{{; name=.+$}}
218+
// BAZ_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Baz2({#Int#})[#BazEnum<Int>#]{{; name=.+$}}
219219
// BAZ_ENUM_TYPE_CONTEXT: End completions
220220

221221
// BAZ_INT_ENUM_NO_DOT: Begin completions, 8 items
222-
// BAZ_INT_ENUM_NO_DOT-NEXT: Decl[EnumElement]/CurrNominal: .Baz1[#BazEnum<T>#]{{; name=.+$}}
223-
// BAZ_INT_ENUM_NO_DOT-NEXT: Decl[EnumElement]/CurrNominal: .Baz2({#T#})[#BazEnum<T>#]{{; name=.+$}}
222+
// BAZ_INT_ENUM_NO_DOT-NEXT: Decl[EnumElement]/CurrNominal: .Baz1[#BazEnum<Int>#]{{; name=.+$}}
223+
// BAZ_INT_ENUM_NO_DOT-NEXT: Decl[EnumElement]/CurrNominal: .Baz2({#Int#})[#BazEnum<Int>#]{{; name=.+$}}
224224
// BAZ_INT_ENUM_NO_DOT-NEXT: Decl[InstanceMethod]/CurrNominal: .bazInstanceFunc({#self: &BazEnum<Int>#})[#() -> Void#]{{; name=.+$}}
225225
// BAZ_INT_ENUM_NO_DOT-NEXT: Decl[StaticVar]/CurrNominal: .staticVar[#Int#]{{; name=.+$}}
226226
// BAZ_INT_ENUM_NO_DOT-NEXT: Decl[StaticVar]/CurrNominal: .staticVarT[#Int#]{{; name=.+$}}
@@ -230,8 +230,8 @@ enum BazEnum<T> {
230230
// BAZ_INT_ENUM_NO_DOT-NEXT: End completions
231231

232232
// BAZ_T_ENUM_NO_DOT: Begin completions
233-
// BAZ_T_ENUM_NO_DOT-NEXT: Decl[EnumElement]/CurrNominal: .Baz1[#BazEnum<T>#]{{; name=.+$}}
234-
// BAZ_T_ENUM_NO_DOT-NEXT: Decl[EnumElement]/CurrNominal: .Baz2({#T#})[#BazEnum<T>#]{{; name=.+$}}
233+
// BAZ_T_ENUM_NO_DOT-NEXT: Decl[EnumElement]/CurrNominal: .Baz1[#BazEnum<_>#]{{; name=.+$}}
234+
// BAZ_T_ENUM_NO_DOT-NEXT: Decl[EnumElement]/CurrNominal: .Baz2({#_#})[#BazEnum<_>#]{{; name=.+$}}
235235
// BAZ_T_ENUM_NO_DOT-NEXT: Decl[InstanceMethod]/CurrNominal: .bazInstanceFunc({#self: &BazEnum<_>#})[#() -> Void#]{{; name=.+$}}
236236
// BAZ_T_ENUM_NO_DOT-NEXT: Decl[StaticVar]/CurrNominal: .staticVar[#Int#]{{; name=.+$}}
237237
// BAZ_T_ENUM_NO_DOT-NEXT: Decl[StaticVar]/CurrNominal: .staticVarT[#_#]{{; name=.+$}}
@@ -243,8 +243,8 @@ enum BazEnum<T> {
243243
// BAZ_INT_ENUM_DOT: Begin completions, 8 items
244244
// BAZ_INT_ENUM_DOT-NEXT: Keyword[self]/CurrNominal: self[#BazEnum<Int>.Type#]; name=self
245245
// BAZ_INT_ENUM_DOT-NEXT: Keyword/CurrNominal: Type[#BazEnum<Int>.Type#]; name=Type
246-
// BAZ_INT_ENUM_DOT-NEXT: Decl[EnumElement]/CurrNominal: Baz1[#BazEnum<T>#]{{; name=.+$}}
247-
// BAZ_INT_ENUM_DOT-NEXT: Decl[EnumElement]/CurrNominal: Baz2({#T#})[#BazEnum<T>#]{{; name=.+$}}
246+
// BAZ_INT_ENUM_DOT-NEXT: Decl[EnumElement]/CurrNominal: Baz1[#BazEnum<Int>#]{{; name=.+$}}
247+
// BAZ_INT_ENUM_DOT-NEXT: Decl[EnumElement]/CurrNominal: Baz2({#Int#})[#BazEnum<Int>#]{{; name=.+$}}
248248
// BAZ_INT_ENUM_DOT-NEXT: Decl[InstanceMethod]/CurrNominal/NotRecommended/TypeRelation[Invalid]: bazInstanceFunc({#self: &BazEnum<Int>#})[#() -> Void#]{{; name=.+$}}
249249
// BAZ_INT_ENUM_DOT-NEXT: Decl[StaticVar]/CurrNominal: staticVar[#Int#]{{; name=.+$}}
250250
// BAZ_INT_ENUM_DOT-NEXT: Decl[StaticVar]/CurrNominal: staticVarT[#Int#]{{; name=.+$}}
@@ -254,8 +254,8 @@ enum BazEnum<T> {
254254
// BAZ_T_ENUM_DOT: Begin completions, 8 items
255255
// BAZ_T_ENUM_DOT-NEXT: Keyword[self]/CurrNominal: self[#BazEnum<_>.Type#]; name=self
256256
// BAZ_T_ENUM_DOT-NEXT: Keyword/CurrNominal: Type[#BazEnum<_>.Type#]; name=Type
257-
// BAZ_T_ENUM_DOT-NEXT: Decl[EnumElement]/CurrNominal: Baz1[#BazEnum<T>#]{{; name=.+$}}
258-
// BAZ_T_ENUM_DOT-NEXT: Decl[EnumElement]/CurrNominal: Baz2({#T#})[#BazEnum<T>#]{{; name=.+$}}
257+
// BAZ_T_ENUM_DOT-NEXT: Decl[EnumElement]/CurrNominal: Baz1[#BazEnum<_>#]{{; name=.+$}}
258+
// BAZ_T_ENUM_DOT-NEXT: Decl[EnumElement]/CurrNominal: Baz2({#_#})[#BazEnum<_>#]{{; name=.+$}}
259259
// BAZ_T_ENUM_DOT-NEXT: Decl[InstanceMethod]/CurrNominal: bazInstanceFunc({#self: &BazEnum<_>#})[#() -> Void#]{{; name=.+$}}
260260
// BAZ_T_ENUM_DOT-NEXT: Decl[StaticVar]/CurrNominal: staticVar[#Int#]{{; name=.+$}}
261261
// BAZ_T_ENUM_DOT-NEXT: Decl[StaticVar]/CurrNominal: staticVarT[#_#]{{; name=.+$}}

test/IDE/complete_unresolved_members.swift

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -251,16 +251,16 @@ class C4 {
251251
// UNRESOLVED_3_OPT: Begin completions
252252
// UNRESOLVED_3_OPT-DAG: Decl[EnumElement]/ExprSpecific: North[#SomeEnum1#];
253253
// UNRESOLVED_3_OPT-DAG: Decl[EnumElement]/ExprSpecific: South[#SomeEnum1#];
254-
// UNRESOLVED_3_OPT-DAG: Decl[EnumElement]/ExprSpecific: none[#Optional<Wrapped>#]; name=none
255-
// UNRESOLVED_3_OPT-DAG: Decl[EnumElement]/ExprSpecific: some({#Wrapped#})[#Optional<Wrapped>#];
254+
// UNRESOLVED_3_OPT-DAG: Decl[EnumElement]/ExprSpecific: none[#Optional<SomeEnum1>#]; name=none
255+
// UNRESOLVED_3_OPT-DAG: Decl[EnumElement]/ExprSpecific: some({#SomeEnum1#})[#Optional<SomeEnum1>#];
256256
// UNRESOLVED_3_OPT-DAG: Decl[Constructor]/CurrNominal: init({#(some): SomeEnum1#})[#Optional<SomeEnum1>#];
257257
// UNRESOLVED_3_OPT-DAG: Decl[Constructor]/CurrNominal: init({#nilLiteral: ()#})[#Optional<SomeEnum1>#];
258258

259259
// UNRESOLVED_3_OPTOPTOPT: Begin completions
260260
// UNRESOLVED_3_OPTOPTOPT-DAG: Decl[EnumElement]/ExprSpecific: North[#SomeEnum1#];
261261
// UNRESOLVED_3_OPTOPTOPT-DAG: Decl[EnumElement]/ExprSpecific: South[#SomeEnum1#];
262-
// UNRESOLVED_3_OPTOPTOPT-DAG: Decl[EnumElement]/ExprSpecific: none[#Optional<Wrapped>#]; name=none
263-
// UNRESOLVED_3_OPTOPTOPT-DAG: Decl[EnumElement]/ExprSpecific: some({#Wrapped#})[#Optional<Wrapped>#];
262+
// UNRESOLVED_3_OPTOPTOPT-DAG: Decl[EnumElement]/ExprSpecific: none[#Optional<SomeEnum1??>#]; name=none
263+
// UNRESOLVED_3_OPTOPTOPT-DAG: Decl[EnumElement]/ExprSpecific: some({#SomeEnum1??#})[#Optional<SomeEnum1??>#];
264264
// UNRESOLVED_3_OPTOPTOPT-DAG: Decl[Constructor]/CurrNominal: init({#(some): SomeEnum1??#})[#Optional<SomeEnum1??>#];
265265
// UNRESOLVED_3_OPTOPTOPT-DAG: Decl[Constructor]/CurrNominal: init({#nilLiteral: ()#})[#Optional<SomeEnum1??>#];
266266

@@ -517,12 +517,17 @@ func testGeneric() {
517517
switch Generic<Int>.empty {
518518
case let .#^GENERIC_4^#
519519
}
520-
// GENERIC_1: Begin completions
521-
// GENERIC_1: Decl[EnumElement]/ExprSpecific: contains({#content: T#})[#Generic<T>#];
522-
// GENERIC_1: Decl[EnumElement]/ExprSpecific: empty[#Generic<T>#];
523-
// GENERIC_1_INT: Decl[StaticMethod]/CurrNominal: create({#Int#})[#Generic<Int>#];
524-
// GENERIC_1_U: Decl[StaticMethod]/CurrNominal: create({#U#})[#Generic<U>#];
525-
// GENERIC_1: End completions
520+
// GENERIC_1_INT: Begin completions
521+
// GENERIC_1_INT-DAG: Decl[EnumElement]/ExprSpecific: contains({#content: Int#})[#Generic<Int>#];
522+
// GENERIC_1_INT-DAG: Decl[EnumElement]/ExprSpecific: empty[#Generic<Int>#];
523+
// GENERIC_1_INT-DAG: Decl[StaticMethod]/CurrNominal: create({#Int#})[#Generic<Int>#];
524+
// GENERIC_1_INT: End completions
525+
526+
// GENERIC_1_U: Begin completions
527+
// GENERIC_1_U-DAG: Decl[EnumElement]/ExprSpecific: contains({#content: U#})[#Generic<U>#];
528+
// GENERIC_1_U-DAG: Decl[EnumElement]/ExprSpecific: empty[#Generic<U>#];
529+
// GENERIC_1_U-DAG: Decl[StaticMethod]/CurrNominal: create({#U#})[#Generic<U>#];
530+
// GENERIC_1_U: End completions
526531

527532
struct HasCreator {
528533
static var create: () -> HasCreator = { fatalError() }

0 commit comments

Comments
 (0)