[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:
committed by
Space Team
parent
d4b8f73e04
commit
ce666182a2
+2
-22
@@ -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
|
||||
}
|
||||
}
|
||||
+27
@@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user