From f8e9922c9e031803e84b4bf9c7ea48619bdb8de9 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 10 Oct 2016 10:32:58 +0300 Subject: [PATCH] Don't generate generic signature for get/set methods in property reference class --- .../kotlin/codegen/PropertyReferenceCodegen.kt | 18 +++++++++++++++++- .../writeSignature/callableFunction.kt | 15 +++++++++++++++ .../writeSignature/callableProperty.kt | 13 +++++++++++++ .../compiler/WriteSignatureTestGenerated.java | 12 ++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/writeSignature/callableFunction.kt create mode 100644 compiler/testData/writeSignature/callableProperty.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index d5cdfd0fba3..76e4b3ca030 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.codegen +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.codegen.AsmUtil.method import org.jetbrains.kotlin.codegen.binding.CodegenBinding @@ -31,10 +32,13 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.PropertyImportedFromObject +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny import org.jetbrains.kotlin.resolve.jvm.AsmTypes.* import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature +import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.typeUtil.builtIns import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.sure import org.jetbrains.org.objectweb.asm.Opcodes.* @@ -172,6 +176,17 @@ class PropertyReferenceCodegen( } companion object { + + @JvmField + val ANY_SUBSTITUTOR = TypeSubstitutor.create(object : TypeSubstitution() { + override fun get(key: KotlinType): TypeProjection? { + if (KotlinBuiltIns.isUnit(key)) { + return TypeProjectionImpl(key) + } + return TypeProjectionImpl(key.builtIns.anyType) + } + }) + @JvmStatic fun generateCallableReferenceSignature(iv: InstructionAdapter, callable: CallableDescriptor, state: GenerationState) { val accessor = when (callable) { @@ -208,7 +223,8 @@ class PropertyReferenceCodegen( @JvmStatic fun createFakeOpenDescriptor(getFunction: FunctionDescriptor, classDescriptor: ClassDescriptor): FunctionDescriptor { - return getFunction.original.copy(classDescriptor, Modality.OPEN, getFunction.visibility, getFunction.kind, false) + val copy = getFunction.original.copy(classDescriptor, Modality.OPEN, getFunction.visibility, getFunction.kind, false) + return copy.substitute(ANY_SUBSTITUTOR) } @JvmStatic diff --git a/compiler/testData/writeSignature/callableFunction.kt b/compiler/testData/writeSignature/callableFunction.kt new file mode 100644 index 00000000000..1698487d7ee --- /dev/null +++ b/compiler/testData/writeSignature/callableFunction.kt @@ -0,0 +1,15 @@ +class Foo() { + fun test(): String = "OK" +} + +fun test(s: () -> String): String { + return s() +} + +fun box(): String { + return test(Foo()::test) +} + +// method: CallableFunctionKt$box$1::invoke +// jvm signature: ()Ljava/lang/String; +// generic signature: null diff --git a/compiler/testData/writeSignature/callableProperty.kt b/compiler/testData/writeSignature/callableProperty.kt new file mode 100644 index 00000000000..6205a90e85b --- /dev/null +++ b/compiler/testData/writeSignature/callableProperty.kt @@ -0,0 +1,13 @@ +class Foo(val a: String) + +fun test(s: () -> String): String { + return s() +} + +fun box(): String { + return test(Foo("OK")::a) +} + +// method: CallablePropertyKt$box$1::get +// jvm signature: ()Ljava/lang/Object; +// generic signature: null diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java index ad7a8344f7b..50497397b4b 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java @@ -53,6 +53,18 @@ public class WriteSignatureTestGenerated extends AbstractWriteSignatureTest { doTest(fileName); } + @TestMetadata("callableFunction.kt") + public void testCallableFunction() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeSignature/callableFunction.kt"); + doTest(fileName); + } + + @TestMetadata("callableProperty.kt") + public void testCallableProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeSignature/callableProperty.kt"); + doTest(fileName); + } + @TestMetadata("Comparable.kt") public void testComparable() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeSignature/Comparable.kt");