[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`
This commit is contained in:
Ivan Kochurkin
2023-02-16 22:20:29 +01:00
committed by Space Team
parent d87619e06e
commit f1fef62f76
5 changed files with 20 additions and 24 deletions
@@ -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.IntValue
import org.jetbrains.kotlin.fir.serialization.constant.StringValue import org.jetbrains.kotlin.fir.serialization.constant.StringValue
import org.jetbrains.kotlin.fir.serialization.constant.toConstantValue import org.jetbrains.kotlin.fir.serialization.constant.toConstantValue
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.*
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.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
@@ -346,9 +343,9 @@ class FirElementSerializer private constructor(
val nonSourceAnnotations = setter.nonSourceAnnotations(session) val nonSourceAnnotations = setter.nonSourceAnnotations(session)
if (Flags.IS_NOT_DEFAULT.get(accessorFlags)) { if (Flags.IS_NOT_DEFAULT.get(accessorFlags)) {
val setterLocal = local.createChildSerializer(setter) 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 } 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) { for ((index, valueParameter) in function.valueParameters.withIndex()) {
builder.addValueParameter(local.valueParameterProto(valueParameter)) builder.addValueParameter(local.valueParameterProto(valueParameter, index, function))
} }
contractSerializer.serializeContractOfFunctionIfAny(function, builder, this) contractSerializer.serializeContractOfFunctionIfAny(function, builder, this)
@@ -586,8 +583,8 @@ class FirElementSerializer private constructor(
builder.flags = flags builder.flags = flags
} }
for (valueParameter in constructor.valueParameters) { for ((index, valueParameter) in constructor.valueParameters.withIndex()) {
builder.addValueParameter(local.valueParameterProto(valueParameter)) builder.addValueParameter(local.valueParameterProto(valueParameter, index, constructor))
} }
versionRequirementTable?.run { versionRequirementTable?.run {
@@ -609,11 +606,14 @@ class FirElementSerializer private constructor(
private fun valueParameterProto( private fun valueParameterProto(
parameter: FirValueParameter, parameter: FirValueParameter,
index: Int,
function: FirFunction,
additionalAnnotations: List<FirAnnotation> = emptyList() additionalAnnotations: List<FirAnnotation> = emptyList()
): ProtoBuf.ValueParameter.Builder = whileAnalysing(session, parameter) { ): ProtoBuf.ValueParameter.Builder = whileAnalysing(session, parameter) {
val builder = ProtoBuf.ValueParameter.newBuilder() 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( val flags = Flags.getValueParameterFlags(
additionalAnnotations.isNotEmpty() || parameter.nonSourceAnnotations(session).isNotEmpty(), additionalAnnotations.isNotEmpty() || parameter.nonSourceAnnotations(session).isNotEmpty(),
@@ -116,3 +116,7 @@ inline val FirBasedSymbol<*>.isJavaOrEnhancement: Boolean
get() = origin.isJavaOrEnhancement || get() = origin.isJavaOrEnhancement ||
(fir as? FirCallableDeclaration)?.importedFromObjectOrStaticData?.original?.isJavaOrEnhancement == true (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
}
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractImportingScope
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
class FirDefaultParametersResolver : FirSessionComponent { class FirDefaultParametersResolver : FirSessionComponent {
fun declaresDefaultValue( fun declaresDefaultValue(
@@ -22,7 +21,7 @@ class FirDefaultParametersResolver : FirSessionComponent {
originScope: FirScope?, originScope: FirScope?,
index: Int, index: Int,
): Boolean { ): Boolean {
if (valueParameter.defaultValue != null || containsDefaultValue(function.symbol.getSingleCompatibleExpectForActualOrNull(), index)) { if (valueParameter.defaultValue != null || function.symbol.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index)) {
return true return true
} }
if (function !is FirSimpleFunction) return false if (function !is FirSimpleFunction) return false
@@ -44,10 +43,8 @@ class FirDefaultParametersResolver : FirSessionComponent {
var result = false var result = false
typeScope.processOverriddenFunctions(symbol) { overridden -> typeScope.processOverriddenFunctions(symbol) { overridden ->
if (containsDefaultValue(overridden, index) || containsDefaultValue( if (overridden.containsDefaultValue(index) ||
overridden.getSingleCompatibleExpectForActualOrNull(), overridden.getSingleCompatibleExpectForActualOrNull().containsDefaultValue(index)
index
)
) { ) {
result = true result = true
return@processOverriddenFunctions ProcessorAction.STOP return@processOverriddenFunctions ProcessorAction.STOP
@@ -58,11 +55,6 @@ class FirDefaultParametersResolver : FirSessionComponent {
return result 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() internal val FirSession.defaultParameterResolver: FirDefaultParametersResolver by FirSession.sessionComponentAccessor()
@@ -1,6 +1,6 @@
// !LANGUAGE: +MultiPlatformProjects // !LANGUAGE: +MultiPlatformProjects
// IGNORE_BACKEND_K2: JVM_IR, JS_IR, NATIVE // 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 // WITH_STDLIB
// MODULE: lib // MODULE: lib
// FILE: common.kt // FILE: common.kt
@@ -2,7 +2,7 @@
// IGNORE_BACKEND: JS_IR, JS_IR_ES6, WASM // IGNORE_BACKEND: JS_IR, JS_IR_ES6, WASM
// JS IR & Wasm: https://youtrack.jetbrains.com/issue/KT-51225 // JS IR & Wasm: https://youtrack.jetbrains.com/issue/KT-51225
// IGNORE_BACKEND_K2: JVM_IR, NATIVE // 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 // !LANGUAGE: +MultiPlatformProjects
// MODULE: lib // MODULE: lib
// FILE: common.kt // FILE: common.kt