Support 'call' for references to inline class constructors

#KT-26748
This commit is contained in:
Dmitry Petrov
2018-10-17 10:12:16 +03:00
parent 94e1701089
commit 5032c106af
8 changed files with 81 additions and 5 deletions
@@ -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)