Take ReceiverParameterDescriptor in FunctionDescriptorImpl.initialize
Instead of just KotlinType. This will allow to pass annotations on the receiver at call sites
This commit is contained in:
+1
-1
@@ -396,7 +396,7 @@ private fun IrFunction.generateDefaultsFunction(context: CommonBackendContext):
|
||||
} + syntheticParameters
|
||||
|
||||
descriptor.initialize(
|
||||
/* receiverParameterType = */ extensionReceiverParameter?.type,
|
||||
/* receiverParameterType = */ extensionReceiverParameter,
|
||||
/* dispatchReceiverParameter = */ dispatchReceiverParameter,
|
||||
/* typeParameters = */ typeParameters.map {
|
||||
TypeParameterDescriptorImpl.createForFurtherModification(
|
||||
|
||||
+1
-1
@@ -520,7 +520,7 @@ class LocalDeclarationsLowering(
|
||||
val newValueParameters = createTransformedValueParameters(localFunctionContext, capturedValues)
|
||||
|
||||
newDescriptor.initialize(
|
||||
oldDescriptor.extensionReceiverParameter?.type,
|
||||
oldDescriptor.extensionReceiverParameter?.copy(newDescriptor),
|
||||
newDispatchReceiverParameter,
|
||||
newTypeParameters,
|
||||
newValueParameters.map { it.descriptor as ValueParameterDescriptor },
|
||||
|
||||
+1
-1
@@ -123,7 +123,7 @@ class BridgesConstruction(val context: JsIrBackendContext) : ClassLoweringPass {
|
||||
)
|
||||
|
||||
bridgeDescriptorForIrFunction.initialize(
|
||||
bridge.descriptor.extensionReceiverParameter?.returnType, containingClass.thisAsReceiverParameter,
|
||||
bridge.descriptor.extensionReceiverParameter?.copy(bridge.descriptor), containingClass.thisAsReceiverParameter,
|
||||
bridge.descriptor.typeParameters,
|
||||
bridge.descriptor.valueParameters.map { it.copy(bridgeDescriptorForIrFunction, it.name, it.index) },
|
||||
bridge.descriptor.returnType, bridge.descriptor.modality, function.visibility
|
||||
|
||||
+17
-4
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||
@@ -315,11 +316,11 @@ internal class DeepCopyIrTreeWithDescriptors(val targetDescriptor: FunctionDescr
|
||||
val newDispatchReceiverParameter = oldDispatchReceiverParameter?.let { descriptorSubstituteMap.getOrDefault(it, it) as ReceiverParameterDescriptor }
|
||||
val newTypeParameters = oldDescriptor.typeParameters // TODO substitute types
|
||||
val newValueParameters = copyValueParameters(oldDescriptor.valueParameters, this)
|
||||
val newReceiverParameterType = substituteTypeAndTryGetCopied(oldDescriptor.extensionReceiverParameter?.type)
|
||||
val newReceiverParameter = copyReceiverParameter(oldDescriptor.extensionReceiverParameter, this)
|
||||
val newReturnType = substituteTypeAndTryGetCopied(oldDescriptor.returnType)
|
||||
|
||||
initialize(
|
||||
/* receiverParameterType = */ newReceiverParameterType,
|
||||
/* extensionReceiverParameter = */ newReceiverParameter,
|
||||
/* dispatchReceiverParameter = */ newDispatchReceiverParameter,
|
||||
/* typeParameters = */ newTypeParameters,
|
||||
/* unsubstitutedValueParameters = */ newValueParameters,
|
||||
@@ -338,11 +339,11 @@ internal class DeepCopyIrTreeWithDescriptors(val targetDescriptor: FunctionDescr
|
||||
(descriptorSubstituteMap[oldDescriptor] as ClassConstructorDescriptorImpl).apply {
|
||||
val newTypeParameters = oldDescriptor.typeParameters
|
||||
val newValueParameters = copyValueParameters(oldDescriptor.valueParameters, this)
|
||||
val receiverParameterType = substituteTypeAndTryGetCopied(oldDescriptor.dispatchReceiverParameter?.type)
|
||||
val newReceiverParameter = copyReceiverParameter(oldDescriptor.dispatchReceiverParameter, this)
|
||||
val returnType = substituteTypeAndTryGetCopied(oldDescriptor.returnType)
|
||||
|
||||
initialize(
|
||||
/* receiverParameterType = */ receiverParameterType,
|
||||
/* extensionReceiverParameter = */ newReceiverParameter,
|
||||
/* dispatchReceiverParameter = */ null, // For constructor there is no explicit dispatch receiver.
|
||||
/* typeParameters = */ newTypeParameters,
|
||||
/* unsubstitutedValueParameters = */ newValueParameters,
|
||||
@@ -431,6 +432,18 @@ internal class DeepCopyIrTreeWithDescriptors(val targetDescriptor: FunctionDescr
|
||||
newDescriptor
|
||||
}
|
||||
|
||||
private fun copyReceiverParameter(
|
||||
oldReceiverParameter: ReceiverParameterDescriptor?, containingDeclaration: CallableDescriptor
|
||||
): ReceiverParameterDescriptor? {
|
||||
if (oldReceiverParameter == null) return null
|
||||
val substituteTypeAndTryGetCopied = substituteTypeAndTryGetCopied(oldReceiverParameter.type) ?: return null
|
||||
return ReceiverParameterDescriptorImpl(
|
||||
containingDeclaration,
|
||||
ExtensionReceiver(containingDeclaration, substituteTypeAndTryGetCopied, oldReceiverParameter.value),
|
||||
oldReceiverParameter.annotations
|
||||
)
|
||||
}
|
||||
|
||||
private fun substituteTypeAndTryGetCopied(type: KotlinType?): KotlinType? {
|
||||
val substitutedType = substituteType(type) ?: return null
|
||||
val oldClassDescriptor = TypeUtils.getClassDescriptor(substitutedType) ?: return substitutedType
|
||||
|
||||
+3
-3
@@ -84,7 +84,7 @@ object JsSymbolBuilder {
|
||||
|
||||
|
||||
fun IrSimpleFunctionSymbol.initialize(
|
||||
receiverParameterType: IrType? = null,
|
||||
extensionReceiverParameter: ReceiverParameterDescriptor? = null,
|
||||
dispatchParameterDescriptor: ReceiverParameterDescriptor? = null,
|
||||
typeParameters: List<TypeParameterDescriptor> = emptyList(),
|
||||
valueParameters: List<ValueParameterDescriptor> = emptyList(),
|
||||
@@ -93,7 +93,7 @@ fun IrSimpleFunctionSymbol.initialize(
|
||||
visibility: Visibility = Visibilities.LOCAL
|
||||
) = this.apply {
|
||||
(descriptor as FunctionDescriptorImpl).initialize(
|
||||
receiverParameterType?.toKotlinType(),
|
||||
extensionReceiverParameter,
|
||||
dispatchParameterDescriptor,
|
||||
typeParameters,
|
||||
valueParameters,
|
||||
@@ -101,4 +101,4 @@ fun IrSimpleFunctionSymbol.initialize(
|
||||
modality,
|
||||
visibility
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@ class JvmDescriptorsFactory(
|
||||
// Call the long version of `initialize()`, because otherwise default implementation inserts
|
||||
// an unwanted `dispatchReceiverParameter`
|
||||
newDescriptor.initialize(
|
||||
oldDescriptor.extensionReceiverParameter?.type,
|
||||
oldDescriptor.extensionReceiverParameter?.copy(newDescriptor),
|
||||
null,
|
||||
oldDescriptor.typeParameters,
|
||||
newValueParameters,
|
||||
|
||||
+3
-2
@@ -197,7 +197,8 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
|
||||
)
|
||||
|
||||
bridgeDescriptorForIrFunction.initialize(
|
||||
bridge.descriptor.extensionReceiverParameter?.returnType, containingClass.thisAsReceiverParameter, emptyList(),
|
||||
bridge.descriptor.extensionReceiverParameter?.copy(bridgeDescriptorForIrFunction),
|
||||
containingClass.thisAsReceiverParameter, emptyList(),
|
||||
bridge.descriptor.valueParameters.map { it.copy(bridgeDescriptorForIrFunction, it.name, it.index) },
|
||||
bridge.descriptor.returnType, Modality.OPEN, descriptor.visibility
|
||||
)
|
||||
@@ -329,7 +330,7 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
|
||||
)
|
||||
|
||||
delegationDescriptor.initialize(
|
||||
descriptor.extensionReceiverParameter?.returnType, containingClass.thisAsReceiverParameter, emptyList(),
|
||||
descriptor.extensionReceiverParameter?.copy(delegationDescriptor), containingClass.thisAsReceiverParameter, emptyList(),
|
||||
descriptor.valueParameters.map { it.copy(delegationDescriptor, it.name, it.index) },
|
||||
descriptor.returnType, Modality.OPEN, descriptor.visibility
|
||||
)
|
||||
|
||||
+9
-3
@@ -8,11 +8,17 @@ package org.jetbrains.kotlin.backend.jvm.lower
|
||||
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
|
||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.addMember
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||
@@ -148,7 +154,7 @@ class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : ClassLowe
|
||||
// Call the long version of `initialize()`, because otherwise default implementation inserts
|
||||
// an unwanted `dispatchReceiverParameter`.
|
||||
result.initialize(
|
||||
extensionReceiverParameter?.type,
|
||||
extensionReceiverParameter?.copy(result),
|
||||
dispatchReceiverParameter,
|
||||
typeParameters,
|
||||
generateNewValueParameters(this, numDefaultParametersToExpect),
|
||||
|
||||
+6
-4
@@ -18,8 +18,6 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||
@@ -30,7 +28,11 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
||||
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
||||
|
||||
/*
|
||||
@@ -227,7 +229,7 @@ private fun makeJvmStaticFunctionSymbol(
|
||||
)
|
||||
|
||||
proxyDescriptorForIrFunction.initialize(
|
||||
oldFunctionSymbol.descriptor.extensionReceiverParameter?.type,
|
||||
oldFunctionSymbol.descriptor.extensionReceiverParameter?.copy(proxyDescriptorForIrFunction),
|
||||
null,
|
||||
oldFunctionSymbol.descriptor.typeParameters,
|
||||
oldFunctionSymbol.descriptor.valueParameters.map { it.copy(proxyDescriptorForIrFunction, it.name, it.index) },
|
||||
|
||||
+1
-2
@@ -40,7 +40,6 @@ import org.jetbrains.kotlin.ir.util.defaultType
|
||||
import org.jetbrains.kotlin.ir.util.usesDefaultArguments
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
|
||||
interface StubContext {
|
||||
@@ -315,7 +314,7 @@ class SyntheticAccessorLowering(val context: JvmBackendContext) : FileLoweringPa
|
||||
private fun AccessorForConstructorDescriptor.constructorDescriptorWithMarker(marker: KotlinType) =
|
||||
ClassConstructorDescriptorImpl.createSynthesized(containingDeclaration, annotations, false, source).also {
|
||||
it.initialize(
|
||||
DescriptorUtils.getReceiverParameterType(extensionReceiverParameter),
|
||||
extensionReceiverParameter?.copy(this),
|
||||
dispatchReceiverParameter,
|
||||
emptyList()/*TODO*/,
|
||||
calleeDescriptor.valueParameters.map {
|
||||
|
||||
Reference in New Issue
Block a user