Don't generate generic signature for get/set methods in property reference class
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user