From 5d34f5fb75349c5782280007b64bccd06bf67a88 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 14 Sep 2016 12:11:22 +0300 Subject: [PATCH] KT-13836: fix generation of FQN of secondary constructor when it's called via typealias. Fix #KT-13836 --- .../box/typealias/typeAliasObjectCallable.kt | 9 +++++++++ .../typealias/typeAliasSecondaryConstructor.kt | 11 +++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 12 ++++++++++++ .../semantics/TypeAliasesTestsGenerated.java | 12 ++++++++++++ .../js/translate/context/StaticContext.java | 16 ++++++++++++++++ 5 files changed, 60 insertions(+) create mode 100644 compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt create mode 100644 compiler/testData/codegen/box/typealias/typeAliasSecondaryConstructor.kt diff --git a/compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt b/compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt new file mode 100644 index 00000000000..5a321ecd586 --- /dev/null +++ b/compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt @@ -0,0 +1,9 @@ +object O { + val x = "OK" + + operator fun invoke() = x +} + +typealias A = O + +fun box(): String = A() diff --git a/compiler/testData/codegen/box/typealias/typeAliasSecondaryConstructor.kt b/compiler/testData/codegen/box/typealias/typeAliasSecondaryConstructor.kt new file mode 100644 index 00000000000..fd0f2bd66c9 --- /dev/null +++ b/compiler/testData/codegen/box/typealias/typeAliasSecondaryConstructor.kt @@ -0,0 +1,11 @@ +class C(val x: String) { + constructor(n: Int) : this(n.toString()) +} + +typealias Alias = C + +fun box(): String { + val c = Alias(23) + if (c.x != "23") return "fail: $c" + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 3902b4b94a5..7d458c725dc 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -15603,6 +15603,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt"); doTest(fileName); } + + @TestMetadata("typeAliasObjectCallable.kt") + public void testTypeAliasObjectCallable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt"); + doTest(fileName); + } + + @TestMetadata("typeAliasSecondaryConstructor.kt") + public void testTypeAliasSecondaryConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasSecondaryConstructor.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/box/unaryOp") 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 5a8816c60f0..6242d7cd0db 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 @@ -76,4 +76,16 @@ public class TypeAliasesTestsGenerated extends AbstractTypeAliasesTests { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt"); doTest(fileName); } + + @TestMetadata("typeAliasObjectCallable.kt") + public void testTypeAliasObjectCallable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt"); + doTest(fileName); + } + + @TestMetadata("typeAliasSecondaryConstructor.kt") + public void testTypeAliasSecondaryConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasSecondaryConstructor.kt"); + doTest(fileName); + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index bbaee73d734..ae64bd56e91 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.ReflectionTypes; import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor; import org.jetbrains.kotlin.js.config.JsConfig; import org.jetbrains.kotlin.js.config.LibrarySourcesConfig; import org.jetbrains.kotlin.js.translate.context.generator.Generator; @@ -266,6 +267,20 @@ public final class StaticContext { private final class NameGenerator extends Generator { public NameGenerator() { + Rule typeAliasConstructor = new Rule() { + @Nullable + @Override + public JsName apply(@NotNull DeclarationDescriptor descriptor) { + if (descriptor instanceof TypeAliasConstructorDescriptor) { + TypeAliasConstructorDescriptor constructorDescriptor = (TypeAliasConstructorDescriptor) descriptor; + return getNameForDescriptor(constructorDescriptor.getUnderlyingConstructorDescriptor()); + } + else { + return null; + } + } + }; + Rule namesForDynamic = new Rule() { @Override @Nullable @@ -422,6 +437,7 @@ public final class StaticContext { } }; + addRule(typeAliasConstructor); addRule(namesForDynamic); addRule(localClasses); addRule(namesForStandardClasses);