From fd9b19ee49f26295cf82090eac5b972aec9a5462 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 1 Nov 2022 14:04:39 +0100 Subject: [PATCH] Remove unsafe cast function usages from IR modules --- build.gradle.kts | 3 --- .../backend/common/lower/ExpectDeclarationRemover.kt | 3 +-- .../backend/common/lower/LocalDeclarationsLowering.kt | 3 +-- .../psi2ir/generators/ArgumentsGenerationUtils.kt | 3 +-- .../kotlin/psi2ir/generators/FunctionGenerator.kt | 3 +-- .../jetbrains/kotlin/ir/builders/ExpressionHelpers.kt | 6 ++---- .../src/org/jetbrains/kotlin/ir/builders/IrBuilder.kt | 10 +++++----- .../org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt | 4 +--- .../kotlin/ir/util/DeclarationStubGenerator.kt | 3 +-- .../jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt | 3 +-- .../src/org/jetbrains/kotlin/ir/util/IrUtils.kt | 5 +---- 11 files changed, 15 insertions(+), 31 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f8ade22e230..d9ec1f0fb3c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -371,9 +371,6 @@ val projectsWithOptInToUnsafeCastFunctionsFromAddToStdLib by extra { ":analysis:symbol-light-classes", ":compiler", ":compiler:backend.js", - ":compiler:ir.backend.common", - ":compiler:ir.psi2ir", - ":compiler:ir.tree", ":compiler:light-classes", ":core:reflection.jvm", ":jps:jps-common", diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt index 1a531127264..43231187b4e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.multiplatform.* -import org.jetbrains.kotlin.utils.addToStdlib.safeAs // `doRemove` means should expect-declaration be removed from IR @OptIn(ObsoleteDescriptorBasedAPI::class) @@ -229,7 +228,7 @@ class ExpectDeclarationRemover(val symbolTable: ReferenceSymbolTable, private va // Nothing we can do with those. // TODO they may not actually have the defaults though -- may be a frontend bug. val expectFunction = - function.descriptor.findExpectForActual().safeAs()?.let { symbolTable.referenceFunction(it).owner } + (function.descriptor.findExpectForActual() as? FunctionDescriptor)?.let { symbolTable.referenceFunction(it).owner } ?: return val defaultValue = expectFunction.valueParameters[index].defaultValue ?: return diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index 88a5f6b469f..f2beccff3c5 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.utils.addToStdlib.safeAs interface VisibilityPolicy { fun forClass(declaration: IrClass, inInlineFunctionScope: Boolean): DescriptorVisibility = @@ -909,7 +908,7 @@ class LocalDeclarationsLowering( get() { val parentFun = parent as? IrSimpleFunction ?: throw AssertionError("Extension receiver parent is not a simple function: ${parent.render()}") - val correspondingProperty = parentFun.safeAs()?.correspondingPropertySymbol?.owner + val correspondingProperty = parentFun.correspondingPropertySymbol?.owner return when { correspondingProperty != null -> correspondingProperty.name.asStringStripSpecialMarkers() diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt index 900fff82d3a..9f7997c205e 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt @@ -51,7 +51,6 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.* import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.util.OperatorNameConventions -import org.jetbrains.kotlin.utils.addToStdlib.safeAs import kotlin.math.max import kotlin.math.min @@ -629,7 +628,7 @@ fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: Ca "$originalDescriptor has ${originalDescriptor.typeParameters}" } - val resolvedCallArguments = resolvedCall.safeAs>()?.argumentMappingByOriginal?.values + val resolvedCallArguments = (resolvedCall as? NewResolvedCallImpl<*>)?.argumentMappingByOriginal?.values assert(resolvedCallArguments == null || resolvedCallArguments.size == underlyingValueParameters.size) { "Mismatching resolved call arguments:\n" + "${resolvedCallArguments?.size} != ${underlyingValueParameters.size}" diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt index b2fff9dff5e..02dac5f7390 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt @@ -30,7 +30,6 @@ import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluat import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotationConstructor import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor -import org.jetbrains.kotlin.utils.addToStdlib.safeAs @ObsoleteDescriptorBasedAPI class FunctionGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) { @@ -352,7 +351,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio val ktParameter = DescriptorToSourceUtils.getSourceFromDescriptor(valueParameterDescriptor) as? KtParameter irValueParameter.defaultValue = ktParameter?.defaultValue?.let { defaultValue -> val inAnnotation = - valueParameterDescriptor.containingDeclaration.safeAs()?.isAnnotationConstructor() ?: false + (valueParameterDescriptor.containingDeclaration as? ConstructorDescriptor)?.isAnnotationConstructor() == true if (inAnnotation) { generateDefaultAnnotationParameterValue(defaultValue, valueParameterDescriptor) } else if (context.configuration.generateBodies) { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt index 297b57d41d9..39febc3f5ae 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.ir.util.isImmutable import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.primaryConstructor import org.jetbrains.kotlin.ir.util.render -import org.jetbrains.kotlin.utils.addToStdlib.assertedCast val IrBuilderWithScope.parent get() = scope.getLocalDeclarationParent() @@ -76,9 +75,8 @@ fun IrBuilderWithScope.irReturn(value: IrExpression) = IrReturnImpl( startOffset, endOffset, context.irBuiltIns.nothingType, - scope.scopeOwnerSymbol.assertedCast { - "Function scope expected: ${scope.scopeOwnerSymbol.owner.render()}" - }, + scope.scopeOwnerSymbol as? IrReturnTargetSymbol + ?: throw AssertionError("Function scope expected: ${scope.scopeOwnerSymbol.owner.render()}"), value ) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/IrBuilder.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/IrBuilder.kt index cd81a792fde..53720097ccc 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/IrBuilder.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/IrBuilder.kt @@ -28,8 +28,6 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.utils.addToStdlib.safeAs -import java.util.* abstract class IrBuilder( override val context: IrGeneratorContext, @@ -107,9 +105,11 @@ class IrBlockBuilder( override fun doBuild(): IrContainerExpression { val resultType = this.resultType - ?: statements.lastOrNull().safeAs()?.type - ?: context.irBuiltIns.unitType - val irBlock = if (isTransparent) IrCompositeImpl(startOffset, endOffset, resultType, origin) else IrBlockImpl(startOffset, endOffset, resultType, origin) + ?: (statements.lastOrNull() as? IrExpression)?.type + ?: context.irBuiltIns.unitType + val irBlock = + if (isTransparent) IrCompositeImpl(startOffset, endOffset, resultType, origin) + else IrBlockImpl(startOffset, endOffset, resultType, origin) irBlock.statements.addAll(statements) return irBlock } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt index 725519b9073..7eb0fb3ce99 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.model.CaptureStatus import org.jetbrains.kotlin.types.model.CapturedTypeConstructorMarker import org.jetbrains.kotlin.types.model.CapturedTypeMarker -import org.jetbrains.kotlin.utils.addToStdlib.safeAs abstract class IrTypeBase(val kotlinType: KotlinType?) : IrType(), IrTypeProjection { override val type: IrType get() = this @@ -43,8 +42,7 @@ class IrDynamicTypeImpl( } val IrType.originalKotlinType: KotlinType? - get() = safeAs()?.kotlinType - + get() = (this as? IrTypeBase)?.kotlinType object IrStarProjectionImpl : IrStarProjection { override fun equals(other: Any?): Boolean = this === other diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 57f986e30ef..b055902eb9b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.isValueClass import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.utils.addToStdlib.safeAs @OptIn(ObsoleteDescriptorBasedAPI::class) abstract class DeclarationStubGenerator( @@ -89,7 +88,7 @@ abstract class DeclarationStubGenerator( } fun generateOrGetFacadeClass(descriptor: DeclarationDescriptor): IrClass? { - val directMember = descriptor.safeAs()?.correspondingProperty ?: descriptor + val directMember = (descriptor as? PropertyAccessorDescriptor)?.correspondingProperty ?: descriptor val packageFragment = directMember.containingDeclaration as? PackageFragmentDescriptor ?: return null val containerSource = extensions.getContainerSource(directMember) ?: return null return facadeClassMap.getOrPut(containerSource) { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt index b7d263d9c21..44cee4da94c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrSymbol -import org.jetbrains.kotlin.utils.addToStdlib.safeAs val IrDeclaration.isReal: Boolean get() = !isFakeOverride @@ -115,7 +114,7 @@ fun > T.resolveFakeOverrideOrNull( collectRealOverrides(toSkip, { it.modality == Modality.ABSTRACT }) .let { realOverrides -> // Kotlin forbids conflicts between overrides, but they may trickle down from Java. - realOverrides.singleOrNull { it.parent.safeAs()?.isInterface != true } + realOverrides.singleOrNull { (it.parent as? IrClass)?.isInterface != true } // TODO: We take firstOrNull instead of singleOrNull here because of KT-36188. ?: realOverrides.firstOrNull() } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 9d3692e5946..a3a9805372b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -31,7 +31,6 @@ import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.addIfNotNull -import org.jetbrains.kotlin.utils.addToStdlib.safeAs import java.io.StringWriter /** @@ -342,10 +341,8 @@ fun IrFunction.isFakeOverriddenFromAny(): Boolean { fun IrCall.isSuperToAny() = superQualifierSymbol?.let { this.symbol.owner.isFakeOverriddenFromAny() } ?: false - fun IrDeclaration.hasInterfaceParent() = - parent.safeAs()?.isInterface == true - + (parent as? IrClass)?.isInterface == true fun IrPossiblyExternalDeclaration.isEffectivelyExternal(): Boolean = this.isExternal