From b0c5ea4717ac671c2c40d4d34f143b218f373c93 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 14 Sep 2021 23:47:26 +0200 Subject: [PATCH] JVM IR: remove dependencies of lowerings on codegen Move out utilities which are used both in lowerings and codegen to JvmIrUtils and JvmIrTypeUtils, and introduce new JvmIrCoroutineUtils and JvmIrInlineUtils (probably can be renamed or moved somewhere more appropriate in the future). --- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 2 +- .../jvm/lower/AddContinuationLowering.kt | 7 +- .../AdditionalClassAnnotationLowering.kt | 2 +- .../backend/jvm/lower/BridgeLowering.kt | 1 - .../BytecodeInliningPreparationLowering.kt | 3 +- .../jvm/lower/CollectionStubMethodLowering.kt | 2 +- .../FakeInliningLocalVariablesLowering.kt | 2 +- .../jvm/lower/GenerateMultifileFacades.kt | 2 +- ...nheritedDefaultMethodsOnClassesLowering.kt | 1 - .../lower/InlineCallableReferenceToLambda.kt | 2 +- .../backend/jvm/lower/InterfaceLowering.kt | 5 +- .../jvm/lower/JvmStaticAnnotationLowering.kt | 4 +- .../jvm/lower/ProcessOptionalAnnotations.kt | 4 +- .../PropertyReferenceDelegationLowering.kt | 2 +- .../jvm/lower/PropertyReferenceLowering.kt | 1 - .../backend/jvm/lower/ReflectiveAccess.kt | 3 +- .../jvm/lower/RepeatedAnnotationLowering.kt | 10 +- .../backend/jvm/lower/ResolveInlineCalls.kt | 2 +- .../jvm/lower/SuspendLambdaLowering.kt | 18 ++- .../jvm/lower/SyntheticAccessorLowering.kt | 6 +- .../backend/jvm/lower/ToArrayLowering.kt | 2 +- .../backend/jvm/lower/TypeOperatorLowering.kt | 2 - .../backend/jvm/JvmCachedDeclarations.kt | 2 +- .../jvm/MemoizedInlineClassReplacements.kt | 4 +- .../backend/jvm/codegen/AnnotationCodegen.kt | 33 +---- .../backend/jvm/codegen/CoroutineCodegen.kt | 90 ++---------- .../backend/jvm/codegen/ExpressionCodegen.kt | 4 +- .../backend/jvm/codegen/FunctionCodegen.kt | 2 + .../backend/jvm/codegen/IrInlineCodegen.kt | 26 +--- .../jvm/codegen/IrSourceCompilerForInline.kt | 2 + .../backend/jvm/codegen/irCodegenUtils.kt | 53 +------ .../kotlin/backend/jvm/intrinsics/AndAnd.kt | 3 +- .../backend/jvm/intrinsics/CompareTo.kt | 2 +- .../kotlin/backend/jvm/intrinsics/Equals.kt | 2 +- .../jvm/intrinsics/IrIntrinsicFunction.kt | 5 - .../intrinsics/JvmDebuggerInvokeSpecial.kt | 23 +--- .../jvm/intrinsics/JvmInvokeDynamic.kt | 35 +---- .../kotlin/backend/jvm/intrinsics/OrOr.kt | 3 +- .../kotlin/backend/jvm/intrinsics/TypeOf.kt | 2 +- .../jvm/ir/IrInlineReferenceLocator.kt | 2 - .../backend/jvm/ir/JvmIrCoroutineUtils.kt | 94 +++++++++++++ .../kotlin/backend/jvm/ir/JvmIrInlineUtils.kt | 90 ++++++++++++ .../kotlin/backend/jvm/ir/JvmIrTypeUtils.kt | 1 - .../kotlin/backend/jvm/ir/JvmIrUtils.kt | 130 +++++++++++------- .../android/parcel/ir/IrParcelSerializers.kt | 2 +- .../parcelize/ir/IrParcelSerializers.kt | 2 +- 46 files changed, 348 insertions(+), 347 deletions(-) create mode 100644 compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrCoroutineUtils.kt create mode 100644 compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrInlineUtils.kt diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index dd30a8abcf2..6594af50264 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -11,8 +11,8 @@ import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.common.lower.loops.forLoopsPhase import org.jetbrains.kotlin.backend.common.lower.optimizations.foldConstantLoweringPhase import org.jetbrains.kotlin.backend.common.phaser.* -import org.jetbrains.kotlin.backend.jvm.codegen.shouldContainSuspendMarkers import org.jetbrains.kotlin.backend.jvm.ir.constantValue +import org.jetbrains.kotlin.backend.jvm.ir.shouldContainSuspendMarkers import org.jetbrains.kotlin.backend.jvm.lower.* import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibility diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt index 0535c9c01ec..7c738da1489 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt @@ -16,12 +16,7 @@ import org.jetbrains.kotlin.backend.common.push import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.continuationParameter -import org.jetbrains.kotlin.backend.jvm.codegen.hasContinuation -import org.jetbrains.kotlin.backend.jvm.codegen.isInvokeSuspendOfContinuation -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface -import org.jetbrains.kotlin.backend.jvm.ir.defaultValue -import org.jetbrains.kotlin.backend.jvm.ir.suspendFunctionOriginal +import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.backend.jvm.localDeclarationsPhase import org.jetbrains.kotlin.codegen.coroutines.* import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt index 838a9247ce2..22976f25974 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.getAnnotationRetention +import org.jetbrains.kotlin.backend.jvm.ir.getAnnotationRetention import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index 872a768cc4f..5db0e80d916 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.SpecialBridge -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.descriptors.DescriptorVisibilities diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BytecodeInliningPreparationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BytecodeInliningPreparationLowering.kt index 198c8ff61c9..0b7d85c6d1c 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BytecodeInliningPreparationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BytecodeInliningPreparationLowering.kt @@ -9,7 +9,8 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName +import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.expressions.IrLoop import org.jetbrains.kotlin.ir.visitors.IrElementVisitor diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt index 19189815dd7..bcd0e4d372d 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.caches.StubsForCollectionClass -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesLowering.kt index 9d59a6fd940..784dccdd3f2 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesLowering.kt @@ -9,8 +9,8 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.isInlineOnly import org.jetbrains.kotlin.backend.jvm.ir.IrInlineReferenceLocator +import org.jetbrains.kotlin.backend.jvm.ir.isInlineOnly import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.ir.builders.createTmpVariable import org.jetbrains.kotlin.ir.builders.irBlockBody diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt index 51bfd5af7f5..99b0869be75 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.backend.common.phaser.makeCustomPhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.MultifileFacadeFileEntry -import org.jetbrains.kotlin.backend.jvm.codegen.fileParent +import org.jetbrains.kotlin.backend.jvm.ir.fileParent import org.jetbrains.kotlin.backend.jvm.ir.getKtFile import org.jetbrains.kotlin.backend.jvm.isMultifileBridge import org.jetbrains.kotlin.config.JvmAnalysisFlags diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt index f7558a7a4a4..5059250bdde 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.config.JvmDefaultMode diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InlineCallableReferenceToLambda.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InlineCallableReferenceToLambda.kt index 6f267372056..96e933dffa7 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InlineCallableReferenceToLambda.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InlineCallableReferenceToLambda.kt @@ -11,9 +11,9 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.isInlineFunctionCall import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder import org.jetbrains.kotlin.backend.jvm.ir.irArray +import org.jetbrains.kotlin.backend.jvm.ir.isInlineFunctionCall import org.jetbrains.kotlin.backend.jvm.ir.isInlineParameter import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.IrElement diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt index a36da7c132a..cb525af0902 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt @@ -10,20 +10,17 @@ import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny import org.jetbrains.kotlin.backend.common.ir.moveBodyTo import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.DescriptorVisibilities -import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionReference import org.jetbrains.kotlin.ir.expressions.IrReturn import org.jetbrains.kotlin.ir.expressions.impl.* -import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.util.* diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt index 63e09c7d733..2d75c71e22a 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt @@ -12,8 +12,8 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.CachedFieldsForObjectInstances import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.isEffectivelyInlineOnly -import org.jetbrains.kotlin.backend.jvm.codegen.isInlineFunctionCall +import org.jetbrains.kotlin.backend.jvm.ir.isEffectivelyInlineOnly +import org.jetbrains.kotlin.backend.jvm.ir.isInlineFunctionCall import org.jetbrains.kotlin.backend.jvm.ir.replaceThisByStaticReference import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.IrBuiltIns diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotations.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotations.kt index ddd2e4b26cf..df80d535fba 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotations.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotations.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.isOptionalAnnotationClass +import org.jetbrains.kotlin.backend.jvm.ir.isOptionalAnnotationClass import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFile @@ -22,7 +22,7 @@ internal val processOptionalAnnotationsPhase = makeIrModulePhase( class ProcessOptionalAnnotations(private val context: JvmBackendContext) : FileLoweringPass { override fun lower(irFile: IrFile) { for (declaration in irFile.declarations) { - if (declaration !is IrClass || !declaration.isOptionalAnnotationClass()) continue + if (declaration !is IrClass || !declaration.isOptionalAnnotationClass) continue // TODO FirMetadataSource.Class val metadataSource = (declaration.metadata as? DescriptorMetadataSource.Class)?.descriptor ?: continue context.state.factory.packagePartRegistry.optionalAnnotations += metadataSource diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceDelegationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceDelegationLowering.kt index 85a617895dd..752642717b5 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceDelegationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceDelegationLowering.kt @@ -10,8 +10,8 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.parents import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.fileParent import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder +import org.jetbrains.kotlin.backend.jvm.ir.fileParent import org.jetbrains.kotlin.backend.jvm.lower.JvmPropertiesLowering.Companion.createSyntheticMethodForPropertyDelegate import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.Modality diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt index 14c98264c4d..5685fc8fdc1 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclaration import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.* -import org.jetbrains.kotlin.backend.jvm.codegen.parentClassId import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.backend.jvm.lower.FunctionReferenceLowering.Companion.calculateOwner import org.jetbrains.kotlin.backend.jvm.lower.FunctionReferenceLowering.Companion.calculateOwnerKClass diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt index 41a16dbfe69..e1e0a3b1b64 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt @@ -9,11 +9,10 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.JvmReflectSymbols -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.IrInlineScopeResolver import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder import org.jetbrains.kotlin.backend.jvm.ir.findInlineCallSites +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface import org.jetbrains.kotlin.backend.jvm.lower.SyntheticAccessorLowering.Companion.isAccessible import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.IrFile diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/RepeatedAnnotationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/RepeatedAnnotationLowering.kt index 9ef8e38c1b5..6170ac0136d 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/RepeatedAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/RepeatedAnnotationLowering.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.AnnotationCodegen.Companion.annotationClass import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.ir.IrElement @@ -22,10 +21,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.typeWith -import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.hasAnnotation -import org.jetbrains.kotlin.ir.util.isAnnotation -import org.jetbrains.kotlin.ir.util.primaryConstructor +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -69,12 +65,12 @@ class RepeatedAnnotationLowering(private val context: JvmBackendContext) : FileL private fun transformAnnotations(annotations: List): List { if (annotations.size < 2) return annotations - val annotationsByClass = annotations.groupByTo(mutableMapOf()) { it.annotationClass } + val annotationsByClass = annotations.groupByTo(mutableMapOf()) { it.symbol.owner.constructedClass } if (annotationsByClass.values.none { it.size > 1 }) return annotations val result = mutableListOf() for (annotation in annotations) { - val annotationClass = annotation.annotationClass + val annotationClass = annotation.symbol.owner.constructedClass val grouped = annotationsByClass.remove(annotationClass) ?: continue if (grouped.size < 2) { result.add(grouped.single()) diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt index 47b84a47b65..ff3a59d7874 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.isInlineFunctionCall +import org.jetbrains.kotlin.backend.jvm.ir.isInlineFunctionCall import org.jetbrains.kotlin.backend.jvm.isMultifileBridge import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFunction diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLowering.kt index 66740d1af87..960504629a1 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLowering.kt @@ -7,15 +7,18 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext -import org.jetbrains.kotlin.backend.common.ir.* +import org.jetbrains.kotlin.backend.common.ir.copyTo +import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor +import org.jetbrains.kotlin.backend.common.ir.isSuspend +import org.jetbrains.kotlin.backend.common.ir.moveBodyTo import org.jetbrains.kotlin.backend.common.lower.LocalDeclarationsLowering import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.parents import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.isReadOfCrossinline import org.jetbrains.kotlin.backend.jvm.ir.hasChild +import org.jetbrains.kotlin.backend.jvm.ir.isReadOfCrossinline import org.jetbrains.kotlin.codegen.coroutines.COROUTINE_LABEL_FIELD_NAME import org.jetbrains.kotlin.codegen.coroutines.INVOKE_SUSPEND_METHOD_NAME import org.jetbrains.kotlin.codegen.coroutines.SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME @@ -28,18 +31,25 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.* import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.expressions.IrBlock +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrFunctionReference +import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.ir.visitors.* +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid +import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.org.objectweb.asm.Type +import kotlin.collections.set internal val suspendLambdaPhase = makeIrFilePhase( ::SuspendLambdaLowering, diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index daf3db0f735..7fe93cca1e8 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -12,12 +12,8 @@ import org.jetbrains.kotlin.backend.common.descriptors.synthesizedString import org.jetbrains.kotlin.backend.common.ir.* import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.hasMangledParameters -import org.jetbrains.kotlin.backend.jvm.intrinsics.receiverAndArgs -import org.jetbrains.kotlin.backend.jvm.ir.IrInlineScopeResolver -import org.jetbrains.kotlin.backend.jvm.ir.findInlineCallSites -import org.jetbrains.kotlin.backend.jvm.ir.isAssertionsDisabledField +import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibility diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt index e5a653ef204..1a7909c0c63 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.builders.declarations.addDispatchReceiver diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt index c6ebf70f43f..07cce1972a8 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt @@ -16,9 +16,7 @@ import org.jetbrains.kotlin.backend.common.pop import org.jetbrains.kotlin.backend.common.push import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.fileParent import org.jetbrains.kotlin.backend.jvm.intrinsics.generateMethodHandle -import org.jetbrains.kotlin.backend.jvm.intrinsics.getBooleanConstArgument import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.backend.jvm.unboxInlineClass import org.jetbrains.kotlin.descriptors.DescriptorVisibilities diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt index 478bb3f7d6b..fab7fc2361a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt @@ -8,9 +8,9 @@ package org.jetbrains.kotlin.backend.jvm import org.jetbrains.kotlin.backend.common.ir.* import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.jvm.codegen.AnnotationCodegen.Companion.annotationClass -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.copyCorrespondingPropertyFrom import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.replaceThisByStaticReference import org.jetbrains.kotlin.builtins.CompanionObjectMapping import org.jetbrains.kotlin.builtins.StandardNames diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt index e9ebba259ad..f929bc1e666 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt @@ -11,10 +11,10 @@ import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom import org.jetbrains.kotlin.backend.common.ir.createDispatchReceiverParameter import org.jetbrains.kotlin.backend.jvm.codegen.classFileContainsMethod import org.jetbrains.kotlin.backend.jvm.codegen.extensionReceiverName -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface -import org.jetbrains.kotlin.backend.jvm.codegen.parentClassId import org.jetbrains.kotlin.backend.jvm.ir.isCompiledToJvmDefault +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.isStaticInlineClassReplacement +import org.jetbrains.kotlin.backend.jvm.ir.parentClassId import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt index 99b32477051..99096e7be2c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt @@ -22,16 +22,13 @@ import org.jetbrains.kotlin.backend.common.ir.ir2string import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.JvmSymbols -import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound -import org.jetbrains.kotlin.backend.jvm.ir.isInlineClassType -import org.jetbrains.kotlin.backend.jvm.ir.isWithFlexibleNullability +import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.TypeAnnotationCollector import org.jetbrains.kotlin.codegen.TypePathInfo import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.JvmTarget.JVM_1_6 -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget @@ -39,12 +36,10 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol import org.jetbrains.kotlin.ir.types.* -import org.jetbrains.kotlin.ir.types.impl.buildSimpleType import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.org.objectweb.asm.AnnotationVisitor @@ -198,9 +193,7 @@ abstract class AnnotationCodegen( // We do not generate annotations whose classes are optional (annotated with `@OptionalExpectation`) because if an annotation entry // is resolved to the expected declaration, this means that annotation has no actual class, and thus should not be generated. // (Otherwise we would've resolved the entry to the actual annotation class.) - if (annotationClass.isOptionalAnnotationClass) { - return null - } + if (annotationClass.isOptionalAnnotationClass) return null innerClassConsumer.addInnerClassInfoFromAnnotation(annotationClass) @@ -450,22 +443,6 @@ private fun isBareTypeParameterWithNullableUpperBound(type: IrType): Boolean { return type.classifierOrNull?.owner is IrTypeParameter && !type.isMarkedNullable() && type.isNullable() } -private val RETENTION_PARAMETER_NAME = Name.identifier("value") - -fun IrClass.getAnnotationRetention(): KotlinRetention? { - val retentionArgument = - getAnnotation(StandardNames.FqNames.retention)?.getValueArgument(RETENTION_PARAMETER_NAME) - as? IrGetEnumValue ?: return null - val retentionArgumentValue = retentionArgument.symbol.owner - return KotlinRetention.valueOf(retentionArgumentValue.name.asString()) -} - -// To be generalized to IrMemberAccessExpression as soon as properties get symbols. -private fun IrConstructorCall.getValueArgument(name: Name): IrExpression? { - val index = symbol.owner.valueParameters.find { it.name == name }?.index ?: return null - return getValueArgument(index) -} - // Copied and modified from AnnotationChecker.kt private val TARGET_ALLOWED_TARGETS = Name.identifier("allowedTargets") @@ -482,9 +459,3 @@ private fun loadAnnotationTargets(targetEntry: IrConstructorCall): Set dispatchReceiverParameter - else -> valueParameters.singleOrNull { it.origin == JvmLoweredDeclarationOrigin.CONTINUATION_CLASS } -} - -internal fun IrFunction.isInvokeSuspendOfLambda(): Boolean = - name.asString() == INVOKE_SUSPEND_METHOD_NAME && parentAsClass.origin == JvmLoweredDeclarationOrigin.SUSPEND_LAMBDA - -private fun IrFunction.isInvokeSuspendForInlineOfLambda(): Boolean = - origin == JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE - && parentAsClass.origin == JvmLoweredDeclarationOrigin.SUSPEND_LAMBDA - -fun IrFunction.isInvokeSuspendOfContinuation(): Boolean = - name.asString() == INVOKE_SUSPEND_METHOD_NAME && parentAsClass.origin == JvmLoweredDeclarationOrigin.CONTINUATION_CLASS - -private fun IrFunction.isInvokeOfSuspendCallableReference(): Boolean = - isSuspend && name.asString().let { name -> name == "invoke" || name.startsWith("invoke-") } - && parentAsClass.origin == JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL - -private fun IrFunction.isBridgeToSuspendImplMethod(): Boolean = - isSuspend && this is IrSimpleFunction && parentAsClass.functions.any { - it.name.asString() == name.asString() + SUSPEND_IMPL_NAME_SUFFIX && it.attributeOwnerId == attributeOwnerId - } - -private fun IrFunction.isStaticInlineClassReplacementDelegatingCall(): Boolean = - this is IrAttributeContainer && !isStaticInlineClassReplacement && - (parent as? IrClass)?.declarations?.find { it is IrAttributeContainer && it.attributeOwnerId == attributeOwnerId && it !== this } - ?.isStaticInlineClassReplacement == true - -private val BRIDGE_ORIGINS = setOf( - IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, - JvmLoweredDeclarationOrigin.JVM_STATIC_WRAPPER, - JvmLoweredDeclarationOrigin.JVM_OVERLOADS_WRAPPER, - JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR, - JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR_FOR_HIDDEN_CONSTRUCTOR, - JvmLoweredDeclarationOrigin.SUPER_INTERFACE_METHOD_BRIDGE, - IrDeclarationOrigin.BRIDGE, - IrDeclarationOrigin.BRIDGE_SPECIAL, -) - -// These functions contain a single `suspend` tail call, the value of which should be returned as is -// (i.e. if it's an unboxed inline class value, it should remain unboxed). -internal fun IrFunction.isNonBoxingSuspendDelegation(): Boolean = - origin in BRIDGE_ORIGINS || - isMultifileBridge() || - isBridgeToSuspendImplMethod() || - isStaticInlineClassReplacementForDefaultInterfaceMethod() - -// Suspend static inline class replacements for fake overrides have to be for interface methods as inline classes cannot have a -// non-Object super type. -fun IrFunction.isStaticInlineClassReplacementForDefaultInterfaceMethod(): Boolean = - isStaticInlineClassReplacement && this is IrSimpleFunction && (attributeOwnerId as IrSimpleFunction).isFakeOverride - -fun IrFunction.shouldContainSuspendMarkers(): Boolean = !isNonBoxingSuspendDelegation() && - // These functions also contain a single `suspend` tail call, but if it returns an unboxed inline class value, - // the return of it should be checked for a suspension and potentially boxed to satisfy an interface. - origin != IrDeclarationOrigin.DELEGATED_MEMBER && - !isInvokeSuspendOfContinuation() && - !isInvokeOfSuspendCallableReference() && - !isStaticInlineClassReplacementDelegatingCall() - -fun IrFunction.hasContinuation(): Boolean = isInvokeSuspendOfLambda() || - isSuspend && shouldContainSuspendMarkers() && - // These are templates for the inliner; the continuation is borrowed from the caller method. - !isEffectivelyInlineOnly() && - origin != JvmLoweredDeclarationOrigin.INLINE_LAMBDA && - origin != JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE && - origin != JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE_CAPTURES_CROSSINLINE - -fun IrExpression?.isReadOfCrossinline(): Boolean = when (this) { - is IrGetValue -> (symbol.owner as? IrValueParameter)?.isCrossinline == true - is IrGetField -> symbol.owner.origin == LocalDeclarationsLowering.DECLARATION_ORIGIN_FIELD_FOR_CROSSINLINE_CAPTURED_VALUE - else -> false -} - internal fun IrExpression?.isReadOfInlineLambda(): Boolean = isReadOfCrossinline() || (this is IrGetValue && origin == IrStatementOrigin.VARIABLE_AS_FUNCTION && (symbol.owner as? IrValueParameter)?.isNoinline == false) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index cbdbb67b9f9..71d14b5f5b8 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -10,9 +10,7 @@ import org.jetbrains.kotlin.backend.common.lower.LoweredStatementOrigins import org.jetbrains.kotlin.backend.jvm.* import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods import org.jetbrains.kotlin.backend.jvm.intrinsics.JavaClassProperty -import org.jetbrains.kotlin.backend.jvm.ir.constantValue -import org.jetbrains.kotlin.backend.jvm.ir.eraseTypeParameters -import org.jetbrains.kotlin.backend.jvm.ir.isInlineClassType +import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.AsmUtil.* diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index d0fd2e8779d..6dc0f6cdc66 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -11,6 +11,8 @@ import org.jetbrains.kotlin.backend.common.lower.BOUND_RECEIVER_PARAMETER import org.jetbrains.kotlin.backend.common.lower.BOUND_VALUE_PARAMETER import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface +import org.jetbrains.kotlin.backend.jvm.ir.isReifiable import org.jetbrains.kotlin.backend.jvm.ir.suspendFunctionOriginal import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.inline.* diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt index 1e267652497..8dd24a3da9f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt @@ -5,24 +5,25 @@ package org.jetbrains.kotlin.backend.jvm.codegen -import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin +import org.jetbrains.kotlin.backend.jvm.ir.isInlineOnly import org.jetbrains.kotlin.backend.jvm.ir.isInlineParameter +import org.jetbrains.kotlin.backend.jvm.ir.unwrapInlineLambda import org.jetbrains.kotlin.codegen.IrExpressionLambda import org.jetbrains.kotlin.codegen.JvmKotlinType import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.ValueKind import org.jetbrains.kotlin.codegen.inline.* import org.jetbrains.kotlin.codegen.state.GenerationState -import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.descriptors.toIrBasedKotlinType import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.dump +import org.jetbrains.kotlin.ir.util.explicitParameters +import org.jetbrains.kotlin.ir.util.getArgumentsWithIr +import org.jetbrains.kotlin.ir.util.isSuspendFunction import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.types.KotlinType @@ -213,18 +214,3 @@ class IrExpressionLambdaImpl( invokeMethodReturnType = (unboxedReturnType ?: function.returnType).toIrBasedKotlinType() } } - -fun IrStatement.unwrapInlineLambda(): IrFunctionReference? = when (this) { - is IrBlock -> statements.lastOrNull()?.unwrapInlineLambda() - is IrFunctionReference -> takeIf { it.origin == JvmLoweredStatementOrigin.INLINE_LAMBDA } - else -> null -} - -fun IrFunction.isInlineFunctionCall(context: JvmBackendContext) = - (!context.state.isInlineDisabled || typeParameters.any { it.isReified }) && (isInline || isInlineArrayConstructor(context)) - -// Constructors can't be marked as inline in metadata, hence this hack. -private fun IrFunction.isInlineArrayConstructor(context: JvmBackendContext): Boolean = - this is IrConstructor && valueParameters.size == 2 && constructedClass.symbol.let { - it == context.irBuiltIns.arrayClass || it in context.irBuiltIns.primitiveArraysToPrimitiveTypes - } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt index 4d8e77ee8b1..3c2f26435c7 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt @@ -9,8 +9,10 @@ import com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.backend.common.ir.ir2string import org.jetbrains.kotlin.backend.jvm.hasMangledReturnType +import org.jetbrains.kotlin.backend.jvm.ir.fileParent import org.jetbrains.kotlin.backend.jvm.ir.getKtFile import org.jetbrains.kotlin.backend.jvm.ir.inlineScopeVisibility +import org.jetbrains.kotlin.backend.jvm.ir.parentClassId import org.jetbrains.kotlin.codegen.inline.* import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.diagnostics.DiagnosticUtils diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt index 70d12aad248..054a5baf904 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt @@ -12,6 +12,10 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.JvmSymbols import org.jetbrains.kotlin.backend.jvm.MultifileFacadeFileEntry +import org.jetbrains.kotlin.backend.jvm.ir.fileParent +import org.jetbrains.kotlin.backend.jvm.ir.isInlineOnly +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface +import org.jetbrains.kotlin.backend.jvm.ir.isPrivateInlineSuspend import org.jetbrains.kotlin.builtins.StandardNames.FqNames import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.codegen.* @@ -33,13 +37,10 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.getClass import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities -import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmClassSignature -import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -75,16 +76,6 @@ fun IrFrameMap.leave(irDeclaration: IrSymbolOwner): Int { return leave(irDeclaration.symbol) } -val IrClass.isJvmInterface get() = isAnnotationClass || isInterface - -val IrDeclaration.fileParent: IrFile - get() { - return when (val myParent = parent) { - is IrFile -> myParent - else -> (myParent as IrDeclaration).fileParent - } - } - internal val DeclarationDescriptorWithSource.psiElement: PsiElement? get() = (source as? PsiSourceElement)?.psi @@ -214,30 +205,15 @@ private fun IrDeclarationWithVisibility.specialCaseVisibility(kind: OwnerKind?): return null } -/* Borrowed from InlineUtil. */ private tailrec fun isInlineOrContainedInInline(declaration: IrDeclaration?): Boolean = when { declaration === null -> false declaration is IrFunction && declaration.isInline -> true else -> isInlineOrContainedInInline(declaration.parent as? IrDeclaration) } -/* Borrowed from inlineOnly.kt */ - -fun IrDeclarationWithVisibility.isEffectivelyInlineOnly(): Boolean = - this is IrFunction && (isReifiable() || isInlineOnly() || isPrivateInlineSuspend()) - private fun IrDeclarationWithVisibility.isInlineOnlyPrivateInBytecode(): Boolean = this is IrFunction && (isInlineOnly() || isPrivateInlineSuspend()) -private fun IrFunction.isPrivateInlineSuspend(): Boolean = - isSuspend && isInline && visibility == DescriptorVisibilities.PRIVATE - -fun IrFunction.isInlineOnly() = - (isInline && hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME)) || - (this is IrSimpleFunction && correspondingPropertySymbol?.owner?.hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME) == true) - -fun IrFunction.isReifiable() = typeParameters.any { it.isReified } - internal fun IrFunction.isBridge() = origin == IrDeclarationOrigin.BRIDGE || origin == IrDeclarationOrigin.BRIDGE_SPECIAL // Borrowed with modifications from ImplementationBodyCodegen.java @@ -322,12 +298,6 @@ fun IrClass.getVisibilityAccessFlagForClass(): Int { } else AsmUtil.NO_FLAG_PACKAGE_PRIVATE } -/* Borrowed and translated from ExpectedActualDeclarationChecker */ -// TODO: Descriptor-based code also checks for `descriptor.isExpect`; we don't represent expect/actual distinction in IR thus far. -fun IrClass.isOptionalAnnotationClass(): Boolean = - isAnnotationClass && - hasAnnotation(OptionalAnnotationUtil.OPTIONAL_EXPECTATION_FQ_NAME) - val IrDeclaration.isAnnotatedWithDeprecated: Boolean get() = annotations.hasAnnotation(FqNames.deprecated) @@ -382,18 +352,3 @@ internal fun classFileContainsMethod(classId: ClassId, function: IrFunction, con else originalDescriptor return classFileContainsMethod(classId, context.state, Method(originalSignature.name, descriptor)) } - -val IrMemberWithContainerSource.parentClassId: ClassId? - get() = ((this as? IrSimpleFunction)?.correspondingPropertySymbol?.owner ?: this).let { directMember -> - (directMember.containerSource as? JvmPackagePartSource)?.classId ?: (directMember.parent as? IrClass)?.classId - } - -// Translated into IR-based terms from classifierDescriptor?.classId -private val IrClass.classId: ClassId? - get() = when (val parent = parent) { - is IrExternalPackageFragment -> ClassId(parent.fqName, name) - // TODO: there's `context.classNameOverride`; theoretically it's only relevant for top-level members, - // where `containerSource` is a `JvmPackagePartSource` anyway, but I'm not 100% sure. - is IrClass -> parent.classId?.createNestedClassId(name) - else -> null - } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/AndAnd.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/AndAnd.kt index d045cd8f3fb..8b0bfc932dc 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/AndAnd.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/AndAnd.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.codegen.* +import org.jetbrains.kotlin.backend.jvm.ir.receiverAndArgs import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.org.objectweb.asm.Label @@ -39,4 +40,4 @@ object AndAnd : IntrinsicMethod() { val (left, right) = expression.receiverAndArgs() return BooleanConjunction(left, right, codegen, data) } -} \ No newline at end of file +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt index 7541e7bf62a..bdf41734e32 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt @@ -20,6 +20,7 @@ import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.codegen.* import org.jetbrains.kotlin.backend.jvm.ir.isSmartcastFromHigherThanNullable +import org.jetbrains.kotlin.backend.jvm.ir.receiverAndArgs import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil.comparisonOperandType @@ -207,4 +208,3 @@ class PrimitiveComparison( } } } - diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt index 42c07ddccdd..be49216baab 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt @@ -9,6 +9,7 @@ import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.codegen.* import org.jetbrains.kotlin.backend.jvm.ir.isSmartcastFromHigherThanNullable +import org.jetbrains.kotlin.backend.jvm.ir.receiverAndArgs import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genAreEqualCall @@ -183,4 +184,3 @@ class Ieee754Equals(val operandType: Type) : IntrinsicMethod() { } } } - diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt index f52d7d385dc..2331684925b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt @@ -155,8 +155,3 @@ fun IrFunctionAccessExpression.argTypes(context: JvmBackendContext): ArrayList { - return (arrayListOf(this.dispatchReceiver, this.extensionReceiver) + - symbol.owner.valueParameters.mapIndexed { i, _ -> getValueArgument(i) }).filterNotNull() -} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmDebuggerInvokeSpecial.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmDebuggerInvokeSpecial.kt index e7653fa2eea..4835698752e 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmDebuggerInvokeSpecial.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmDebuggerInvokeSpecial.kt @@ -6,11 +6,9 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.codegen.* -import org.jetbrains.kotlin.ir.expressions.IrConst -import org.jetbrains.kotlin.ir.expressions.IrConstKind -import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.backend.jvm.ir.getBooleanConstArgument +import org.jetbrains.kotlin.backend.jvm.ir.getStringConstArgument import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression -import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.org.objectweb.asm.Type // This intrinsic enables IR lowerings to force the generation of a particular @@ -29,21 +27,14 @@ import org.jetbrains.org.objectweb.asm.Type // lowerings in between. object JvmDebuggerInvokeSpecial : IntrinsicMethod() { override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue { - fun fail(message: String): Nothing = - throw AssertionError("$message; expression:\n${expression.dump()}") - - val owner = expression.getValueArgument(0)?.getStringConst() - ?: fail("'owner' is expected to be a string const") - val name = expression.getValueArgument(1)?.getStringConst() - ?: fail("'name' is expected to be a string const") - val descriptor = expression.getValueArgument(2)?.getStringConst() - ?: fail("'descriptor' is expected to be a string const") - val isInterface = expression.getValueArgument(3)?.getBooleanConst() - ?: fail("'isInterface' is expected to be a boolean const") + val owner = expression.getStringConstArgument(0) + val name = expression.getStringConstArgument(1) + val descriptor = expression.getStringConstArgument(2) + val isInterface = expression.getBooleanConstArgument(3) expression.dispatchReceiver!!.accept(codegen, data).materialize() codegen.mv.invokespecial(owner, name, descriptor, isInterface) return MaterialValue(codegen, Type.getReturnType(descriptor), expression.type) } -} \ No newline at end of file +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmInvokeDynamic.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmInvokeDynamic.kt index 8b941bdb13b..e1da19f435c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmInvokeDynamic.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmInvokeDynamic.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.codegen.* -import org.jetbrains.kotlin.backend.jvm.ir.findSuperDeclaration +import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrFunction @@ -130,37 +130,6 @@ object JvmInvokeDynamic : IntrinsicMethod() { } -fun IrCall.getIntConstArgument(i: Int) = - getValueArgument(i)?.getIntConst() - ?: throw AssertionError("Value argument #$i should be an Int const: ${dump()}") - -fun IrCall.getStringConstArgument(i: Int) = - getValueArgument(i)?.getStringConst() - ?: throw AssertionError("Value argument #$i should be a String const: ${dump()}") - -fun IrCall.getBooleanConstArgument(i: Int) = - getValueArgument(i)?.getBooleanConst() - ?: throw AssertionError("Value argument #$i should be a Boolean const: ${dump()}") - - -internal fun IrExpression.getIntConst() = - if (this is IrConst<*> && kind == IrConstKind.Int) - this.value as Int - else - null - -internal fun IrExpression.getStringConst() = - if (this is IrConst<*> && kind == IrConstKind.String) - this.value as String - else - null - -internal fun IrExpression.getBooleanConst() = - if (this is IrConst<*> && kind == IrConstKind.Boolean) - this.value as Boolean - else - null - internal fun generateMethodHandle(jvmBackendContext: JvmBackendContext, irRawFunctionReference: IrRawFunctionReference): Handle { return generateMethodHandle(jvmBackendContext, irRawFunctionReference.symbol.owner) } @@ -198,5 +167,3 @@ internal fun getMethodKindTag(irFun: IrFunction) = else -> Opcodes.H_INVOKEVIRTUAL } - - diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/OrOr.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/OrOr.kt index fb1df3b2c2c..972142e2010 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/OrOr.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/OrOr.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.codegen.* +import org.jetbrains.kotlin.backend.jvm.ir.receiverAndArgs import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.org.objectweb.asm.Label @@ -40,4 +41,4 @@ object OrOr : IntrinsicMethod() { val (left, right) = expression.receiverAndArgs() return BooleanDisjunction(left, right, codegen, data) } -} \ No newline at end of file +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/TypeOf.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/TypeOf.kt index 2aad0a23d30..3c2f4a84910 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/TypeOf.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/TypeOf.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.codegen.BlockInfo import org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen import org.jetbrains.kotlin.backend.jvm.codegen.IrInlineIntrinsicsSupport -import org.jetbrains.kotlin.backend.jvm.codegen.fileParent +import org.jetbrains.kotlin.backend.jvm.ir.fileParent import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner import org.jetbrains.kotlin.codegen.inline.generateTypeOf import org.jetbrains.kotlin.codegen.putReifiedOperationMarkerIfTypeIsReifiedParameter diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrInlineReferenceLocator.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrInlineReferenceLocator.kt index bd2c88feba4..457578730e4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrInlineReferenceLocator.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrInlineReferenceLocator.kt @@ -6,8 +6,6 @@ package org.jetbrains.kotlin.backend.jvm.ir import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.isInlineFunctionCall -import org.jetbrains.kotlin.backend.jvm.codegen.unwrapInlineLambda import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrCoroutineUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrCoroutineUtils.kt new file mode 100644 index 00000000000..918f4151faa --- /dev/null +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrCoroutineUtils.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.jvm.ir + +import org.jetbrains.kotlin.backend.common.lower.LocalDeclarationsLowering +import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin +import org.jetbrains.kotlin.backend.jvm.isMultifileBridge +import org.jetbrains.kotlin.codegen.coroutines.INVOKE_SUSPEND_METHOD_NAME +import org.jetbrains.kotlin.codegen.coroutines.SUSPEND_IMPL_NAME_SUFFIX +import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrGetField +import org.jetbrains.kotlin.ir.expressions.IrGetValue +import org.jetbrains.kotlin.ir.util.functions +import org.jetbrains.kotlin.ir.util.isSuspend +import org.jetbrains.kotlin.ir.util.parentAsClass + +fun IrFunction.continuationParameter(): IrValueParameter? = when { + isInvokeSuspendOfLambda() || isInvokeSuspendForInlineOfLambda() -> dispatchReceiverParameter + else -> valueParameters.singleOrNull { it.origin == JvmLoweredDeclarationOrigin.CONTINUATION_CLASS } +} + +internal fun IrFunction.isInvokeSuspendOfLambda(): Boolean = + name.asString() == INVOKE_SUSPEND_METHOD_NAME && parentAsClass.origin == JvmLoweredDeclarationOrigin.SUSPEND_LAMBDA + +private fun IrFunction.isInvokeSuspendForInlineOfLambda(): Boolean = + origin == JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE + && parentAsClass.origin == JvmLoweredDeclarationOrigin.SUSPEND_LAMBDA + +fun IrFunction.isInvokeSuspendOfContinuation(): Boolean = + name.asString() == INVOKE_SUSPEND_METHOD_NAME && parentAsClass.origin == JvmLoweredDeclarationOrigin.CONTINUATION_CLASS + +private fun IrFunction.isInvokeOfSuspendCallableReference(): Boolean = + isSuspend && name.asString().let { name -> name == "invoke" || name.startsWith("invoke-") } + && parentAsClass.origin == JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL + +private fun IrFunction.isBridgeToSuspendImplMethod(): Boolean = + isSuspend && this is IrSimpleFunction && parentAsClass.functions.any { + it.name.asString() == name.asString() + SUSPEND_IMPL_NAME_SUFFIX && it.attributeOwnerId == attributeOwnerId + } + +private fun IrFunction.isStaticInlineClassReplacementDelegatingCall(): Boolean = + this is IrAttributeContainer && !isStaticInlineClassReplacement && + (parent as? IrClass)?.declarations?.find { it is IrAttributeContainer && it.attributeOwnerId == attributeOwnerId && it !== this } + ?.isStaticInlineClassReplacement == true + +private val BRIDGE_ORIGINS = setOf( + IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, + JvmLoweredDeclarationOrigin.JVM_STATIC_WRAPPER, + JvmLoweredDeclarationOrigin.JVM_OVERLOADS_WRAPPER, + JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR, + JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR_FOR_HIDDEN_CONSTRUCTOR, + JvmLoweredDeclarationOrigin.SUPER_INTERFACE_METHOD_BRIDGE, + IrDeclarationOrigin.BRIDGE, + IrDeclarationOrigin.BRIDGE_SPECIAL, +) + +// These functions contain a single `suspend` tail call, the value of which should be returned as is +// (i.e. if it's an unboxed inline class value, it should remain unboxed). +fun IrFunction.isNonBoxingSuspendDelegation(): Boolean = + origin in BRIDGE_ORIGINS || + isMultifileBridge() || + isBridgeToSuspendImplMethod() || + isStaticInlineClassReplacementForDefaultInterfaceMethod() + +// Suspend static inline class replacements for fake overrides have to be for interface methods as inline classes cannot have a +// non-Object super type. +fun IrFunction.isStaticInlineClassReplacementForDefaultInterfaceMethod(): Boolean = + isStaticInlineClassReplacement && this is IrSimpleFunction && (attributeOwnerId as IrSimpleFunction).isFakeOverride + +fun IrFunction.shouldContainSuspendMarkers(): Boolean = !isNonBoxingSuspendDelegation() && + // These functions also contain a single `suspend` tail call, but if it returns an unboxed inline class value, + // the return of it should be checked for a suspension and potentially boxed to satisfy an interface. + origin != IrDeclarationOrigin.DELEGATED_MEMBER && + !isInvokeSuspendOfContinuation() && + !isInvokeOfSuspendCallableReference() && + !isStaticInlineClassReplacementDelegatingCall() + +fun IrFunction.hasContinuation(): Boolean = isInvokeSuspendOfLambda() || + isSuspend && shouldContainSuspendMarkers() && + // These are templates for the inliner; the continuation is borrowed from the caller method. + !isEffectivelyInlineOnly() && + origin != JvmLoweredDeclarationOrigin.INLINE_LAMBDA && + origin != JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE && + origin != JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE_CAPTURES_CROSSINLINE + +fun IrExpression?.isReadOfCrossinline(): Boolean = when (this) { + is IrGetValue -> (symbol.owner as? IrValueParameter)?.isCrossinline == true + is IrGetField -> symbol.owner.origin == LocalDeclarationsLowering.DECLARATION_ORIGIN_FIELD_FOR_CROSSINLINE_CAPTURED_VALUE + else -> false +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrInlineUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrInlineUtils.kt new file mode 100644 index 00000000000..0a0a33eed49 --- /dev/null +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrInlineUtils.kt @@ -0,0 +1,90 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.jvm.ir + +import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin +import org.jetbrains.kotlin.descriptors.DescriptorVisibilities +import org.jetbrains.kotlin.descriptors.DescriptorVisibility +import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.expressions.IrBlock +import org.jetbrains.kotlin.ir.expressions.IrFunctionReference +import org.jetbrains.kotlin.ir.types.isNullable +import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +fun IrValueParameter.isInlineParameter(): Boolean = + index >= 0 && !isNoinline && (type.isFunction() || type.isSuspendFunction()) && + // Parameters with default values are always nullable, so check the expression too. + // Note that the frontend has a diagnostic for nullable inline parameters, so actually + // making this return `false` requires using `@Suppress`. + (!type.isNullable() || defaultValue?.expression?.type?.isNullable() == false) + +// Declarations in the scope of an externally visible inline function are implicitly part of the +// public ABI of a Kotlin module. This function returns the visibility of a containing inline function +// (determined *before* lowering), or null if the given declaration is not in the scope of an inline function. +// +// Currently, we mark all declarations in the scope of a public inline function as public, even if they are +// contained in a nested private inline function. This is an over approximation, since private declarations +// inside of a public inline function can still escape if they are used without being regenerated. +// See `plugins/jvm-abi-gen/testData/compile/inlineNoRegeneration` for an example. +val IrDeclaration.inlineScopeVisibility: DescriptorVisibility? + get() { + var owner: IrDeclaration? = original + var result: DescriptorVisibility? = null + while (owner != null) { + if (owner is IrFunction && owner.isInline) { + result = if (!DescriptorVisibilities.isPrivate(owner.visibility)) { + if (owner.parentClassOrNull?.visibility?.let(DescriptorVisibilities::isPrivate) == true) + DescriptorVisibilities.PRIVATE + else + return owner.visibility + } else { + owner.visibility + } + } + owner = owner.parent.safeAs()?.original + } + return result + } + +// True for declarations which are in the scope of an externally visible inline function. +val IrDeclaration.isInPublicInlineScope: Boolean + get() = inlineScopeVisibility?.let(DescriptorVisibilities::isPrivate) == false + +// Map declarations to original declarations before lowering. +private val IrDeclaration.original: IrDeclaration + get() = (this as? IrAttributeContainer)?.attributeOwnerId as? IrDeclaration ?: this + +fun IrStatement.unwrapInlineLambda(): IrFunctionReference? = when (this) { + is IrBlock -> statements.lastOrNull()?.unwrapInlineLambda() + is IrFunctionReference -> takeIf { it.origin == JvmLoweredStatementOrigin.INLINE_LAMBDA } + else -> null +} + +fun IrFunction.isInlineFunctionCall(context: JvmBackendContext): Boolean = + (!context.state.isInlineDisabled || typeParameters.any { it.isReified }) && (isInline || isInlineArrayConstructor(context)) + +// Constructors can't be marked as inline in metadata, hence this hack. +private fun IrFunction.isInlineArrayConstructor(context: JvmBackendContext): Boolean = + this is IrConstructor && valueParameters.size == 2 && constructedClass.symbol.let { + it == context.irBuiltIns.arrayClass || it in context.irBuiltIns.primitiveArraysToPrimitiveTypes + } + +fun IrFunction.isInlineOnly(): Boolean = + (isInline && hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME)) || + (this is IrSimpleFunction && correspondingPropertySymbol?.owner?.hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME) == true) + +fun IrDeclarationWithVisibility.isEffectivelyInlineOnly(): Boolean = + this is IrFunction && (isReifiable() || isInlineOnly() || isPrivateInlineSuspend()) + +fun IrFunction.isPrivateInlineSuspend(): Boolean = + isSuspend && isInline && visibility == DescriptorVisibilities.PRIVATE + +fun IrFunction.isReifiable(): Boolean = + typeParameters.any { it.isReified } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrTypeUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrTypeUtils.kt index 5fe58d4826e..08c6368d385 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrTypeUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrTypeUtils.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.backend.jvm.ir import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.codegen.representativeUpperBound import org.jetbrains.kotlin.backend.jvm.unboxInlineClass import org.jetbrains.kotlin.ir.declarations.IrClass diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt index 56baa06036e..4961690eb73 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt @@ -12,15 +12,14 @@ import org.jetbrains.kotlin.backend.common.lower.irNot import org.jetbrains.kotlin.backend.jvm.CachedFieldsForObjectInstances import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin -import org.jetbrains.kotlin.backend.jvm.codegen.isInlineOnly -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface +import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.codegen.ASSERTIONS_DISABLED_FIELD_NAME import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DescriptorVisibilities -import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention import org.jetbrains.kotlin.descriptors.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrElement @@ -49,15 +48,17 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities import org.jetbrains.kotlin.load.java.JvmAbi +import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_FQ_NAME import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_NO_COMPATIBILITY_FQ_NAME import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_WITH_COMPATIBILITY_FQ_NAME import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil import org.jetbrains.kotlin.utils.DFS -import org.jetbrains.kotlin.utils.addToStdlib.safeAs fun IrDeclaration.getJvmNameFromAnnotation(): String? { // TODO lower @JvmName? @@ -101,13 +102,6 @@ fun IrFunction.hasPlatformDependent(): Boolean = propertyIfAccessor.hasAnnotatio fun IrFunction.getJvmVisibilityOfDefaultArgumentStub() = if (DescriptorVisibilities.isPrivate(visibility) || isInlineOnly()) JavaDescriptorVisibilities.PACKAGE_VISIBILITY else DescriptorVisibilities.PUBLIC -fun IrValueParameter.isInlineParameter() = - index >= 0 && !isNoinline && (type.isFunction() || type.isSuspendFunction()) && - // Parameters with default values are always nullable, so check the expression too. - // Note that the frontend has a diagnostic for nullable inline parameters, so actually - // making this return `false` requires using `@Suppress`. - (!type.isNullable() || defaultValue?.expression?.type?.isNullable() == false) - fun IrDeclaration.isInCurrentModule(): Boolean = getPackageFragment() is IrFile @@ -262,6 +256,9 @@ private fun JvmBackendContext.makeRawTypeAnnotation() = fun IrClass.rawType(context: JvmBackendContext): IrType = defaultType.addAnnotations(listOf(context.makeRawTypeAnnotation())) +val IrClass.isJvmInterface: Boolean + get() = isAnnotationClass || isInterface + fun IrClass.getSingleAbstractMethod(): IrSimpleFunction? = functions.singleOrNull { it.modality == Modality.ABSTRACT } @@ -286,42 +283,6 @@ val IrClass.isSyntheticSingleton: Boolean || origin == JvmLoweredDeclarationOrigin.GENERATED_PROPERTY_REFERENCE) && primaryConstructor!!.valueParameters.isEmpty() -// Map declarations to original declarations before lowering. -private val IrDeclaration.original: IrDeclaration - get() = (this as? IrAttributeContainer)?.attributeOwnerId as? IrDeclaration ?: this - -// Declarations in the scope of an externally visible inline function are implicitly part of the -// public ABI of a Kotlin module. This function returns the visibility of a containing inline function -// (determined *before* lowering), or null if the given declaration is not in the scope of an inline function. -// -// Currently, we mark all declarations in the scope of a public inline function as public, even if they are -// contained in a nested private inline function. This is an over approximation, since private declarations -// inside of a public inline function can still escape if they are used without being regenerated. -// See `plugins/jvm-abi-gen/testData/compile/inlineNoRegeneration` for an example. -val IrDeclaration.inlineScopeVisibility: DescriptorVisibility? - get() { - var owner: IrDeclaration? = original - var result: DescriptorVisibility? = null - while (owner != null) { - if (owner is IrFunction && owner.isInline) { - result = if (!DescriptorVisibilities.isPrivate(owner.visibility)) { - if (owner.parentClassOrNull?.visibility?.let(DescriptorVisibilities::isPrivate) == true) - DescriptorVisibilities.PRIVATE - else - return owner.visibility - } else { - owner.visibility - } - } - owner = owner.parent.safeAs()?.original - } - return result - } - -// True for declarations which are in the scope of an externally visible inline function. -val IrDeclaration.isInPublicInlineScope: Boolean - get() = inlineScopeVisibility?.let(DescriptorVisibilities::isPrivate) == false - fun IrSimpleFunction.suspendFunctionOriginal(): IrSimpleFunction = if (isSuspend && !isStaticInlineClassReplacement && @@ -424,4 +385,77 @@ fun findSuperDeclaration(function: IrSimpleFunction, isSuperCall: Boolean, jvmDe ?: error("Fake override should have at least one overridden descriptor: ${current.render()}") } return current -} \ No newline at end of file +} + +fun IrMemberAccessExpression<*>.getIntConstArgument(i: Int): Int = + getValueArgument(i)?.let { + if (it is IrConst<*> && it.kind == IrConstKind.Int) + it.value as Int + else + null + } ?: throw AssertionError("Value argument #$i should be an Int const: ${dump()}") + +fun IrMemberAccessExpression<*>.getStringConstArgument(i: Int): String = + getValueArgument(i)?.let { + if (it is IrConst<*> && it.kind == IrConstKind.String) + it.value as String + else + null + } ?: throw AssertionError("Value argument #$i should be a String const: ${dump()}") + +fun IrMemberAccessExpression<*>.getBooleanConstArgument(i: Int): Boolean = + getValueArgument(i)?.let { + if (it is IrConst<*> && it.kind == IrConstKind.Boolean) + it.value as Boolean + else + null + } ?: throw AssertionError("Value argument #$i should be a Boolean const: ${dump()}") + +val IrDeclaration.fileParent: IrFile + get() { + return when (val myParent = parent) { + is IrFile -> myParent + else -> (myParent as IrDeclaration).fileParent + } + } + +private val RETENTION_PARAMETER_NAME = Name.identifier("value") + +fun IrClass.getAnnotationRetention(): KotlinRetention? { + val retentionArgument = + getAnnotation(StandardNames.FqNames.retention)?.getValueArgument(RETENTION_PARAMETER_NAME) + as? IrGetEnumValue ?: return null + val retentionArgumentValue = retentionArgument.symbol.owner + return KotlinRetention.valueOf(retentionArgumentValue.name.asString()) +} + +// To be generalized to IrMemberAccessExpression as soon as properties get symbols. +fun IrConstructorCall.getValueArgument(name: Name): IrExpression? { + val index = symbol.owner.valueParameters.find { it.name == name }?.index ?: return null + return getValueArgument(index) +} + +val IrMemberWithContainerSource.parentClassId: ClassId? + get() = ((this as? IrSimpleFunction)?.correspondingPropertySymbol?.owner ?: this).let { directMember -> + (directMember.containerSource as? JvmPackagePartSource)?.classId ?: (directMember.parent as? IrClass)?.classId + } + +// Translated into IR-based terms from classifierDescriptor?.classId +private val IrClass.classId: ClassId? + get() = when (val parent = parent) { + is IrExternalPackageFragment -> ClassId(parent.fqName, name) + // TODO: there's `context.classNameOverride`; theoretically it's only relevant for top-level members, + // where `containerSource` is a `JvmPackagePartSource` anyway, but I'm not 100% sure. + is IrClass -> parent.classId?.createNestedClassId(name) + else -> null + } + +val IrClass.isOptionalAnnotationClass: Boolean + get() = kind == ClassKind.ANNOTATION_CLASS && + isExpect && + hasAnnotation(OptionalAnnotationUtil.OPTIONAL_EXPECTATION_FQ_NAME) + +fun IrFunctionAccessExpression.receiverAndArgs(): List { + return (arrayListOf(this.dispatchReceiver, this.extensionReceiver) + + symbol.owner.valueParameters.mapIndexed { i, _ -> getValueArgument(i) }).filterNotNull() +} diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/IrParcelSerializers.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/IrParcelSerializers.kt index 67cb5b63609..976f0e07d6e 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/IrParcelSerializers.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/IrParcelSerializers.kt @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.android.parcel.ir import org.jetbrains.kotlin.android.parcel.serializers.ParcelableExtensionBase.Companion.CREATOR_NAME -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt index b706f383ac6..b783c7ba8d6 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.parcelize.ir -import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound +import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration