From f2b8569b4be1690b7c412a31883582e35881d01c Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 6 Sep 2016 13:03:51 +0300 Subject: [PATCH] KT-13735 NoSuchMethodError for generic typealias acces Use underlying constructor descriptor for type alias constructor code generation. --- .../jetbrains/kotlin/codegen/ExpressionCodegen.java | 4 ++++ .../box/typealias/genericTypeAliasConstructor.kt | 6 ++++++ .../box/typealias/typeAliasConstructorAccessor.kt | 10 ++++++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 12 ++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 compiler/testData/codegen/box/typealias/genericTypeAliasConstructor.kt create mode 100644 compiler/testData/codegen/box/typealias/typeAliasConstructorAccessor.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 45a9f375801..7b23aa298a8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.coroutines.CoroutineUtilKt; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor; import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor; import org.jetbrains.kotlin.diagnostics.DiagnosticUtils; import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; @@ -2725,6 +2726,9 @@ public class ExpressionCodegen extends KtVisitor impleme @NotNull protected FunctionDescriptor accessibleFunctionDescriptor(@NotNull ResolvedCall resolvedCall) { FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor(); + if (descriptor instanceof TypeAliasConstructorDescriptor) { + descriptor = ((TypeAliasConstructorDescriptor) descriptor).getUnderlyingConstructorDescriptor(); + } FunctionDescriptor originalIfSamAdapter = SamCodegenUtil.getOriginalIfSamAdapter(descriptor); if (originalIfSamAdapter != null) { descriptor = originalIfSamAdapter; diff --git a/compiler/testData/codegen/box/typealias/genericTypeAliasConstructor.kt b/compiler/testData/codegen/box/typealias/genericTypeAliasConstructor.kt new file mode 100644 index 00000000000..6dfe839c270 --- /dev/null +++ b/compiler/testData/codegen/box/typealias/genericTypeAliasConstructor.kt @@ -0,0 +1,6 @@ +class Cell(val x: T) + +typealias StringCell = Cell + +fun box(): String = + StringCell("O").x + Cell("K").x \ No newline at end of file diff --git a/compiler/testData/codegen/box/typealias/typeAliasConstructorAccessor.kt b/compiler/testData/codegen/box/typealias/typeAliasConstructorAccessor.kt new file mode 100644 index 00000000000..3b92f4005d2 --- /dev/null +++ b/compiler/testData/codegen/box/typealias/typeAliasConstructorAccessor.kt @@ -0,0 +1,10 @@ +class Outer private constructor(public val x: String) { + class Nested { + fun foo() = OuterAlias("OK") + } +} + +typealias OuterAlias = Outer + +fun box(): String = + Outer.Nested().foo().x \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 0bdecbc7dcc..8031d957e41 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -15532,6 +15532,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/typealias"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("genericTypeAliasConstructor.kt") + public void testGenericTypeAliasConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/genericTypeAliasConstructor.kt"); + doTest(fileName); + } + @TestMetadata("localTypeAlias.kt") public void testLocalTypeAlias() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/localTypeAlias.kt"); @@ -15550,6 +15556,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("typeAliasConstructorAccessor.kt") + public void testTypeAliasConstructorAccessor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasConstructorAccessor.kt"); + doTest(fileName); + } + @TestMetadata("typeAliasObject.kt") public void testTypeAliasObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");