diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt index 1e15edd5a76..676a297f258 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.codegen import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeSubstitutor @@ -56,7 +55,7 @@ class AccessorForConstructorDescriptor( init { initialize( - DescriptorUtils.getReceiverParameterType(extensionReceiverParameter), + calleeDescriptor.extensionReceiverParameter?.copy(this), calleeDescriptor.dispatchReceiverParameter, copyTypeParameters(calleeDescriptor), copyValueParameters(calleeDescriptor), diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt index 04d4282008b..ec123cbafa2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt @@ -16,14 +16,12 @@ package org.jetbrains.kotlin.codegen -import org.jetbrains.kotlin.codegen.coroutines.* +import org.jetbrains.kotlin.codegen.coroutines.INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.DescriptorUtils - -import java.util.LinkedHashMap +import java.util.* class AccessorForFunctionDescriptor( override val calleeDescriptor: FunctionDescriptor, @@ -36,7 +34,7 @@ class AccessorForFunctionDescriptor( init { initialize( - DescriptorUtils.getReceiverParameterType(calleeDescriptor.extensionReceiverParameter), + calleeDescriptor.extensionReceiverParameter?.copy(this), if (calleeDescriptor is ConstructorDescriptor || calleeDescriptor.isJvmStaticInObjectOrClassOrInterface()) null else diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt index bf547ea1a70..c1fb550a432 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt @@ -185,7 +185,7 @@ class CoroutineCodegenForLambda private constructor( funDescriptor.source ).also { it.initialize( - funDescriptor.extensionReceiverParameter?.type, + funDescriptor.extensionReceiverParameter?.copy(it), funDescriptor.dispatchReceiverParameter, funDescriptor.typeParameters, funDescriptor.valueParameters, diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData.java index 6c9477dc6f3..1e5ee52ba74 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData.java @@ -22,7 +22,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.descriptors.annotations.*; +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor; @@ -90,7 +91,7 @@ public class SignaturesPropagationData { SourceElement.NO_SOURCE ); autoMethodDescriptor.initialize( - /* receiverParameterType = */ null, + null, containingClass.getThisAsReceiverParameter(), autoTypeParameters, autoValueParameters, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 620b9f3c4b4..53f855eeb51 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -930,8 +930,15 @@ public class DescriptorResolver { } } - ReceiverParameterDescriptor receiverDescriptor = - DescriptorFactory.createExtensionReceiverParameterForCallable(propertyDescriptor, receiverType); + ReceiverParameterDescriptor receiverDescriptor; + if (receiverType != null) { + receiverDescriptor = DescriptorFactory.createExtensionReceiverParameterForCallable( + propertyDescriptor, receiverType, Annotations.Companion.getEMPTY() + ); + } + else { + receiverDescriptor = null; + } LexicalScope scopeForInitializer = ScopeUtils.makeScopeForPropertyInitializer(scopeForInitializerResolutionWithTypeParameters, propertyDescriptor); KotlinType propertyType = propertyInfo.getVariableType(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index 420a5981fec..d3a361c5467 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -210,7 +210,9 @@ class FunctionDescriptorResolver( } functionDescriptor.initialize( - receiverType, + receiverType?.let { + DescriptorFactory.createExtensionReceiverParameterForCallable(functionDescriptor, it, Annotations.EMPTY) + }, getDispatchReceiverParameterIfNeeded(container), typeParameterDescriptors, valueParameterDescriptors, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt index 58b5bda036b..50356d9bd7c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt @@ -138,7 +138,7 @@ class DynamicCallableDescriptors(storageManager: StorageManager, builtIns: Kotli } private fun createDynamicDispatchReceiverParameter(owner: CallableDescriptor): ReceiverParameterDescriptorImpl { - return ReceiverParameterDescriptorImpl(owner, TransientReceiver(dynamicType)) + return ReceiverParameterDescriptorImpl(owner, TransientReceiver(dynamicType), Annotations.EMPTY) } private fun createTypeParameters(owner: DeclarationDescriptor, call: Call): List = diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt index ad480d09256..1e5d74facbf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt @@ -159,19 +159,19 @@ class ResolvedAtomCompleter( trace.recordType(ktArgumentExpression, substitutedFunctionalType) // Mainly this is needed for builder-like inference, when we have type `SomeType.() -> Unit` and now we want to update those K, V - val extensionReceiverParameter = functionDescriptor.extensionReceiverParameter - if (extensionReceiverParameter != null) { - require(extensionReceiverParameter is ReceiverParameterDescriptorImpl) { - "Extension receiver for anonymous function ($extensionReceiverParameter) should be ReceiverParameterDescriptorImpl" + val receiver = functionDescriptor.extensionReceiverParameter + if (receiver != null) { + require(receiver is ReceiverParameterDescriptorImpl) { + "Extension receiver for anonymous function ($receiver) should be ReceiverParameterDescriptorImpl" } - val valueType = extensionReceiverParameter.value.type.unwrap() + val valueType = receiver.value.type.unwrap() val newValueType = resultSubstitutor.substituteKeepAnnotations(valueType) - val newReceiverValue = extensionReceiverParameter.value.replaceType(newValueType) + val newReceiverValue = receiver.value.replaceType(newValueType) functionDescriptor.setExtensionReceiverParameter( - ReceiverParameterDescriptorImpl(extensionReceiverParameter.containingDeclaration, newReceiverValue) + ReceiverParameterDescriptorImpl(receiver.containingDeclaration, newReceiverValue, receiver.annotations) ) } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt index 26a5ad20e8b..ddc1fe5824b 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt @@ -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( diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index e9f2ba61287..fab2fc412b4 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -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 }, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt index 4d51136b429..36c51015cf7 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt @@ -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 diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/DeepCopyIrTreeWithDescriptors.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/DeepCopyIrTreeWithDescriptors.kt index f5d3488194f..cb118a9f688 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/DeepCopyIrTreeWithDescriptors.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/DeepCopyIrTreeWithDescriptors.kt @@ -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 diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/symbols/SymbolBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/symbols/SymbolBuilder.kt index a4e340da162..8a0e5b646ea 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/symbols/SymbolBuilder.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/symbols/SymbolBuilder.kt @@ -84,7 +84,7 @@ object JsSymbolBuilder { fun IrSimpleFunctionSymbol.initialize( - receiverParameterType: IrType? = null, + extensionReceiverParameter: ReceiverParameterDescriptor? = null, dispatchParameterDescriptor: ReceiverParameterDescriptor? = null, typeParameters: List = emptyList(), valueParameters: List = 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 ) -} \ No newline at end of file +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt index 616843f4a52..69fe51f1af8 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt @@ -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, diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index fbaf4e3cae4..55ea8059081 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -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 ) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt index 942a4268486..b6c0a77caae 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt @@ -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), diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt index f70bcdb7c23..c48463b0f19 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt @@ -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) }, diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index 574f6c8e975..23730d0dbc9 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -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 { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt index b4936d115e2..014fa78aa65 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt @@ -22,7 +22,9 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden import org.jetbrains.kotlin.types.TypeSubstitutor @@ -66,7 +68,11 @@ fun createSynthesizedInvokes(functions: Collection): Collect private fun createSynthesizedFunctionWithFirstParameterAsReceiver(descriptor: FunctionDescriptor) = descriptor.original.newCopyBuilder().apply { - setExtensionReceiverType(descriptor.original.valueParameters.first().type) + setExtensionReceiverParameter( + DescriptorFactory.createExtensionReceiverParameterForCallable( + descriptor.original, descriptor.original.valueParameters.first().type, Annotations.EMPTY + ) + ) setValueParameters( descriptor.original.valueParameters .drop(1) diff --git a/compiler/tests/org/jetbrains/kotlin/types/KotlinTypeCheckerTest.java b/compiler/tests/org/jetbrains/kotlin/types/KotlinTypeCheckerTest.java index 281517baf7c..b1ec577be62 100644 --- a/compiler/tests/org/jetbrains/kotlin/types/KotlinTypeCheckerTest.java +++ b/compiler/tests/org/jetbrains/kotlin/types/KotlinTypeCheckerTest.java @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.descriptors.PackageFragmentProvider; +import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl; import org.jetbrains.kotlin.psi.KtExpression; @@ -544,7 +545,8 @@ public class KotlinTypeCheckerTest extends KotlinTestWithEnvironment { KotlinType thisType = makeType(contextType); ReceiverParameterDescriptorImpl receiverParameterDescriptor = new ReceiverParameterDescriptorImpl( scopeWithImports.getOwnerDescriptor(), - new TransientReceiver(thisType) + new TransientReceiver(thisType), + Annotations.Companion.getEMPTY() ); LexicalScope scope = new LexicalScopeImpl(scopeWithImports, scopeWithImports.getOwnerDescriptor(), false, diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaClassConstructorDescriptor.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaClassConstructorDescriptor.java index 21a21c9fcc5..3bbb9dcc3fd 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaClassConstructorDescriptor.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaClassConstructorDescriptor.java @@ -18,13 +18,11 @@ package org.jetbrains.kotlin.load.java.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.ClassDescriptor; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.FunctionDescriptor; -import org.jetbrains.kotlin.descriptors.SourceElement; +import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.resolve.DescriptorFactory; import org.jetbrains.kotlin.types.KotlinType; import java.util.List; @@ -125,9 +123,13 @@ public class JavaClassConstructorDescriptor extends ClassConstructorDescriptorIm ) { JavaClassConstructorDescriptor enhanced = createSubstitutedCopy( getContainingDeclaration(), /* original = */ null, getKind(), null, getAnnotations(), getSource()); + ReceiverParameterDescriptor enhancedReceiver = + enhancedReceiverType == null ? null : DescriptorFactory.createExtensionReceiverParameterForCallable( + enhanced, enhancedReceiverType, Annotations.Companion.getEMPTY() + ); // We do not use doSubstitute here as in JavaMethodDescriptor.enhance because type parameters of constructor belongs to class enhanced.initialize( - enhancedReceiverType, + enhancedReceiver, getDispatchReceiverParameter(), getTypeParameters(), UtilKt.copyValueParameters(enhancedValueParametersData, getValueParameters(), enhanced), diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java index e65c5ce87bd..d6f5a84d480 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.resolve.DescriptorFactory; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.util.OperatorChecks; @@ -83,7 +84,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement @NotNull @Override public SimpleFunctionDescriptorImpl initialize( - @Nullable KotlinType receiverParameterType, + @Nullable ReceiverParameterDescriptor extensionReceiverParameter, @Nullable ReceiverParameterDescriptor dispatchReceiverParameter, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @@ -93,8 +94,9 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement @Nullable Map, ?> userData ) { SimpleFunctionDescriptorImpl descriptor = super.initialize( - receiverParameterType, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, - unsubstitutedReturnType, modality, visibility, userData); + extensionReceiverParameter, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, + unsubstitutedReturnType, modality, visibility, userData + ); setOperator(OperatorChecks.INSTANCE.check(descriptor).isSuccess()); return descriptor; } @@ -147,11 +149,16 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement List enhancedValueParameters = UtilKt.copyValueParameters(enhancedValueParametersData, getValueParameters(), this); + ReceiverParameterDescriptor enhancedReceiver = + enhancedReceiverType == null ? null : DescriptorFactory.createExtensionReceiverParameterForCallable( + this, enhancedReceiverType, Annotations.Companion.getEMPTY() + ); + JavaMethodDescriptor enhancedMethod = (JavaMethodDescriptor) newCopyBuilder() .setValueParameters(enhancedValueParameters) .setReturnType(enhancedReturnType) - .setExtensionReceiverType(enhancedReceiverType) + .setExtensionReceiverParameter(enhancedReceiver) .setDropOriginalInContainingParts() .setPreserveSourceElement() .build(); diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt index 7b94d638c88..31b23f4e952 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.load.java.lazy.descriptors import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupLocation @@ -35,6 +36,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaField import org.jetbrains.kotlin.load.java.structure.JavaMethod import org.jetbrains.kotlin.load.java.structure.JavaValueParameter import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.constants.StringValue import org.jetbrains.kotlin.resolve.descriptorUtil.firstArgument @@ -130,14 +132,16 @@ abstract class LazyJavaScope(protected val c: LazyJavaResolverContext) : MemberS val effectiveSignature = resolveMethodSignature(method, methodTypeParameters, returnType, valueParameters.descriptors) functionDescriptorImpl.initialize( - effectiveSignature.receiverType, - getDispatchReceiverParameter(), - effectiveSignature.typeParameters, - effectiveSignature.valueParameters, - effectiveSignature.returnType, - Modality.convertFromFlags(method.isAbstract, !method.isFinal), - method.visibility, - if (effectiveSignature.receiverType != null) + effectiveSignature.receiverType?.let { + DescriptorFactory.createExtensionReceiverParameterForCallable(functionDescriptorImpl, it, Annotations.EMPTY) + }, + getDispatchReceiverParameter(), + effectiveSignature.typeParameters, + effectiveSignature.valueParameters, + effectiveSignature.returnType, + Modality.convertFromFlags(method.isAbstract, !method.isFinal), + method.visibility, + if (effectiveSignature.receiverType != null) mapOf(JavaMethodDescriptor.ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER to valueParameters.descriptors.first()) else emptyMap, ValueParameterDescriptor>() diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java index 9561aa22234..84e72cc57b7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java @@ -114,7 +114,7 @@ public interface FunctionDescriptor extends CallableMemberDescriptor { CopyBuilder setReturnType(@NotNull KotlinType type); @NotNull - CopyBuilder setExtensionReceiverType(@Nullable KotlinType type); + CopyBuilder setExtensionReceiverParameter(@Nullable ReceiverParameterDescriptor extensionReceiverParameter); @NotNull @Override diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ReceiverParameterDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ReceiverParameterDescriptor.java index 371ac6a61f4..2f909f3166c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ReceiverParameterDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ReceiverParameterDescriptor.java @@ -22,11 +22,13 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.kotlin.types.TypeSubstitutor; public interface ReceiverParameterDescriptor extends ParameterDescriptor { - @NotNull ReceiverValue getValue(); @Nullable @Override ReceiverParameterDescriptor substitute(@NotNull TypeSubstitutor substitutor); + + @NotNull + ReceiverParameterDescriptor copy(@NotNull DeclarationDescriptor newOwner); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractReceiverParameterDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractReceiverParameterDescriptor.java index a33ae7ea44d..f944d053788 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractReceiverParameterDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractReceiverParameterDescriptor.java @@ -33,8 +33,8 @@ import java.util.List; public abstract class AbstractReceiverParameterDescriptor extends DeclarationDescriptorImpl implements ReceiverParameterDescriptor { private static final Name RECEIVER_PARAMETER_NAME = Name.special(""); - public AbstractReceiverParameterDescriptor() { - super(Annotations.Companion.getEMPTY(), RECEIVER_PARAMETER_NAME); + public AbstractReceiverParameterDescriptor(@NotNull Annotations annotations) { + super(annotations, RECEIVER_PARAMETER_NAME); } @Nullable @@ -58,7 +58,7 @@ public abstract class AbstractReceiverParameterDescriptor extends DeclarationDes if (substitutedType == null) return null; if (substitutedType == getType()) return this; - return new ReceiverParameterDescriptorImpl(getContainingDeclaration(), new TransientReceiver(substitutedType)); + return new ReceiverParameterDescriptorImpl(getContainingDeclaration(), new TransientReceiver(substitutedType), getAnnotations()); } @Override diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index 99ca42928dc..808c0621b0e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.annotations.AnnotationsKt; import org.jetbrains.kotlin.name.Name; -import org.jetbrains.kotlin.resolve.DescriptorFactory; +import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver; import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.utils.SmartList; @@ -66,7 +66,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo @NotNull public FunctionDescriptorImpl initialize( - @Nullable KotlinType receiverParameterType, + @Nullable ReceiverParameterDescriptor extensionReceiverParameter, @Nullable ReceiverParameterDescriptor dispatchReceiverParameter, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @@ -79,7 +79,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo this.unsubstitutedReturnType = unsubstitutedReturnType; this.modality = modality; this.visibility = visibility; - this.extensionReceiverParameter = DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverParameterType); + this.extensionReceiverParameter = extensionReceiverParameter; this.dispatchReceiverParameter = dispatchReceiverParameter; for (int i = 0; i < typeParameters.size(); ++i) { @@ -350,7 +350,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo protected @Nullable FunctionDescriptor original = null; protected @NotNull Kind kind; protected @NotNull List newValueParameterDescriptors; - protected @Nullable KotlinType newExtensionReceiverParameterType; + protected @Nullable ReceiverParameterDescriptor newExtensionReceiverParameter; protected @Nullable ReceiverParameterDescriptor dispatchReceiverParameter = FunctionDescriptorImpl.this.dispatchReceiverParameter; protected @NotNull KotlinType newReturnType; protected @Nullable Name name; @@ -373,7 +373,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo @NotNull Visibility newVisibility, @NotNull Kind kind, @NotNull List newValueParameterDescriptors, - @Nullable KotlinType newExtensionReceiverParameterType, + @Nullable ReceiverParameterDescriptor newExtensionReceiverParameter, @NotNull KotlinType newReturnType, @Nullable Name name ) { @@ -383,7 +383,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo this.newVisibility = newVisibility; this.kind = kind; this.newValueParameterDescriptors = newValueParameterDescriptors; - this.newExtensionReceiverParameterType = newExtensionReceiverParameterType; + this.newExtensionReceiverParameter = newExtensionReceiverParameter; this.newReturnType = newReturnType; this.name = name; } @@ -453,8 +453,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo @NotNull @Override - public CopyConfiguration setExtensionReceiverType(@Nullable KotlinType type) { - this.newExtensionReceiverParameterType = type; + public CopyConfiguration setExtensionReceiverParameter(@Nullable ReceiverParameterDescriptor extensionReceiverParameter) { + this.newExtensionReceiverParameter = extensionReceiverParameter; return this; } @@ -567,7 +567,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo return new CopyConfiguration( substitutor.getSubstitution(), getContainingDeclaration(), getModality(), getVisibility(), getKind(), getValueParameters(), - getExtensionReceiverParameterType(), getReturnType(), null); + getExtensionReceiverParameter(), getReturnType(), null + ); } @Nullable @@ -594,14 +595,22 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo ); if (substitutor == null) return null; - KotlinType substitutedReceiverParameterType = null; - if (configuration.newExtensionReceiverParameterType != null) { - substitutedReceiverParameterType = substitutor.substitute(configuration.newExtensionReceiverParameterType, Variance.IN_VARIANCE); - if (substitutedReceiverParameterType == null) { + ReceiverParameterDescriptor substitutedReceiverParameter = null; + if (configuration.newExtensionReceiverParameter != null) { + KotlinType substitutedExtensionReceiverType = + substitutor.substitute(configuration.newExtensionReceiverParameter.getType(), Variance.IN_VARIANCE); + if (substitutedExtensionReceiverType == null) { return null; } + substitutedReceiverParameter = new ReceiverParameterDescriptorImpl( + substitutedDescriptor, + new ExtensionReceiver( + substitutedDescriptor, substitutedExtensionReceiverType, configuration.newExtensionReceiverParameter.getValue() + ), + configuration.newExtensionReceiverParameter.getAnnotations() + ); - wereChanges[0] |= substitutedReceiverParameterType != configuration.newExtensionReceiverParameterType; + wereChanges[0] |= substitutedExtensionReceiverType != configuration.newExtensionReceiverParameter.getType(); } ReceiverParameterDescriptor substitutedExpectedThis = null; @@ -644,7 +653,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo } substitutedDescriptor.initialize( - substitutedReceiverParameterType, + substitutedReceiverParameter, substitutedExpectedThis, substitutedTypeParameters, substitutedValueParameters, diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyClassReceiverParameterDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyClassReceiverParameterDescriptor.java index 86b40c0db40..9af9c75fd05 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyClassReceiverParameterDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyClassReceiverParameterDescriptor.java @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.descriptors.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; +import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor; +import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; @@ -27,6 +29,7 @@ public class LazyClassReceiverParameterDescriptor extends AbstractReceiverParame private final ImplicitClassReceiver receiverValue; public LazyClassReceiverParameterDescriptor(@NotNull ClassDescriptor descriptor) { + super(Annotations.Companion.getEMPTY()); this.descriptor = descriptor; this.receiverValue = new ImplicitClassReceiver(descriptor, null); } @@ -43,6 +46,12 @@ public class LazyClassReceiverParameterDescriptor extends AbstractReceiverParame return descriptor; } + @NotNull + @Override + public ReceiverParameterDescriptor copy(@NotNull DeclarationDescriptor newOwner) { + throw new UnsupportedOperationException(); + } + @Override public String toString() { return "class " + descriptor.getName() + "::this"; diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java index e91ae95fd56..4dfc7a86e89 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java @@ -112,7 +112,8 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp @Nullable ReceiverParameterDescriptor dispatchReceiverParameter, @Nullable KotlinType receiverType ) { - ReceiverParameterDescriptor extensionReceiverParameter = DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverType); + ReceiverParameterDescriptor extensionReceiverParameter = + DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverType, Annotations.Companion.getEMPTY()); setType(outType, typeParameters, dispatchReceiverParameter, extensionReceiverParameter); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ReceiverParameterDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ReceiverParameterDescriptorImpl.java index 28c6028468c..df56e1e7249 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ReceiverParameterDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ReceiverParameterDescriptorImpl.java @@ -19,13 +19,19 @@ package org.jetbrains.kotlin.descriptors.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor; +import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; public class ReceiverParameterDescriptorImpl extends AbstractReceiverParameterDescriptor { private final DeclarationDescriptor containingDeclaration; private final ReceiverValue value; - public ReceiverParameterDescriptorImpl(@NotNull DeclarationDescriptor containingDeclaration, @NotNull ReceiverValue value) { + public ReceiverParameterDescriptorImpl( + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull ReceiverValue value, + @NotNull Annotations annotations + ) { + super(annotations); this.containingDeclaration = containingDeclaration; this.value = value; } @@ -41,4 +47,10 @@ public class ReceiverParameterDescriptorImpl extends AbstractReceiverParameterDe public DeclarationDescriptor getContainingDeclaration() { return containingDeclaration; } + + @NotNull + @Override + public ReceiverParameterDescriptor copy(@NotNull DeclarationDescriptor newOwner) { + return new ReceiverParameterDescriptorImpl(newOwner, value, getAnnotations()); + } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java index 0a572e7cf8a..9fdc28c99af 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java @@ -53,7 +53,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme @NotNull @Override public SimpleFunctionDescriptorImpl initialize( - @Nullable KotlinType receiverParameterType, + @Nullable ReceiverParameterDescriptor extensionReceiverParameter, @Nullable ReceiverParameterDescriptor dispatchReceiverParameter, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @@ -61,13 +61,13 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme @Nullable Modality modality, @NotNull Visibility visibility ) { - return initialize(receiverParameterType, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, + return initialize(extensionReceiverParameter, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility, null); } @NotNull public SimpleFunctionDescriptorImpl initialize( - @Nullable KotlinType receiverParameterType, + @Nullable ReceiverParameterDescriptor extensionReceiverParameter, @Nullable ReceiverParameterDescriptor dispatchReceiverParameter, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @@ -76,7 +76,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme @NotNull Visibility visibility, @Nullable Map, ?> userData ) { - super.initialize(receiverParameterType, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, + super.initialize(extensionReceiverParameter, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility); if (userData != null && !userData.isEmpty()) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt index d3d3331beed..bbc9de8ff01 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.types.* @@ -192,12 +193,16 @@ class TypeAliasConstructorDescriptorImpl private constructor( val returnType = substitutedConstructor.returnType.unwrap().lowerIfFlexible().withAbbreviation(typeAliasDescriptor.defaultType) - val receiverParameterType = constructor.dispatchReceiverParameter?.let { - substitutorForUnderlyingClass.safeSubstitute(it.type, Variance.INVARIANT) + val receiverParameter = constructor.dispatchReceiverParameter?.let { + DescriptorFactory.createExtensionReceiverParameterForCallable( + typeAliasConstructor, + substitutorForUnderlyingClass.safeSubstitute(it.type, Variance.INVARIANT), + Annotations.EMPTY + ) } typeAliasConstructor.initialize( - receiverParameterType, + receiverParameter, null, typeAliasDescriptor.declaredTypeParameters, valueParameters, diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java index b919e4b10ea..2ca3ffc5c07 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java @@ -168,10 +168,11 @@ public class DescriptorFactory { @Nullable public static ReceiverParameterDescriptor createExtensionReceiverParameterForCallable( @NotNull CallableDescriptor owner, - @Nullable KotlinType receiverParameterType + @Nullable KotlinType receiverParameterType, + @NotNull Annotations annotations ) { return receiverParameterType == null ? null - : new ReceiverParameterDescriptorImpl(owner, new ExtensionReceiver(owner, receiverParameterType, null)); + : new ReceiverParameterDescriptorImpl(owner, new ExtensionReceiver(owner, receiverParameterType, null), annotations); } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java index 2004c5e75eb..d192374e049 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java @@ -123,7 +123,7 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI @NotNull @Override - public CopyBuilder setExtensionReceiverType(@Nullable KotlinType type) { + public CopyBuilder setExtensionReceiverParameter(@Nullable ReceiverParameterDescriptor extensionReceiverParameter) { return this; } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt index 45549d07888..66dae826ec2 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt @@ -154,7 +154,7 @@ class MemberDeserializer(private val c: DeserializationContext) { } private fun DeserializedSimpleFunctionDescriptor.initializeWithCoroutinesExperimentalityStatus( - receiverParameterType: KotlinType?, + extensionReceiverParameter: ReceiverParameterDescriptor?, dispatchReceiverParameter: ReceiverParameterDescriptor?, typeParameters: List, unsubstitutedValueParameters: List, @@ -165,7 +165,7 @@ class MemberDeserializer(private val c: DeserializationContext) { isSuspend: Boolean ) { initialize( - receiverParameterType, + extensionReceiverParameter, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, @@ -174,7 +174,7 @@ class MemberDeserializer(private val c: DeserializationContext) { visibility, userDataMap, computeExperimentalityModeForFunctions( - receiverParameterType, + extensionReceiverParameter, unsubstitutedValueParameters, typeParameters, unsubstitutedReturnType, @@ -184,7 +184,7 @@ class MemberDeserializer(private val c: DeserializationContext) { } private fun DeserializedCallableMemberDescriptor.computeExperimentalityModeForFunctions( - extensionReceiverType: KotlinType?, + extensionReceiverParameter: ReceiverParameterDescriptor?, parameters: Collection, typeParameters: Collection, returnType: KotlinType?, @@ -193,7 +193,7 @@ class MemberDeserializer(private val c: DeserializationContext) { if (!versionAndReleaseCoroutinesMismatch()) return CoroutinesCompatibilityMode.COMPATIBLE if (fqNameOrNull() == KOTLIN_SUSPEND_BUILT_IN_FUNCTION_FQ_NAME) return CoroutinesCompatibilityMode.COMPATIBLE - val types = parameters.map { it.type } + listOfNotNull(extensionReceiverType) + val types = parameters.map { it.type } + listOfNotNull(extensionReceiverParameter?.type) if (returnType?.containsSuspendFunctionType() == true) return CoroutinesCompatibilityMode.INCOMPATIBLE if (typeParameters.any { typeParameter -> typeParameter.upperBounds.any { it.containsSuspendFunctionType() } }) { @@ -252,7 +252,9 @@ class MemberDeserializer(private val c: DeserializationContext) { val local = c.childContext(function, proto.typeParameterList) function.initializeWithCoroutinesExperimentalityStatus( - proto.receiverType(c.typeTable)?.let { local.typeDeserializer.type(it, receiverAnnotations) }, + proto.receiverType(c.typeTable)?.let { local.typeDeserializer.type(it, receiverAnnotations) }?.let { receiverType -> + DescriptorFactory.createExtensionReceiverParameterForCallable(function, receiverType, Annotations.EMPTY) + }, getDispatchReceiverParameter(), local.typeDeserializer.ownTypeParameters, local.memberDeserializer.valueParameters(proto.valueParameterList, proto, AnnotatedCallableKind.FUNCTION), diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt index 06c2dcdb8e1..52cfc3de8e0 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt @@ -76,7 +76,7 @@ class DeserializedSimpleFunctionDescriptor( private set fun initialize( - receiverParameterType: KotlinType?, + extensionReceiverParameter: ReceiverParameterDescriptor?, dispatchReceiverParameter: ReceiverParameterDescriptor?, typeParameters: List, unsubstitutedValueParameters: List, @@ -87,7 +87,7 @@ class DeserializedSimpleFunctionDescriptor( isExperimentalCoroutineInReleaseEnvironment: DeserializedMemberDescriptor.CoroutinesCompatibilityMode ): SimpleFunctionDescriptorImpl { return super.initialize( - receiverParameterType, + extensionReceiverParameter, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt index 86fa3aceffc..7c74009c5ac 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt @@ -31,8 +31,8 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny -import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.core.ShortenReferences +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.load.java.NOT_NULL_ANNOTATIONS @@ -219,7 +219,7 @@ class ChangeMemberFunctionSignatureFix private constructor( return descriptor.apply { initialize( - function.extensionReceiverParameter?.type, function.dispatchReceiverParameter, + function.extensionReceiverParameter?.copy(this), function.dispatchReceiverParameter, function.typeParameters, parameters, function.returnType, function.modality, function.visibility ) isOperator = function.isOperator diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/ChangeMethodParameters.kt.183 b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/ChangeMethodParameters.kt.183 index 5890fc02762..e12c6b0396b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/ChangeMethodParameters.kt.183 +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/ChangeMethodParameters.kt.183 @@ -59,7 +59,7 @@ internal class ChangeMethodParameters( SourceElement.NO_SOURCE ).apply { initialize( - functionDescriptor.extensionReceiverParameter?.type, + functionDescriptor.extensionReceiverParameter?.copy(this), functionDescriptor.dispatchReceiverParameter, functionDescriptor.typeParameters, request.withIndex().map { (index, parameter) -> diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt index 0969af0785f..8b75323d320 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.source.PsiSourceElement @@ -46,8 +47,10 @@ internal fun genClearCacheFunction(packageFragmentDescriptor: PackageFragmentDes SourceElement.NO_SOURCE) {} val unitType = packageFragmentDescriptor.builtIns.unitType - function.initialize(receiverType, null, emptyList(), emptyList(), unitType, Modality.FINAL, Visibilities.PUBLIC) - return function + return function.initialize( + DescriptorFactory.createExtensionReceiverParameterForCallable(function, receiverType, Annotations.EMPTY), + null, emptyList(), emptyList(), unitType, Modality.FINAL, Visibilities.PUBLIC + ) } internal fun genPropertyForWidget(