| // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=CONSTRAINT1 | %FileCheck %s -check-prefix=CONSTRAINT1 |
| // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=CONSTRAINT2 | %FileCheck %s -check-prefix=CONSTRAINT2 |
| // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=CONSTRAINT3 | %FileCheck %s -check-prefix=CONSTRAINT3 |
| |
| public protocol P1 {} |
| public protocol P2 {} |
| public struct Example<T: Any> {} |
| |
| extension Example where T: P1 { |
| func P1Method() {} |
| } |
| |
| extension Example where T: P2 { |
| func P2Method() {} |
| } |
| |
| public struct S1 : P1 {} |
| public struct S2 : P2 {} |
| |
| func foo1() { |
| var I1 = Example<S1>() |
| I1.#^CONSTRAINT1^# |
| } |
| |
| // CONSTRAINT1: Begin completions, 1 items |
| // CONSTRAINT1-NEXT: Decl[InstanceMethod]/CurrNominal: P1Method()[#Void#]; name=P1Method() |
| // CONSTRAINT1-NEXT: End completions |
| |
| func foo2() { |
| var I2 = Example<S2>() |
| I2.#^CONSTRAINT2^# |
| } |
| |
| // CONSTRAINT2: Begin completions, 1 items |
| // CONSTRAINT2-NEXT: Decl[InstanceMethod]/CurrNominal: P2Method()[#Void#]; name=P2Method() |
| // CONSTRAINT2-NEXT: End completions |
| |
| protocol MyIndexable {} |
| protocol MyCollection : MyIndexable { |
| associatedtype Indices = MyDefaultIndices<Self> |
| var indices: Indices { get } |
| } |
| struct MyDefaultIndices<Elements : MyIndexable> : MyCollection {} |
| extension MyCollection where Indices == MyDefaultIndices<Self> { |
| var indices: MyDefaultIndices<Self> { return MyDefaultIndices() } |
| } |
| struct ConcreteCollection<Element> : MyCollection {} |
| func foo3() { |
| ConcreteCollection<Int>().#^CONSTRAINT3^# |
| } |
| // CONSTRAINT3: Begin completions, 1 items |
| // CONSTRAINT3-NEXT: Decl[InstanceVar]/Super: indices[#MyDefaultIndices<ConcreteCollection<Int>>#]; name=indices |
| // CONSTRAINT3-NEXT: End completions |