File: objc_implementation_conflicts.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 (252 lines) | stat: -rw-r--r-- 6,204 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
// RUN: %target-typecheck-verify-swift -import-objc-header %S/Inputs/objc_implementation.h
// RUN: %target-typecheck-verify-swift -DPRIVATE_MODULE -Xcc -fmodule-map-file=%S/Inputs/objc_implementation_private.modulemap

// REQUIRES: objc_interop

// Swift doesn't diagnose selector conflicts if there are other errors
// in the file. This is equivalent to decl/ext/objc_implementation.swift
// but has no failures, so we get to that stage of type checking.

#if PRIVATE_MODULE
import objc_implementation_private
#endif

@_objcImplementation extension ObjCClass {
  @objc func method(fromHeader1: CInt) {
    // OK, provides an implementation for the header's method.
  }

  @objc func method(fromHeader2: CInt) {
    // OK, provides an implementation for the header's method.
  }

  @objc func method(fromHeader3: CInt) {
    // OK
  }

  func method(fromHeader4: CInt) {
    // OK
  }

  func methodFromHeader5() -> CInt {
    return 1 // OK
  }

  func method(fromHeader6: CInt) {
    // OK
  }

  @objc fileprivate func methodNot(fromHeader1: CInt) {
    // OK, declares a new @objc dynamic method.
  }

  final func methodNot(fromHeader2: CInt) {
    // OK, declares a new Swift method.
  }

  @objc var propertyFromHeader1: CInt
  // OK, provides an implementation with a stored property

  @objc var propertyFromHeader2: CInt
  // OK, provides an implementation with a stored property

  @objc var propertyFromHeader3: CInt {
    // OK, provides an implementation with a computed property
    get { return 1 }
    set {}
  }

  @objc var propertyFromHeader4: CInt {
    // OK, provides an implementation with a computed property
    get { return 1 }
    set {}
  }

  @objc var propertyFromHeader5: CInt

  @objc var propertyFromHeader6: CInt {
    get { return 1 }
    set {}
  }

  @objc var propertyFromHeader7: CInt {
    get { return 1 }
    set {}
  }

  var propertyFromHeader8: CInt

  @objc var propertyFromHeader9: CInt

  @objc var propertyFromHeader10: CInt

  @objc var propertyFromHeader11: CInt

  @objc var readonlyPropertyFromHeader1: CInt
  // OK, provides an implementation with a stored property that's nonpublicly settable

  @objc var readonlyPropertyFromHeader2: CInt
  // OK, provides an implementation with a stored property that's nonpublicly settable

  @objc var readonlyPropertyFromHeader3: CInt {
    // FIXME: OK, provides an implementation with a computed property
    get { return 1 }
    set {}
  }

  @objc var readonlyPropertyFromHeader4: CInt {
    // OK, provides an implementation with a computed property
    get { return 1 }
    set {}
  }

  @objc let readonlyPropertyFromHeader5: CInt
  // OK, provides an implementation with a stored read-only property

  @objc var readonlyPropertyFromHeader6: CInt {
    // OK, provides an implementation with a computed read-only property
    get { return 1 }
  }

  @objc fileprivate var propertyNotFromHeader2: CInt
  // OK, provides a nonpublic but ObjC-compatible stored property

  @objc private var propertyNotFromHeader3: CInt {
    // OK, provides a nonpublic but ObjC-compatible computed property
    get { return 1 }
    set {}
  }

  final var propertyNotFromHeader4: CInt
  // OK, provides a Swift-only stored property

  @objc final var propertyNotFromHeader5: CInt
  // OK, @objc final is weird but supported, not a member impl

  override open func superclassMethod(_: CInt) {
    // OK
  }

  override open var superclassProperty: CInt {
    get {
      // OK
    }
    set {
      // OK
    }
  }

  override public init(fromSuperclass v: CInt) {
    // OK
    super.init(fromSuperclass: v)
  }

  override public init(fromSuperclass2 v: CInt) {
    // OK
    super.init(fromSuperclass2: v)
  }

  @objc(initFromProtocol1:)
  required public init?(fromProtocol1 v: CInt) {
    // OK
    super.init(fromSuperclass: v)
  }

  @objc(initFromProtocol2:)
  required public init?(fromProtocol2 v: CInt) {
    // OK
    super.init(fromSuperclass: v)
  }

  @objc(initNotFromProtocol:)
  public init?(notFromProtocol v: CInt) {
    // OK
    super.init(fromSuperclass: v)
  }

  class func classMethod1(_: CInt) {}
  class func classMethod2(_: CInt) {}
  class func classMethod3(_: CInt) {}

  func instanceMethod1(_: CInt) {}
  func instanceMethod2(_: CInt) {}

  @objc func extensionMethod(fromHeader1: CInt) {}
  @objc func extensionMethod(fromHeader2: CInt) {}

  @objc(copyWithZone:) func copy(with zone: NSZone?) -> Any { self }

  let rdar122280735: (@escaping () -> ()) -> Void = { _ in }
}

@_objcImplementation(PresentAdditions) extension ObjCClass {
  @objc func categoryMethod(fromHeader3: CInt) {
    // OK
  }

  @objc func categoryMethod(fromHeader1: CInt) {
    // OK, provides an implementation for the header's method.
  }

  @objc func categoryMethod(fromHeader2: CInt) {
    // OK, provides an implementation for the header's method.
  }

  @objc func categoryMethod(fromHeader4: CInt) {
    // OK, provides an implementation for the header's method.
  }

  @objc fileprivate func categoryMethodNot(fromHeader1: CInt) {
    // OK, declares a new @objc dynamic method.
  }

  final func categoryMethodNot(fromHeader2: CInt) {
    // OK, declares a new Swift method.
  }

  private func categoryMethodNot(fromHeader3: CInt) {
    // OK
  }

  @objc var categoryPropertyFromHeader1: CInt {
    get { return 1 }
    set {}
  }

  @objc var categoryPropertyFromHeader2: CInt {
    get { return 1 }
    set {}
  }

  @objc var categoryPropertyFromHeader3: CInt {
    // OK, provides an implementation with a computed property
    get { return 1 }
    set {}
  }

  @objc var categoryPropertyFromHeader4: CInt {
    // OK, provides an implementation with a computed property
    get { return 1 }
    set {}
  }
}

@objc class SwiftClass {}

func usesAreNotAmbiguous(obj: ObjCClass) {
  obj.method(fromHeader1: 1)
  obj.method(fromHeader2: 2)
  obj.method(fromHeader3: 3)
  obj.method(fromHeader4: 4)

  obj.methodNot(fromHeader1: 1)
  obj.methodNot(fromHeader2: 2)

  obj.categoryMethod(fromHeader1: 1)
  obj.categoryMethod(fromHeader2: 2)
  obj.categoryMethod(fromHeader3: 3)
  obj.categoryMethod(fromHeader4: 4)

  obj.categoryMethodNot(fromHeader1: 1)
  obj.categoryMethodNot(fromHeader2: 2)
}