[FIR & IR] Support of default values for arguments in expect functions

Add FirActualDeclarationChecker that checks expect/actual return types

^KT-56331 Fixed, ^KT-56334 Fixed
This commit is contained in:
Ivan Kochurkin
2023-02-16 21:22:03 +01:00
committed by Space Team
parent a54b56d74e
commit d87619e06e
64 changed files with 819 additions and 705 deletions
@@ -8,8 +8,10 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility
import org.jetbrains.kotlin.resolve.multiplatform.compatible
import java.util.*
private object ExpectForActualAttributeKey : FirDeclarationDataKey()
@@ -21,6 +23,24 @@ typealias ExpectForActualData = Map<ExpectActualCompatibility<FirBasedSymbol<*>>
var FirDeclaration.expectForActual: ExpectForActualData? by FirDeclarationDataRegistry.data(ExpectForActualAttributeKey)
private var FirDeclaration.actualForExpectMap: WeakHashMap<FirSession, FirBasedSymbol<*>>? by FirDeclarationDataRegistry.data(ActualForExpectAttributeKey)
fun FirFunctionSymbol<*>.getSingleCompatibleExpectForActualOrNull() =
(this as FirBasedSymbol<*>).getSingleCompatibleExpectForActualOrNull() as? FirFunctionSymbol<*>
fun FirBasedSymbol<*>.getSingleCompatibleExpectForActualOrNull(): FirBasedSymbol<*>? {
val expectForActual = expectForActual ?: return null
var compatibleActuals: List<FirBasedSymbol<*>>? = null
for ((key, item) in expectForActual) {
if (key.compatible) {
if (compatibleActuals == null) {
compatibleActuals = item
} else {
return null // Exit if there are more than one list with compatible actuals
}
}
}
return compatibleActuals?.singleOrNull()
}
val FirBasedSymbol<*>.expectForActual: ExpectForActualData?
get() {
lazyResolveToPhase(FirResolvePhase.EXPECT_ACTUAL_MATCHING)
@@ -14,11 +14,11 @@ enum class FirResolvePhase(val noProcessor: Boolean = false) {
SEALED_CLASS_INHERITORS,
TYPES,
STATUS,
EXPECT_ACTUAL_MATCHING,
ARGUMENTS_OF_ANNOTATIONS,
CONTRACTS,
IMPLICIT_TYPES_BODY_RESOLVE,
ANNOTATIONS_ARGUMENTS_MAPPING,
EXPECT_ACTUAL_MATCHING,
BODY_RESOLVE;
val requiredToLaunch: FirResolvePhase