Skip to content

Commit 7897317

Browse files
committed
[LookupVisibleDecls] Include protocol members when finding subscript(dynamicMember:)
struct Point { var x, y: Int } protocol P {} extension P { subscript<T>(dynamicMember key: KeyPath<Point, T>) -> T } @dynamicMemberLookup struct S: P {} S().<HERE> Previously, completion couldn't suggest 'x' and 'y'. Include 'NL_ProtocolMembers' when finding 'subscript(dynamicMember:)'. rdar://problem/71008072
1 parent 15d566d commit 7897317

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

lib/Sema/LookupVisibleDecls.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,8 +1095,8 @@ static void lookupVisibleDynamicMemberLookupDecls(
10951095
{ ctx, DeclBaseName::createSubscript(), { ctx.Id_dynamicMember} });
10961096

10971097
SmallVector<ValueDecl *, 2> subscripts;
1098-
dc->lookupQualified(baseType, subscriptName, NL_QualifiedDefault,
1099-
subscripts);
1098+
dc->lookupQualified(baseType, subscriptName,
1099+
NL_QualifiedDefault | NL_ProtocolMembers, subscripts);
11001100

11011101
for (ValueDecl *VD : subscripts) {
11021102
auto *subscript = dyn_cast<SubscriptDecl>(VD);

test/IDE/complete_keypath_member_lookup.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=testNested2 | %FileCheck %s -check-prefix=testNested2
2424
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=testCycle1 | %FileCheck %s -check-prefix=testCycle1
2525
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=testCycle2 | %FileCheck %s -check-prefix=testCycle2
26+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=testSubscriptOnProtocolExt | %FileCheck %s -check-prefix=testSubscriptOnProtocolExt
2627

2728
struct Point {
2829
var x: Int
@@ -385,3 +386,26 @@ func testCycle2(r: CycleA<Point>) {
385386
r.#^testCycle2^#
386387
// testCycle2: Begin completions
387388
}
389+
390+
protocol DynamicLookupProto {
391+
associatedtype Content
392+
}
393+
extension DynamicLookupProto {
394+
subscript<T>(dynamicMember key: KeyPath<Content, T>) -> T {
395+
fatalError()
396+
}
397+
}
398+
399+
@dynamicMemberLookup
400+
struct DynamicLookupConcrete : DynamicLookupProto {
401+
typealias Content = Point
402+
}
403+
404+
func testSubscriptOnProtocolExtension(dyn: DynamicLookupConcrete) {
405+
dyn.#^testSubscriptOnProtocolExt^#
406+
// testSubscriptOnProtocolExt: Begin completions
407+
// testSubscriptOnProtocolExt: Keyword[self]/CurrNominal: self[#DynamicLookupConcrete#];
408+
// testSubscriptOnProtocolExt: Decl[InstanceVar]/CurrNominal: x[#Int#];
409+
// testSubscriptOnProtocolExt: Decl[InstanceVar]/CurrNominal: y[#Int#];
410+
// testSubscriptOnProtocolExt: End completions
411+
}

0 commit comments

Comments
 (0)