[FIR] Add stub default values to kotlin.Enum constructor parameters
This commit is contained in:
+16
-3
@@ -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.declarations.impl.FirDefaultPropertySetter
|
||||||
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
|
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
|
||||||
import org.jetbrains.kotlin.fir.descriptors.FirPackageFragmentDescriptor
|
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.psi
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
import org.jetbrains.kotlin.fir.resolve.*
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
@@ -417,7 +418,12 @@ class Fir2IrDeclarationStorage(
|
|||||||
declareDefaultSetterParameter(type)
|
declareDefaultSetterParameter(type)
|
||||||
} else if (function != null) {
|
} else if (function != null) {
|
||||||
valueParameters = function.valueParameters.mapIndexed { index, valueParameter ->
|
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) {
|
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 descriptor = WrappedValueParameterDescriptor()
|
||||||
val origin = IrDeclarationOrigin.DEFINED
|
val origin = IrDeclarationOrigin.DEFINED
|
||||||
val type = valueParameter.returnTypeRef.toIrType(session, this)
|
val type = valueParameter.returnTypeRef.toIrType(session, this)
|
||||||
@@ -755,7 +765,10 @@ class Fir2IrDeclarationStorage(
|
|||||||
valueParameter.isCrossinline, valueParameter.isNoinline
|
valueParameter.isCrossinline, valueParameter.isNoinline
|
||||||
).apply {
|
).apply {
|
||||||
descriptor.bind(this)
|
descriptor.bind(this)
|
||||||
if (valueParameter.defaultValue != null) {
|
if (valueParameter.defaultValue.let {
|
||||||
|
it != null && (useStubForDefaultValueStub || it !is FirExpressionStub)
|
||||||
|
}
|
||||||
|
) {
|
||||||
this.defaultValue = IrExpressionBodyImpl(
|
this.defaultValue = IrExpressionBodyImpl(
|
||||||
IrErrorExpressionImpl(
|
IrErrorExpressionImpl(
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, type,
|
UNDEFINED_OFFSET, UNDEFINED_OFFSET, type,
|
||||||
|
|||||||
+9
-2
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.*
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
|
import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
|
||||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
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.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||||
@@ -271,7 +272,9 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
|||||||
this.symbol = symbol
|
this.symbol = symbol
|
||||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||||
this.typeParameters += typeParameters
|
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)
|
annotations += local.annotationDeserializer.loadConstructorAnnotations(proto, local.nameResolver)
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
@@ -284,7 +287,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun valueParameters(
|
private fun valueParameters(
|
||||||
valueParameters: List<ProtoBuf.ValueParameter>
|
valueParameters: List<ProtoBuf.ValueParameter>,
|
||||||
|
addDefaultValue: Boolean = false
|
||||||
): List<FirValueParameter> {
|
): List<FirValueParameter> {
|
||||||
return valueParameters.map { proto ->
|
return valueParameters.map { proto ->
|
||||||
val flags = if (proto.hasFlags()) proto.flags else 0
|
val flags = if (proto.hasFlags()) proto.flags else 0
|
||||||
@@ -295,6 +299,9 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
|||||||
this.name = name
|
this.name = name
|
||||||
symbol = FirVariableSymbol(name)
|
symbol = FirVariableSymbol(name)
|
||||||
defaultValue = defaultValue(flags)
|
defaultValue = defaultValue(flags)
|
||||||
|
if (addDefaultValue) {
|
||||||
|
defaultValue = buildExpressionStub()
|
||||||
|
}
|
||||||
isCrossinline = Flags.IS_CROSSINLINE.get(flags)
|
isCrossinline = Flags.IS_CROSSINLINE.get(flags)
|
||||||
isNoinline = Flags.IS_NOINLINE.get(flags)
|
isNoinline = Flags.IS_NOINLINE.get(flags)
|
||||||
isVararg = proto.varargElementType(c.typeTable) != null
|
isVararg = proto.varargElementType(c.typeTable) != null
|
||||||
|
|||||||
@@ -157,11 +157,6 @@ internal object MapArguments : ResolutionStage() {
|
|||||||
override suspend fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) {
|
override suspend fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) {
|
||||||
val symbol = candidate.symbol as? FirFunctionSymbol<*> ?: return sink.reportApplicability(CandidateApplicability.HIDDEN)
|
val symbol = candidate.symbol as? FirFunctionSymbol<*> ?: return sink.reportApplicability(CandidateApplicability.HIDDEN)
|
||||||
val function = symbol.fir
|
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 mapping = mapArguments(callInfo.arguments, function)
|
||||||
val argumentToParameterMapping = mutableMapOf<FirExpression, FirValueParameter>()
|
val argumentToParameterMapping = mutableMapOf<FirExpression, FirValueParameter>()
|
||||||
|
|||||||
+1
-1
@@ -515,7 +515,7 @@ public abstract class Enum<E> : R|kotlin/Comparable<E>| {
|
|||||||
public final val ordinal: R|kotlin/Int|
|
public final val ordinal: R|kotlin/Int|
|
||||||
public get(): R|kotlin/Int|
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
public constructor<E>(name: R|kotlin/String|, ordinal: R|kotlin/Int|): R|kotlin/Enum<E>|
|
public constructor<E>(name: R|kotlin/String| = STUB, ordinal: R|kotlin/Int| = STUB): R|kotlin/Enum<E>|
|
||||||
|
|
||||||
public final companion object Companion : R|kotlin/Any| {
|
public final companion object Companion : R|kotlin/Any| {
|
||||||
private constructor(): R|kotlin/Enum.Companion|
|
private constructor(): R|kotlin/Enum.Companion|
|
||||||
|
|||||||
Reference in New Issue
Block a user