Don't generate generic signature for get/set methods in property reference class

This commit is contained in:
Michael Bogdanov
2016-10-10 10:32:58 +03:00
parent 5bd045c79c
commit f8e9922c9e
4 changed files with 57 additions and 1 deletions
@@ -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
+15
View File
@@ -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
+13
View File
@@ -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
@@ -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");