// REQUIRES: objc_interop
// RUN: %empty-directory(%t.mod)
// RUN: %target-swift-frontend -emit-module -o %t.mod/Cities.swiftmodule %S/Inputs/Cities.swift -module-name Cities -parse-as-library
// RUN: %empty-directory(%t) && %target-swift-frontend -c -update-code -disable-migrator-fixits -primary-file %s  -I %t.mod -api-diff-data-file %S/Inputs/API.json -emit-migrated-file-path %t/wrap_optional.swift.result -o /dev/null
// RUN: diff -u %S/wrap_optional.swift.expected %t/wrap_optional.swift.result

import Cities

class MyCities : Cities {
  override init?(x: Int?) { super.init(x: x) }
  override init?(y: Int) { super.init(y: y) }
  override func newMooloolaba(newX x: Cities?, newY y: Cities) {}
  override func toowoomba(x: [Cities?], y: [Cities?]) {}
  override func mareeba(x: [String? : Cities], y: [Int : Cities]) {}
  override func maroochy(x: ((Int) -> Int)?, y: ((Int) -> Int)?) {}
}

class MySubCities : MyCities {}

class MySubSubCities : MySubCities {
  override func yandina(x: [[Int : Cities]]?) {}
  override func buderim() -> (Cities & ExtraCities)? { return nil }
  override func noosa() -> [[Int : Cities]] { return [] }
}

typealias IntPair = (Int, Int)

extension ExtraCities {
  func coolum(x: [String : [Int : [((([String])))]]]) {}
  func currimundi(x: (Int, IntPair)?) {}
}

class MyExtraCities : ExtraCities {
  func blibli(x: ((String, String) -> String?)?) {}
  func currimundi(x: (Int, (Int?, Int))?) {}
}

typealias IntAnd<T> = (Int, T)
class Outer {
  typealias Inner = (String?, String) -> String?
}

class MyExtraCitiesWithAliases : ExtraCities {
  func blibli(x: Outer.Inner?) {}
  func currimundi(x: (Int, IntAnd<Int>)?) {}
}

typealias OptString = String?
typealias OptGeneric<T> = T?

class MyExtraCitiesWithMoreAliases : ExtraCities {
  func blibli(x: ((OptString, String) -> String?)?) {}
  func currimundi(x: OptGeneric<(Int, (Int, Int))>) {}
}
