|
4 | 4 |
|
5 | 5 | import Foundation
|
6 | 6 |
|
| 7 | +open class InvalidOpenExtension { |
| 8 | + open func openMethod() { } // No warning: Pure Swift methods can be open inside the class declaration. |
| 9 | + open var openVar: Int { 3 } // No warning: Pure Swift properties can be open inside the class declaration. |
| 10 | +} |
| 11 | +extension InvalidOpenExtension { |
| 12 | + open func nonObjcOpenMethod() { } // expected-warning {{non-'@objc' instance method in extensions cannot be overridden; use 'public' instead}} {{3-7=public}} |
| 13 | + open class func nonObjcOpenMethod() { } // expected-warning {{non-'@objc' class method in extensions cannot be overridden; use 'public' instead}} {{3-7=public}} |
| 14 | + open var nonObjcOpenVar: Int { 3 } // expected-warning {{non-'@objc' property in extensions cannot be overridden; use 'public' instead}} {{3-7=public}} |
| 15 | + open subscript(_ index: Int) -> Int { 3 } // expected-warning {{non-'@objc' subscript in extensions cannot be overridden; use 'public' instead}} {{3-7=public}} |
| 16 | + 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}} |
| 17 | + |
| 18 | + @objc open func objcOpenMethod() { } // No warning: @objc methods can be open inside extensions. |
| 19 | + @objc open var objcOpenVar: Int { 3 } // No warning: @objc methods can be open inside extensions. |
| 20 | + |
| 21 | + open class nonObjcClassDecl { } |
| 22 | + open enum nonObjcEnumDecl { case one } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}} {{3-7=public}} |
| 23 | +} |
| 24 | + |
| 25 | +// For extensions with access level less than open, '`open` modifier conflicts with...' warning will always precede the 'non-@objc member...' warning. |
| 26 | +// For extensions with open access level, invalid open extension error will precede the 'non-@objc member...' warning. |
| 27 | +public extension InvalidOpenExtension { |
| 28 | + open func nonObjcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}} |
| 29 | + open var nonObjcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}} |
| 30 | + @objc open func objcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}} |
| 31 | + @objc open var objcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}} |
| 32 | +} |
| 33 | + |
| 34 | +@objcMembers |
| 35 | +open class ValidOpenExtension { } |
| 36 | +extension ValidOpenExtension { |
| 37 | + open func objcOpenMethod() { } // No warning: This declaration is implicitly @objc |
| 38 | + open class func objcOpenMethod() { } // No warning: This declaration is implicitly @objc |
| 39 | + open var objcOpenVar: Int { 3 } // No warning: This declaration is implicitly @objc |
| 40 | + open subscript(_ index: Int) -> Int { 3 } // No warning: This declaration is implicitly @objc |
| 41 | + open convenience init(index: Int) { self.init() } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}} |
| 42 | +} |
| 43 | + |
| 44 | +public extension ValidOpenExtension { |
| 45 | + open func objcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}} |
| 46 | + open var objcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}} |
| 47 | +} |
| 48 | + |
7 | 49 | class InvalidOpenExtensionClass { }
|
8 | 50 |
|
9 | 51 | open extension InvalidOpenExtensionClass { // expected-error {{extensions cannot be declared 'open'; declare individual members as 'open' instead}} {{1-6=}} {{3-3=public }} {{9-9=open }} {{9-9=open }} {{3-3=public }}
|
|
0 commit comments