[FIR] Add compatibleOnly parameter to getSingleCompatibleExpectForActualOrNull

Rename `getSingleCompatibleExpectForActualOrNull` to `getSingleExpectForActualOrNull`
This commit is contained in:
Ivan Kochurkin
2023-05-31 19:57:13 +02:00
committed by Space Team
parent d600d768a6
commit 1e09e8663c
6 changed files with 21 additions and 17 deletions
@@ -10,11 +10,15 @@ import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.expectForActual
import org.jetbrains.kotlin.fir.declarations.getSingleExpectForActualOrNull
import org.jetbrains.kotlin.fir.declarations.utils.isActual import org.jetbrains.kotlin.fir.declarations.utils.isActual
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.areCompatibleExpectActualTypes
import org.jetbrains.kotlin.fir.types.createExpectActualTypeParameterSubstitutor
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility
object FirActualCallableDeclarationChecker : FirCallableDeclarationChecker() { object FirActualCallableDeclarationChecker : FirCallableDeclarationChecker() {
@@ -37,7 +41,7 @@ object FirActualCallableDeclarationChecker : FirCallableDeclarationChecker() {
private fun checkReturnTypes(callableDeclaration: FirCallableDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkReturnTypes(callableDeclaration: FirCallableDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
val actualFunctionSymbol = callableDeclaration.symbol val actualFunctionSymbol = callableDeclaration.symbol
val expectFunctionSymbol = actualFunctionSymbol.getSingleCompatibleExpectForActualOrNull() as? FirCallableSymbol ?: return val expectFunctionSymbol = actualFunctionSymbol.getSingleExpectForActualOrNull() as? FirCallableSymbol ?: return
val expectTypeParameters = expectFunctionSymbol.getContainingClassSymbol(expectFunctionSymbol.moduleData.session) val expectTypeParameters = expectFunctionSymbol.getContainingClassSymbol(expectFunctionSymbol.moduleData.session)
?.typeParameterSymbols.orEmpty() ?.typeParameterSymbols.orEmpty()
@@ -180,7 +180,7 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
} }
} }
} }
val expectedSingleCandidate = compatibilityToMembersMap.values.singleOrNull()?.firstOrNull() val expectedSingleCandidate = symbol.getSingleExpectForActualOrNull()
if (expectedSingleCandidate != null) { if (expectedSingleCandidate != null) {
checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias( checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias(
expectedSingleCandidate, expectedSingleCandidate,
@@ -700,7 +700,7 @@ class FirElementSerializer private constructor(
val builder = ProtoBuf.ValueParameter.newBuilder() val builder = ProtoBuf.ValueParameter.newBuilder()
val declaresDefaultValue = parameter.defaultValue != null || val declaresDefaultValue = parameter.defaultValue != null ||
function.symbol.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index) function.symbol.getSingleExpectForActualOrNull(compatibleOnly = true).containsDefaultValue(index)
val flags = Flags.getValueParameterFlags( val flags = Flags.getValueParameterFlags(
additionalAnnotations.isNotEmpty() || parameter.nonSourceAnnotations(session).isNotEmpty(), additionalAnnotations.isNotEmpty() || parameter.nonSourceAnnotations(session).isNotEmpty(),
@@ -21,7 +21,7 @@ class FirDefaultParametersResolver : FirSessionComponent {
originScope: FirScope?, originScope: FirScope?,
index: Int, index: Int,
): Boolean { ): Boolean {
if (valueParameter.defaultValue != null || function.symbol.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index)) { if (valueParameter.defaultValue != null || function.symbol.getSingleExpectForActualOrNull().containsDefaultValue(index)) {
return true return true
} }
if (function !is FirSimpleFunction) return false if (function !is FirSimpleFunction) return false
@@ -45,7 +45,7 @@ class FirDefaultParametersResolver : FirSessionComponent {
typeScope.processOverriddenFunctions(symbol) { overridden -> typeScope.processOverriddenFunctions(symbol) { overridden ->
if (overridden.containsDefaultValue(index) || if (overridden.containsDefaultValue(index) ||
overridden.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index) overridden.getSingleExpectForActualOrNull().containsDefaultValue(index)
) { ) {
result = true result = true
return@processOverriddenFunctions ProcessorAction.STOP return@processOverriddenFunctions ProcessorAction.STOP
@@ -19,22 +19,22 @@ typealias ExpectForActualData = Map<ExpectActualCompatibility<FirBasedSymbol<*>>
@SymbolInternals @SymbolInternals
var FirDeclaration.expectForActual: ExpectForActualData? by FirDeclarationDataRegistry.data(ExpectForActualAttributeKey) var FirDeclaration.expectForActual: ExpectForActualData? by FirDeclarationDataRegistry.data(ExpectForActualAttributeKey)
fun FirFunctionSymbol<*>.getSingleCompatibleExpectForActualOrNull() = fun FirFunctionSymbol<*>.getSingleExpectForActualOrNull(compatibleOnly: Boolean = false) =
(this as FirBasedSymbol<*>).getSingleCompatibleExpectForActualOrNull() as? FirFunctionSymbol<*> (this as FirBasedSymbol<*>).getSingleExpectForActualOrNull(compatibleOnly) as? FirFunctionSymbol<*>
fun FirBasedSymbol<*>.getSingleCompatibleExpectForActualOrNull(): FirBasedSymbol<*>? { fun FirBasedSymbol<*>.getSingleExpectForActualOrNull(compatibleOnly: Boolean = false): FirBasedSymbol<*>? {
val expectForActual = expectForActual ?: return null val expectForActual = expectForActual ?: return null
var compatibleActuals: List<FirBasedSymbol<*>>? = null var actuals: List<FirBasedSymbol<*>>? = null
for ((key, item) in expectForActual) { for ((key, item) in expectForActual) {
if (key.compatible) { if (!compatibleOnly || key.compatible) {
if (compatibleActuals == null) { if (actuals == null) {
compatibleActuals = item actuals = item
} else { } else {
return null // Exit if there are more than one list with compatible actuals return null // Exit if there are more than one list with actuals
} }
} }
} }
return compatibleActuals?.singleOrNull() return actuals?.singleOrNull()
} }
val FirBasedSymbol<*>.expectForActual: ExpectForActualData? val FirBasedSymbol<*>.expectForActual: ExpectForActualData?
@@ -336,7 +336,7 @@ class ExpectedActualDeclarationChecker(
} }
} }
} }
val expectSingleCandidate = compatibility.values.singleOrNull()?.firstOrNull() val expectSingleCandidate = compatibility.values.singleOrNull()?.singleOrNull()
if (expectSingleCandidate != null) { if (expectSingleCandidate != null) {
checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias(expectSingleCandidate, reportOn, trace) checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias(expectSingleCandidate, reportOn, trace)
} }