// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -I %S/Inputs/custom-modules %s -verify -verify-ignore-unknown

// REQUIRES: objc_interop
// REQUIRES: OS=macosx
// FIXME: <rdar://problem/19452886> test/ClangModules/objc_init.swift should not require REQUIRES: OS=macosx

import AppKit
import objc_ext
import TestProtocols
import ObjCParseExtras

// rdar://problem/18500201
extension NSSet {
  convenience init<T>(array: Array<T>) {
    self.init()
  }
}

// Subclassing and designated initializers
func testNSInterestingDesignated() {
  NSInterestingDesignated() // expected-warning{{unused}}
  NSInterestingDesignated(string:"hello") // expected-warning{{unused}}
  NSInterestingDesignatedSub() // expected-warning{{unused}}
  NSInterestingDesignatedSub(string:"hello") // expected-warning{{unused}}
}

extension URLDocument {
  convenience init(string: String) {
    self.init(url: string)
  }
}

class MyDocument1 : URLDocument {
  override init() { 
    super.init()
  }
}

func createMyDocument1() {
  var md = MyDocument1()
  md = MyDocument1(url: "http://llvm.org")

  // Inherited convenience init.
  md = MyDocument1(string: "http://llvm.org")
  _ = md
}

class MyDocument2 : URLDocument {
  init(url: String) {
    super.init(url: url) // expected-error{{must call a designated initializer of the superclass 'URLDocument'}}
  }
}

class MyDocument3 : NSAwesomeDocument {
  override init() { 
    super.init()
  }
}

func createMyDocument3(_ url: NSURL) {
  var md = MyDocument3()
  md = try! MyDocument3(contentsOf: url as URL, ofType:"")
  _ = md
}

class MyInterestingDesignated : NSInterestingDesignatedSub { 
  override init(string str: String) {
    super.init(string: str)
  }

  init(int i: Int) {
    super.init() // expected-error{{must call a designated initializer of the superclass 'NSInterestingDesignatedSub'}}
  }
}

func createMyInterestingDesignated() {
  _ = MyInterestingDesignated(url: "http://llvm.org")
}

func testNoReturn(_ a : NSAwesomeDocument) -> Int {
  a.noReturnMethod(42)
  return 17    // TODO: In principle, we should produce an unreachable code diagnostic here.
}

// Initializer inheritance from protocol-specified initializers.
class MyViewController : NSViewController {
}

class MyView : NSView {
  override init() { super.init() }
} // expected-error{{'required' initializer 'init(coder:)' must be provided by subclass of 'NSView'}}

class MyMenu : NSMenu {
  override init(title: String) { super.init(title: title) }
} // expected-error{{'required' initializer 'init(coder:)' must be provided by subclass of 'NSMenu'}}

class MyTableViewController : NSTableViewController {
}

class MyOtherTableViewController : NSTableViewController {
  override init(int i: Int) {
    super.init(int: i)
  }
} // expected-error{{'required' initializer 'init(coder:)' must be provided by subclass of 'NSTableViewController'}}

class MyThirdTableViewController : NSTableViewController {
  override init(int i: Int) {
    super.init(int: i)
  }

  required init(coder: NSCoder) {
    super.init(coder: coder)!
  }
}

func checkInitWithCoder(_ coder: NSCoder) {
  NSViewController(coder: coder) // expected-warning{{unused}}
  NSTableViewController(coder: coder) // expected-warning{{unused}}
  MyViewController(coder: coder) // expected-warning{{unused}}
  MyTableViewController(coder: coder) // expected-warning{{unused}}
  MyOtherTableViewController(coder: coder) // expected-error{{incorrect argument label in call (have 'coder:', expected 'int:')}}
  MyThirdTableViewController(coder: coder) // expected-warning{{unused}}
}

// <rdar://problem/16838409>
class MyDictionary1 : NSDictionary {}

func getMyDictionary1() {
  _ = MyDictionary1()
}

// <rdar://problem/16838515>
class MyDictionary2 : NSDictionary {
  override init() {
    super.init()
  }
}

class MyString : NSString {
  override init() { super.init() }
} // expected-error{{'required' initializer 'init(coder:)' must be provided by subclass of 'NSString'}}

// <rdar://problem/17281900>
class View: NSView {
  override func addSubview(_ aView: NSView) {
    _ = MyViewController.init()
  }
}

// rdar://problem/19726164
class NonNullDefaultInitSubSub : NonNullDefaultInitSub {
  func foo() {
    _ = NonNullDefaultInitSubSub() as NonNullDefaultInitSubSub?
  }
}

class DesignatedInitSub : DesignatedInitBase {
  var foo: Int?

  override init(int: Int) {}
}

class DesignedInitSubSub : DesignatedInitSub {
  init(double: Double) { super.init(int: 0) } // okay
  init(string: String) { super.init() } // expected-error {{must call a designated initializer of the superclass 'DesignatedInitSub'}}
}

// Make sure that our magic doesn't think the class property with the type name is an init
func classPropertiesAreNotInit() -> ProcessInfo {
  var procInfo = NSProcessInfo.processInfo // expected-error{{'NSProcessInfo' has been renamed to 'ProcessInfo'}}
  procInfo = ProcessInfo.processInfo // okay
  return procInfo
}

// FIXME: Remove -verify-ignore-unknown.
// <unknown>:0: error: unexpected note produced: 'NSProcessInfo' was obsoleted in Swift 3
