From f1fef62f7618964ade5b3364cd44e106c9ec8264 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Thu, 16 Feb 2023 22:20:29 +0100 Subject: [PATCH] [FIR] Consider default values from expect function during serialization It's not possible to unmute some tests for K2 because it causes testData structure changing If change testData, NATIVE doesn't work even with `IGNORE_BACKEND` --- .../fir/serialization/FirElementSerializer.kt | 22 +++++++++---------- .../fir/declarations/declarationUtils.kt | 4 ++++ .../resolve/FirDefaultParametersResolver.kt | 14 +++--------- .../functionFromOtherModule.kt | 2 +- .../defaultArguments/nestedEnumEntryValue.kt | 2 +- 5 files changed, 20 insertions(+), 24 deletions(-) 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