diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 874780ad25f..0f100c5d9c4 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirPackageFragmentDescriptor +import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.* @@ -417,7 +418,12 @@ class Fir2IrDeclarationStorage( declareDefaultSetterParameter(type) } else if (function != null) { valueParameters = function.valueParameters.mapIndexed { index, valueParameter -> - createAndSaveIrParameter(valueParameter, index).apply { this.parent = parent } + createAndSaveIrParameter( + valueParameter, index, + useStubForDefaultValueStub = function !is FirConstructor || containingClass?.name != Name.identifier("Enum") + ).apply { + this.parent = parent + } } } if (function !is FirConstructor) { @@ -739,7 +745,11 @@ class Fir2IrDeclarationStorage( } } - private fun createAndSaveIrParameter(valueParameter: FirValueParameter, index: Int = -1): IrValueParameter { + private fun createAndSaveIrParameter( + valueParameter: FirValueParameter, + index: Int = -1, + useStubForDefaultValueStub: Boolean = true + ): IrValueParameter { val descriptor = WrappedValueParameterDescriptor() val origin = IrDeclarationOrigin.DEFINED val type = valueParameter.returnTypeRef.toIrType(session, this) @@ -755,7 +765,10 @@ class Fir2IrDeclarationStorage( valueParameter.isCrossinline, valueParameter.isNoinline ).apply { descriptor.bind(this) - if (valueParameter.defaultValue != null) { + if (valueParameter.defaultValue.let { + it != null && (useStubForDefaultValueStub || it !is FirExpressionStub) + } + ) { this.defaultValue = IrExpressionBodyImpl( IrErrorExpressionImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index c386f826367..9b1039a1926 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub import org.jetbrains.kotlin.fir.symbols.CallableId +import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef @@ -271,7 +272,9 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { this.symbol = symbol resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES this.typeParameters += typeParameters - valueParameters += local.memberDeserializer.valueParameters(proto.valueParameterList) + valueParameters += local.memberDeserializer.valueParameters( + proto.valueParameterList, addDefaultValue = classBuilder.symbol.classId == StandardClassIds.Enum + ) annotations += local.annotationDeserializer.loadConstructorAnnotations(proto, local.nameResolver) }.build() } @@ -284,7 +287,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { } private fun valueParameters( - valueParameters: List + valueParameters: List, + addDefaultValue: Boolean = false ): List { return valueParameters.map { proto -> val flags = if (proto.hasFlags()) proto.flags else 0 @@ -295,6 +299,9 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { this.name = name symbol = FirVariableSymbol(name) defaultValue = defaultValue(flags) + if (addDefaultValue) { + defaultValue = buildExpressionStub() + } isCrossinline = Flags.IS_CROSSINLINE.get(flags) isNoinline = Flags.IS_NOINLINE.get(flags) isVararg = proto.varargElementType(c.typeTable) != null diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt index 7167b297eab..d7f57710e4e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt @@ -157,11 +157,6 @@ internal object MapArguments : ResolutionStage() { override suspend fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) { val symbol = candidate.symbol as? FirFunctionSymbol<*> ?: return sink.reportApplicability(CandidateApplicability.HIDDEN) val function = symbol.fir - if (function is FirConstructor && function.returnTypeRef.isEnum) { - // NB: we do not check kotlin.Enum constructor calls, because we do not pass arguments there - candidate.argumentMapping = mapOf() - return - } val mapping = mapArguments(callInfo.arguments, function) val argumentToParameterMapping = mutableMapOf() diff --git a/compiler/fir/resolve/testData/builtIns/kotlin.txt b/compiler/fir/resolve/testData/builtIns/kotlin.txt index 612444923d6..8a200721ad1 100644 --- a/compiler/fir/resolve/testData/builtIns/kotlin.txt +++ b/compiler/fir/resolve/testData/builtIns/kotlin.txt @@ -515,7 +515,7 @@ public abstract class Enum : R|kotlin/Comparable| { public final val ordinal: R|kotlin/Int| public get(): R|kotlin/Int| - public constructor(name: R|kotlin/String|, ordinal: R|kotlin/Int|): R|kotlin/Enum| + public constructor(name: R|kotlin/String| = STUB, ordinal: R|kotlin/Int| = STUB): R|kotlin/Enum| public final companion object Companion : R|kotlin/Any| { private constructor(): R|kotlin/Enum.Companion|