| // RUN_PIPELINE_TILL: CODEGEN | |
| // IGNORE_FIR_DIAGNOSTICS | |
| // ALLOW_KOTLIN_PACKAGE | |
| // FILE: kotlin.kt | |
| package kotlin.native | |
| @Target(AnnotationTarget.ANNOTATION_CLASS) | |
| @Retention(AnnotationRetention.BINARY) | |
| @MustBeDocumented | |
| annotation class HidesFromObjC | |
| @HidesFromObjC | |
| @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) | |
| @Retention(AnnotationRetention.BINARY) | |
| annotation class HiddenFromObjC | |
| @Target(AnnotationTarget.ANNOTATION_CLASS) | |
| @Retention(AnnotationRetention.BINARY) | |
| annotation class RefinesInSwift | |
| @RefinesInSwift | |
| @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION) | |
| @Retention(AnnotationRetention.BINARY) | |
| public annotation class ShouldRefineInSwift | |
| <!INVALID_REFINES_IN_SWIFT_TARGETS!>@RefinesInSwift<!> | |
| @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) | |
| @Retention(AnnotationRetention.BINARY) | |
| public annotation class WrongShouldRefineInSwift | |
| // FILE: plugin.kt | |
| package plugin | |
| @HidesFromObjC | |
| @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) | |
| @Retention(AnnotationRetention.BINARY) | |
| annotation class PluginHiddenFromObjC | |
| @RefinesInSwift | |
| @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION) | |
| @Retention(AnnotationRetention.BINARY) | |
| annotation class PluginShouldRefineInSwift | |
| // FILE: test.kt | |
| import plugin.PluginHiddenFromObjC | |
| import plugin.PluginShouldRefineInSwift | |
| @HidesFromObjC | |
| <!REDUNDANT_SWIFT_REFINEMENT!>@RefinesInSwift<!> | |
| @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION) | |
| @Retention(AnnotationRetention.BINARY) | |
| annotation class MyRefinedAnnotationA | |
| <!INVALID_OBJC_HIDES_TARGETS!>@HidesFromObjC<!> | |
| @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FILE) | |
| @Retention(AnnotationRetention.BINARY) | |
| annotation class MyRefinedAnnotationB | |
| <!INVALID_REFINES_IN_SWIFT_TARGETS!>@RefinesInSwift<!> | |
| @Retention(AnnotationRetention.BINARY) | |
| annotation class MyRefinedAnnotationC | |
| @RefinesInSwift | |
| @Target(AnnotationTarget.PROPERTY) | |
| @Retention(AnnotationRetention.BINARY) | |
| annotation class MyRefinedAnnotationD | |
| typealias HFOC = HiddenFromObjC | |
| @HFOC | |
| <!REDUNDANT_SWIFT_REFINEMENT!>@ShouldRefineInSwift<!> | |
| var refinedProperty: Int = 0 | |
| @PluginHiddenFromObjC | |
| <!REDUNDANT_SWIFT_REFINEMENT!>@PluginShouldRefineInSwift<!> | |
| fun pluginRefinedFunction() { } | |
| @HiddenFromObjC | |
| @PluginHiddenFromObjC | |
| fun multipleObjCRefinementsFunction() { } | |
| @ShouldRefineInSwift | |
| @PluginShouldRefineInSwift | |
| fun multipleSwiftRefinementsFunction() { } | |
| @HiddenFromObjC | |
| @PluginHiddenFromObjC | |
| <!REDUNDANT_SWIFT_REFINEMENT!>@ShouldRefineInSwift<!> | |
| <!REDUNDANT_SWIFT_REFINEMENT!>@PluginShouldRefineInSwift<!> | |
| fun multipleMixedRefinementsFunction() { } | |
| interface InterfaceA { | |
| val barA: Int | |
| val barB: Int | |
| fun fooA() | |
| @HiddenFromObjC | |
| fun fooB() | |
| } | |
| interface InterfaceB { | |
| val barA: Int | |
| @ShouldRefineInSwift | |
| val barB: Int | |
| @HFOC | |
| fun fooA() | |
| @HiddenFromObjC | |
| fun fooB() | |
| } | |
| open class ClassA: InterfaceA, InterfaceB { | |
| <!INCOMPATIBLE_OBJC_REFINEMENT_OVERRIDE!>@HiddenFromObjC<!> | |
| override val barA: Int = 0 | |
| <!INCOMPATIBLE_OBJC_REFINEMENT_OVERRIDE!>@ShouldRefineInSwift<!> | |
| override val barB: Int = 0 | |
| <!INCOMPATIBLE_OBJC_REFINEMENT_OVERRIDE!>override fun fooA() { }<!> | |
| override fun fooB() { } | |
| @HiddenFromObjC | |
| open fun fooC() { } | |
| } | |
| class ClassB: ClassA() { | |
| @HiddenFromObjC | |
| override fun fooB() { } | |
| <!INCOMPATIBLE_OBJC_REFINEMENT_OVERRIDE!>@ShouldRefineInSwift<!> | |
| override fun fooC() { } | |
| } | |
| open class Base { | |
| @HiddenFromObjC | |
| open fun foo() {} | |
| } | |
| interface I { | |
| fun foo() | |
| } | |
| <!INCOMPATIBLE_OBJC_REFINEMENT_OVERRIDE!>open class Derived : Base(), I<!> | |
| open class Derived2 : Derived() { | |
| override fun foo() {} | |
| } | |
| @HiddenFromObjC | |
| open class OpenHiddenClass | |
| <!SUBTYPE_OF_HIDDEN_FROM_OBJC!>class InheritsFromOpenHiddenClass : OpenHiddenClass()<!> | |
| @HiddenFromObjC | |
| interface HiddenInterface | |
| interface NotHiddenInterface | |
| <!SUBTYPE_OF_HIDDEN_FROM_OBJC!>class ImplementsHiddenInterface : NotHiddenInterface, HiddenInterface<!> | |
| <!SUBTYPE_OF_HIDDEN_FROM_OBJC!>class InheritsFromOpenHiddenClass2 : NotHiddenInterface, OpenHiddenClass()<!> | |
| @HiddenFromObjC | |
| class OuterHidden { | |
| class Nested { | |
| open class Nested | |
| } | |
| } | |
| <!SUBTYPE_OF_HIDDEN_FROM_OBJC!>class InheritsFromNested : OuterHidden.Nested.Nested()<!> | |
| private class PrivateInheritsFromNested : OuterHidden.Nested.Nested() | |
| internal class InternalInheritsFromNested : OuterHidden.Nested.Nested() | |
| fun produceInstanceOfHidden(): OuterHidden.Nested.Nested { | |
| return object : OuterHidden.Nested.Nested() {} | |
| } | |
| @HiddenFromObjC | |
| enum class MyHiddenEnum { | |
| A, | |
| B, | |
| C | |
| } | |
| @HiddenFromObjC | |
| object MyHiddenObject | |
| sealed class MySealedClass { | |
| @HiddenFromObjC | |
| class MyHiddenSealedVariant : MySealedClass() | |
| class MyPublicVariant : MySealedClass() | |
| } | |
| @HiddenFromObjC | |
| enum class MyHiddenNonTrivialEnum { | |
| A, | |
| B, | |
| C { | |
| override fun sayCheese(): String { | |
| return "Boo :(" | |
| } | |
| }; | |
| open fun sayCheese(): String { | |
| return "Cheese!" | |
| } | |
| } |