From 139e219ebd2c7269e255da9563e7f4cc1a1e1640 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 10 Jun 2016 12:42:11 +0300 Subject: [PATCH] Star projections in type alias expansions are substituted to star projections for corresponding type parameters in expanded type. Test that type alias arguments are substituted literally, and no type approximation is performed on substitution. --- .../jetbrains/kotlin/resolve/TypeAliasExpander.kt | 6 +++++- ...pproximationInTypeAliasArgumentSubstitution.kt | 15 +++++++++++---- ...proximationInTypeAliasArgumentSubstitution.txt | 7 +++++-- .../starProjectionInTypeAliasArgument.kt | 6 ++++++ .../starProjectionInTypeAliasArgument.txt | 14 ++++++++++++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ 6 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt index 54037ed2d90..74bb482094e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeAliasExpander.kt @@ -103,6 +103,10 @@ class TypeAliasExpander( argumentVariance } + if (typeAliasArgument.isStarProjection) { + return TypeUtils.makeStarProjection(typeParameterDescriptor!!) + } + val substitutedType = TypeUtils.makeNullableIfNeeded(typeAliasArgument.type, originalType.isMarkedNullable) return TypeProjectionImpl(substitutedVariance, substitutedType) @@ -165,7 +169,7 @@ class TypeAliasExpander( val typeSubstitutor = TypeSubstitutor.create(substitutedType) substitutedType.arguments.forEachIndexed { i, substitutedArgument -> - if (!substitutedArgument.type.containsTypeAliasParameters()) { + if (!substitutedArgument.isStarProjection && !substitutedArgument.type.containsTypeAliasParameters()) { val unsubstitutedArgument = unsubstitutedType.arguments[i] val typeParameter = unsubstitutedType.constructor.parameters[i] DescriptorResolver.checkBoundsInTypeAlias(reportStrategy, unsubstitutedArgument.type, substitutedArgument.type, typeParameter, typeSubstitutor) diff --git a/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.kt b/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.kt index d312988285f..721f69ed1ec 100644 --- a/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.kt +++ b/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.kt @@ -1,7 +1,14 @@ typealias Array2D = Array> -fun foo(a: Array2D) = a +fun foo1(a: Array2D) = a -fun bar(a: Array2D) { - foo(a) -} \ No newline at end of file +fun bar1(a: Array2D) = + foo1( [= Array>]; Array2D [= Array>])!>a) + + +typealias TMap = Map + +fun foo2(m: TMap) = m + +fun bar2(m: TMap<*>) = + foo2(m) diff --git a/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.txt b/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.txt index cce939e20cc..61a00d8cb99 100644 --- a/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.txt +++ b/compiler/testData/diagnostics/tests/typealias/noApproximationInTypeAliasArgumentSubstitution.txt @@ -1,5 +1,8 @@ package public typealias Array2D = kotlin.Array> -public fun bar(/*0*/ a: Array2D [= kotlin.Array>]): kotlin.Unit -public fun foo(/*0*/ a: Array2D [= kotlin.Array>]): Array2D [= kotlin.Array>] +public typealias TMap = kotlin.collections.Map +public fun bar1(/*0*/ a: Array2D [= kotlin.Array>]): Array2D [= kotlin.Array>] +public fun bar2(/*0*/ m: TMap<*> [= kotlin.collections.Map<*, *>]): [ERROR : Error function type] +public fun foo1(/*0*/ a: Array2D [= kotlin.Array>]): Array2D [= kotlin.Array>] +public fun foo2(/*0*/ m: TMap [= kotlin.collections.Map]): TMap [= kotlin.collections.Map] diff --git a/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt b/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt new file mode 100644 index 00000000000..4f98fe9a121 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt @@ -0,0 +1,6 @@ +class NumCharSeq(val n: N, val m: M) + +typealias Test = NumCharSeq + +fun getN(t: Test<*, *>) = t.n +fun getM(t: Test<*, *>) = t.m diff --git a/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.txt b/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.txt new file mode 100644 index 00000000000..7683a5da480 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.txt @@ -0,0 +1,14 @@ +package + +public typealias Test = NumCharSeq +public fun getM(/*0*/ t: Test<*, *> [= NumCharSeq<*, *>]): kotlin.CharSequence +public fun getN(/*0*/ t: Test<*, *> [= NumCharSeq<*, *>]): kotlin.Number + +public final class NumCharSeq { + public constructor NumCharSeq(/*0*/ n: N, /*1*/ m: M) + public final val m: M + public final val n: N + 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 +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 9158f70b57b..ac292d24ce9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -19605,6 +19605,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("starProjectionInTypeAliasArgument.kt") + public void testStarProjectionInTypeAliasArgument() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/starProjectionInTypeAliasArgument.kt"); + doTest(fileName); + } + @TestMetadata("substitutionVariance.kt") public void testSubstitutionVariance() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/substitutionVariance.kt");