From 71456c5514f10d8736bf61057d5e7263a18253b3 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 26 Jun 2023 16:00:53 +0300 Subject: [PATCH] FIR2IR: properly set constant expression type --- .../FirCompileTimeConstantEvaluator.kt | 2 +- .../fir/file/structure/FirElementsRecorder.kt | 3 +- .../deserialization/FirConstDeserializer.kt | 35 +++++++--- .../deserialization/FirMemberDeserializer.kt | 1 + .../fir/serialization/FirElementSerializer.kt | 8 ++- .../Fir2IrAnnotationsFromPluginRegistrar.kt | 70 ++++++++++++++++--- .../jetbrains/kotlin/fir/java/JavaUtils.kt | 48 ++++++++----- .../fir/builder/AbstractRawFirBuilder.kt | 19 +++-- .../kotlin/fir/builder/ConversionUtils.kt | 2 +- .../fir/expressions/FirExpressionUtil.kt | 2 +- .../builder/FirConstExpressionBuilder.kt | 30 +++++--- .../types/impl/FirImplicitBuiltinTypeRef.kt | 10 +++ 12 files changed, 172 insertions(+), 58 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt index 8b88824aa61..dac3106e4d0 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt @@ -390,7 +390,7 @@ internal object FirCompileTimeConstantEvaluator { private fun ConstantValueKind.toConstExpression(source: KtSourceElement?, value: Any?): FirConstExpression = @Suppress("UNCHECKED_CAST") - buildConstExpression(source, this, value as T) + buildConstExpression(source, this, value as T, setType = false) private fun FirFunctionCall.getOriginalFunction(): FirCallableDeclaration? { val symbol: FirBasedSymbol<*>? = when (val reference = calleeReference) { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt index d9c3515b7b0..c31a5511892 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt @@ -215,7 +215,8 @@ internal open class FirElementsRecorder : FirVisitor buildConstExpression(null, ConstantValueKind.Byte, ((protoValue?.intValue ?: sourceValue) as Number).toByte()) - "CHAR", "C" -> buildConstExpression(null, ConstantValueKind.Char, ((protoValue?.intValue ?: sourceValue) as Number).toInt().toChar()) - "SHORT", "S" -> buildConstExpression(null, ConstantValueKind.Short, ((protoValue?.intValue ?: sourceValue) as Number).toShort()) - "INT", "I" -> buildConstExpression(null, ConstantValueKind.Int, protoValue?.intValue?.toInt() ?: sourceValue as Int) - "LONG", "J" -> buildConstExpression(null, ConstantValueKind.Long, protoValue?.intValue ?: sourceValue as Long) - "FLOAT", "F" -> buildConstExpression(null, ConstantValueKind.Float, protoValue?.floatValue ?: sourceValue as Float) - "DOUBLE", "D" -> buildConstExpression(null, ConstantValueKind.Double, protoValue?.doubleValue ?: sourceValue as Double) - "BOOLEAN", "Z" -> buildConstExpression(null, ConstantValueKind.Boolean, (protoValue?.intValue?.toInt() ?: sourceValue) != 0) + "BYTE", "B" -> buildConstExpression( + null, ConstantValueKind.Byte, ((protoValue?.intValue ?: sourceValue) as Number).toByte(), setType = true + ) + "CHAR", "C" -> buildConstExpression( + null, ConstantValueKind.Char, ((protoValue?.intValue ?: sourceValue) as Number).toInt().toChar(), setType = true + ) + "SHORT", "S" -> buildConstExpression( + null, ConstantValueKind.Short, ((protoValue?.intValue ?: sourceValue) as Number).toShort(), setType = true + ) + "INT", "I" -> buildConstExpression( + null, ConstantValueKind.Int, protoValue?.intValue?.toInt() ?: sourceValue as Int, setType = true + ) + "LONG", "J" -> buildConstExpression( + null, ConstantValueKind.Long, protoValue?.intValue ?: sourceValue as Long, setType = true + ) + "FLOAT", "F" -> buildConstExpression( + null, ConstantValueKind.Float, protoValue?.floatValue ?: sourceValue as Float, setType = true + ) + "DOUBLE", "D" -> buildConstExpression( + null, ConstantValueKind.Double, protoValue?.doubleValue ?: sourceValue as Double, setType = true + ) + "BOOLEAN", "Z" -> buildConstExpression( + null, ConstantValueKind.Boolean, (protoValue?.intValue?.toInt() ?: sourceValue) != 0, setType = true + ) "STRING", "Ljava/lang/String;" -> buildConstExpression( - null, ConstantValueKind.String, protoValue?.stringValue?.let { nameResolver.getString(it) } ?: sourceValue as String + null, ConstantValueKind.String, + protoValue?.stringValue?.let { nameResolver.getString(it) } ?: sourceValue as String, setType = true ) else -> null } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index 70d8bf14086..9569fd91569 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -467,6 +467,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { proto.contextReceiverTypes(c.typeTable).mapTo(contextReceivers, ::loadContextReceiver) }.apply { + initializer?.replaceTypeRef(returnTypeRef) versionRequirementsTable = c.versionRequirementTable setLazyPublishedVisibility(c.session) getter?.setLazyPublishedVisibility(annotations, this, c.session) 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 68f22bc98f6..0ef0708667d 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 @@ -600,7 +600,9 @@ class FirElementSerializer private constructor( } } - private fun typeAliasProto(typeAlias: FirTypeAlias): ProtoBuf.TypeAlias.Builder? = whileAnalysing(session, typeAlias) { + private fun typeAliasProto(typeAlias: FirTypeAlias): ProtoBuf.TypeAlias.Builder? = whileAnalysing( + session, typeAlias + ) { val builder = ProtoBuf.TypeAlias.newBuilder() val local = createChildSerializer(typeAlias) @@ -851,7 +853,9 @@ class FirElementSerializer private constructor( correspondingTypeRef?.annotations, CompilerConeAttributes.ContextFunctionTypeParams.ANNOTATION_CLASS_ID, argumentMapping = buildAnnotationArgumentMapping { this.mapping[StandardNames.CONTEXT_FUNCTION_TYPE_PARAMETER_COUNT_NAME] = - buildConstExpression(source = null, ConstantValueKind.Int, type.contextReceiversNumberForFunctionType) + buildConstExpression( + source = null, ConstantValueKind.Int, type.contextReceiversNumberForFunctionType, setType = false + ) } ) ) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrAnnotationsFromPluginRegistrar.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrAnnotationsFromPluginRegistrar.kt index 50a4be765f1..5dac77f66dc 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrAnnotationsFromPluginRegistrar.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrAnnotationsFromPluginRegistrar.kt @@ -117,16 +117,66 @@ class Fir2IrAnnotationsFromPluginRegistrar(private val components: Fir2IrCompone val name = this@toFirAnnotation.symbol.owner.valueParameters[i].name val argument = this@toFirAnnotation.getValueArgument(i) as IrConst<*> this.mapping[name] = when (argument.kind) { - IrConstKind.Boolean -> buildConstExpression(source = null, ConstantValueKind.Boolean, argument.value as Boolean) - IrConstKind.Byte -> buildConstExpression(source = null, ConstantValueKind.Byte, argument.value as Byte) - IrConstKind.Char -> buildConstExpression(source = null, ConstantValueKind.Char, argument.value as Char) - IrConstKind.Double -> buildConstExpression(source = null, ConstantValueKind.Double, argument.value as Double) - IrConstKind.Float -> buildConstExpression(source = null, ConstantValueKind.Float, argument.value as Float) - IrConstKind.Int -> buildConstExpression(source = null, ConstantValueKind.Int, argument.value as Int) - IrConstKind.Long -> buildConstExpression(source = null, ConstantValueKind.Long, argument.value as Long) - IrConstKind.Null -> buildConstExpression(source = null, ConstantValueKind.Null, null) - IrConstKind.Short -> buildConstExpression(source = null, ConstantValueKind.Short, argument.value as Short) - IrConstKind.String -> buildConstExpression(source = null, ConstantValueKind.String, argument.value as String) + IrConstKind.Boolean -> buildConstExpression( + source = null, + ConstantValueKind.Boolean, + argument.value as Boolean, + setType = true + ) + IrConstKind.Byte -> buildConstExpression( + source = null, + ConstantValueKind.Byte, + argument.value as Byte, + setType = true + ) + IrConstKind.Char -> buildConstExpression( + source = null, + ConstantValueKind.Char, + argument.value as Char, + setType = true + ) + IrConstKind.Double -> buildConstExpression( + source = null, + ConstantValueKind.Double, + argument.value as Double, + setType = true + ) + IrConstKind.Float -> buildConstExpression( + source = null, + ConstantValueKind.Float, + argument.value as Float, + setType = true + ) + IrConstKind.Int -> buildConstExpression( + source = null, + ConstantValueKind.Int, + argument.value as Int, + setType = true + ) + IrConstKind.Long -> buildConstExpression( + source = null, + ConstantValueKind.Long, + argument.value as Long, + setType = true + ) + IrConstKind.Null -> buildConstExpression( + source = null, + ConstantValueKind.Null, + value = null, + setType = true + ) + IrConstKind.Short -> buildConstExpression( + source = null, + ConstantValueKind.Short, + argument.value as Short, + setType = false + ) + IrConstKind.String -> buildConstExpression( + source = null, + ConstantValueKind.String, + argument.value as String, + setType = false + ) } } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 66215d7faf9..e59d319ba9a 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -63,15 +63,33 @@ internal fun Any?.createConstantOrError(session: FirSession): FirExpression { internal fun Any?.createConstantIfAny(session: FirSession, unsigned: Boolean = false): FirExpression? { return when (this) { - is Byte -> buildConstExpression(null, if (unsigned) ConstantValueKind.UnsignedByte else ConstantValueKind.Byte, this).setProperType(session) - is Short -> buildConstExpression(null, if (unsigned) ConstantValueKind.UnsignedShort else ConstantValueKind.Short, this).setProperType(session) - is Int -> buildConstExpression(null, if (unsigned) ConstantValueKind.UnsignedInt else ConstantValueKind.Int, this).setProperType(session) - is Long -> buildConstExpression(null, if (unsigned) ConstantValueKind.UnsignedLong else ConstantValueKind.Long, this).setProperType(session) - is Char -> buildConstExpression(null, ConstantValueKind.Char, this).setProperType(session) - is Float -> buildConstExpression(null, ConstantValueKind.Float, this).setProperType(session) - is Double -> buildConstExpression(null, ConstantValueKind.Double, this).setProperType(session) - is Boolean -> buildConstExpression(null, ConstantValueKind.Boolean, this).setProperType(session) - is String -> buildConstExpression(null, ConstantValueKind.String, this).setProperType(session) + is Byte -> buildConstExpression( + null, if (unsigned) ConstantValueKind.UnsignedByte else ConstantValueKind.Byte, this, setType = true + ) + is Short -> buildConstExpression( + null, if (unsigned) ConstantValueKind.UnsignedShort else ConstantValueKind.Short, this, setType = true + ) + is Int -> buildConstExpression( + null, if (unsigned) ConstantValueKind.UnsignedInt else ConstantValueKind.Int, this, setType = true + ) + is Long -> buildConstExpression( + null, if (unsigned) ConstantValueKind.UnsignedLong else ConstantValueKind.Long, this, setType = true + ) + is Char -> buildConstExpression( + null, ConstantValueKind.Char, this, setType = true + ) + is Float -> buildConstExpression( + null, ConstantValueKind.Float, this, setType = true + ) + is Double -> buildConstExpression( + null, ConstantValueKind.Double, this, setType = true + ) + is Boolean -> buildConstExpression( + null, ConstantValueKind.Boolean, this, setType = true + ) + is String -> buildConstExpression( + null, ConstantValueKind.String, this, setType = true + ) is ByteArray -> toList().createArrayOfCall(session, ConstantValueKind.Byte) is ShortArray -> toList().createArrayOfCall(session, ConstantValueKind.Short) is IntArray -> toList().createArrayOfCall(session, ConstantValueKind.Int) @@ -80,7 +98,9 @@ internal fun Any?.createConstantIfAny(session: FirSession, unsigned: Boolean = f is FloatArray -> toList().createArrayOfCall(session, ConstantValueKind.Float) is DoubleArray -> toList().createArrayOfCall(session, ConstantValueKind.Double) is BooleanArray -> toList().createArrayOfCall(session, ConstantValueKind.Boolean) - null -> buildConstExpression(null, ConstantValueKind.Null, null).setProperType(session) + null -> buildConstExpression( + null, ConstantValueKind.Null, null, setType = true + ) else -> null } @@ -99,14 +119,6 @@ private fun List.createArrayOfCall(session: FirSession, kind: ConstantVal } } -private fun FirConstExpression<*>.setProperType(session: FirSession): FirConstExpression<*> { - val typeRef = buildResolvedTypeRef { - type = kind.expectedConeType(session) - } - replaceTypeRef(typeRef) - return this -} - // For now, it's supported only for RxJava3 annotations, see KT-53041 fun extractNullabilityAnnotationOnBoundedWildcard(wildcardType: JavaWildcardType): JavaAnnotation? { require(wildcardType.bound != null) { "Nullability annotations on unbounded wildcards aren't supported" } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt index f5b4cde5bf3..f2bfd4b3e5c 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt @@ -406,13 +406,15 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context buildConstExpression( sourceElement, ConstantValueKind.Boolean, - convertedText as Boolean + convertedText as Boolean, + setType = false ) NULL -> buildConstExpression( sourceElement, ConstantValueKind.Null, - null + null, + setType = false ) else -> throw AssertionError("Unknown literal type: $type, $text") @@ -438,7 +440,8 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context return buildConstExpression( source.toFirSourceElement(), ConstantValueKind.IntegerLiteral, - convertedValue + convertedValue, + setType = false ) } @@ -457,11 +460,15 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context OPEN_QUOTE, CLOSING_QUOTE -> continue@L LITERAL_STRING_TEMPLATE_ENTRY -> { sb.append(entry.asText) - buildConstExpression(entry.toFirSourceElement(), ConstantValueKind.String, entry.asText) + buildConstExpression( + entry.toFirSourceElement(), ConstantValueKind.String, entry.asText, setType = false + ) } ESCAPE_STRING_TEMPLATE_ENTRY -> { sb.append(entry.unescapedValue) - buildConstExpression(entry.toFirSourceElement(), ConstantValueKind.String, entry.unescapedValue) + buildConstExpression( + entry.toFirSourceElement(), ConstantValueKind.String, entry.unescapedValue, setType = false + ) } SHORT_STRING_TEMPLATE_ENTRY, LONG_STRING_TEMPLATE_ENTRY -> { hasExpressions = true @@ -479,7 +486,7 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context } source = base?.toFirSourceElement() // Fast-pass if there is no non-const string expressions - if (!hasExpressions) return buildConstExpression(source, ConstantValueKind.String, sb.toString()) + if (!hasExpressions) return buildConstExpression(source, ConstantValueKind.String, sb.toString(), setType = false) } } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index 5ab0d765ea0..9b92fc269e4 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -355,7 +355,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate( type = context.dispatchReceiverTypesStack.last() } } - else -> buildConstExpression(null, ConstantValueKind.Null, null) + else -> buildConstExpression(null, ConstantValueKind.Null, null, setType = false) } fun delegateAccess() = buildPropertyAccessExpression { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt index d9a18da11b9..e8dbdd04d29 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt @@ -38,7 +38,7 @@ inline val FirAnnotation.unexpandedClassId: ClassId? fun buildConstOrErrorExpression(source: KtSourceElement?, kind: ConstantValueKind, value: T?, diagnostic: ConeDiagnostic): FirExpression = value?.let { - buildConstExpression(source, kind, it) + buildConstExpression(source, kind, it, setType = false) } ?: buildErrorExpression { this.source = source this.diagnostic = diagnostic diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirConstExpressionBuilder.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirConstExpressionBuilder.kt index c312d39e5e7..da5b3640950 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirConstExpressionBuilder.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirConstExpressionBuilder.kt @@ -18,18 +18,30 @@ fun buildConstExpression( kind: ConstantValueKind, value: T, annotations: MutableList = mutableListOf(), - setType: Boolean = false + setType: Boolean ): FirConstExpression { return FirConstExpressionImpl(source, annotations.toMutableOrEmpty(), kind, value).also { if (setType) { - when (value) { - null -> it.typeRef = FirImplicitNullableAnyTypeRef(null) - is String -> it.typeRef = FirImplicitStringTypeRef(null) - is Long -> it.typeRef = FirImplicitLongTypeRef(null) - is Int -> it.typeRef = FirImplicitIntTypeRef(null) - is Boolean -> it.typeRef = FirImplicitBooleanTypeRef(null) - is Double -> it.typeRef = FirImplicitDoubleTypeRef(null) - is Float -> it.typeRef = FirImplicitFloatTypeRef(null) + when (kind) { + ConstantValueKind.Boolean -> it.typeRef = FirImplicitBooleanTypeRef(null) + ConstantValueKind.Byte -> it.typeRef = FirImplicitByteTypeRef(null) + ConstantValueKind.Char -> it.typeRef = FirImplicitCharTypeRef(null) + ConstantValueKind.Double -> it.typeRef = FirImplicitDoubleTypeRef(null) + ConstantValueKind.Float -> it.typeRef = FirImplicitFloatTypeRef(null) + ConstantValueKind.Int -> it.typeRef = FirImplicitIntTypeRef(null) + ConstantValueKind.Long -> it.typeRef = FirImplicitLongTypeRef(null) + ConstantValueKind.Null -> it.typeRef = FirImplicitNullableAnyTypeRef(null) + ConstantValueKind.Short -> it.typeRef = FirImplicitShortTypeRef(null) + ConstantValueKind.String -> it.typeRef = FirImplicitStringTypeRef(null) + ConstantValueKind.UnsignedByte -> it.typeRef = FirImplicitUByteTypeRef(null) + ConstantValueKind.UnsignedInt -> it.typeRef = FirImplicitUIntTypeRef(null) + ConstantValueKind.UnsignedLong -> it.typeRef = FirImplicitULongTypeRef(null) + ConstantValueKind.UnsignedShort -> it.typeRef = FirImplicitUShortTypeRef(null) + ConstantValueKind.IntegerLiteral, + ConstantValueKind.UnsignedIntegerLiteral, + ConstantValueKind.Error, + -> { + } } } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt index 25bd7006469..2fe4c3e735c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt @@ -106,6 +106,14 @@ class FirImplicitULongTypeRef( source: KtSourceElement? ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.ULong) +class FirImplicitUShortTypeRef( + source: KtSourceElement? +) : FirImplicitBuiltinTypeRef(source, StandardClassIds.UShort) + +class FirImplicitUByteTypeRef( + source: KtSourceElement? +) : FirImplicitBuiltinTypeRef(source, StandardClassIds.UByte) + class FirImplicitNothingTypeRef( source: KtSourceElement? ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Nothing) @@ -241,5 +249,7 @@ fun FirImplicitBuiltinTypeRef.withNewSource(newSource: KtSourceElement?): FirImp extensionReceiverTypeArgument = type.typeArguments[1], propertyTypeArgument = type.typeArguments[2] ) + is FirImplicitUByteTypeRef -> FirImplicitUByteTypeRef(newSource) + is FirImplicitUShortTypeRef -> FirImplicitUShortTypeRef(newSource) } }