From df335b9e8d017bf1546e89c4199af1b38aa7c3a7 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 2 Jun 2016 14:12:10 +0300 Subject: [PATCH] Type aliases: do not reparse RHS of type alias declaration in expanded type resolution --- .../kotlin/resolve/DescriptorResolver.java | 4 +-- .../jetbrains/kotlin/resolve/TypeResolver.kt | 27 ++++++++++++++----- .../testData/codegen/box/typealias/simple.kt | 6 +++-- .../boundsViolationInTypeAliasRHS.kt | 4 +-- .../typealias/functionTypeInTypeAlias.kt | 3 +++ .../typealias/functionTypeInTypeAlias.txt | 4 +++ .../diagnostics/tests/typealias/recursive.kt | 4 +-- .../tests/typealias/substitutionVariance.kt | 8 +++--- .../checkers/DiagnosticsTestGenerated.java | 6 +++++ .../impl/AbstractTypeAliasDescriptor.kt | 2 ++ 10 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 0ba74dbaa97..9bc61495924 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -735,9 +735,7 @@ public class DescriptorResolver { DeferredType.create(storageManager, trace, new Function0() { @Override public KotlinType invoke() { - // TODO do not reparse type alias RHS, just expand it instead - // NB this messes up with diagnostics - return typeResolver.resolveType(scopeWithTypeParameters, typeReference, trace, true); + return typeResolver.resolveExpandedTypeForTypeAlias(typeAliasDescriptor); } })); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 4c1f500c878..3569a4b799c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -71,6 +71,13 @@ class TypeResolver( return resolveType(TypeResolutionContext(scope, trace, checkBounds, false, typeReference.suppressDiagnosticsInDebugMode(), true), typeReference) } + fun resolveExpandedTypeForTypeAlias(typeAliasDescriptor: TypeAliasDescriptor): KotlinType { + val typeAliasExpansion = createTypeAliasExpansion(null, typeAliasDescriptor, emptyList()) + val expandedType = expandTypeAlias(typeAliasExpansion, TypeAliasExpansionReportStrategy.DEFAULT, Annotations.EMPTY, 0, + withAbbreviatedType = false) + return expandedType + } + private fun resolveType(c: TypeResolutionContext, typeReference: KtTypeReference): KotlinType { assert(!c.allowBareTypes) { "Use resolvePossiblyBareType() when bare types are allowed" } return resolvePossiblyBareType(c, typeReference).getActualType() @@ -550,7 +557,8 @@ class TypeResolver( typeAliasExpansion: TypeAliasExpansion, reportStrategy: TypeAliasExpansionReportStrategy, annotations: Annotations, - recursionDepth: Int + recursionDepth: Int, + withAbbreviatedType: Boolean = true ): KotlinType { val originalProjection = TypeProjectionImpl(Variance.INVARIANT, typeAliasExpansion.descriptor.underlyingType) val expandedProjection = expandTypeProjectionForTypeAlias(originalProjection, typeAliasExpansion, null, reportStrategy, recursionDepth) @@ -562,13 +570,18 @@ class TypeResolver( "Type alias expansion: result for ${typeAliasExpansion.descriptor} is ${expandedProjection.projectionKind}, should be invariant" } - val abbreviatedType = KotlinTypeImpl.create(annotations, - typeAliasExpansion.descriptor.typeConstructor, - originalProjection.type.isMarkedNullable, - typeAliasExpansion.arguments, - MemberScope.Empty) + return if (withAbbreviatedType) { + val abbreviatedType = KotlinTypeImpl.create(annotations, + typeAliasExpansion.descriptor.typeConstructor, + originalProjection.type.isMarkedNullable, + typeAliasExpansion.arguments, + MemberScope.Empty) - return expandedType.withAbbreviatedType(abbreviatedType) + expandedType.withAbbreviatedType(abbreviatedType) + } + else { + expandedType + } } private fun expandTypeProjectionForTypeAlias( diff --git a/compiler/testData/codegen/box/typealias/simple.kt b/compiler/testData/codegen/box/typealias/simple.kt index 4eb3d1b3745..a5cd67b9ad7 100644 --- a/compiler/testData/codegen/box/typealias/simple.kt +++ b/compiler/testData/codegen/box/typealias/simple.kt @@ -1,5 +1,7 @@ typealias S = String -val OK: S = "OK" +typealias SF = (T) -> S -fun box(): S = OK +val f: SF = { it } + +fun box(): S = f("OK") diff --git a/compiler/testData/diagnostics/tests/typealias/boundsViolationInTypeAliasRHS.kt b/compiler/testData/diagnostics/tests/typealias/boundsViolationInTypeAliasRHS.kt index cf871ebee3a..af9f7335965 100644 --- a/compiler/testData/diagnostics/tests/typealias/boundsViolationInTypeAliasRHS.kt +++ b/compiler/testData/diagnostics/tests/typealias/boundsViolationInTypeAliasRHS.kt @@ -2,8 +2,8 @@ class TColl> -typealias TCErr = TCollAny> -typealias TCErr2 = TCErr +typealias TCErr = TCollAny> +typealias TCErr2 = TCErr fun testType1(x: TCErr) {} val testCtor1 = TCErr() diff --git a/compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.kt b/compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.kt new file mode 100644 index 00000000000..d1b1e45332e --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.kt @@ -0,0 +1,3 @@ +val f: () -> Unit = {} + +typealias F = () -> Unit diff --git a/compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.txt b/compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.txt new file mode 100644 index 00000000000..1720e7d8855 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.txt @@ -0,0 +1,4 @@ +package + +public typealias F = () -> kotlin.Unit +public val f: () -> kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/typealias/recursive.kt b/compiler/testData/diagnostics/tests/typealias/recursive.kt index 97ea09f10ee..d64150b2e15 100644 --- a/compiler/testData/diagnostics/tests/typealias/recursive.kt +++ b/compiler/testData/diagnostics/tests/typealias/recursive.kt @@ -1,4 +1,4 @@ -typealias A = B -typealias B = A +typealias A = B +typealias B = A val x: A = TODO() \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/substitutionVariance.kt b/compiler/testData/diagnostics/tests/typealias/substitutionVariance.kt index be2cbc6fc13..1b355a97f89 100644 --- a/compiler/testData/diagnostics/tests/typealias/substitutionVariance.kt +++ b/compiler/testData/diagnostics/tests/typealias/substitutionVariance.kt @@ -3,13 +3,13 @@ class Out class Inv typealias In1 = In -typealias In2 = In<in T> -typealias In3 = In<out T> +typealias In2 = In<in T> +typealias In3 = In<out T> typealias In4 = In<*> typealias Out1 = Out -typealias Out2 = Out<in T> -typealias Out3 = Out<out T> +typealias Out2 = Out<in T> +typealias Out3 = Out<out T> typealias Out4 = Out<*> typealias Inv1 = Inv diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 637983fe3c2..4f1432df755 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -19296,6 +19296,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("functionTypeInTypeAlias.kt") + public void testFunctionTypeInTypeAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/functionTypeInTypeAlias.kt"); + doTest(fileName); + } + @TestMetadata("genericTypeAliasConstructor.kt") public void testGenericTypeAliasConstructor() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/genericTypeAliasConstructor.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt index a0bb04671bd..98153c39dee 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt @@ -88,6 +88,8 @@ abstract class AbstractTypeAliasDescriptor( override val annotations: Annotations get() = declarationDescriptor.annotations + + override fun toString(): String = "[typealias ${declarationDescriptor.name.asString()}]" } }