[IR] Refactor: extract util methods from IrExpectActualAnnotationMatchingChecker

They will be re-used in new checker in subsequent commit.

^KT-59940
This commit is contained in:
Roman Efremov
2023-09-13 17:29:20 +02:00
committed by Space Team
parent d4b8f73e04
commit ce666182a2
2 changed files with 29 additions and 22 deletions
@@ -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<IrClass>().lastOrNull()
return getContainingTopLevelClass(actualSymbol.owner as IrDeclaration)?.symbol
}
}
@@ -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<IrClass>().lastOrNull()
}