diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index 46e19df8222..3d78f389bac 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -35,10 +35,7 @@ import org.jetbrains.kotlin.fir.serialization.constant.EnumValue import org.jetbrains.kotlin.fir.serialization.constant.IntValue import org.jetbrains.kotlin.fir.serialization.constant.StringValue import org.jetbrains.kotlin.fir.serialization.constant.toConstantValue -import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol +import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl @@ -346,9 +343,9 @@ class FirElementSerializer private constructor( val nonSourceAnnotations = setter.nonSourceAnnotations(session) if (Flags.IS_NOT_DEFAULT.get(accessorFlags)) { val setterLocal = local.createChildSerializer(setter) - for (valueParameterDescriptor in setter.valueParameters) { + for ((index, valueParameterDescriptor) in setter.valueParameters.withIndex()) { val annotations = nonSourceAnnotations.filter { it.useSiteTarget == AnnotationUseSiteTarget.SETTER_PARAMETER } - builder.setSetterValueParameter(setterLocal.valueParameterProto(valueParameterDescriptor, annotations)) + builder.setSetterValueParameter(setterLocal.valueParameterProto(valueParameterDescriptor, index, setter, annotations)) } } } @@ -481,8 +478,8 @@ class FirElementSerializer private constructor( } } - for (valueParameter in function.valueParameters) { - builder.addValueParameter(local.valueParameterProto(valueParameter)) + for ((index, valueParameter) in function.valueParameters.withIndex()) { + builder.addValueParameter(local.valueParameterProto(valueParameter, index, function)) } contractSerializer.serializeContractOfFunctionIfAny(function, builder, this) @@ -586,8 +583,8 @@ class FirElementSerializer private constructor( builder.flags = flags } - for (valueParameter in constructor.valueParameters) { - builder.addValueParameter(local.valueParameterProto(valueParameter)) + for ((index, valueParameter) in constructor.valueParameters.withIndex()) { + builder.addValueParameter(local.valueParameterProto(valueParameter, index, constructor)) } versionRequirementTable?.run { @@ -609,11 +606,14 @@ class FirElementSerializer private constructor( private fun valueParameterProto( parameter: FirValueParameter, + index: Int, + function: FirFunction, additionalAnnotations: List = emptyList() ): ProtoBuf.ValueParameter.Builder = whileAnalysing(session, parameter) { val builder = ProtoBuf.ValueParameter.newBuilder() - val declaresDefaultValue = parameter.defaultValue != null // TODO: || parameter.isActualParameterWithAnyExpectedDefault + val declaresDefaultValue = parameter.defaultValue != null || + function.symbol.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index) val flags = Flags.getValueParameterFlags( additionalAnnotations.isNotEmpty() || parameter.nonSourceAnnotations(session).isNotEmpty(), diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt index d7eab2d035b..cf1ae2ce687 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt @@ -116,3 +116,7 @@ inline val FirBasedSymbol<*>.isJavaOrEnhancement: Boolean get() = origin.isJavaOrEnhancement || (fir as? FirCallableDeclaration)?.importedFromObjectOrStaticData?.original?.isJavaOrEnhancement == true +fun FirFunctionSymbol<*>?.containsDefaultValue(index: Int): Boolean { + if (this == null) return false + return this.fir.valueParameters[index].defaultValue != null +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirDefaultParametersResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirDefaultParametersResolver.kt index edad2d0b80f..06ddef77326 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirDefaultParametersResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirDefaultParametersResolver.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractImportingScope -import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol class FirDefaultParametersResolver : FirSessionComponent { fun declaresDefaultValue( @@ -22,7 +21,7 @@ class FirDefaultParametersResolver : FirSessionComponent { originScope: FirScope?, index: Int, ): Boolean { - if (valueParameter.defaultValue != null || containsDefaultValue(function.symbol.getSingleCompatibleExpectForActualOrNull(), index)) { + if (valueParameter.defaultValue != null || function.symbol.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index)) { return true } if (function !is FirSimpleFunction) return false @@ -44,10 +43,8 @@ class FirDefaultParametersResolver : FirSessionComponent { var result = false typeScope.processOverriddenFunctions(symbol) { overridden -> - if (containsDefaultValue(overridden, index) || containsDefaultValue( - overridden.getSingleCompatibleExpectForActualOrNull(), - index - ) + if (overridden.containsDefaultValue(index) || + overridden.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index) ) { result = true return@processOverriddenFunctions ProcessorAction.STOP @@ -58,11 +55,6 @@ class FirDefaultParametersResolver : FirSessionComponent { return result } - - private fun containsDefaultValue(functionSymbol: FirFunctionSymbol<*>?, index: Int): Boolean { - if (functionSymbol == null) return false - return functionSymbol.fir.valueParameters[index].defaultValue != null - } } internal val FirSession.defaultParameterResolver: FirDefaultParametersResolver by FirSession.sessionComponentAccessor() diff --git a/compiler/testData/codegen/box/multiplatform/defaultArguments/functionFromOtherModule.kt b/compiler/testData/codegen/box/multiplatform/defaultArguments/functionFromOtherModule.kt index 06c5f519679..a2649cd0f49 100644 --- a/compiler/testData/codegen/box/multiplatform/defaultArguments/functionFromOtherModule.kt +++ b/compiler/testData/codegen/box/multiplatform/defaultArguments/functionFromOtherModule.kt @@ -1,6 +1,6 @@ // !LANGUAGE: +MultiPlatformProjects // IGNORE_BACKEND_K2: JVM_IR, JS_IR, NATIVE -// FIR status: default argument mapping in MPP isn't designed yet +// FIR status: expect/actual in the same module // WITH_STDLIB // MODULE: lib // FILE: common.kt diff --git a/compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt b/compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt index d5e674eaff6..06ac9590701 100644 --- a/compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt +++ b/compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt @@ -2,7 +2,7 @@ // IGNORE_BACKEND: JS_IR, JS_IR_ES6, WASM // JS IR & Wasm: https://youtrack.jetbrains.com/issue/KT-51225 // IGNORE_BACKEND_K2: JVM_IR, NATIVE -// FIR status: default argument mapping in MPP isn't designed yet +// FIR status: expect/actual in the same module // !LANGUAGE: +MultiPlatformProjects // MODULE: lib // FILE: common.kt