File: attr_objc_swift4.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (71 lines) | stat: -rw-r--r-- 2,923 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// RUN: %target-swift-frontend -disable-objc-attr-requires-foundation-module -typecheck -verify %s -swift-version 4 -enable-source-import -I %S/Inputs
// RUN: %target-swift-ide-test -skip-deinit=false -print-ast-typechecked -source-filename %s -prefer-type-repr=false -print-implicit-attrs=true -explode-pattern-binding-decls=true -disable-objc-attr-requires-foundation-module -swift-version 4 -enable-source-import -I %S/Inputs | %FileCheck %s
// REQUIRES: objc_interop

import Foundation

class ObjCSubclass : NSObject {
  func foo() { } // expected-note{{add '@objc' to expose this instance method to Objective-C}}
}

class DynamicMembers {
  @objc dynamic func foo() { }
  
  @objc dynamic var bar: NSObject? = nil
}

func test(sc: ObjCSubclass, dm: DynamicMembers) {
  _ = #selector(sc.foo) // expected-error{{argument of '#selector' refers to instance method 'foo()' that is not exposed to Objective-C}}

  _ = #selector(getter: dm.bar)
  _ = #keyPath(DynamicMembers.bar)
}

struct PlainStruct { }

class BadInSwift4 {
  @IBInspectable var badIBInspectable: PlainStruct?
  // expected-error@-1{{property cannot be marked @IBInspectable because its type cannot be represented in Objective-C}}

  @GKInspectable var badGKInspectable: PlainStruct?
  // expected-error@-1{{property cannot be marked @GKInspectable because its type cannot be represented in Objective-C}}
}

// CHECK-LABEL: class InitsInheritObjCAttrBase
class InitsInheritObjCAttrBase: NSObject {
  override init() {}
  // CHECK: {{^}} @objc convenience init(foo: Int)
  @objc convenience init(foo: Int) { self.init() }
} // CHECK: {{^[}]$}}

// CHECK-LABEL: extension InitsInheritObjCAttrBase
extension InitsInheritObjCAttrBase {
  // CHECK: {{^}} @objc convenience dynamic init(bar: Int)
  @objc convenience init(bar: Int) { self.init() }
} // CHECK: {{^[}]$}}

// CHECK-LABEL: class ConvenienceInitsInheritObjCAttrSub
class ConvenienceInitsInheritObjCAttrSub: InitsInheritObjCAttrBase {
  init(somethingElse: ()) { super.init() }

  // CHECK: {{^}} @objc convenience init(foo: Int)
  convenience init(foo: Int) { self.init(somethingElse: ()) }
  // FIXME: The '@objc' is relied upon, but the 'dynamic' probably shouldn't be!
  // CHECK: {{^}} @objc convenience dynamic init(bar: Int)
  convenience init(bar: Int) { self.init(somethingElse: ()) }

  // CHECK: {{^}} convenience init(unrelated: Int)
  convenience init(unrelated: Int) { self.init(somethingElse: ()) }
} // CHECK: {{^[}]$}}

// CHECK-LABEL: class DesignatedInitsInheritObjCAttrSub
class DesignatedInitsInheritObjCAttrSub: InitsInheritObjCAttrBase {
  // CHECK: {{^}} @objc init(foo: Int)
  init(foo: Int) { super.init() }
  // FIXME: The '@objc' is relied upon, but the 'dynamic' probably shouldn't be!
  // CHECK: {{^}} @objc dynamic init(bar: Int)
  init(bar: Int) { super.init() }
  
  // CHECK: {{^}} init(unrelated: Int)
  init(unrelated: Int) { super.init() }
} // CHECK: {{^[}]$}}