[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:
committed by
Space Team
parent
d87619e06e
commit
f1fef62f76
+11
-11
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
+3
-11
@@ -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
-1
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user