From c41ec1ddfbdd75bf8a02b4fbc4cb311ddfdf8f67 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 18 Oct 2016 16:07:30 +0300 Subject: [PATCH] KT-14400: Properly handle TypeAliasConstructorDescriptor in KotlinTypeMapper.mapToCallableMethod(...) Implement getDefaultType() in TypeAliasDescriptor subclasses. --- .../kotlin/codegen/state/KotlinTypeMapper.java | 8 ++++++-- .../lazy/descriptors/LazyTypeAliasDescriptor.kt | 3 +++ .../box/typealias/typeAliasInAnonymousObjectType.kt | 7 +++++++ .../tests/typealias/typeAliasInAnonymousObjectType.kt | 5 +++++ .../typealias/typeAliasInAnonymousObjectType.txt | 11 +++++++++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../descriptors/impl/AbstractTypeAliasDescriptor.kt | 8 +++++--- .../serialization/deserialization/NotFoundClasses.kt | 2 ++ .../descriptors/DeserializedMemberDescriptor.kt | 5 +++++ .../js/test/semantics/TypeAliasesTestsGenerated.java | 6 ++++++ 12 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index e6cd4de4dd8..8cca0abad2d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -639,9 +639,13 @@ public class KotlinTypeMapper { @NotNull public CallableMethod mapToCallableMethod(@NotNull FunctionDescriptor descriptor, boolean superCall) { - if (descriptor instanceof ConstructorDescriptor) { + if (descriptor instanceof TypeAliasConstructorDescriptor) { + return mapToCallableMethod(((TypeAliasConstructorDescriptor) descriptor).getUnderlyingConstructorDescriptor(), superCall); + } + + if (descriptor instanceof ClassConstructorDescriptor) { JvmMethodSignature method = mapSignatureSkipGeneric(descriptor); - Type owner = mapClass(((ConstructorDescriptor) descriptor).getContainingDeclaration()); + Type owner = mapClass(((ClassConstructorDescriptor) descriptor).getContainingDeclaration()); String defaultImplDesc = mapDefaultMethod(descriptor, OwnerKind.IMPLEMENTATION).getDescriptor(); return new CallableMethod(owner, owner, defaultImplDesc, method, INVOKESPECIAL, null, null, null); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyTypeAliasDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyTypeAliasDescriptor.kt index 2098f188997..f4716156ab0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyTypeAliasDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyTypeAliasDescriptor.kt @@ -41,9 +41,11 @@ class LazyTypeAliasDescriptor( private lateinit var underlyingTypeImpl: NotNullLazyValue private lateinit var expandedTypeImpl: NotNullLazyValue + private lateinit var defaultTypeImpl: NotNullLazyValue override val underlyingType: SimpleType get() = underlyingTypeImpl() override val expandedType: SimpleType get() = expandedTypeImpl() + override fun getDefaultType(): SimpleType = defaultTypeImpl() fun initialize( declaredTypeParameters: List, @@ -53,6 +55,7 @@ class LazyTypeAliasDescriptor( super.initialize(declaredTypeParameters) this.underlyingTypeImpl = lazyUnderlyingType this.expandedTypeImpl = lazyExpandedType + this.defaultTypeImpl = storageManager.createLazyValue { computeDefaultType() } } private val lazyTypeConstructorParameters = diff --git a/compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt b/compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt new file mode 100644 index 00000000000..ba3a87abaec --- /dev/null +++ b/compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt @@ -0,0 +1,7 @@ +open class Foo(val x: T) + +typealias FooStr = Foo + +val test = object : FooStr("OK") {} + +fun box() = test.x \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.kt new file mode 100644 index 00000000000..7567522a5b3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.kt @@ -0,0 +1,5 @@ +open class Foo + +typealias FooStr = Foo + +val test = object : FooStr() {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.txt b/compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.txt new file mode 100644 index 00000000000..77ee368d1db --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.txt @@ -0,0 +1,11 @@ +package + +public val test: FooStr /* = Foo */ + +public open class Foo { + public constructor Foo() + 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 FooStr = Foo diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index b40e9cdff8e..6c2a28d650d 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -15982,6 +15982,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("typeAliasInAnonymousObjectType.kt") + public void testTypeAliasInAnonymousObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt"); + doTest(fileName); + } + @TestMetadata("typeAliasObject.kt") public void testTypeAliasObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 78f75e20efa..ff96518c11f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -20862,6 +20862,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("typeAliasInAnonymousObjectType.kt") + public void testTypeAliasInAnonymousObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.kt"); + doTest(fileName); + } + @TestMetadata("typeAliasInvisibleObject.kt") public void testTypeAliasInvisibleObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasInvisibleObject.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 20809cae57a..d7ef0d53a4a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -15982,6 +15982,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("typeAliasInAnonymousObjectType.kt") + public void testTypeAliasInAnonymousObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt"); + doTest(fileName); + } + @TestMetadata("typeAliasObject.kt") public void testTypeAliasObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.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 f6c170ad346..b91460994af 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt @@ -21,9 +21,11 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns +import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.SimpleType import org.jetbrains.kotlin.types.TypeConstructor +import org.jetbrains.kotlin.types.TypeUtils abstract class AbstractTypeAliasDescriptor( containingDeclaration: DeclarationDescriptor, @@ -57,9 +59,6 @@ abstract class AbstractTypeAliasDescriptor( override fun getVisibility() = visibilityImpl - override fun getDefaultType(): SimpleType = - TODO("typealias getDefaultType") - override fun getTypeConstructor(): TypeConstructor = typeConstructor @@ -67,6 +66,9 @@ abstract class AbstractTypeAliasDescriptor( protected abstract fun getTypeConstructorTypeParameters(): List + protected fun computeDefaultType(): SimpleType = + TypeUtils.makeUnsubstitutedType(this, classDescriptor?.unsubstitutedMemberScope ?: MemberScope.Empty) + private val typeConstructor = object : TypeConstructor { override fun getDeclarationDescriptor(): TypeAliasDescriptor = this@AbstractTypeAliasDescriptor diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NotFoundClasses.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NotFoundClasses.kt index 9b24300e7e7..ac663161c18 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NotFoundClasses.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NotFoundClasses.kt @@ -133,6 +133,8 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo get() = builtIns.nullableAnyType override val expandedType: SimpleType get() = builtIns.nullableAnyType + override fun getDefaultType(): SimpleType = + builtIns.nullableAnyType override fun substitute(substitutor: TypeSubstitutor) = this diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt index ae7cf7e4e88..28284b9cc25 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt @@ -155,6 +155,7 @@ class DeserializedTypeAliasDescriptor( override lateinit var underlyingType: SimpleType private set override lateinit var expandedType: SimpleType private set private lateinit var typeConstructorParameters: List + private lateinit var defaultTypeImpl: SimpleType private set fun initialize( declaredTypeParameters: List, @@ -165,8 +166,12 @@ class DeserializedTypeAliasDescriptor( this.underlyingType = underlyingType this.expandedType = expandedType typeConstructorParameters = computeConstructorTypeParameters() + defaultTypeImpl = computeDefaultType() } + override fun getDefaultType(): SimpleType = + defaultTypeImpl + override fun substitute(substitutor: TypeSubstitutor): TypeAliasDescriptor { if (substitutor.isEmpty) return this val substituted = DeserializedTypeAliasDescriptor(containingDeclaration, annotations, name, visibility, proto, nameResolver, typeTable, containerSource) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/TypeAliasesTestsGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/TypeAliasesTestsGenerated.java index 629635e7ccc..59a0859f750 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/TypeAliasesTestsGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/TypeAliasesTestsGenerated.java @@ -77,6 +77,12 @@ public class TypeAliasesTestsGenerated extends AbstractTypeAliasesTests { doTest(fileName); } + @TestMetadata("typeAliasInAnonymousObjectType.kt") + public void testTypeAliasInAnonymousObjectType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt"); + doTest(fileName); + } + @TestMetadata("typeAliasObject.kt") public void testTypeAliasObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");