Skip to content

Commit 4df17c5

Browse files
committed
[CodeCompletion] Stop suggesting initializer calls on unresolved member
For example, for class C { class D: C { init() {} } } let _: C = .#^HERE^# We used to suggest 'D()' (not just 'D') because it was invalid without initialization. However, after SE-0287, it can be valid. For example, if 'D' has: extension C.D { static var staticC: C { ... } } Users can write: let _: C = .D.staticC So we should not suggest constructor calls. Also, this is consistent with normal type name completion. Users still can get initializer completions by adding '(' after the type name. Although initialization call completion with type names was convenient in some cases, it's too annoying when we have unrelated member types like: enum MyEnum { typealias Content = Int case value(Content) } We don't want `.Content(bitPattern)` etc for implicit member completion for 'MyEnum' context type. rdar://75963052
1 parent 209878f commit 4df17c5

File tree

3 files changed

+5
-20
lines changed

3 files changed

+5
-20
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3255,7 +3255,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
32553255
void addConstructorCallsForType(Type type, Identifier name,
32563256
DeclVisibilityKind Reason,
32573257
DynamicLookupInfo dynamicLookupInfo) {
3258-
if (!Ctx.LangOpts.CodeCompleteInitsInPostfixExpr && !IsUnresolvedMember)
3258+
if (!Ctx.LangOpts.CodeCompleteInitsInPostfixExpr)
32593259
return;
32603260

32613261
assert(CurrDeclContext);
@@ -3267,10 +3267,6 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
32673267
auto *init = cast<ConstructorDecl>(entry.getValueDecl());
32683268
if (init->shouldHideFromEditor())
32693269
continue;
3270-
if (IsUnresolvedMember && init->isFailable() &&
3271-
!init->isImplicitlyUnwrappedOptional()) {
3272-
continue;
3273-
}
32743270
addConstructorCall(cast<ConstructorDecl>(init), Reason,
32753271
dynamicLookupInfo, type, None,
32763272
/*IsOnType=*/true, name);
@@ -3341,8 +3337,6 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
33413337

33423338
void addNominalTypeRef(const NominalTypeDecl *NTD, DeclVisibilityKind Reason,
33433339
DynamicLookupInfo dynamicLookupInfo) {
3344-
if (IsUnresolvedMember)
3345-
return;
33463340
CommandWordsPairs Pairs;
33473341
CodeCompletionResultBuilder Builder(
33483342
Sink, CodeCompletionResult::ResultKind::Declaration,
@@ -3371,8 +3365,6 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
33713365

33723366
void addTypeAliasRef(const TypeAliasDecl *TAD, DeclVisibilityKind Reason,
33733367
DynamicLookupInfo dynamicLookupInfo) {
3374-
if (IsUnresolvedMember)
3375-
return;
33763368
CommandWordsPairs Pairs;
33773369
CodeCompletionResultBuilder Builder(
33783370
Sink, CodeCompletionResult::ResultKind::Declaration,

test/IDE/complete_enum_elements.swift

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,12 @@ enum FooEnum: CaseIterable {
127127
// FOO_ENUM_DOT_CONTEXT-NEXT: Decl[StaticVar]/CurrNominal: allCases[#[FooEnum]#]{{; name=.+$}}
128128
// FOO_ENUM_DOT_CONTEXT-NEXT: End completions
129129

130-
// FOO_ENUM_DOT_ELEMENTS: Begin completions, 13 items
130+
// FOO_ENUM_DOT_ELEMENTS: Begin completions, 6 items
131131
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Foo1[#FooEnum#]{{; name=.+$}}
132132
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Foo2[#FooEnum#]{{; name=.+$}}
133133
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[StaticVar]/ExprSpecific/TypeRelation[Identical]: alias1[#FooEnum#]; name=alias1
134134
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: hash({#(self): FooEnum#})[#(into: inout Hasher) -> Void#]; name=hash(self: FooEnum)
135-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[Constructor]/CurrNominal/IsSystem: AllCases({#arrayLiteral: FooEnum...#})[#Array<FooEnum>#]; name=AllCases(arrayLiteral: FooEnum...)
136-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[Constructor]/CurrNominal/IsSystem: AllCases()[#Array<FooEnum>#]; name=AllCases()
137-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[Constructor]/CurrNominal/IsSystem: AllCases({#(s): Sequence#})[#Array<FooEnum>#]; name=AllCases(s: Sequence)
138-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[Constructor]/CurrNominal/IsSystem: AllCases({#repeating: FooEnum#}, {#count: Int#})[#Array<FooEnum>#]; name=AllCases(repeating: FooEnum, count: Int)
139-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[Constructor]/CurrNominal/IsSystem: AllCases({#unsafeUninitializedCapacity: Int#}, {#initializingWith: (inout UnsafeMutableBufferPointer<FooEnum>, inout Int) throws -> Void##(inout UnsafeMutableBufferPointer<FooEnum>, inout Int) throws -> Void#})[' rethrows'][#Array<FooEnum>#]; name=AllCases(unsafeUninitializedCapacity: Int, initializingWith: (inout UnsafeMutableBufferPointer<FooEnum>, inout Int) throws -> Void) rethrows
140-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[Constructor]/CurrNominal/IsSystem: AllCases({#from: Decoder#})[' throws'][#Array<FooEnum>#]; name=AllCases(from: Decoder) throws
141-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[Constructor]/CurrNominal/IsSystem: AllCases({#repeating: FooEnum#}, {#count: Int#})[#FooEnum.AllCases#]; name=AllCases(repeating: FooEnum, count: Int)
142-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[Constructor]/CurrNominal/IsSystem: AllCases({#(elements): Sequence#})[#FooEnum.AllCases#]; name=AllCases(elements: Sequence)
135+
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[TypeAlias]/CurrNominal: AllCases[#[FooEnum]#]; name=AllCases
143136
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[StaticVar]/CurrNominal: allCases[#[FooEnum]#]; name=allCases
144137
// FOO_ENUM_DOT_ELEMENTS-NEXT: End completions
145138

@@ -456,7 +449,7 @@ func testUnqualified1(x: QuxEnum) {
456449
// UNRESOLVED_2: Begin completions
457450
// UNRESOLVED_2-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Qux1[#QuxEnum#]; name=Qux1
458451
// UNRESOLVED_2-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Qux2[#QuxEnum#]; name=Qux2
459-
// UNRESOLVED_2-DAG: Decl[Constructor]/CurrNominal/IsSystem: RawValue({#bitPattern: UInt#})[#Int#]; name=RawValue(bitPattern: UInt)
452+
// UNRESOLVED_2-DAG: Decl[TypeAlias]/CurrNominal: RawValue[#Int#]; name=RawValue
460453
// UNRESOLVED_2-DAG: Decl[Constructor]/CurrNominal: init({#rawValue: Int#})[#QuxEnum?#]; name=init(rawValue: Int)
461454
// UNRESOLVED_2-DAG: Decl[InstanceMethod]/Super/IsSystem/TypeRelation[Invalid]: hash({#(self): QuxEnum#})[#(into: inout Hasher) -> Void#]; name=hash(self: QuxEnum)
462455
// UNRESOLVED_2: End completions

test/IDE/complete_unresolved_members.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ func testSubType() {
568568
// SUBTYPE_1: Begin completions, 4 items
569569
// SUBTYPE_1-NOT: Concrete1(
570570
// SUBTYPE_1-DAG: Decl[Constructor]/CurrNominal/TypeRelation[Identical]: init()[#BaseClass#];
571-
// SUBTYPE_1-DAG: Decl[Constructor]/CurrNominal/TypeRelation[Convertible]: SubClass()[#BaseClass.SubClass#];
571+
// SUBTYPE_1-DAG: Decl[Class]/CurrNominal/TypeRelation[Convertible]: SubClass[#BaseClass.SubClass#];
572572
// SUBTYPE_1-DAG: Decl[StaticVar]/CurrNominal/TypeRelation[Convertible]: subInstance[#BaseClass.SubClass#];
573573
// SUBTYPE_1-DAG: Decl[Constructor]/CurrNominal: init({#failable: Void#})[#BaseClass?#];
574574
// SUBTYPE_1: End completions

0 commit comments

Comments
 (0)