
protocol FooProtocol {
  /// fooInstanceVar Aaa.
  /// Bbb.
  ///
  /// Ccc.
  var fooInstanceVar: Int { get }
  typealias FooTypeAlias1
  func fooInstanceFunc0() -> Double
  func fooInstanceFunc1(a: Int) -> Double
  subscript(i: Int) -> Double { get }
}

func test1(a: FooProtocol) {
  a.
}

func testOptional1(a: FooProtocol?) {
  a.
}

class C {
  @available(*, unavailable) func unavail() {}
}

func test_unavail(a: C) {
  a.
}

class Base {
    func foo() {}
}

class Derived: Base {
    func foo() {}
}

func testOverrideUSR() {
    Derived().
}

// RUN: %sourcekitd-test -req=complete -pos=15:5 %s -- %s > %t.response
// RUN: diff -u %s.response %t.response
//
// RUN: %sourcekitd-test -req=complete -pos=19:5 %s -- %s | FileCheck %s -check-prefix=CHECK-OPTIONAL
// RUN: %sourcekitd-test -req=complete.open -pos=19:5 %s -- %s | FileCheck %s -check-prefix=CHECK-OPTIONAL-OPEN
// CHECK-OPTIONAL:     {
// CHECK-OPTIONAL:       key.kind: source.lang.swift.decl.function.method.instance,
// CHECK-OPTIONAL:       key.name: "fooInstanceFunc0()",
// CHECK-OPTIONAL-LABEL:       key.sourcetext: "?.fooInstanceFunc1(<#T##a: Int##Int#>)",
// CHECK-OPTIONAL-NEXT:       key.description: "fooInstanceFunc1(a: Int)",
// CHECK-OPTIONAL-NEXT:       key.typename: "Double",
// CHECK-OPTIONAL-NEXT:       key.context: source.codecompletion.context.thisclass,
// CHECK-OPTIONAL-NEXT:       key.num_bytes_to_erase: 1,
// CHECK-OPTIONAL-NEXT:       key.associated_usrs: "s:FP15complete_member11FooProtocol16fooInstanceFunc1FSiSd",
// CHECK-OPTIONAL-NEXT:       key.modulename: "complete_member"
// CHECK-OPTIONAL-NEXT:     },

// RUN: %sourcekitd-test -req=complete.open -pos=19:5 %s -- %s | FileCheck %s -check-prefix=CHECK-OPTIONAL-OPEN
// CHECK-OPTIONAL-OPEN-NOT:       key.description: "fooInstanceFunc1
// CHECK-OPTIONAL-OPEN:       key.description: "?.fooInstanceFunc1(a: Int)",
// CHECK-OPTIONAL-OPEN-NOT:       key.description: "fooInstanceFunc1

// RUN: %sourcekitd-test -req=complete -pos=27:5 %s -- %s | FileCheck %s -check-prefix=CHECK-UNAVAIL
// CHECK-UNAVAIL-NOT: key.name: "unavail()",

// RUN: %sourcekitd-test -req=complete -pos=39:15 %s -- %s | FileCheck %s -check-prefix=CHECK-OVERRIDE_USR
// CHECK-OVERRIDE_USR:      {
// CHECK-OVERRIDE_USR:          key.kind: source.lang.swift.decl.function.method.instance,
// CHECK-OVERRIDE_USR-NEXT:     key.name: "foo()",
// CHECK-OVERRIDE_USR-NEXT:     key.sourcetext: "foo()",
// CHECK-OVERRIDE_USR-NEXT:     key.description: "foo()",
// CHECK-OVERRIDE_USR-NEXT:     key.typename: "Void",
// CHECK-OVERRIDE_USR-NEXT:     key.context: source.codecompletion.context.thisclass,
// CHECK-OVERRIDE_USR-NEXT:     key.num_bytes_to_erase: 0,
// CHECK-OVERRIDE_USR-NEXT:     key.associated_usrs: "s:FC15complete_member7Derived3fooFT_T_ s:FC15complete_member4Base3fooFT_T_",
// CHECK-OVERRIDE_USR-NEXT:     key.modulename: "complete_member"
// CHECK-OVERRIDE_USR-NEXT: }
