[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.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()
|
||||||
|
|||||||
+1
-1
@@ -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,
|
||||||
|
|||||||
+1
-1
@@ -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(),
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+9
-9
@@ -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?
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user