// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OVERRIDE_1 | %FileCheck %s -check-prefix=OVERRIDE_1
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OVERRIDE_2 | %FileCheck %s -check-prefix=OVERRIDE_2
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OVERRIDE_3 | %FileCheck %s -check-prefix=OVERRIDE_3

struct Generic<T> {}

protocol MyProtocol {
  associatedtype Result
  typealias Arg1 = Generic<Self>
  typealias Arg2<X> = Generic<X>
  typealias Func = () -> Int
  func foo<U>(arg1: Arg1, arg2: Arg2<U>, arg3: Arg2<Int>, arg4: [Arg1], arg5: Arg2<U>? arg6: Generic<Arg2<Generic<Arg2<Int>>>>) -> Result
  func bar() -> Result
  func baz(arg: @escaping Func)
}

struct MyStruct1 : MyProtocol {
  // No 'Result' witness.
  func #^OVERRIDE_1^#
}

struct MyStruct2 : MyProtocol {
  // Explicit 'Result' witness by 'typealias'.
  typealias Result = String
  func #^OVERRIDE_2^#
}

struct MyStruct3 : MyProtocol {
  // Implicit 'Result' witness by inference.
  func bar() -> String
  func #^OVERRIDE_3^#
}

// OVERRIDE_1: Begin completions, 3 items
// OVERRIDE_1-DAG: Decl[InstanceMethod]/Super: foo<U>(arg1: Arg1, arg2: Arg2<U>, arg3: Arg2<Int>, arg4: [Arg1], arg5: Arg2<U>?, arg6: Generic<Arg2<Generic<Arg2<Int>>>>) -> Result {|};
// OVERRIDE_1-DAG: Decl[InstanceMethod]/Super: bar() -> Result {|};
// OVERRIDE_1-DAG: Decl[InstanceMethod]/Super: baz(arg: @escaping Func) {|};

// OVERRIDE_2: Begin completions, 3 items
// OVERRIDE_2-DAG: Decl[InstanceMethod]/Super: foo<U>(arg1: Arg1, arg2: Arg2<U>, arg3: Arg2<Int>, arg4: [Arg1], arg5: Arg2<U>?, arg6: Generic<Arg2<Generic<Arg2<Int>>>>) -> String {|};
// OVERRIDE_2-DAG: Decl[InstanceMethod]/Super: bar() -> String {|};
// OVERRIDE_2-DAG: Decl[InstanceMethod]/Super: baz(arg: @escaping Func) {|};

// OVERRIDE_3-DAG: Begin completions, 2 items
// OVERRIDE_3-DAG: Decl[InstanceMethod]/Super: foo<U>(arg1: Arg1, arg2: Arg2<U>, arg3: Arg2<Int>, arg4: [Arg1], arg5: Arg2<U>?, arg6: Generic<Arg2<Generic<Arg2<Int>>>>) -> String {|};
// OVERRIDE_3-DAG: Decl[InstanceMethod]/Super: baz(arg: @escaping Func) {|};

