File: open_objc.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 (73 lines) | stat: -rw-r--r-- 4,557 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
// RUN: %empty-directory(%t)
// RUN: %target-typecheck-verify-swift -sdk %clang-importer-sdk -I %t
// REQUIRES: objc_interop

import Foundation

open class InvalidOpenExtension {
  open func openMethod() { } // No warning: Pure Swift methods can be open inside the class declaration.
  open var openVar: Int { 3 } // No warning: Pure Swift properties can be open inside the class declaration.
}
extension InvalidOpenExtension {
  open func nonObjcOpenMethod() { } // expected-warning {{non-'@objc' instance method in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
  open class func nonObjcOpenMethod() { } // expected-warning {{non-'@objc' class method in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
  open var nonObjcOpenVar: Int { 3 }  // expected-warning {{non-'@objc' property in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
  open subscript(_ index: Int) -> Int { 3 } // expected-warning {{non-'@objc' subscript in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
  open convenience init(index: Int) { self.init() } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}} // expected-warning {{non-'@objc' initializer in extensions cannot be overridden; use 'public' instead}}

  @objc open func objcOpenMethod() { } // No warning: @objc methods can be open inside extensions. 
  @objc open var objcOpenVar: Int { 3 } // No warning: @objc methods can be open inside extensions. 

  open class nonObjcClassDecl  { }
  open enum nonObjcEnumDecl { case one } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}} {{3-7=public}}
}

// For extensions with access level less than open, '`open` modifier conflicts with...' warning will always precede the 'non-@objc member...' warning. 
// For extensions with open access level, invalid open extension error will precede the 'non-@objc member...' warning. 
public extension InvalidOpenExtension { 
    open func nonObjcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
    open var nonObjcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
    @objc open func objcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
    @objc open var objcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
}

@objcMembers
open class ValidOpenExtension { }
extension ValidOpenExtension {
    open func objcOpenMethod() { } // No warning: This declaration is implicitly @objc
    open class func objcOpenMethod() { } // No warning: This declaration is implicitly @objc
    open var objcOpenVar: Int { 3 } // No warning: This declaration is implicitly @objc
    open subscript(_ index: Int) -> Int { 3 } // No warning: This declaration is implicitly @objc
    open convenience init(index: Int) { self.init() } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}}
}

public extension ValidOpenExtension { 
    open func objcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
    open var objcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
}

class InvalidOpenExtensionClass { }

open extension InvalidOpenExtensionClass {  // expected-error {{extensions cannot be declared 'open'; declare individual members as 'open' instead}} {{1-6=}} {{+2:9-9=open }} {{+3:3-3=public }} {{+5:9-9=open }} {{+6:3-3=public }}
  private func A() { } // OK
  @objc func B() { } // Insert open 
  func C() { } // Insert public
  @objc private var D: Int { 3 } // Okay
  @objc var E: Int { 3 } // Insert open
  var F: Int { 3 } // Insert public
  private var G: Int { 3 } // Okay
}

@objc
@objcMembers
class InvalidOpenExtensionObjcClass: NSObject { }

open extension InvalidOpenExtensionObjcClass {  // expected-error {{extensions cannot be declared 'open'; declare individual members as 'open' instead}} {{1-6=}} {{+2:9-9=open }} {{+3:3-3=open }} {{+5:9-9=open }} {{+6:3-3=open }}
  private func A() { } // OK
  @objc func B() { } // Insert open 
  func C() { } // Insert open
  @objc private var D: Int { 3 } // Okay
  @objc var E: Int { 3 } // Insert open
  var F: Int { 3 } // Insert open
  private var G: Int { 3 } // Okay
}