From d2d8f72ffc3860a77ad38eda551c6a2f188679d0 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 10 Oct 2016 16:02:17 +0300 Subject: [PATCH] Annotations on type aliases: typealias is not a "default target". Add diagnostic test for annotations on type aliases. --- .../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 ++-- .../typealias/annotationsOnTypeAliases.kt | 15 ++++++++++++ .../typealias/annotationsOnTypeAliases.txt | 23 +++++++++++++++++++ .../compiledKotlin/typealias/Annotations.kt | 1 + .../compiledKotlin/typealias/Annotations.txt | 2 +- .../checkers/DiagnosticsTestGenerated.java | 6 +++++ .../descriptors/annotations/KotlinTarget.kt | 2 +- .../decompiledText/TypeAliases/TypeAliases.kt | 3 +++ .../stubBuilder/TypeAliases/TypeAliases.kt | 3 +++ .../reference-public-api/kotlin-runtime.txt | 1 + 13 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.txt diff --git a/compiler/testData/builtin-classes/default/kotlin.txt b/compiler/testData/builtin-classes/default/kotlin.txt index c6978873751..17ca987216e 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}) @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 @@ -673,7 +673,7 @@ public final class String : kotlin.Comparable, kotlin.CharSequenc } } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.EXPRESSION, AnnotationTarget.FILE}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Suppress : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.EXPRESSION, AnnotationTarget.FILE, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Suppress : kotlin.Annotation { /*primary*/ public constructor Suppress(/*0*/ vararg names: kotlin.String /*kotlin.Array*/) public final val names: kotlin.Array public final fun (): kotlin.Array diff --git a/compiler/testData/builtin-classes/java6/kotlin.txt b/compiler/testData/builtin-classes/java6/kotlin.txt index cb70c0b05a4..11d20ac96c6 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}) @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 @@ -677,7 +677,7 @@ public final class String : kotlin.Comparable, kotlin.CharSequenc } } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.EXPRESSION, AnnotationTarget.FILE}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Suppress : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.EXPRESSION, AnnotationTarget.FILE, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Suppress : kotlin.Annotation { /*primary*/ public constructor Suppress(/*0*/ vararg names: kotlin.String /*kotlin.Array*/) public final val names: kotlin.Array public final fun (): kotlin.Array diff --git a/compiler/testData/builtin-classes/java8/kotlin.txt b/compiler/testData/builtin-classes/java8/kotlin.txt index b3b3c1570f4..00eeb7ed741 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}) @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 @@ -681,7 +681,7 @@ public final class String : kotlin.Comparable, kotlin.CharSequenc } } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.EXPRESSION, AnnotationTarget.FILE}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Suppress : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.EXPRESSION, AnnotationTarget.FILE, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Suppress : kotlin.Annotation { /*primary*/ public constructor Suppress(/*0*/ vararg names: kotlin.String /*kotlin.Array*/) public final val names: kotlin.Array public final fun (): kotlin.Array diff --git a/compiler/testData/builtin-classes/newMethods/kotlin.txt b/compiler/testData/builtin-classes/newMethods/kotlin.txt index f2e71b6f79a..6a2ffa7dbc5 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}) @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 @@ -677,7 +677,7 @@ public final class String : kotlin.Comparable, kotlin.CharSequenc } } -@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.EXPRESSION, AnnotationTarget.FILE}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Suppress : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.EXPRESSION, AnnotationTarget.FILE, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Suppress : kotlin.Annotation { /*primary*/ public constructor Suppress(/*0*/ vararg names: kotlin.String /*kotlin.Array*/) public final val names: kotlin.Array public final fun (): kotlin.Array diff --git a/compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.kt b/compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.kt new file mode 100644 index 00000000000..18ef6876c85 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.kt @@ -0,0 +1,15 @@ +// WITH_RUNTIME +import kotlin.annotation.AnnotationTarget.* + +annotation class NoTarget + +@Target(CLASS) +annotation class IrrelevantTarget + +@Target(TYPEALIAS) +annotation class TypealiasTarget + +@NoTarget +@IrrelevantTarget +@TypealiasTarget +typealias Test = String \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.txt b/compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.txt new file mode 100644 index 00000000000..cb9181a4716 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.txt @@ -0,0 +1,23 @@ +package + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) public final annotation class IrrelevantTarget : kotlin.Annotation { + public constructor IrrelevantTarget() + 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 annotation class NoTarget : kotlin.Annotation { + public constructor NoTarget() + 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.annotation.Target(allowedTargets = {AnnotationTarget.TYPEALIAS}) public final annotation class TypealiasTarget : kotlin.Annotation { + public constructor TypealiasTarget() + 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 +} +@NoTarget() @IrrelevantTarget() @TypealiasTarget() public typealias Test = kotlin.String diff --git a/compiler/testData/loadJava/compiledKotlin/typealias/Annotations.kt b/compiler/testData/loadJava/compiledKotlin/typealias/Annotations.kt index 44369ce5fc1..3b74a0843c0 100644 --- a/compiler/testData/loadJava/compiledKotlin/typealias/Annotations.kt +++ b/compiler/testData/loadJava/compiledKotlin/typealias/Annotations.kt @@ -1,6 +1,7 @@ //ALLOW_AST_ACCESS package test +@Target(AnnotationTarget.TYPEALIAS) annotation class Ann(val value: String = "") @Ann() diff --git a/compiler/testData/loadJava/compiledKotlin/typealias/Annotations.txt b/compiler/testData/loadJava/compiledKotlin/typealias/Annotations.txt index faee360d600..e989be45cef 100644 --- a/compiler/testData/loadJava/compiledKotlin/typealias/Annotations.txt +++ b/compiler/testData/loadJava/compiledKotlin/typealias/Annotations.txt @@ -1,6 +1,6 @@ package test -public final annotation class Ann : kotlin.Annotation { +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPEALIAS}) public final annotation class Ann : kotlin.Annotation { /*primary*/ public constructor Ann(/*0*/ value: kotlin.String = ...) public final val value: kotlin.String public final fun (): kotlin.String diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 488df021592..f3639cad18e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -20520,6 +20520,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/typealias"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("annotationsOnTypeAliases.kt") + public void testAnnotationsOnTypeAliases() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/annotationsOnTypeAliases.kt"); + doTest(fileName); + } + @TestMetadata("boundViolationInTypeAliasConstructor.kt") public void testBoundViolationInTypeAliasConstructor() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/boundViolationInTypeAliasConstructor.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt index 81930c58e66..8b96851a6dd 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt @@ -38,7 +38,7 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true) TYPE("type usage", false), EXPRESSION("expression", false), // includes FUNCTION_LITERAL, OBJECT_LITERAL FILE("file", false), - TYPEALIAS("typealias"), // TODO support typealias as annotation target + TYPEALIAS("typealias", false), TYPE_PROJECTION("type projection", false), STAR_PROJECTION("star projection", false), diff --git a/idea/testData/decompiler/decompiledText/TypeAliases/TypeAliases.kt b/idea/testData/decompiler/decompiledText/TypeAliases/TypeAliases.kt index 2d5233e8db7..2546636433b 100644 --- a/idea/testData/decompiler/decompiledText/TypeAliases/TypeAliases.kt +++ b/idea/testData/decompiler/decompiledText/TypeAliases/TypeAliases.kt @@ -1,6 +1,7 @@ package test import dependency.* +import kotlin.annotation.AnnotationTarget class Outer { inner class Inner { @@ -8,7 +9,9 @@ class Outer { } } +@Target(AnnotationTarget.TYPEALIAS) annotation class Ann(val value: String) + class TypeAliases { typealias B = (A) -> Unit diff --git a/idea/testData/decompiler/stubBuilder/TypeAliases/TypeAliases.kt b/idea/testData/decompiler/stubBuilder/TypeAliases/TypeAliases.kt index eea088da381..3ea291bd022 100644 --- a/idea/testData/decompiler/stubBuilder/TypeAliases/TypeAliases.kt +++ b/idea/testData/decompiler/stubBuilder/TypeAliases/TypeAliases.kt @@ -1,6 +1,7 @@ package test import dependency.* +import kotlin.annotation.AnnotationTarget class Outer { inner class Inner { @@ -8,7 +9,9 @@ class Outer { } } +@Target(AnnotationTarget.TYPEALIAS) annotation class Ann + class TypeAliases { typealias B = (A) -> Unit diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt index c4a7feee235..9b861b5985c 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt @@ -88,6 +88,7 @@ public final class kotlin/annotation/AnnotationTarget : java/lang/Enum { public static final field PROPERTY_GETTER Lkotlin/annotation/AnnotationTarget; public static final field PROPERTY_SETTER Lkotlin/annotation/AnnotationTarget; public static final field TYPE Lkotlin/annotation/AnnotationTarget; + public static final field TYPEALIAS Lkotlin/annotation/AnnotationTarget; public static final field TYPE_PARAMETER Lkotlin/annotation/AnnotationTarget; public static final field VALUE_PARAMETER Lkotlin/annotation/AnnotationTarget; public static fun valueOf (Ljava/lang/String;)Lkotlin/annotation/AnnotationTarget;