Concatenate annotations in type alias expansion.
This commit is contained in:
@@ -19,6 +19,8 @@ package org.jetbrains.kotlin.resolve
|
|||||||
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
|
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
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.resolve.scopes.MemberScope
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
import org.jetbrains.kotlin.types.typeUtil.containsTypeAliasParameters
|
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"
|
"Type alias expansion: result for ${typeAliasExpansion.descriptor} is ${expandedProjection.projectionKind}, should be invariant"
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (withAbbreviatedType) {
|
val expandedTypeWithExtraAnnotations = expandedType.replace(
|
||||||
val abbreviatedType = KotlinTypeFactory.simpleType(annotations,
|
newAnnotations = CompositeAnnotations(listOf(annotations, expandedType.annotations)))
|
||||||
typeAliasExpansion.descriptor.typeConstructor,
|
|
||||||
typeAliasExpansion.arguments,
|
|
||||||
originalProjection.type.isMarkedNullable,
|
|
||||||
MemberScope.Empty)
|
|
||||||
|
|
||||||
expandedType.withAbbreviation(abbreviatedType)
|
return if (withAbbreviatedType)
|
||||||
}
|
expandedTypeWithExtraAnnotations.withAbbreviation(typeAliasExpansion.createAbbreviation(originalProjection, annotations))
|
||||||
else {
|
else
|
||||||
expandedType
|
expandedTypeWithExtraAnnotations
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun TypeAliasExpansion.createAbbreviation(originalProjection: TypeProjection, annotations: Annotations) =
|
||||||
|
KotlinTypeFactory.simpleType(
|
||||||
|
annotations,
|
||||||
|
descriptor.typeConstructor,
|
||||||
|
arguments,
|
||||||
|
originalProjection.type.isMarkedNullable,
|
||||||
|
MemberScope.Empty
|
||||||
|
)
|
||||||
|
|
||||||
private fun expandTypeProjection(
|
private fun expandTypeProjection(
|
||||||
originalProjection: TypeProjection,
|
originalProjection: TypeProjection,
|
||||||
typeAliasExpansion: TypeAliasExpansion,
|
typeAliasExpansion: TypeAliasExpansion,
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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>
|
||||||
Vendored
+1
-1
@@ -2,7 +2,7 @@ package
|
|||||||
|
|
||||||
public val test1: java.lang.Runnable
|
public val test1: java.lang.Runnable
|
||||||
public val test2: java.util.Comparator<kotlin.String>
|
public val test2: java.util.Comparator<kotlin.String>
|
||||||
public val test3: ComparatorT<kotlin.String> /* = java.util.Comparator<kotlin.String> */
|
public val test3: java.util.Comparator<kotlin.String>
|
||||||
public typealias ComparatorStrT = ComparatorT<kotlin.String>
|
public typealias ComparatorStrT = ComparatorT<kotlin.String>
|
||||||
public typealias ComparatorT</*0*/ T> = java.util.Comparator<T>
|
public typealias ComparatorT</*0*/ T> = java.util.Comparator<T>
|
||||||
public typealias RunnableT = java.lang.Runnable
|
public typealias RunnableT = java.lang.Runnable
|
||||||
|
|||||||
@@ -20832,6 +20832,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("unsupportedTypeAlias.kt")
|
||||||
public void testUnsupportedTypeAlias() throws Exception {
|
public void testUnsupportedTypeAlias() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/unsupportedTypeAlias.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/unsupportedTypeAlias.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user