// RUN: %complete-test -tok=TOP_LEVEL_0 %s | FileCheck %s -check-prefix=TOP_LEVEL_0
// RUN: %complete-test -tok=TOP_LEVEL_1 %s | FileCheck %s -check-prefix=TOP_LEVEL_1
// RUN: %complete-test -tok=TOP_LEVEL_2 %s | FileCheck %s -check-prefix=TOP_LEVEL_2
// RUN: %complete-test -tok=TOP_LEVEL_3 %s | FileCheck %s -check-prefix=TOP_LEVEL_3
// RUN: %complete-test -group=none -tok=CROSS_CONTEXT_0 %s | FileCheck %s -check-prefix=CROSS_CONTEXT_0
// RUN: %complete-test -group=none -tok=FROM_METHOD_0 %s | FileCheck %s -check-prefix=FROM_METHOD_0

let valueA = [0]
let valueS = ""
let valueZ = 1

func takeInt(x: Int, y: Int)
func takeIntOpt(x: Int, y: Int?)
func takeString(x: Int, y: String)
func takeAny(x: Int, y: Any)

takeInt(1, y: #^TOP_LEVEL_0^#)
// TOP_LEVEL_0-NOT: nil
// TOP_LEVEL_0: valueZ
// TOP_LEVEL_0: Int
// TOP_LEVEL_0: valueA
// TOP_LEVEL_0: valueS

takeString(1, y: #^TOP_LEVEL_1^#)
// TOP_LEVEL_1: valueS
// TOP_LEVEL_1: String
// TOP_LEVEL_1: valueA
// TOP_LEVEL_1: valueZ

takeAny(1, y: #^TOP_LEVEL_2^#)
// TOP_LEVEL_2: valueA
// TOP_LEVEL_2: valueS
// TOP_LEVEL_2: valueZ

takeIntOpt(1, y: #^TOP_LEVEL_3^#)
// TOP_LEVEL_3: nil
// TOP_LEVEL_3: valueZ
// TOP_LEVEL_3: valueA
// TOP_LEVEL_3: valueS

func testCrossContext(x: Int, y: String, z: Any) {
  takeInt(1, y: #^CROSS_CONTEXT_0^#)
}
// CROSS_CONTEXT_0: x
// CROSS_CONTEXT_0: valueZ
// CROSS_CONTEXT_0: Int
// CROSS_CONTEXT_0: y
// CROSS_CONTEXT_0: z
// CROSS_CONTEXT_0: valueA
// CROSS_CONTEXT_0: valueS

struct FromMethod {
  func valueA() -> [Int] { return [0] }
  func valueS() -> String { return "" }
  func valueZ() -> Int { return 1 }
}

func testFromMethod(x: FromMethod) {
  takeInt(1, y: x.#^FROM_METHOD_0^#)
}
// FROM_METHOD_0: valueZ()
// FROM_METHOD_0: valueA()
// FROM_METHOD_0: valueS()
