From ce666182a28cee4fe0aeeeaf8989085cbfe66c1a Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Wed, 13 Sep 2023 17:29:20 +0200 Subject: [PATCH] [IR] Refactor: extract util methods from IrExpectActualAnnotationMatchingChecker They will be re-used in new checker in subsequent commit. ^KT-59940 --- ...IrExpectActualAnnotationMatchingChecker.kt | 24 ++--------------- .../checker/irExpectActualCheckersUtils.kt | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 22 deletions(-) create mode 100644 compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/irExpectActualCheckersUtils.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/IrExpectActualAnnotationMatchingChecker.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/IrExpectActualAnnotationMatchingChecker.kt index 1c59c1c11e3..9243b55ef75 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/IrExpectActualAnnotationMatchingChecker.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/IrExpectActualAnnotationMatchingChecker.kt @@ -5,17 +5,12 @@ package org.jetbrains.kotlin.backend.common.actualizer.checker -import org.jetbrains.kotlin.backend.common.actualizer.ClassActualizationInfo import org.jetbrains.kotlin.backend.common.actualizer.reportActualAnnotationsNotMatchExpect -import org.jetbrains.kotlin.backend.common.lower.parents import org.jetbrains.kotlin.config.LanguageFeature -import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.symbols.IrSymbol -import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol -import org.jetbrains.kotlin.ir.util.classIdOrFail import org.jetbrains.kotlin.ir.util.isFakeOverride import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualAnnotationMatchChecker @@ -36,7 +31,7 @@ internal object IrExpectActualAnnotationMatchingChecker : IrExpectActualChecker val incompatibility = AbstractExpectActualAnnotationMatchChecker.areAnnotationsCompatible(expectSymbol, actualSymbol, matchingContext) ?: continue - val reportOn = getTypealiasSymbolIfActualizedViaTypealias(expectSymbol, classActualizationInfo) + val reportOn = getTypealiasSymbolIfActualizedViaTypealias(expectSymbol.owner as IrDeclaration, classActualizationInfo) ?: getContainingActualClassIfFakeOverride(actualSymbol) ?: actualSymbol diagnosticsReporter.reportActualAnnotationsNotMatchExpect( @@ -51,25 +46,10 @@ internal object IrExpectActualAnnotationMatchingChecker : IrExpectActualChecker private val IrSymbol.isFakeOverride: Boolean get() = (owner as IrDeclaration).isFakeOverride - private fun getTypealiasSymbolIfActualizedViaTypealias( - expectSymbol: IrSymbol, - classActualizationInfo: ClassActualizationInfo, - ): IrTypeAliasSymbol? { - val topLevelExpectClass = getContainingTopLevelClass(expectSymbol) ?: return null - val classId = topLevelExpectClass.classIdOrFail - return classActualizationInfo.actualTypeAliases[classId] - } - private fun getContainingActualClassIfFakeOverride(actualSymbol: IrSymbol): IrSymbol? { if (!actualSymbol.isFakeOverride) { return null } - return getContainingTopLevelClass(actualSymbol)?.symbol - } - - private fun getContainingTopLevelClass(symbol: IrSymbol): IrClass? { - val declaration = symbol.owner as IrDeclaration - val parentsWithSelf = sequenceOf(declaration) + declaration.parents - return parentsWithSelf.filterIsInstance().lastOrNull() + return getContainingTopLevelClass(actualSymbol.owner as IrDeclaration)?.symbol } } \ No newline at end of file diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/irExpectActualCheckersUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/irExpectActualCheckersUtils.kt new file mode 100644 index 00000000000..a48ed7f3e1d --- /dev/null +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/irExpectActualCheckersUtils.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2023 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.common.actualizer.checker + +import org.jetbrains.kotlin.backend.common.actualizer.ClassActualizationInfo +import org.jetbrains.kotlin.backend.common.lower.parents +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol +import org.jetbrains.kotlin.ir.util.classIdOrFail + +internal fun getTypealiasSymbolIfActualizedViaTypealias( + expectDeclaration: IrDeclaration, + classActualizationInfo: ClassActualizationInfo, +): IrTypeAliasSymbol? { + val topLevelExpectClass = getContainingTopLevelClass(expectDeclaration) ?: return null + val classId = topLevelExpectClass.classIdOrFail + return classActualizationInfo.actualTypeAliases[classId] +} + +internal fun getContainingTopLevelClass(expectDeclaration: IrDeclaration): IrClass? { + val parentsWithSelf = sequenceOf(expectDeclaration) + expectDeclaration.parents + return parentsWithSelf.filterIsInstance().lastOrNull() +} \ No newline at end of file