Support 'call' for references to inline class constructors
#KT-26748
This commit is contained in:
@@ -41,6 +41,7 @@ import org.jetbrains.kotlin.name.NameUtils
|
||||
import org.jetbrains.kotlin.resolve.DescriptorFactory
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor
|
||||
import org.jetbrains.kotlin.resolve.isInlineClass
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
||||
@@ -107,7 +108,7 @@ internal sealed class JvmPropertySignature {
|
||||
} else {
|
||||
val (name, desc) =
|
||||
JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable)
|
||||
?: throw KotlinReflectionInternalError("No field signature for property: $descriptor")
|
||||
?: throw KotlinReflectionInternalError("No field signature for property: $descriptor")
|
||||
JvmAbi.getterName(name) + getManglingSuffix() + "()" + desc
|
||||
}
|
||||
|
||||
@@ -116,7 +117,7 @@ internal sealed class JvmPropertySignature {
|
||||
if (descriptor.visibility == Visibilities.INTERNAL && containingDeclaration is DeserializedClassDescriptor) {
|
||||
val classProto = containingDeclaration.classProto
|
||||
val moduleName = classProto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let(nameResolver::getString)
|
||||
?: JvmAbi.DEFAULT_MODULE_NAME
|
||||
?: JvmAbi.DEFAULT_MODULE_NAME
|
||||
return "$" + NameUtils.sanitizeAsJavaIdentifier(moduleName)
|
||||
}
|
||||
if (descriptor.visibility == Visibilities.PRIVATE && containingDeclaration is PackageFragmentDescriptor) {
|
||||
@@ -172,14 +173,17 @@ internal object RuntimeTypeMapper {
|
||||
}
|
||||
if (proto is ProtoBuf.Constructor) {
|
||||
JvmProtoBufUtil.getJvmConstructorSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
|
||||
return JvmFunctionSignature.KotlinConstructor(signature)
|
||||
return if (possiblySubstitutedFunction.containingDeclaration.isInlineClass())
|
||||
JvmFunctionSignature.KotlinFunction(signature)
|
||||
else
|
||||
JvmFunctionSignature.KotlinConstructor(signature)
|
||||
}
|
||||
}
|
||||
return mapJvmFunctionSignature(function)
|
||||
}
|
||||
is JavaMethodDescriptor -> {
|
||||
val method = ((function.source as? JavaSourceElement)?.javaElement as? ReflectJavaMethod)?.member
|
||||
?: throw KotlinReflectionInternalError("Incorrect resolution sequence for Java method $function")
|
||||
?: throw KotlinReflectionInternalError("Incorrect resolution sequence for Java method $function")
|
||||
|
||||
return JvmFunctionSignature.JavaMethod(method)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ package kotlin.reflect.jvm.internal.calls
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
||||
@@ -69,7 +70,7 @@ internal class InlineClassAwareCaller<out M : Member>(
|
||||
val extensionReceiverType = descriptor.extensionReceiverParameter?.type
|
||||
if (extensionReceiverType != null) {
|
||||
kotlinParameterTypes.add(extensionReceiverType)
|
||||
} else {
|
||||
} else if (descriptor !is ConstructorDescriptor) {
|
||||
val containingDeclaration = descriptor.containingDeclaration
|
||||
if (containingDeclaration is ClassDescriptor && containingDeclaration.isInline) {
|
||||
kotlinParameterTypes.add(containingDeclaration.defaultType)
|
||||
|
||||
Reference in New Issue
Block a user