Skip to content

Commit ede3ba2

Browse files
committed
[CodeCompletion] Duplicate existential requirements when restated
1 parent 3d1bfcb commit ede3ba2

File tree

5 files changed

+217
-38
lines changed

5 files changed

+217
-38
lines changed

lib/AST/LookupVisibleDecls.cpp

Lines changed: 76 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ struct LookupState {
113113
return Result;
114114
}
115115
};
116-
} // unnamed namespace
116+
} // end anonymous namespace
117117

118118
static bool areTypeDeclsVisibleInLookupMode(LookupState LS) {
119119
// Nested type declarations can be accessed only with unqualified lookup or
@@ -473,19 +473,70 @@ lookupVisibleMemberDeclsImpl(Type BaseTy, VisibleDeclConsumer &Consumer,
473473
GenericSignatureBuilder *GSB,
474474
VisitedSet &Visited);
475475

476-
static void lookupVisibleProtocolMemberDecls(
477-
Type BaseTy, ProtocolType *PT, VisibleDeclConsumer &Consumer,
478-
const DeclContext *CurrDC, LookupState LS, DeclVisibilityKind Reason,
479-
LazyResolver *TypeResolver, GenericSignatureBuilder *GSB,
480-
VisitedSet &Visited) {
476+
class RestateFilteringConsumer : public VisibleDeclConsumer {
477+
VisibleDeclConsumer &parentConsumer;
478+
const Type baseTy;
479+
const DeclContext *DC;
480+
LazyResolver *resolver;
481+
llvm::DenseSet<DeclName> foundVars;
482+
llvm::DenseMap<std::tuple<DeclName, Type>, std::set<ValueDecl *>> foundFuncs;
483+
484+
void validate() {
485+
assert(DC && baseTy && !baseTy->hasLValueType());
486+
}
487+
public:
488+
RestateFilteringConsumer(VisibleDeclConsumer &parentConsumer,
489+
Type baseTy, const DeclContext *DC,
490+
LazyResolver *resolver)
491+
: parentConsumer(parentConsumer), baseTy(baseTy), DC(DC), resolver(resolver) {
492+
validate();
493+
}
494+
495+
void foundDecl(ValueDecl *VD, DeclVisibilityKind Reason) override {
496+
assert(VD);
497+
if (!VD->getDeclContext()->getAsProtocolOrProtocolExtensionContext()) {
498+
parentConsumer.foundDecl(VD, Reason);
499+
return;
500+
}
501+
if (resolver)
502+
resolver->resolveDeclSignature(VD);
503+
504+
if (!VD->hasInterfaceType()) {
505+
parentConsumer.foundDecl(VD, Reason);
506+
return;
507+
}
508+
if (!VD->getInterfaceType()->is<AnyFunctionType>()) {
509+
if (foundVars.insert(VD->getFullName()).second) {
510+
parentConsumer.foundDecl(VD, Reason);
511+
}
512+
return;
513+
}
514+
auto type =
515+
VD->getOverloadSignatureType()->getAs<AnyFunctionType>()->getResult();
516+
517+
if (foundFuncs[{VD->getFullName(), type}].empty()) {
518+
parentConsumer.foundDecl(VD, Reason);
519+
}
520+
foundFuncs[{VD->getFullName(), type}].insert(VD);
521+
}
522+
};
523+
524+
static void
525+
lookupVisibleProtocolMemberDecls(Type BaseTy, ProtocolType *PT,
526+
VisibleDeclConsumer &Consumer,
527+
const DeclContext *CurrDC, LookupState LS,
528+
DeclVisibilityKind Reason,
529+
LazyResolver *TypeResolver,
530+
GenericSignatureBuilder *GSB,
531+
VisitedSet &Visited) {
481532
if (!Visited.insert(PT->getDecl()).second)
482533
return;
483534

484-
for (auto Proto : PT->getDecl()->getInheritedProtocols())
485-
lookupVisibleProtocolMemberDecls(BaseTy, Proto->getDeclaredType(), Consumer, CurrDC,
486-
LS, getReasonForSuper(Reason), TypeResolver,
487-
GSB, Visited);
488-
535+
for (auto Proto : PT->getDecl()->getInheritedProtocols()){
536+
lookupVisibleProtocolMemberDecls(BaseTy, Proto->getDeclaredType(),
537+
Consumer, CurrDC, LS,
538+
getReasonForSuper(Reason), TypeResolver,
539+
GSB, Visited);}
489540
lookupTypeMembers(BaseTy, PT, Consumer, CurrDC, LS, Reason, TypeResolver);
490541
}
491542

@@ -536,7 +587,7 @@ static void lookupVisibleMemberDeclsImpl(
536587
}
537588

538589
// If the base is a protocol, enumerate its members.
539-
if (ProtocolType *PT = BaseTy->getAs<ProtocolType>()) {
590+
if (auto PT = BaseTy->getAs<ProtocolType>()) {
540591
lookupVisibleProtocolMemberDecls(BaseTy, PT, Consumer, CurrDC, LS, Reason,
541592
TypeResolver, GSB, Visited);
542593
return;
@@ -551,13 +602,13 @@ static void lookupVisibleMemberDeclsImpl(
551602
}
552603

553604
// Enumerate members of archetype's requirements.
554-
if (ArchetypeType *Archetype = BaseTy->getAs<ArchetypeType>()) {
555-
for (auto Proto : Archetype->getConformsTo())
556-
lookupVisibleProtocolMemberDecls(
557-
BaseTy, Proto->getDeclaredType(), Consumer, CurrDC, LS,
558-
getReasonForSuper(Reason), TypeResolver, GSB, Visited);
559-
560-
if (auto superclass = Archetype->getSuperclass())
605+
if (ArchetypeType *AT = BaseTy->getAs<ArchetypeType>()) {
606+
for (auto Proto : AT->getConformsTo())
607+
lookupVisibleProtocolMemberDecls(BaseTy, Proto->getDeclaredType(),
608+
Consumer, CurrDC, LS,
609+
getReasonForSuper(Reason),
610+
TypeResolver, GSB, Visited);
611+
if (auto superclass = AT->getSuperclass())
561612
lookupVisibleMemberDeclsImpl(superclass, Consumer, CurrDC, LS,
562613
getReasonForSuper(Reason), TypeResolver,
563614
GSB, Visited);
@@ -832,7 +883,7 @@ class OverrideFilteringConsumer : public VisibleDeclConsumer {
832883
DeclsToReport.insert(FoundDeclTy(VD, Reason));
833884
}
834885
};
835-
} // unnamed namespace
886+
} // end anonymous namespace
836887

837888
/// \brief Enumerate all members in \c BaseTy (including members of extensions,
838889
/// superclasses and implemented protocols), as seen from the context \c CurrDC.
@@ -844,13 +895,15 @@ static void lookupVisibleMemberDecls(
844895
Type BaseTy, VisibleDeclConsumer &Consumer, const DeclContext *CurrDC,
845896
LookupState LS, DeclVisibilityKind Reason, LazyResolver *TypeResolver,
846897
GenericSignatureBuilder *GSB) {
847-
OverrideFilteringConsumer ConsumerWrapper(BaseTy, CurrDC, TypeResolver);
898+
OverrideFilteringConsumer overrideConsumer(BaseTy, CurrDC, TypeResolver);
899+
RestateFilteringConsumer restateConsumer(overrideConsumer, BaseTy, CurrDC,
900+
TypeResolver);
848901
VisitedSet Visited;
849-
lookupVisibleMemberDeclsImpl(BaseTy, ConsumerWrapper, CurrDC, LS, Reason,
902+
lookupVisibleMemberDeclsImpl(BaseTy, restateConsumer, CurrDC, LS, Reason,
850903
TypeResolver, GSB, Visited);
851904

852905
// Report the declarations we found to the real consumer.
853-
for (const auto &DeclAndReason : ConsumerWrapper.DeclsToReport)
906+
for (const auto &DeclAndReason : overrideConsumer.DeclsToReport)
854907
Consumer.foundDecl(DeclAndReason.D, DeclAndReason.Reason);
855908
}
856909

test/IDE/complete_associated_types.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ struct StructWithBrokenConformance : FooProtocolWithAssociatedTypes {
266266
func testBrokenConformances1() {
267267
StructWithBrokenConformance.#^BROKEN_CONFORMANCE_1^#
268268
}
269-
// BROKEN_CONFORMANCE_1: Begin completions, 34 items
269+
// BROKEN_CONFORMANCE_1: Begin completions, 32 items
270270
// BROKEN_CONFORMANCE_1-DAG: Decl[TypeAlias]/CurrNominal: DefaultedTypeCommonA[#StructWithBrokenConformance.DefaultedTypeCommonA#]; name=DefaultedTypeCommonA
271271
// BROKEN_CONFORMANCE_1-DAG: Decl[TypeAlias]/CurrNominal: DefaultedTypeCommonB[#StructWithBrokenConformance.DefaultedTypeCommonB#]; name=DefaultedTypeCommonB
272272
// BROKEN_CONFORMANCE_1-DAG: Decl[TypeAlias]/CurrNominal: FooBaseDefaultedTypeB[#StructWithBrokenConformance.FooBaseDefaultedTypeB#]; name=FooBaseDefaultedTypeB

test/IDE/complete_override_access_control_protocol.swift

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -168,18 +168,17 @@ public class TestPublicDE : ProtocolDPrivate, ProtocolEPublic {
168168
#^TEST_PUBLIC_DE^#
169169
}
170170

171-
// FIXME: Should be 2 items in the three checks below.
172-
// TEST_PRIVATE_DE: Begin completions, 4 items
171+
// TEST_PRIVATE_DE: Begin completions, 2 items
173172
// TEST_PRIVATE_DE-DAG: Decl[InstanceMethod]/Super: func colliding() {|}{{; name=.+$}}
174173
// TEST_PRIVATE_DE-DAG: Decl[InstanceMethod]/Super: func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
175174

176-
// TEST_INTERNAL_DE: Begin completions, 4 items
175+
// TEST_INTERNAL_DE: Begin completions, 2 items
177176
// TEST_INTERNAL_DE-DAG: Decl[InstanceMethod]/Super: func colliding() {|}{{; name=.+$}}
178177
// TEST_INTERNAL_DE-DAG: Decl[InstanceMethod]/Super: func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
179178

180-
// TEST_PUBLIC_DE: Begin completions, 4 items
181-
// TEST_PUBLIC_DE-DAG: Decl[InstanceMethod]/Super: public func colliding() {|}{{; name=.+$}}
182-
// TEST_PUBLIC_DE-DAG: Decl[InstanceMethod]/Super: public func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
179+
// TEST_PUBLIC_DE: Begin completions, 2 items
180+
// TEST_PUBLIC_DE-DAG: Decl[InstanceMethod]/Super: func colliding() {|}{{; name=.+$}}
181+
// TEST_PUBLIC_DE-DAG: Decl[InstanceMethod]/Super: func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
183182

184183
private class TestPrivateED : ProtocolEPublic, ProtocolDPrivate {
185184
#^TEST_PRIVATE_ED^#
@@ -195,16 +194,15 @@ public class TestPublicED : ProtocolEPublic, ProtocolDPrivate {
195194
#^TEST_PUBLIC_ED^#
196195
}
197196

198-
// FIXME: Should be 2 items in the three checks below.
199-
// TEST_PRIVATE_ED: Begin completions, 4 items
197+
// TEST_PRIVATE_ED: Begin completions, 2 items
200198
// TEST_PRIVATE_ED-DAG: Decl[InstanceMethod]/Super: func colliding() {|}{{; name=.+$}}
201199
// TEST_PRIVATE_ED-DAG: Decl[InstanceMethod]/Super: func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
202200

203-
// TEST_INTERNAL_ED: Begin completions, 4 items
201+
// TEST_INTERNAL_ED: Begin completions, 2 items
204202
// TEST_INTERNAL_ED-DAG: Decl[InstanceMethod]/Super: func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
205203
// TEST_INTERNAL_ED-DAG: Decl[InstanceMethod]/Super: func colliding() {|}{{; name=.+$}}
206204

207-
// TEST_PUBLIC_ED: Begin completions, 4 items
205+
// TEST_PUBLIC_ED: Begin completions, 2 items
208206
// TEST_PUBLIC_ED-DAG: Decl[InstanceMethod]/Super: public func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
209207
// TEST_PUBLIC_ED-DAG: Decl[InstanceMethod]/Super: public func colliding() {|}{{; name=.+$}}
210208

@@ -222,15 +220,14 @@ public class TestPublicEF : ProtocolEPublic, ProtocolFPublic {
222220
#^TEST_PUBLIC_EF^#
223221
}
224222

225-
// FIXME: Should be 2 items in the three checks below.
226-
// TEST_PRIVATE_EF: Begin completions, 4 items
223+
// TEST_PRIVATE_EF: Begin completions, 2 items
227224
// TEST_PRIVATE_EF-DAG: Decl[InstanceMethod]/Super: func colliding() {|}{{; name=.+$}}
228225
// TEST_PRIVATE_EF-DAG: Decl[InstanceMethod]/Super: func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
229226

230-
// TEST_INTERNAL_EF: Begin completions, 4 items
227+
// TEST_INTERNAL_EF: Begin completions, 2 items
231228
// TEST_INTERNAL_EF-DAG: Decl[InstanceMethod]/Super: func colliding() {|}{{; name=.+$}}
232229
// TEST_INTERNAL_EF-DAG: Decl[InstanceMethod]/Super: func collidingGeneric<T>(x: T) {|}{{; name=.+$}}
233230

234-
// TEST_PUBLIC_EF: Begin completions, 4 items
231+
// TEST_PUBLIC_EF: Begin completions, 2 items
235232
// TEST_PUBLIC_EF-DAG: Decl[InstanceMethod]/Super: public func colliding() {|}{{; name=.+$}}
236233
// TEST_PUBLIC_EF-DAG: Decl[InstanceMethod]/Super: public func collidingGeneric<T>(x: T) {|}{{; name=.+$}}

test/IDE/complete_value_expr.swift

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,18 @@
114114
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PROTOCOL_EXT_GENERICP1 | %FileCheck %s -check-prefix=PROTOCOL_EXT_GENERICP1
115115
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PROTOCOL_EXT_GENERICP2 | %FileCheck %s -check-prefix=PROTOCOL_EXT_GENERICP2
116116
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PROTOCOL_EXT_GENERICP3 | %FileCheck %s -check-prefix=PROTOCOL_EXT_GENERICP3
117+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ1 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ
118+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ2 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ
119+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ3 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ
120+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ4 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ
121+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ5 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ
122+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ6 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ
123+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE1 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE
124+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE2 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE
125+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE3 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE
126+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_NODOT1 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_NODOT
127+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_NODOT2 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_NODOT
128+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_NODOT3 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_NODOT
117129
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PROTOCOL_EXT_P4 | %FileCheck %s -check-prefix=PROTOCOL_EXT_P4
118130
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PROTOCOL_EXT_CONCRETE1 | %FileCheck %s -check-prefix=PROTOCOL_EXT_P4_P1
119131
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PROTOCOL_EXT_CONCRETE2 | %FileCheck %s -check-prefix=PROTOCOL_EXT_P4_P1
@@ -1459,6 +1471,104 @@ func testGenericConforming3<T: P3>(x: T) {
14591471
// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: extP3()[#Void#]{{; name=.+$}}
14601472
// PROTOCOL_EXT_GENERICP3: End completions
14611473
1474+
protocol NoDupReq1 {
1475+
func foo()
1476+
func roo(arg1: Int)
1477+
subscript(arg: Bool) -> Bool {get}
1478+
var doo: Int {get}
1479+
associatedtype E
1480+
}
1481+
protocol NoDupReq2 {
1482+
func foo()
1483+
subscript(arg: Bool) -> Bool {get}
1484+
var doo: Int {get}
1485+
associatedtype E
1486+
}
1487+
protocol NoDupReq3 {
1488+
func foo()
1489+
func roo(arg2: Int)
1490+
subscript(arg: Bool) -> Bool {get}
1491+
var doo: Int {get}
1492+
associatedtype E
1493+
}
1494+
1495+
protocol NoDupReq4 {
1496+
func foo()
1497+
func roo(arg1: Int)
1498+
subscript(arg: Bool) -> Bool {get}
1499+
var doo: Int {get}
1500+
associatedtype E
1501+
}
1502+
protocol NoDupReq5: NoDupReq4 {
1503+
func foo()
1504+
subscript(arg: Bool) -> Bool {get}
1505+
var doo: Int {get}
1506+
associatedtype E
1507+
}
1508+
protocol NoDupReq6: NoDupReq5 {
1509+
func foo()
1510+
func roo(arg2: Int)
1511+
subscript(arg: Bool) -> Bool {get}
1512+
var doo: Int {get}
1513+
associatedtype E
1514+
}
1515+
1516+
typealias NoDupReq23 = NoDupReq2 & NoDupReq3
1517+
1518+
func checkRestatementNoDup1(_ arg: NoDupReq1 & NoDupReq2 & NoDupReq3) {
1519+
arg.#^NODUP_RESTATED_REQ1^#
1520+
arg#^NODUP_RESTATED_REQ_NODOT1^#
1521+
}
1522+
func checkRestatementNoDup2(_ arg: NoDupReq6) {
1523+
arg.#^NODUP_RESTATED_REQ2^#
1524+
}
1525+
func checkRestatementNoDup3<T: NoDupReq6>(_ arg: T) {
1526+
arg.#^NODUP_RESTATED_REQ3^#
1527+
T.#^NODUP_RESTATED_REQ_TYPE1^#
1528+
arg#^NODUP_RESTATED_REQ_NODOT2^#
1529+
}
1530+
func checkRestatementNoDup4<T: NoDupReq1 & NoDupReq2 & NoDupReq3>(_ arg: T) {
1531+
arg.#^NODUP_RESTATED_REQ4^#
1532+
T.#^NODUP_RESTATED_REQ_TYPE2^#
1533+
}
1534+
func checkRestatementNoDup5<T: NoDupReq1 & NoDupReq23>(_ arg: T) {
1535+
arg.#^NODUP_RESTATED_REQ5^#
1536+
T.#^NODUP_RESTATED_REQ_TYPE3^#
1537+
}
1538+
func checkRestatementNoDup6(_ arg: NoDupReq1 & NoDupReq23) {
1539+
arg.#^NODUP_RESTATED_REQ6^#
1540+
arg#^NODUP_RESTATED_REQ_NODOT3^#
1541+
}
1542+
1543+
// CHECK_NODUP_RESTATED_REQ: Begin completions
1544+
// CHECK_NODUP_RESTATED_REQ-DAG: Decl[InstanceMethod]/{{Super|CurrNominal}}: foo()[#Void#]; name=foo()
1545+
// CHECK_NODUP_RESTATED_REQ-DAG: Decl[InstanceMethod]/{{Super|CurrNominal}}: roo({#arg1: Int#})[#Void#]; name=roo(arg1: Int)
1546+
// CHECK_NODUP_RESTATED_REQ-DAG: Decl[InstanceVar]/{{Super|CurrNominal}}: doo[#Int#]; name=doo
1547+
// CHECK_NODUP_RESTATED_REQ-DAG: Decl[InstanceMethod]/{{Super|CurrNominal}}: roo({#arg2: Int#})[#Void#]; name=roo(arg2: Int)
1548+
// CHECK_NODUP_RESTATED_REQ-NOT: Decl[InstanceMethod]/{{Super|CurrNominal}}: foo()[#Void#]; name=foo()
1549+
// CHECK_NODUP_RESTATED_REQ-NOT: Decl[InstanceVar]/{{Super|CurrNominal}}: doo[#Int#]; name=doo
1550+
// CHECK_NODUP_RESTATED_REQ: End completions
1551+
1552+
// CHECK_NODUP_RESTATED_REQ_NODOT: Begin completions
1553+
// CHECK_NODUP_RESTATED_REQ_NODOT: Decl[InstanceMethod]/{{Super|CurrNominal}}: .foo()[#Void#]; name=foo()
1554+
// CHECK_NODUP_RESTATED_REQ_NODOT: Decl[InstanceMethod]/{{Super|CurrNominal}}: .roo({#arg1: Int#})[#Void#]; name=roo(arg1: Int)
1555+
// CHECK_NODUP_RESTATED_REQ_NODOT: Decl[Subscript]/{{Super|CurrNominal}}: [{#Bool#}][#Bool#]; name=[Bool]
1556+
// CHECK_NODUP_RESTATED_REQ_NODOT: Decl[InstanceVar]/{{Super|CurrNominal}}: .doo[#Int#]; name=doo
1557+
// CHECK_NODUP_RESTATED_REQ_NODOT: Decl[InstanceMethod]/{{Super|CurrNominal}}: .roo({#arg2: Int#})[#Void#]; name=roo(arg2: Int)
1558+
// CHECK_NODUP_RESTATED_REQ_NODOT-NOT: Decl[InstanceMethod]/{{Super|CurrNominal}}: .foo()[#Void#]; name=foo()
1559+
// CHECK_NODUP_RESTATED_REQ_NODOT-NOT: Decl[Subscript]/{{Super|CurrNominal}}: [{#Bool#}][#Bool#]; name=[Bool]
1560+
// CHECK_NODUP_RESTATED_REQ_NODOT-NOT: Decl[InstanceVar]/{{Super|CurrNominal}}: .doo[#Int#]; name=doo
1561+
// CHECK_NODUP_RESTATED_REQ_NODOT: End completions
1562+
1563+
// CHECK_NODUP_RESTATED_REQ_TYPE: Begin completions
1564+
// CHECK_NODUP_RESTATED_REQ_TYPE-DAG: Decl[InstanceMethod]/Super: foo({#self: [[ARG:.+]]#})[#() -> Void#]; name=foo([[ARG]])
1565+
// CHECK_NODUP_RESTATED_REQ_TYPE-DAG: Decl[InstanceMethod]/Super: roo({#self: [[ARG]]#})[#(arg1: Int) -> Void#]; name=roo([[ARG]])
1566+
// CHECK_NODUP_RESTATED_REQ_TYPE-DAG: Decl[AssociatedType]/Super: E; name=E
1567+
// CHECK_NODUP_RESTATED_REQ_TYPE-DAG: Decl[InstanceMethod]/Super: roo({#self: [[ARG]]#})[#(arg2: Int) -> Void#]; name=roo([[ARG]])
1568+
// CHECK_NODUP_RESTATED_REQ_TYPE-NOT: Decl[InstanceMethod]/Super: foo({#self: [[ARG:.+]]#})[#() -> Void#]; name=foo([[ARG]])
1569+
// CHECK_NODUP_RESTATED_REQ_TYPE-NOT: Decl[AssociatedType]/Super: E; name=E
1570+
// CHECK_NODUP_RESTATED_REQ_TYPE: End completions
1571+
14621572
struct OnlyMe {}
14631573
protocol P4 {
14641574
associatedtype T

test/IDE/complete_where_clause.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GP4 | %FileCheck %s -check-prefix=TYPE1
55
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GP5 | %FileCheck %s -check-prefix=TYPE1
66
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GP6 | %FileCheck %s -check-prefix=A1
7+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=FUNC_ASSOC_NODUP_1 | %FileCheck %s -check-prefix=GEN_T_ASSOC_E
8+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=FUNC_ASSOC_NODUP_2 | %FileCheck %s -check-prefix=GEN_T_ASSOC_E
79
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=FUNC_1 | %FileCheck %s -check-prefix=GEN_T
810
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=FUNC_2 | %FileCheck %s -check-prefix=GEN_T_DOT
911
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=FUNC_2_ASSOC | %FileCheck %s -check-prefix=GEN_T_ASSOC_DOT
@@ -63,6 +65,23 @@ extension A1 where T1.#^GP6^# {}
6365
// TYPE1-NOT: T4
6466
// TYPE1-NOT: T5
6567

68+
protocol A {associatedtype E}
69+
protocol B {associatedtype E}
70+
71+
protocol C {associatedtype E}
72+
protocol D: C {associatedtype E}
73+
74+
func ab<T: A & B>(_ arg: T) where T.#^FUNC_ASSOC_NODUP_1^#
75+
76+
func ab<T: D>(_ arg: T) where T.#^FUNC_ASSOC_NODUP_2^#
77+
78+
// GEN_T_ASSOC_E: Begin completions, 3 items
79+
// GEN_T_ASSOC_E: Decl[AssociatedType]/Super: E; name=E
80+
// GEN_T_ASSOC_E-NOT: Decl[AssociatedType]/Super: E; name=E
81+
// GEN_T_ASSOC_E-DAG: Keyword/None: Type[#T.Type#];
82+
// GEN_T_ASSOC_E-DAG: Keyword/CurrNominal: self[#T#];
83+
// GEN_T_ASSOC_E: End completions
84+
6685
protocol Assoc {
6786
associatedtype Q
6887
}

0 commit comments

Comments
 (0)