[FIR] Add compatibleOnly parameter to getSingleCompatibleExpectForActualOrNull
Rename `getSingleCompatibleExpectForActualOrNull` to `getSingleExpectForActualOrNull`
This commit is contained in:
committed by
Space Team
parent
d600d768a6
commit
1e09e8663c
+7
-3
@@ -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.getContainingClassSymbol
|
||||
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.symbols.FirBasedSymbol
|
||||
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
|
||||
|
||||
object FirActualCallableDeclarationChecker : FirCallableDeclarationChecker() {
|
||||
@@ -37,7 +41,7 @@ object FirActualCallableDeclarationChecker : FirCallableDeclarationChecker() {
|
||||
|
||||
private fun checkReturnTypes(callableDeclaration: FirCallableDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
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)
|
||||
?.typeParameterSymbols.orEmpty()
|
||||
|
||||
+1
-1
@@ -180,7 +180,7 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
}
|
||||
}
|
||||
val expectedSingleCandidate = compatibilityToMembersMap.values.singleOrNull()?.firstOrNull()
|
||||
val expectedSingleCandidate = symbol.getSingleExpectForActualOrNull()
|
||||
if (expectedSingleCandidate != null) {
|
||||
checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias(
|
||||
expectedSingleCandidate,
|
||||
|
||||
+1
-1
@@ -700,7 +700,7 @@ class FirElementSerializer private constructor(
|
||||
val builder = ProtoBuf.ValueParameter.newBuilder()
|
||||
|
||||
val declaresDefaultValue = parameter.defaultValue != null ||
|
||||
function.symbol.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index)
|
||||
function.symbol.getSingleExpectForActualOrNull(compatibleOnly = true).containsDefaultValue(index)
|
||||
|
||||
val flags = Flags.getValueParameterFlags(
|
||||
additionalAnnotations.isNotEmpty() || parameter.nonSourceAnnotations(session).isNotEmpty(),
|
||||
|
||||
+2
-2
@@ -21,7 +21,7 @@ class FirDefaultParametersResolver : FirSessionComponent {
|
||||
originScope: FirScope?,
|
||||
index: Int,
|
||||
): Boolean {
|
||||
if (valueParameter.defaultValue != null || function.symbol.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index)) {
|
||||
if (valueParameter.defaultValue != null || function.symbol.getSingleExpectForActualOrNull().containsDefaultValue(index)) {
|
||||
return true
|
||||
}
|
||||
if (function !is FirSimpleFunction) return false
|
||||
@@ -45,7 +45,7 @@ class FirDefaultParametersResolver : FirSessionComponent {
|
||||
|
||||
typeScope.processOverriddenFunctions(symbol) { overridden ->
|
||||
if (overridden.containsDefaultValue(index) ||
|
||||
overridden.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index)
|
||||
overridden.getSingleExpectForActualOrNull().containsDefaultValue(index)
|
||||
) {
|
||||
result = true
|
||||
return@processOverriddenFunctions ProcessorAction.STOP
|
||||
|
||||
+9
-9
@@ -19,22 +19,22 @@ typealias ExpectForActualData = Map<ExpectActualCompatibility<FirBasedSymbol<*>>
|
||||
@SymbolInternals
|
||||
var FirDeclaration.expectForActual: ExpectForActualData? by FirDeclarationDataRegistry.data(ExpectForActualAttributeKey)
|
||||
|
||||
fun FirFunctionSymbol<*>.getSingleCompatibleExpectForActualOrNull() =
|
||||
(this as FirBasedSymbol<*>).getSingleCompatibleExpectForActualOrNull() as? FirFunctionSymbol<*>
|
||||
fun FirFunctionSymbol<*>.getSingleExpectForActualOrNull(compatibleOnly: Boolean = false) =
|
||||
(this as FirBasedSymbol<*>).getSingleExpectForActualOrNull(compatibleOnly) as? FirFunctionSymbol<*>
|
||||
|
||||
fun FirBasedSymbol<*>.getSingleCompatibleExpectForActualOrNull(): FirBasedSymbol<*>? {
|
||||
fun FirBasedSymbol<*>.getSingleExpectForActualOrNull(compatibleOnly: Boolean = false): FirBasedSymbol<*>? {
|
||||
val expectForActual = expectForActual ?: return null
|
||||
var compatibleActuals: List<FirBasedSymbol<*>>? = null
|
||||
var actuals: List<FirBasedSymbol<*>>? = null
|
||||
for ((key, item) in expectForActual) {
|
||||
if (key.compatible) {
|
||||
if (compatibleActuals == null) {
|
||||
compatibleActuals = item
|
||||
if (!compatibleOnly || key.compatible) {
|
||||
if (actuals == null) {
|
||||
actuals = item
|
||||
} 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?
|
||||
|
||||
+1
-1
@@ -336,7 +336,7 @@ class ExpectedActualDeclarationChecker(
|
||||
}
|
||||
}
|
||||
}
|
||||
val expectSingleCandidate = compatibility.values.singleOrNull()?.firstOrNull()
|
||||
val expectSingleCandidate = compatibility.values.singleOrNull()?.singleOrNull()
|
||||
if (expectSingleCandidate != null) {
|
||||
checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias(expectSingleCandidate, reportOn, trace)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user