diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt index 2afad113cb2..ca601c514e7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt @@ -6,17 +6,22 @@ package org.jetbrains.kotlin.backend.common.ir import org.jetbrains.kotlin.backend.common.CommonBackendContext +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.UnsignedType import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +import org.jetbrains.kotlin.ir.declarations.IrPackageFragment import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol +import org.jetbrains.kotlin.ir.types.classifierOrNull import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable +import org.jetbrains.kotlin.ir.util.getPackageFragment import org.jetbrains.kotlin.ir.util.referenceFunction import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -24,7 +29,7 @@ import org.jetbrains.kotlin.resolve.calls.components.isVararg import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.util.OperatorNameConventions -// This is what Context collects about IR. + // This is what Context collects about IR. abstract class Ir(val context: T, val irModule: IrModuleFragment) { abstract val symbols: Symbols @@ -173,8 +178,6 @@ abstract class Symbols(val context: T, private val abstract val coroutineSuspendedGetter: IrSimpleFunctionSymbol - abstract val lateinitIsInitializedPropertyGetter: IrSimpleFunctionSymbol - fun getFunction(parameterCount: Int) = symbolTable.referenceClass(context.builtIns.getFunction(parameterCount)) val functionReference = calc { symbolTable.referenceClass(context.getInternalClass("FunctionReference")) } @@ -215,4 +218,17 @@ abstract class Symbols(val context: T, private val val intAnd = getBinaryOperator(OperatorNameConventions.AND, builtIns.intType, builtIns.intType) val intPlusInt = getBinaryOperator(OperatorNameConventions.PLUS, builtIns.intType, builtIns.intType) -} \ No newline at end of file + + companion object { + fun isLateinitIsInitializedPropertyGetter(symbol: IrFunctionSymbol): Boolean = + symbol is IrSimpleFunctionSymbol && symbol.owner.let { function -> + function.name.asString() == "" && + function.parent is IrPackageFragment && + function.getPackageFragment()!!.fqName.asString() == "kotlin" && + function.valueParameters.isEmpty() && + (symbol.owner.extensionReceiverParameter?.type?.classifierOrNull?.owner as? IrClass).let { receiverClass -> + receiverClass?.fqName?.toUnsafe() == KotlinBuiltIns.FQ_NAMES.kProperty0 + } + } + } +} diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index 571ee73e41a..add2c2bd45a 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -18,11 +18,7 @@ package org.jetbrains.kotlin.backend.common.ir import org.jetbrains.kotlin.backend.common.DumpIrTreeWithDescriptorsVisitor import org.jetbrains.kotlin.backend.common.deepCopyWithVariables -import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassConstructorDescriptor -import org.jetbrains.kotlin.backend.common.descriptors.WrappedReceiverParameterDescriptor -import org.jetbrains.kotlin.backend.common.descriptors.WrappedTypeParameterDescriptor -import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor -import org.jetbrains.kotlin.backend.common.descriptors.WrappedVariableDescriptor +import org.jetbrains.kotlin.backend.common.descriptors.* import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.builders.IrStatementsBuilder @@ -32,10 +28,6 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl import org.jetbrains.kotlin.ir.declarations.impl.IrTypeParameterImpl import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns -import org.jetbrains.kotlin.ir.expressions.IrCall -import org.jetbrains.kotlin.ir.expressions.IrExpression -import org.jetbrains.kotlin.ir.expressions.IrExpressionBody -import org.jetbrains.kotlin.ir.expressions.IrFunctionReference import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl @@ -52,6 +44,7 @@ import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.visitors.IrElementVisitor +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import java.io.StringWriter @@ -392,3 +385,13 @@ fun isElseBranch(branch: IrBranch) = branch is IrElseBranch || ((branch.conditio fun IrSimpleFunction.isMethodOfAny() = ((valueParameters.size == 0 && name.asString().let { it == "hashCode" || it == "toString" }) || (valueParameters.size == 1 && name.asString() == "equals" && valueParameters[0].type.isNullableAny())) + +val IrClass.fqName: FqName? + get() { + val parentFqName = when (val parent = parent) { + is IrPackageFragment -> parent.fqName + is IrClass -> parent.fqName + else -> return null + } + return parentFqName?.child(name) + } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt index 44d9a049a12..23d2ad4e412 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.FileLoweringPass +import org.jetbrains.kotlin.backend.common.ir.Symbols import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -82,7 +83,7 @@ class LateinitLowering(val context: CommonBackendContext) : FileLoweringPass { override fun visitCall(expression: IrCall): IrExpression { expression.transformChildrenVoid(this) - if (expression.symbol != context.ir.symbols.lateinitIsInitializedPropertyGetter) return expression + if (!Symbols.isLateinitIsInitializedPropertyGetter(expression.symbol)) return expression val receiver = expression.extensionReceiver as IrPropertyReference @@ -133,4 +134,4 @@ class LateinitLowering(val context: CommonBackendContext) : FileLoweringPass { } private val throwErrorFunction by lazy { context.ir.symbols.ThrowUninitializedPropertyAccessException.owner } -} \ No newline at end of file +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt index 12bb25b715f..72af6c30ceb 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt @@ -24,12 +24,14 @@ import org.jetbrains.kotlin.ir.SourceRangeInfo import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.backend.js.lower.CallableReferenceKey import org.jetbrains.kotlin.ir.backend.js.lower.ConstructorPair -import org.jetbrains.kotlin.ir.backend.js.lower.inline.ModuleIndex import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns -import org.jetbrains.kotlin.ir.symbols.* +import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol +import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.impl.IrDynamicTypeImpl import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.FqName @@ -184,15 +186,6 @@ class JsIrBackendContext( NoLookupLocation.FROM_BACKEND ).filterNot { it.isExpect }.single().getter!! ) - - override val lateinitIsInitializedPropertyGetter = - symbolTable.referenceSimpleFunction( - module.getPackage(kotlinPackageFqn).memberScope.getContributedVariables( - Name.identifier("isInitialized"), NoLookupLocation.FROM_BACKEND - ).single { - it.extensionReceiverParameter != null && !it.isExternal - }.getter!! - ) } override fun shouldGenerateHandlerParameterForDefaultBodyFun() = true @@ -244,8 +237,6 @@ class JsIrBackendContext( return vars.single() } - val lateinitIsInitializedPropertyGetter = ir.symbols.lateinitIsInitializedPropertyGetter - val captureStackSymbol = symbolTable.referenceSimpleFunction(getInternalFunctions("captureStack").single()) val newThrowableSymbol = symbolTable.referenceSimpleFunction(getInternalFunctions("newThrowable").single()) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/FunctionInlining.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/FunctionInlining.kt index 4e7134ba436..202da42315e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/FunctionInlining.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/FunctionInlining.kt @@ -7,8 +7,12 @@ package org.jetbrains.kotlin.ir.backend.js.lower.inline -import org.jetbrains.kotlin.backend.common.* +import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext +import org.jetbrains.kotlin.backend.common.ScopeWithIr +import org.jetbrains.kotlin.backend.common.ir.Symbols import org.jetbrains.kotlin.backend.common.ir.createTemporaryVariableWithWrappedDescriptor +import org.jetbrains.kotlin.backend.common.isBuiltInIntercepted +import org.jetbrains.kotlin.backend.common.isBuiltInSuspendCoroutineUninterceptedOrReturn import org.jetbrains.kotlin.backend.common.lower.CoroutineIntrinsicLambdaOrigin import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.serialization.fqNameSafe @@ -56,7 +60,7 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoidW val languageVersionSettings = context.configuration.languageVersionSettings when { - callSite.symbol == context.ir.symbols.lateinitIsInitializedPropertyGetter -> + Symbols.isLateinitIsInitializedPropertyGetter(callSite.symbol) -> return callSite // Handle coroutine intrinsics // TODO These should actually be inlined. @@ -432,4 +436,4 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoidW return evaluationStatements } } -} \ No newline at end of file +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index 682d02e2c9e..4831709ad9a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -143,14 +143,6 @@ class JvmBackendContext( override val coroutineSuspendedGetter: IrSimpleFunctionSymbol get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. - override val lateinitIsInitializedPropertyGetter = symbolTable.referenceSimpleFunction( - state.module.getPackage(FqName("kotlin")).memberScope.getContributedVariables( - Name.identifier("isInitialized"), NoLookupLocation.FROM_BACKEND - ).single { - it.extensionReceiverParameter != null && !it.isExternal - }.getter!! - ) - val lambdaClass = calc { symbolTable.referenceClass(context.getInternalClass("Lambda")) } fun getKFunction(parameterCount: Int) = symbolTable.referenceClass(reflectionTypes.getKFunction(parameterCount)) 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 e8f602e5c19..7588d94014b 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 @@ -18,13 +18,16 @@ import org.jetbrains.kotlin.backend.common.lower.irNot 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.descriptors.* +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl -import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.expressions.IrConstKind +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl @@ -32,13 +35,16 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl -import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.types.IrErrorType +import org.jetbrains.kotlin.ir.types.IrSimpleType +import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.defaultType +import org.jetbrains.kotlin.ir.util.isInterface +import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.org.objectweb.asm.commons.Method @@ -454,25 +460,6 @@ private data class SignatureWithSource(val signature: Method, val source: IrSimp } } -val IrClass.fqName - get(): FqName? { - val parentFqName = when (val parent = parent) { - is IrPackageFragment -> parent.fqName - is IrClass -> parent.fqName - else -> return null - } - return parentFqName?.child(name) - } - -fun IrClass.isSubclassOf(pred: (IrClass) -> Boolean): Boolean = - DFS.ifAny( - listOf(this), - DFS.Neighbors { current -> - current.superTypes.mapNotNull { (it as? IrSimpleType)?.classifier?.owner as? IrClass } - }, - pred - ) - fun IrSimpleFunction.allOverridden(): Sequence { val visited = mutableSetOf()