From e7ca00d91bbbf88ed1ada40181e30b827d3973b0 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 12 Oct 2016 12:32:23 +0300 Subject: [PATCH] Support @SinceKotlin annotation for type aliases. --- .../kotlin/resolve/sinceKotlinUtil.kt | 21 ++++++++--- .../builtin-classes/default/kotlin.txt | 4 +- .../testData/builtin-classes/java6/kotlin.txt | 4 +- .../testData/builtin-classes/java8/kotlin.txt | 4 +- .../builtin-classes/newMethods/kotlin.txt | 4 +- .../apiVersion/typealiasesAsConstructors.kt | 20 ++++++++++ .../apiVersion/typealiasesAsConstructors.txt | 37 +++++++++++++++++++ .../apiVersion/typealiasesAsObjects.kt | 11 ++++++ .../apiVersion/typealiasesAsObjects.txt | 13 +++++++ .../apiVersion/typealiasesAsTypes.kt | 21 +++++++++++ .../apiVersion/typealiasesAsTypes.txt | 23 ++++++++++++ .../apiVersion/typealiasesOnImport.kt | 18 +++++++++ .../apiVersion/typealiasesOnImport.txt | 16 ++++++++ .../checkers/DiagnosticsTestGenerated.java | 24 ++++++++++++ core/builtins/src/kotlin/Annotations.kt | 2 +- 15 files changed, 208 insertions(+), 14 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.kt create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.txt create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.kt create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.txt create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.kt create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.txt create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.kt create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/sinceKotlinUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/sinceKotlinUtil.kt index 36ad1c1be0e..8c067b1a09e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/sinceKotlinUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/sinceKotlinUtil.kt @@ -18,12 +18,11 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.ConstructorDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForTypeAliasObject private val SINCE_KOTLIN_FQ_NAME = FqName("kotlin.SinceKotlin") @@ -70,5 +69,17 @@ private fun DeclarationDescriptor.getOwnSinceKotlinVersion(): ApiVersion? { val ctorClass = (this as? ConstructorDescriptor)?.containingDeclaration?.loadAnnotationValue() val property = (this as? PropertyAccessorDescriptor)?.correspondingProperty?.loadAnnotationValue() - return listOfNotNull(ownVersion, ctorClass, property).max() + val typeAliasDescriptor = (this as? TypeAliasDescriptor) ?: + (this as? TypeAliasConstructorDescriptor)?.typeAliasDescriptor ?: + (this as? FakeCallableDescriptorForTypeAliasObject)?.typeAliasDescriptor + + val typeAlias = typeAliasDescriptor?.loadAnnotationValue() + + // We should check only the upper-most classifier ('A' in 'A>') to guarantee binary compatibility. + val underlyingClass = typeAliasDescriptor?.classDescriptor?.loadAnnotationValue() + + val underlyingConstructor = (this as? TypeAliasConstructorDescriptor)?.underlyingConstructorDescriptor?.loadAnnotationValue() + val underlyingObject = (this as? FakeCallableDescriptorForTypeAliasObject)?.getReferencedObject()?.loadAnnotationValue() + + return listOfNotNull(ownVersion, ctorClass, property, typeAlias, underlyingClass, underlyingConstructor, underlyingObject).max() } diff --git a/compiler/testData/builtin-classes/default/kotlin.txt b/compiler/testData/builtin-classes/default/kotlin.txt index 17ca987216e..7c1d2dabaa4 100644 --- a/compiler/testData/builtin-classes/default/kotlin.txt +++ b/compiler/testData/builtin-classes/default/kotlin.txt @@ -185,7 +185,7 @@ public interface Comparable { public abstract operator fun compareTo(/*0*/ other: T): kotlin.Int } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented() public final annotation class Deprecated : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented public final annotation class Deprecated : kotlin.Annotation { /*primary*/ public constructor Deprecated(/*0*/ message: kotlin.String, /*1*/ replaceWith: kotlin.ReplaceWith = ..., /*2*/ level: kotlin.DeprecationLevel = ...) public final val level: kotlin.DeprecationLevel public final fun (): kotlin.DeprecationLevel @@ -653,7 +653,7 @@ public final class ShortArray : kotlin.Cloneable { public final operator fun set(/*0*/ index: kotlin.Int, /*1*/ value: kotlin.Short): kotlin.Unit } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation { /*primary*/ public constructor SinceKotlin(/*0*/ version: kotlin.String) public final val version: kotlin.String public final fun (): kotlin.String diff --git a/compiler/testData/builtin-classes/java6/kotlin.txt b/compiler/testData/builtin-classes/java6/kotlin.txt index 11d20ac96c6..cbc6258fb32 100644 --- a/compiler/testData/builtin-classes/java6/kotlin.txt +++ b/compiler/testData/builtin-classes/java6/kotlin.txt @@ -185,7 +185,7 @@ public interface Comparable { public abstract operator fun compareTo(/*0*/ other: T): kotlin.Int } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented() public final annotation class Deprecated : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented public final annotation class Deprecated : kotlin.Annotation { /*primary*/ public constructor Deprecated(/*0*/ message: kotlin.String, /*1*/ replaceWith: kotlin.ReplaceWith = ..., /*2*/ level: kotlin.DeprecationLevel = ...) public final val level: kotlin.DeprecationLevel public final fun (): kotlin.DeprecationLevel @@ -657,7 +657,7 @@ public final class ShortArray : kotlin.Cloneable, java.io.Serializable { public final operator fun set(/*0*/ index: kotlin.Int, /*1*/ value: kotlin.Short): kotlin.Unit } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation { /*primary*/ public constructor SinceKotlin(/*0*/ version: kotlin.String) public final val version: kotlin.String public final fun (): kotlin.String diff --git a/compiler/testData/builtin-classes/java8/kotlin.txt b/compiler/testData/builtin-classes/java8/kotlin.txt index 00eeb7ed741..8be3d90d895 100644 --- a/compiler/testData/builtin-classes/java8/kotlin.txt +++ b/compiler/testData/builtin-classes/java8/kotlin.txt @@ -187,7 +187,7 @@ public interface Comparable { public abstract operator fun compareTo(/*0*/ other: T): kotlin.Int } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented() public final annotation class Deprecated : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented public final annotation class Deprecated : kotlin.Annotation { /*primary*/ public constructor Deprecated(/*0*/ message: kotlin.String, /*1*/ replaceWith: kotlin.ReplaceWith = ..., /*2*/ level: kotlin.DeprecationLevel = ...) public final val level: kotlin.DeprecationLevel public final fun (): kotlin.DeprecationLevel @@ -659,7 +659,7 @@ public final class ShortArray : kotlin.Cloneable, java.io.Serializable { public final operator fun set(/*0*/ index: kotlin.Int, /*1*/ value: kotlin.Short): kotlin.Unit } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation { /*primary*/ public constructor SinceKotlin(/*0*/ version: kotlin.String) public final val version: kotlin.String public final fun (): kotlin.String diff --git a/compiler/testData/builtin-classes/newMethods/kotlin.txt b/compiler/testData/builtin-classes/newMethods/kotlin.txt index 6a2ffa7dbc5..93127b720d9 100644 --- a/compiler/testData/builtin-classes/newMethods/kotlin.txt +++ b/compiler/testData/builtin-classes/newMethods/kotlin.txt @@ -185,7 +185,7 @@ public interface Comparable { public abstract operator fun compareTo(/*0*/ other: T): kotlin.Int } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented() public final annotation class Deprecated : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented public final annotation class Deprecated : kotlin.Annotation { /*primary*/ public constructor Deprecated(/*0*/ message: kotlin.String, /*1*/ replaceWith: kotlin.ReplaceWith = ..., /*2*/ level: kotlin.DeprecationLevel = ...) public final val level: kotlin.DeprecationLevel public final fun (): kotlin.DeprecationLevel @@ -657,7 +657,7 @@ public final class ShortArray : kotlin.Cloneable, java.io.Serializable { public final operator fun set(/*0*/ index: kotlin.Int, /*1*/ value: kotlin.Short): kotlin.Unit } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation { /*primary*/ public constructor SinceKotlin(/*0*/ version: kotlin.String) public final val version: kotlin.String public final fun (): kotlin.String diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.kt new file mode 100644 index 00000000000..05e60f83797 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.kt @@ -0,0 +1,20 @@ +// !API_VERSION: 1.0 + +@SinceKotlin("1.1") +open class C1 + +typealias C1_Alias = C1 + +open class C2(val x: Int) { + @SinceKotlin("1.1") + constructor() : this(0) +} + +typealias C2_Alias = C2 + +val test1 = C1_Alias() +val test2 = C2_Alias() + +class Test3 : C1_Alias() + +class Test4 : C2_Alias() \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.txt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.txt new file mode 100644 index 00000000000..75131dd8b33 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.txt @@ -0,0 +1,37 @@ +package + +public val test1: [ERROR : Type for C1_Alias()] +public val test2: C2 + +@kotlin.SinceKotlin(version = "1.1") public open class C1 { + public constructor C1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class C2 { + @kotlin.SinceKotlin(version = "1.1") public constructor C2() + public constructor C2(/*0*/ x: kotlin.Int) + public final val x: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Test3 : C1_Alias /* = C1 */ { + public constructor Test3() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Test4 : C2_Alias /* = C2 */ { + public constructor Test4() + public final override /*1*/ /*fake_override*/ val x: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +public typealias C1_Alias = C1 +public typealias C2_Alias = C2 diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.kt new file mode 100644 index 00000000000..7923dff9417 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.kt @@ -0,0 +1,11 @@ +// !API_VERSION: 1.0 + +@SinceKotlin("1.1") +object Since_1_1 { + val x = 42 +} + +typealias Since_1_1_Alias = Since_1_1 + +val test1 = Since_1_1_Alias +val test2 = Since_1_1_Alias.x \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.txt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.txt new file mode 100644 index 00000000000..9cced66c220 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.txt @@ -0,0 +1,13 @@ +package + +public val test1: [ERROR : Type for Since_1_1_Alias] +public val test2: kotlin.Int = 42 + +@kotlin.SinceKotlin(version = "1.1") public object Since_1_1 { + private constructor Since_1_1() + public final val x: kotlin.Int = 42 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +public typealias Since_1_1_Alias = Since_1_1 diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.kt new file mode 100644 index 00000000000..e40de227ad3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.kt @@ -0,0 +1,21 @@ +// !API_VERSION: 1.0 + +@SinceKotlin("1.1") +class Since_1_1 + +class C + +typealias Since_1_1_Alias = Since_1_1 + +typealias L = List<Since_1_1> + +@SinceKotlin("1.1") +typealias C_1_1_Alias = C + +fun test1(x: Since_1_1_Alias) = x + +fun test2(x: C_1_1_Alias) = x + +fun test3(x: List<C_1_1_Alias>) = x + +fun test4(x: L) = x \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.txt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.txt new file mode 100644 index 00000000000..e471462b43f --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.txt @@ -0,0 +1,23 @@ +package + +public fun test1(/*0*/ x: Since_1_1_Alias /* = Since_1_1 */): Since_1_1_Alias /* = Since_1_1 */ +public fun test2(/*0*/ x: C_1_1_Alias /* = C */): C_1_1_Alias /* = C */ +public fun test3(/*0*/ x: kotlin.collections.List): kotlin.collections.List +public fun test4(/*0*/ x: L /* = kotlin.collections.List */): L /* = kotlin.collections.List */ + +public final class C { + public constructor C() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.SinceKotlin(version = "1.1") public final class Since_1_1 { + public constructor Since_1_1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +@kotlin.SinceKotlin(version = "1.1") public typealias C_1_1_Alias = C +public typealias L = kotlin.collections.List +public typealias Since_1_1_Alias = Since_1_1 diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.kt new file mode 100644 index 00000000000..4bc1376c96e --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.kt @@ -0,0 +1,18 @@ +// !API_VERSION: 1.0 + +// FILE: a.kt +package a + +@SinceKotlin("1.1") +class Since_1_1 + +typealias Since_1_1_Alias = Since_1_1 + +@SinceKotlin("1.1") +typealias Alias_1_1 = String + +// FILE: b.kt +package b + +import a.Since_1_1_Alias +import a.Alias_1_1 \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.txt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.txt new file mode 100644 index 00000000000..884d9d1ba83 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.txt @@ -0,0 +1,16 @@ +package + +package a { + + @kotlin.SinceKotlin(version = "1.1") public final class Since_1_1 { + public constructor Since_1_1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + @kotlin.SinceKotlin(version = "1.1") public typealias Alias_1_1 = kotlin.String + public typealias Since_1_1_Alias = a.Since_1_1 +} + +package b { +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 9415e593b84..07119e92a58 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -19573,6 +19573,30 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/sinceOldVersionIsOK.kt"); doTest(fileName); } + + @TestMetadata("typealiasesAsConstructors.kt") + public void testTypealiasesAsConstructors() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.kt"); + doTest(fileName); + } + + @TestMetadata("typealiasesAsObjects.kt") + public void testTypealiasesAsObjects() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.kt"); + doTest(fileName); + } + + @TestMetadata("typealiasesAsTypes.kt") + public void testTypealiasesAsTypes() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.kt"); + doTest(fileName); + } + + @TestMetadata("typealiasesOnImport.kt") + public void testTypealiasesOnImport() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/noBoundCallableReferences") diff --git a/core/builtins/src/kotlin/Annotations.kt b/core/builtins/src/kotlin/Annotations.kt index f074b834c3a..29ea37a8723 100644 --- a/core/builtins/src/kotlin/Annotations.kt +++ b/core/builtins/src/kotlin/Annotations.kt @@ -103,7 +103,7 @@ public annotation class UnsafeVariance * @property version the version in the following formats: `.` or `..`, where major, minor and patch * are non-negative integer numbers without leading zeros. */ -@Target(CLASS, PROPERTY, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER) +@Target(CLASS, PROPERTY, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, TYPEALIAS) @Retention(AnnotationRetention.BINARY) @MustBeDocumented public annotation class SinceKotlin(val version: String)