From c6350e1afbb7721a85688f6bceeb974aa3ea1a7d Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 11 Oct 2016 17:57:30 +0300 Subject: [PATCH] Concatenate annotations in type alias expansion. --- .../kotlin/resolve/TypeAliasExpander.kt | 28 +++++++++++-------- .../typealias/typealiasRhsAnnotations.kt | 21 ++++++++++++++ .../typealias/typealiasRhsAnnotations.txt | 26 +++++++++++++++++ .../typeAliasSamAdapterConstructors.txt | 2 +- .../checkers/DiagnosticsTestGenerated.java | 6 ++++ 5 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt index 4b5a1561434..0f097afeab8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl +import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.containsTypeAliasParameters @@ -49,20 +51,24 @@ class TypeAliasExpander( "Type alias expansion: result for ${typeAliasExpansion.descriptor} is ${expandedProjection.projectionKind}, should be invariant" } - return if (withAbbreviatedType) { - val abbreviatedType = KotlinTypeFactory.simpleType(annotations, - typeAliasExpansion.descriptor.typeConstructor, - typeAliasExpansion.arguments, - originalProjection.type.isMarkedNullable, - MemberScope.Empty) + val expandedTypeWithExtraAnnotations = expandedType.replace( + newAnnotations = CompositeAnnotations(listOf(annotations, expandedType.annotations))) - expandedType.withAbbreviation(abbreviatedType) - } - else { - expandedType - } + return if (withAbbreviatedType) + expandedTypeWithExtraAnnotations.withAbbreviation(typeAliasExpansion.createAbbreviation(originalProjection, annotations)) + else + expandedTypeWithExtraAnnotations } + private fun TypeAliasExpansion.createAbbreviation(originalProjection: TypeProjection, annotations: Annotations) = + KotlinTypeFactory.simpleType( + annotations, + descriptor.typeConstructor, + arguments, + originalProjection.type.isMarkedNullable, + MemberScope.Empty + ) + private fun expandTypeProjection( originalProjection: TypeProjection, typeAliasExpansion: TypeAliasExpansion, diff --git a/compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.kt b/compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.kt new file mode 100644 index 00000000000..abafc6009b9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.kt @@ -0,0 +1,21 @@ +@Target(AnnotationTarget.TYPE) +annotation class Ann1 + +@Target(AnnotationTarget.TYPE) +annotation class Ann2 + +typealias Alias1 = @Ann1 String +typealias Alias2 = @Ann2 Alias1 +fun test1(a: Alias2) = a + +// NB @ExtensionFunctionType on non-functional type is not an error +typealias Alias3 = @ExtensionFunctionType Alias1 +fun test2(a: Alias3) = a + +typealias LA1 = List<@Ann2 Alias1> +fun test3(la1: LA1) = la1 + +// see KT-14318 +typealias AliasRepeated = @Ann1 Alias1 +fun test4(a: AliasRepeated) = a +fun test4a(a: @Ann1 Alias1) = a \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.txt b/compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.txt new file mode 100644 index 00000000000..9e3cc5cec2e --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.txt @@ -0,0 +1,26 @@ +package + +public fun test1(/*0*/ a: Alias2 /* = @Ann2 @Ann1 kotlin.String */): Alias2 /* = @Ann2 @Ann1 kotlin.String */ +public fun test2(/*0*/ a: Alias3 /* = @kotlin.ExtensionFunctionType @Ann1 kotlin.String */): Alias3 /* = @kotlin.ExtensionFunctionType @Ann1 kotlin.String */ +public fun test3(/*0*/ la1: LA1 /* = kotlin.collections.List<@Ann2 Alias1 /* = @Ann2 @Ann1 kotlin.String */> */): LA1 /* = kotlin.collections.List<@Ann2 Alias1 /* = @Ann2 @Ann1 kotlin.String */> */ +public fun test4(/*0*/ a: AliasRepeated /* = @Ann1 @Ann1 kotlin.String */): AliasRepeated /* = @Ann1 @Ann1 kotlin.String */ +public fun test4a(/*0*/ a: @Ann1 Alias1 /* = @Ann1 @Ann1 kotlin.String */): @Ann1 Alias1 /* = @Ann1 @Ann1 kotlin.String */ + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) public final annotation class Ann1 : kotlin.Annotation { + public constructor Ann1() + 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.TYPE}) public final annotation class Ann2 : kotlin.Annotation { + public constructor Ann2() + 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 Alias1 = @Ann1 kotlin.String +public typealias Alias2 = @Ann2 Alias1 +public typealias Alias3 = @kotlin.ExtensionFunctionType Alias1 +public typealias AliasRepeated = @Ann1 Alias1 +public typealias LA1 = kotlin.collections.List<@Ann2 Alias1> diff --git a/compiler/testData/diagnostics/testsWithStdLib/typealias/typeAliasSamAdapterConstructors.txt b/compiler/testData/diagnostics/testsWithStdLib/typealias/typeAliasSamAdapterConstructors.txt index 9526c3fc591..aa663b5d34c 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/typealias/typeAliasSamAdapterConstructors.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/typealias/typeAliasSamAdapterConstructors.txt @@ -2,7 +2,7 @@ package public val test1: java.lang.Runnable public val test2: java.util.Comparator -public val test3: ComparatorT /* = java.util.Comparator */ +public val test3: java.util.Comparator public typealias ComparatorStrT = ComparatorT public typealias ComparatorT = java.util.Comparator public typealias RunnableT = java.lang.Runnable diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index b92218793ed..488df021592 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -20832,6 +20832,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("typealiasRhsAnnotations.kt") + public void testTypealiasRhsAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typealiasRhsAnnotations.kt"); + doTest(fileName); + } + @TestMetadata("unsupportedTypeAlias.kt") public void testUnsupportedTypeAlias() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/unsupportedTypeAlias.kt");