Skip to content

Commit fc28f90

Browse files
committed
[CodeCompletion] Tweak canBeUsedAsRequirementFirstType()
1 parent 0dd0092 commit fc28f90

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1580,18 +1580,9 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
15801580
archeTy = archeTy->getRoot();
15811581

15821582
// For protocol, the 'archeTy' should match with the 'baseTy' which is the
1583-
// dynamic 'Self' type of the protocol.
1584-
if (archeTy->isEqual(selfTy))
1585-
return true;
1586-
1587-
// For nominal decls, 'archTy' should be one of the generic parameters.
1588-
if (selfTy->castTo<BoundGenericType>() &&
1589-
llvm::any_of(selfTy->castTo<BoundGenericType>()->getGenericArgs(),
1590-
[&](const Type &T) { return archeTy->isEqual(T); }))
1591-
return true;
1592-
1593-
1594-
return false;
1583+
// dynamic 'Self' type of the protocol. For nominal decls, 'archTy' should
1584+
// be one of the generic params in 'selfTy'. Search 'archeTy' in 'baseTy'.
1585+
return selfTy.findIf([&](Type T) { return archeTy->isEqual(T); });
15951586
}
15961587

15971588
public:

test/IDE/complete_where_clause.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PROTOCOL_SELF | %FileCheck %s -check-prefix=PROTOCOL_SELF
3535
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NOMINAL_TYPEALIAS | %FileCheck %s -check-prefix=NOMINAL_TYPEALIAS
3636
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NOMINAL_TYPEALIAS_EXT | %FileCheck %s -check-prefix=NOMINAL_TYPEALIAS_EXT
37+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NOMINAL_TYPEALIAS_NESTED1 | %FileCheck %s -check-prefix=NOMINAL_TYPEALIAS_NESTED1
38+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NOMINAL_TYPEALIAS_NESTED2 | %FileCheck %s -check-prefix=NOMINAL_TYPEALIAS_NESTED2
39+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NOMINAL_TYPEALIAS_NESTED1_EXT | %FileCheck %s -check-prefix=NOMINAL_TYPEALIAS_NESTED1_EXT
40+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NOMINAL_TYPEALIAS_NESTED2_EXT | %FileCheck %s -check-prefix=NOMINAL_TYPEALIAS_NESTED2_EXT
3741

3842
class A1<T1, T2, T3> {}
3943

@@ -191,3 +195,34 @@ extension TA1 where #^NOMINAL_TYPEALIAS_EXT^# { }
191195
// NOMINAL_TYPEALIAS_EXT-DAG: Decl[GenericTypeParam]/Local: T[#T#];
192196
// NOMINAL_TYPEALIAS_EXT-DAG: Decl[TypeAlias]/CurrNominal: U[#T.Q#];
193197
// NOMINAL_TYPEALIAS_EXT: End completions
198+
199+
struct TA2<T: Assoc> {
200+
struct Inner1<U> where #^NOMINAL_TYPEALIAS_NESTED1^# {
201+
typealias X1 = T
202+
typealias X2 = T.Q
203+
}
204+
// NOMINAL_TYPEALIAS_NESTED1: Begin completions, 2 items
205+
// NOMINAL_TYPEALIAS_NESTED1-DAG: Decl[GenericTypeParam]/Local: T[#T#];
206+
// NOMINAL_TYPEALIAS_NESTED1-DAG: Decl[GenericTypeParam]/Local: U[#U#];
207+
// NOMINAL_TYPEALIAS_NESTED1: End completions
208+
struct Inner2 where #^NOMINAL_TYPEALIAS_NESTED2^# {
209+
typealias X1 = T
210+
typealias X2 = T.Q
211+
}
212+
// NOMINAL_TYPEALIAS_NESTED2: Begin completions, 1 items
213+
// NOMINAL_TYPEALIAS_NESTED2-DAG: Decl[GenericTypeParam]/Local: T[#T#];
214+
// NOMINAL_TYPEALIAS_NESTED2: End completions
215+
}
216+
extension TA2.Inner1 where #^NOMINAL_TYPEALIAS_NESTED1_EXT^# {}
217+
// NOMINAL_TYPEALIAS_NESTED1_EXT: Begin completions, 4 items
218+
// NOMINAL_TYPEALIAS_NESTED1_EXT-DAG: Decl[GenericTypeParam]/Local: T[#T#];
219+
// NOMINAL_TYPEALIAS_NESTED1_EXT-DAG: Decl[GenericTypeParam]/Local: U[#U#];
220+
// NOMINAL_TYPEALIAS_NESTED1_EXT-DAG: Decl[TypeAlias]/CurrNominal: X1[#T#];
221+
// NOMINAL_TYPEALIAS_NESTED1_EXT-DAG: Decl[TypeAlias]/CurrNominal: X2[#T.Q#];
222+
// NOMINAL_TYPEALIAS_NESTED1_EXT: End completions
223+
extension TA2.Inner2 where #^NOMINAL_TYPEALIAS_NESTED2_EXT^# {}
224+
// NOMINAL_TYPEALIAS_NESTED2_EXT: Begin completions, 3 items
225+
// NOMINAL_TYPEALIAS_NESTED2_EXT-DAG: Decl[GenericTypeParam]/Local: T[#T#];
226+
// NOMINAL_TYPEALIAS_NESTED2_EXT-DAG: Decl[TypeAlias]/CurrNominal: X1[#T#];
227+
// NOMINAL_TYPEALIAS_NESTED2_EXT-DAG: Decl[TypeAlias]/CurrNominal: X2[#T.Q#];
228+
// NOMINAL_TYPEALIAS_NESTED2_EXT: End completions

0 commit comments

Comments
 (0)