Rename FirConstKind to ConstantValueKind and move it to compiler.common
This commit is contained in:
+4
-3
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.intersectTypesOrNull
|
||||
import org.jetbrains.kotlin.fir.types.isNullable
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
||||
import org.jetbrains.kotlin.types.model.TypeCheckerProviderContext
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
@@ -183,9 +184,9 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
||||
}
|
||||
|
||||
private fun FirConstExpression<*>.isApplicableWith(operation: Operation): Boolean = when {
|
||||
kind == FirConstKind.Null -> operation == Operation.EqNull
|
||||
kind == FirConstKind.Boolean && operation == Operation.EqTrue -> (value as Boolean)
|
||||
kind == FirConstKind.Boolean && operation == Operation.EqFalse -> !(value as Boolean)
|
||||
kind == ConstantValueKind.Null -> operation == Operation.EqNull
|
||||
kind == ConstantValueKind.Boolean && operation == Operation.EqTrue -> (value as Boolean)
|
||||
kind == ConstantValueKind.Boolean && operation == Operation.EqFalse -> !(value as Boolean)
|
||||
else -> true
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
object RedundantExplicitTypeChecker : FirMemberDeclarationChecker() {
|
||||
override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
@@ -43,14 +44,14 @@ object RedundantExplicitTypeChecker : FirMemberDeclarationChecker() {
|
||||
if (!type.isSame(StandardClassIds.Boolean)) return
|
||||
}
|
||||
KtNodeTypes.INTEGER_CONSTANT -> {
|
||||
if (initializer.kind == FirConstKind.Long) {
|
||||
if (initializer.kind == ConstantValueKind.Long) {
|
||||
if (!type.isSame(StandardClassIds.Long)) return
|
||||
} else {
|
||||
if (!type.isSame(StandardClassIds.Int)) return
|
||||
}
|
||||
}
|
||||
KtNodeTypes.FLOAT_CONSTANT -> {
|
||||
if (initializer.kind == FirConstKind.Float) {
|
||||
if (initializer.kind == ConstantValueKind.Float) {
|
||||
if (!type.isSame(StandardClassIds.Float)) return
|
||||
} else {
|
||||
if (!type.isSame(StandardClassIds.Double)) return
|
||||
|
||||
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintError
|
||||
import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import java.io.File
|
||||
import java.io.Writer
|
||||
@@ -761,7 +762,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
||||
|
||||
private fun FlowContent.generate(expression: FirConstExpression<*>) {
|
||||
val value = expression.value
|
||||
if (value == null && expression.kind != FirConstKind.Null) {
|
||||
if (value == null && expression.kind != ConstantValueKind.Null) {
|
||||
return error {
|
||||
+"null value"
|
||||
}
|
||||
@@ -769,56 +770,56 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
||||
|
||||
@OptIn(ExperimentalUnsignedTypes::class)
|
||||
when (expression.kind) {
|
||||
FirConstKind.Null -> keyword("null")
|
||||
FirConstKind.Boolean -> keyword(value.toString())
|
||||
FirConstKind.String, FirConstKind.Char ->
|
||||
ConstantValueKind.Null -> keyword("null")
|
||||
ConstantValueKind.Boolean -> keyword(value.toString())
|
||||
ConstantValueKind.String, ConstantValueKind.Char ->
|
||||
stringLiteral(value)
|
||||
FirConstKind.Byte -> {
|
||||
ConstantValueKind.Byte -> {
|
||||
+value.toString()
|
||||
keyword("B")
|
||||
}
|
||||
FirConstKind.Short -> {
|
||||
ConstantValueKind.Short -> {
|
||||
+value.toString()
|
||||
keyword("S")
|
||||
}
|
||||
FirConstKind.Int -> {
|
||||
ConstantValueKind.Int -> {
|
||||
+value.toString()
|
||||
keyword("I")
|
||||
}
|
||||
FirConstKind.Long -> {
|
||||
ConstantValueKind.Long -> {
|
||||
+value.toString()
|
||||
keyword("L")
|
||||
}
|
||||
FirConstKind.UnsignedByte -> {
|
||||
ConstantValueKind.UnsignedByte -> {
|
||||
+(value as Long).toUByte().toString()
|
||||
keyword("uB")
|
||||
}
|
||||
FirConstKind.UnsignedShort -> {
|
||||
ConstantValueKind.UnsignedShort -> {
|
||||
+(value as Long).toUShort().toString()
|
||||
keyword("uS")
|
||||
}
|
||||
FirConstKind.UnsignedInt -> {
|
||||
ConstantValueKind.UnsignedInt -> {
|
||||
+(value as Long).toUInt().toString()
|
||||
keyword("uI")
|
||||
}
|
||||
FirConstKind.UnsignedLong -> {
|
||||
ConstantValueKind.UnsignedLong -> {
|
||||
+(value as Long).toULong().toString()
|
||||
keyword("uL")
|
||||
}
|
||||
FirConstKind.Float -> {
|
||||
ConstantValueKind.Float -> {
|
||||
+value.toString()
|
||||
keyword("F")
|
||||
}
|
||||
FirConstKind.Double -> {
|
||||
ConstantValueKind.Double -> {
|
||||
+value.toString()
|
||||
keyword("D")
|
||||
}
|
||||
FirConstKind.IntegerLiteral -> {
|
||||
ConstantValueKind.IntegerLiteral -> {
|
||||
+"IL<"
|
||||
+value.toString()
|
||||
+">"
|
||||
}
|
||||
FirConstKind.UnsignedIntegerLiteral -> {
|
||||
ConstantValueKind.UnsignedIntegerLiteral -> {
|
||||
+"UIL<"
|
||||
+value.toString()
|
||||
+">"
|
||||
|
||||
+11
-10
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerial
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getClassId
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getName
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
abstract class AbstractAnnotationDeserializer(
|
||||
private val session: FirSession
|
||||
@@ -222,30 +223,30 @@ abstract class AbstractAnnotationDeserializer(
|
||||
|
||||
return when (value.type) {
|
||||
BYTE -> {
|
||||
val kind = if (isUnsigned) FirConstKind.UnsignedByte else FirConstKind.Byte
|
||||
val kind = if (isUnsigned) ConstantValueKind.UnsignedByte else ConstantValueKind.Byte
|
||||
const(kind, value.intValue.toByte())
|
||||
}
|
||||
|
||||
SHORT -> {
|
||||
val kind = if (isUnsigned) FirConstKind.UnsignedShort else FirConstKind.Short
|
||||
val kind = if (isUnsigned) ConstantValueKind.UnsignedShort else ConstantValueKind.Short
|
||||
const(kind, value.intValue.toShort())
|
||||
}
|
||||
|
||||
INT -> {
|
||||
val kind = if (isUnsigned) FirConstKind.UnsignedInt else FirConstKind.Int
|
||||
val kind = if (isUnsigned) ConstantValueKind.UnsignedInt else ConstantValueKind.Int
|
||||
const(kind, value.intValue.toInt())
|
||||
}
|
||||
|
||||
LONG -> {
|
||||
val kind = if (isUnsigned) FirConstKind.UnsignedLong else FirConstKind.Long
|
||||
val kind = if (isUnsigned) ConstantValueKind.UnsignedLong else ConstantValueKind.Long
|
||||
const(kind, value.intValue)
|
||||
}
|
||||
|
||||
CHAR -> const(FirConstKind.Char, value.intValue.toChar())
|
||||
FLOAT -> const(FirConstKind.Float, value.floatValue)
|
||||
DOUBLE -> const(FirConstKind.Double, value.doubleValue)
|
||||
BOOLEAN -> const(FirConstKind.Boolean, (value.intValue != 0L))
|
||||
STRING -> const(FirConstKind.String, nameResolver.getString(value.stringValue))
|
||||
CHAR -> const(ConstantValueKind.Char, value.intValue.toChar())
|
||||
FLOAT -> const(ConstantValueKind.Float, value.floatValue)
|
||||
DOUBLE -> const(ConstantValueKind.Double, value.doubleValue)
|
||||
BOOLEAN -> const(ConstantValueKind.Boolean, (value.intValue != 0L))
|
||||
STRING -> const(ConstantValueKind.String, nameResolver.getString(value.stringValue))
|
||||
ANNOTATION -> deserializeAnnotation(value.annotation, nameResolver)
|
||||
CLASS -> buildGetClassCall {
|
||||
val classId = nameResolver.getClassId(value.classId)
|
||||
@@ -294,5 +295,5 @@ abstract class AbstractAnnotationDeserializer(
|
||||
}
|
||||
}
|
||||
|
||||
private fun <T> const(kind: FirConstKind<T>, value: T) = buildConstExpression(null, kind, value)
|
||||
private fun <T> const(kind: ConstantValueKind<T>, value: T) = buildConstExpression(null, kind, value)
|
||||
}
|
||||
|
||||
+10
-10
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.fir.deserialization
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
@@ -17,6 +16,7 @@ import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
||||
import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
class FirConstDeserializer(
|
||||
val session: FirSession,
|
||||
@@ -53,16 +53,16 @@ class FirConstDeserializer(
|
||||
protoValue: ProtoBuf.Annotation.Argument.Value?, sourceValue: Any?, constKind: String, nameResolver: NameResolver
|
||||
): FirExpression? {
|
||||
return when (constKind) {
|
||||
"BYTE", "B" -> buildConstExpression(null, FirConstKind.Byte, ((protoValue?.intValue ?: sourceValue) as Number).toByte())
|
||||
"CHAR", "C" -> buildConstExpression(null, FirConstKind.Char, ((protoValue?.intValue ?: sourceValue) as Number).toChar())
|
||||
"SHORT", "S" -> buildConstExpression(null, FirConstKind.Short, ((protoValue?.intValue ?: sourceValue) as Number).toShort())
|
||||
"INT", "I" -> buildConstExpression(null, FirConstKind.Int, protoValue?.intValue?.toInt() ?: sourceValue as Int)
|
||||
"LONG", "J" -> buildConstExpression(null, FirConstKind.Long, protoValue?.intValue ?: sourceValue as Long)
|
||||
"FLOAT", "F" -> buildConstExpression(null, FirConstKind.Float, protoValue?.floatValue ?: sourceValue as Float)
|
||||
"DOUBLE", "D" -> buildConstExpression(null, FirConstKind.Double, protoValue?.doubleValue ?: sourceValue as Double)
|
||||
"BOOLEAN", "Z" -> buildConstExpression(null, FirConstKind.Boolean, (protoValue?.intValue?.toInt() ?: sourceValue) != 0)
|
||||
"BYTE", "B" -> buildConstExpression(null, ConstantValueKind.Byte, ((protoValue?.intValue ?: sourceValue) as Number).toByte())
|
||||
"CHAR", "C" -> buildConstExpression(null, ConstantValueKind.Char, ((protoValue?.intValue ?: sourceValue) as Number).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)
|
||||
"STRING", "Ljava/lang/String;" -> buildConstExpression(
|
||||
null, FirConstKind.String, protoValue?.stringValue?.let { nameResolver.getString(it) } ?: sourceValue as String
|
||||
null, ConstantValueKind.String, protoValue?.stringValue?.let { nameResolver.getString(it) } ?: sourceValue as String
|
||||
)
|
||||
else -> null
|
||||
}
|
||||
|
||||
+15
-14
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.types.classId
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
|
||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
internal fun FirExpression.toConstantValue(): ConstantValue<*>? = accept(FirToConstantValueTransformer, null)
|
||||
|
||||
@@ -30,20 +31,20 @@ internal object FirToConstantValueTransformer : FirDefaultVisitor<ConstantValue<
|
||||
): ConstantValue<*>? {
|
||||
val value = constExpression.value
|
||||
return when (constExpression.kind) {
|
||||
FirConstKind.Boolean -> BooleanValue(value as Boolean)
|
||||
FirConstKind.Char -> CharValue(value as Char)
|
||||
FirConstKind.Byte -> ByteValue(value as Byte)
|
||||
FirConstKind.UnsignedByte -> UByteValue(value as Byte)
|
||||
FirConstKind.Short -> ShortValue(value as Short)
|
||||
FirConstKind.UnsignedShort -> UShortValue(value as Short)
|
||||
FirConstKind.Int -> IntValue(value as Int)
|
||||
FirConstKind.UnsignedInt -> UIntValue(value as Int)
|
||||
FirConstKind.Long -> LongValue(value as Long)
|
||||
FirConstKind.UnsignedLong -> ULongValue(value as Long)
|
||||
FirConstKind.String -> StringValue(value as String)
|
||||
FirConstKind.Float -> FloatValue(value as Float)
|
||||
FirConstKind.Double -> DoubleValue(value as Double)
|
||||
FirConstKind.Null -> NullValue
|
||||
ConstantValueKind.Boolean -> BooleanValue(value as Boolean)
|
||||
ConstantValueKind.Char -> CharValue(value as Char)
|
||||
ConstantValueKind.Byte -> ByteValue(value as Byte)
|
||||
ConstantValueKind.UnsignedByte -> UByteValue(value as Byte)
|
||||
ConstantValueKind.Short -> ShortValue(value as Short)
|
||||
ConstantValueKind.UnsignedShort -> UShortValue(value as Short)
|
||||
ConstantValueKind.Int -> IntValue(value as Int)
|
||||
ConstantValueKind.UnsignedInt -> UIntValue(value as Int)
|
||||
ConstantValueKind.Long -> LongValue(value as Long)
|
||||
ConstantValueKind.UnsignedLong -> ULongValue(value as Long)
|
||||
ConstantValueKind.String -> StringValue(value as String)
|
||||
ConstantValueKind.Float -> FloatValue(value as Float)
|
||||
ConstantValueKind.Double -> DoubleValue(value as Double)
|
||||
ConstantValueKind.Null -> NullValue
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
||||
@@ -49,6 +48,7 @@ import org.jetbrains.kotlin.ir.util.functions
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
@@ -163,7 +163,7 @@ private fun FirCallableSymbol<*>.toSymbolForCall(declarationStorage: Fir2IrDecla
|
||||
}
|
||||
|
||||
fun FirConstExpression<*>.getIrConstKind(): IrConstKind<*> = when (kind) {
|
||||
FirConstKind.IntegerLiteral -> {
|
||||
ConstantValueKind.IntegerLiteral -> {
|
||||
val type = typeRef.coneTypeUnsafe<ConeIntegerLiteralType>()
|
||||
type.getApproximatedType().toConstKind()!!.toIrConstKind()
|
||||
}
|
||||
@@ -194,25 +194,25 @@ fun <T> FirConstExpression<T>.toIrConst(irType: IrType): IrConst<T> {
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirConstKind<*>.toIrConstKind(): IrConstKind<*> = when (this) {
|
||||
FirConstKind.Null -> IrConstKind.Null
|
||||
FirConstKind.Boolean -> IrConstKind.Boolean
|
||||
FirConstKind.Char -> IrConstKind.Char
|
||||
private fun ConstantValueKind<*>.toIrConstKind(): IrConstKind<*> = when (this) {
|
||||
ConstantValueKind.Null -> IrConstKind.Null
|
||||
ConstantValueKind.Boolean -> IrConstKind.Boolean
|
||||
ConstantValueKind.Char -> IrConstKind.Char
|
||||
|
||||
FirConstKind.Byte -> IrConstKind.Byte
|
||||
FirConstKind.Short -> IrConstKind.Short
|
||||
FirConstKind.Int -> IrConstKind.Int
|
||||
FirConstKind.Long -> IrConstKind.Long
|
||||
ConstantValueKind.Byte -> IrConstKind.Byte
|
||||
ConstantValueKind.Short -> IrConstKind.Short
|
||||
ConstantValueKind.Int -> IrConstKind.Int
|
||||
ConstantValueKind.Long -> IrConstKind.Long
|
||||
|
||||
FirConstKind.UnsignedByte -> IrConstKind.Byte
|
||||
FirConstKind.UnsignedShort -> IrConstKind.Short
|
||||
FirConstKind.UnsignedInt -> IrConstKind.Int
|
||||
FirConstKind.UnsignedLong -> IrConstKind.Long
|
||||
ConstantValueKind.UnsignedByte -> IrConstKind.Byte
|
||||
ConstantValueKind.UnsignedShort -> IrConstKind.Short
|
||||
ConstantValueKind.UnsignedInt -> IrConstKind.Int
|
||||
ConstantValueKind.UnsignedLong -> IrConstKind.Long
|
||||
|
||||
FirConstKind.String -> IrConstKind.String
|
||||
FirConstKind.Float -> IrConstKind.Float
|
||||
FirConstKind.Double -> IrConstKind.Double
|
||||
FirConstKind.IntegerLiteral, FirConstKind.UnsignedIntegerLiteral -> throw IllegalArgumentException()
|
||||
ConstantValueKind.String -> IrConstKind.String
|
||||
ConstantValueKind.Float -> IrConstKind.Float
|
||||
ConstantValueKind.Double -> IrConstKind.Double
|
||||
ConstantValueKind.IntegerLiteral, ConstantValueKind.UnsignedIntegerLiteral -> throw IllegalArgumentException()
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.load.java.typeEnhancement.TypeComponentPosition
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.Variance.*
|
||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||
@@ -542,7 +543,7 @@ internal fun JavaAnnotation.toFirAnnotationCall(
|
||||
}
|
||||
JAVA_RETENTION_CLASS_ID -> arguments.singleOrNull()?.mapJavaRetentionArgument(session)?.let(::buildUnaryArgumentList)
|
||||
JAVA_DEPRECATED_CLASS_ID ->
|
||||
buildUnaryArgumentList(buildConstExpression(null, FirConstKind.String, "Deprecated in Java").setProperType(session))
|
||||
buildUnaryArgumentList(buildConstExpression(null, ConstantValueKind.String, "Deprecated in Java").setProperType(session))
|
||||
null -> null
|
||||
else -> buildArgumentMapping(session, javaTypeParameterStack, lookupTag!!, arguments)
|
||||
} ?: buildArgumentList {
|
||||
@@ -641,7 +642,7 @@ private fun JavaAnnotationArgument.toFirExpression(
|
||||
}
|
||||
|
||||
// TODO: use kind here
|
||||
private fun <T> List<T>.createArrayOfCall(session: FirSession, @Suppress("UNUSED_PARAMETER") kind: FirConstKind<T>): FirArrayOfCall {
|
||||
private fun <T> List<T>.createArrayOfCall(session: FirSession, @Suppress("UNUSED_PARAMETER") kind: ConstantValueKind<T>): FirArrayOfCall {
|
||||
return buildArrayOfCall {
|
||||
argumentList = buildArgumentList {
|
||||
for (element in this@createArrayOfCall) {
|
||||
@@ -662,24 +663,24 @@ internal fun Any?.createConstantOrError(session: FirSession): FirExpression {
|
||||
|
||||
internal fun Any?.createConstantIfAny(session: FirSession): FirExpression? {
|
||||
return when (this) {
|
||||
is Byte -> buildConstExpression(null, FirConstKind.Byte, this).setProperType(session)
|
||||
is Short -> buildConstExpression(null, FirConstKind.Short, this).setProperType(session)
|
||||
is Int -> buildConstExpression(null, FirConstKind.Int, this).setProperType(session)
|
||||
is Long -> buildConstExpression(null, FirConstKind.Long, this).setProperType(session)
|
||||
is Char -> buildConstExpression(null, FirConstKind.Char, this).setProperType(session)
|
||||
is Float -> buildConstExpression(null, FirConstKind.Float, this).setProperType(session)
|
||||
is Double -> buildConstExpression(null, FirConstKind.Double, this).setProperType(session)
|
||||
is Boolean -> buildConstExpression(null, FirConstKind.Boolean, this).setProperType(session)
|
||||
is String -> buildConstExpression(null, FirConstKind.String, this).setProperType(session)
|
||||
is ByteArray -> toList().createArrayOfCall(session, FirConstKind.Byte)
|
||||
is ShortArray -> toList().createArrayOfCall(session, FirConstKind.Short)
|
||||
is IntArray -> toList().createArrayOfCall(session, FirConstKind.Int)
|
||||
is LongArray -> toList().createArrayOfCall(session, FirConstKind.Long)
|
||||
is CharArray -> toList().createArrayOfCall(session, FirConstKind.Char)
|
||||
is FloatArray -> toList().createArrayOfCall(session, FirConstKind.Float)
|
||||
is DoubleArray -> toList().createArrayOfCall(session, FirConstKind.Double)
|
||||
is BooleanArray -> toList().createArrayOfCall(session, FirConstKind.Boolean)
|
||||
null -> buildConstExpression(null, FirConstKind.Null, null).setProperType(session)
|
||||
is Byte -> buildConstExpression(null, ConstantValueKind.Byte, this).setProperType(session)
|
||||
is Short -> buildConstExpression(null, ConstantValueKind.Short, this).setProperType(session)
|
||||
is Int -> buildConstExpression(null, ConstantValueKind.Int, this).setProperType(session)
|
||||
is Long -> buildConstExpression(null, 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 ByteArray -> toList().createArrayOfCall(session, ConstantValueKind.Byte)
|
||||
is ShortArray -> toList().createArrayOfCall(session, ConstantValueKind.Short)
|
||||
is IntArray -> toList().createArrayOfCall(session, ConstantValueKind.Int)
|
||||
is LongArray -> toList().createArrayOfCall(session, ConstantValueKind.Long)
|
||||
is CharArray -> toList().createArrayOfCall(session, ConstantValueKind.Char)
|
||||
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)
|
||||
|
||||
else -> null
|
||||
}
|
||||
|
||||
+2
-2
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
|
||||
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||
@@ -36,6 +35,7 @@ import org.jetbrains.kotlin.load.java.descriptors.StringDefaultValue
|
||||
import org.jetbrains.kotlin.load.java.typeEnhancement.*
|
||||
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
@@ -323,7 +323,7 @@ class FirSignatureEnhancement(
|
||||
)
|
||||
val firResolvedTypeRef = signatureParts.type
|
||||
val defaultValueExpression = when (val defaultValue = ownerParameter.getDefaultValueFromAnnotation()) {
|
||||
NullDefaultValue -> buildConstExpression(null, FirConstKind.Null, null)
|
||||
NullDefaultValue -> buildConstExpression(null, ConstantValueKind.Null, null)
|
||||
is StringDefaultValue -> firResolvedTypeRef.type.lexicalCastFrom(session, defaultValue.value)
|
||||
null -> null
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.RawType
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
import org.jetbrains.kotlin.utils.extractRadix
|
||||
@@ -303,15 +304,15 @@ internal fun ConeKotlinType.lexicalCastFrom(session: FirSession, value: String):
|
||||
|
||||
val (number, radix) = extractRadix(value)
|
||||
return when (classId.relativeClassName.asString()) {
|
||||
"Boolean" -> buildConstExpression(null, FirConstKind.Boolean, value.toBoolean())
|
||||
"Char" -> buildConstExpression(null, FirConstKind.Char, value.singleOrNull() ?: return null)
|
||||
"Byte" -> buildConstExpression(null, FirConstKind.Byte, number.toByteOrNull(radix) ?: return null)
|
||||
"Short" -> buildConstExpression(null, FirConstKind.Short, number.toShortOrNull(radix) ?: return null)
|
||||
"Int" -> buildConstExpression(null, FirConstKind.Int, number.toIntOrNull(radix) ?: return null)
|
||||
"Long" -> buildConstExpression(null, FirConstKind.Long, number.toLongOrNull(radix) ?: return null)
|
||||
"Float" -> buildConstExpression(null, FirConstKind.Float, value.toFloatOrNull() ?: return null)
|
||||
"Double" -> buildConstExpression(null, FirConstKind.Double, value.toDoubleOrNull() ?: return null)
|
||||
"String" -> buildConstExpression(null, FirConstKind.String, value)
|
||||
"Boolean" -> buildConstExpression(null, ConstantValueKind.Boolean, value.toBoolean())
|
||||
"Char" -> buildConstExpression(null, ConstantValueKind.Char, value.singleOrNull() ?: return null)
|
||||
"Byte" -> buildConstExpression(null, ConstantValueKind.Byte, number.toByteOrNull(radix) ?: return null)
|
||||
"Short" -> buildConstExpression(null, ConstantValueKind.Short, number.toShortOrNull(radix) ?: return null)
|
||||
"Int" -> buildConstExpression(null, ConstantValueKind.Int, number.toIntOrNull(radix) ?: return null)
|
||||
"Long" -> buildConstExpression(null, ConstantValueKind.Long, number.toLongOrNull(radix) ?: return null)
|
||||
"Float" -> buildConstExpression(null, ConstantValueKind.Float, value.toFloatOrNull() ?: return null)
|
||||
"Double" -> buildConstExpression(null, ConstantValueKind.Double, value.toDoubleOrNull() ?: return null)
|
||||
"String" -> buildConstExpression(null, ConstantValueKind.String, value)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
import org.jetbrains.kotlin.lexer.KtTokens.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
@@ -375,14 +376,14 @@ class ExpressionsConverter(
|
||||
}
|
||||
val receiver = getAsFirExpression<FirExpression>(argument, "No operand")
|
||||
if (operationToken == PLUS || operationToken == MINUS) {
|
||||
if (receiver is FirConstExpression<*> && receiver.kind == FirConstKind.IntegerLiteral) {
|
||||
if (receiver is FirConstExpression<*> && receiver.kind == ConstantValueKind.IntegerLiteral) {
|
||||
val value = receiver.value as Long
|
||||
val convertedValue = when (operationToken) {
|
||||
MINUS -> -value
|
||||
PLUS -> value
|
||||
else -> error("Should not be here")
|
||||
}
|
||||
return buildConstExpression(unaryExpression.toFirSourceElement(), FirConstKind.IntegerLiteral, convertedValue)
|
||||
return buildConstExpression(unaryExpression.toFirSourceElement(), ConstantValueKind.IntegerLiteral, convertedValue)
|
||||
}
|
||||
}
|
||||
buildFunctionCall {
|
||||
|
||||
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
@@ -1839,14 +1840,18 @@ class RawFirBuilder(
|
||||
|
||||
val receiver = argument.toFirExpression("No operand")
|
||||
if (operationToken == PLUS || operationToken == MINUS) {
|
||||
if (receiver is FirConstExpression<*> && receiver.kind == FirConstKind.IntegerLiteral) {
|
||||
if (receiver is FirConstExpression<*> && receiver.kind == ConstantValueKind.IntegerLiteral) {
|
||||
val value = receiver.value as Long
|
||||
val convertedValue = when (operationToken) {
|
||||
MINUS -> -value
|
||||
PLUS -> value
|
||||
else -> error("Should not be here")
|
||||
}
|
||||
return buildConstExpression(expression.toFirPsiSourceElement(), FirConstKind.IntegerLiteral, convertedValue)
|
||||
return buildConstExpression(
|
||||
expression.toFirPsiSourceElement(),
|
||||
ConstantValueKind.IntegerLiteral,
|
||||
convertedValue
|
||||
)
|
||||
}
|
||||
}
|
||||
buildFunctionCall {
|
||||
|
||||
+13
-12
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.lexer.KtTokens.OPEN_QUOTE
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.parsing.*
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
//T can be either PsiElement, or LighterASTNode
|
||||
@@ -285,17 +286,17 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
convertedText !is Long -> return reportIncorrectConstant(DiagnosticKind.IllegalConstExpression)
|
||||
|
||||
hasUnsignedLongSuffix(text) -> {
|
||||
FirConstKind.UnsignedLong
|
||||
ConstantValueKind.UnsignedLong
|
||||
}
|
||||
hasLongSuffix(text) -> {
|
||||
FirConstKind.Long
|
||||
ConstantValueKind.Long
|
||||
}
|
||||
hasUnsignedSuffix(text) -> {
|
||||
FirConstKind.UnsignedIntegerLiteral
|
||||
ConstantValueKind.UnsignedIntegerLiteral
|
||||
}
|
||||
|
||||
else -> {
|
||||
FirConstKind.IntegerLiteral
|
||||
ConstantValueKind.IntegerLiteral
|
||||
}
|
||||
}
|
||||
|
||||
@@ -310,14 +311,14 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
if (convertedText is Float) {
|
||||
buildConstOrErrorExpression(
|
||||
sourceElement,
|
||||
FirConstKind.Float,
|
||||
ConstantValueKind.Float,
|
||||
convertedText,
|
||||
ConeSimpleDiagnostic("Incorrect float: $text", DiagnosticKind.IllegalConstExpression)
|
||||
)
|
||||
} else {
|
||||
buildConstOrErrorExpression(
|
||||
sourceElement,
|
||||
FirConstKind.Double,
|
||||
ConstantValueKind.Double,
|
||||
convertedText as? Double,
|
||||
ConeSimpleDiagnostic("Incorrect double: $text", DiagnosticKind.IllegalConstExpression)
|
||||
)
|
||||
@@ -325,20 +326,20 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
CHARACTER_CONSTANT ->
|
||||
buildConstOrErrorExpression(
|
||||
sourceElement,
|
||||
FirConstKind.Char,
|
||||
ConstantValueKind.Char,
|
||||
text.parseCharacter(),
|
||||
ConeSimpleDiagnostic("Incorrect character: $text", DiagnosticKind.IllegalConstExpression)
|
||||
)
|
||||
BOOLEAN_CONSTANT ->
|
||||
buildConstExpression(
|
||||
sourceElement,
|
||||
FirConstKind.Boolean,
|
||||
ConstantValueKind.Boolean,
|
||||
convertedText as Boolean
|
||||
)
|
||||
NULL ->
|
||||
buildConstExpression(
|
||||
sourceElement,
|
||||
FirConstKind.Null,
|
||||
ConstantValueKind.Null,
|
||||
null
|
||||
)
|
||||
else ->
|
||||
@@ -361,11 +362,11 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
OPEN_QUOTE, CLOSING_QUOTE -> continue@L
|
||||
LITERAL_STRING_TEMPLATE_ENTRY -> {
|
||||
sb.append(entry.asText)
|
||||
buildConstExpression(entry.toFirSourceElement(), FirConstKind.String, entry.asText)
|
||||
buildConstExpression(entry.toFirSourceElement(), ConstantValueKind.String, entry.asText)
|
||||
}
|
||||
ESCAPE_STRING_TEMPLATE_ENTRY -> {
|
||||
sb.append(entry.unescapedValue)
|
||||
buildConstExpression(entry.toFirSourceElement(), FirConstKind.String, entry.unescapedValue)
|
||||
buildConstExpression(entry.toFirSourceElement(), ConstantValueKind.String, entry.unescapedValue)
|
||||
}
|
||||
SHORT_STRING_TEMPLATE_ENTRY, LONG_STRING_TEMPLATE_ENTRY -> {
|
||||
hasExpressions = true
|
||||
@@ -392,7 +393,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
}
|
||||
source = base?.toFirSourceElement()
|
||||
// Fast-pass if there is no non-const string expressions
|
||||
if (!hasExpressions) return buildConstExpression(source, FirConstKind.String, sb.toString())
|
||||
if (!hasExpressions) return buildConstExpression(source, ConstantValueKind.String, sb.toString())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.types.builder.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
@@ -326,7 +327,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate(
|
||||
boundSymbol = this@generateAccessorsByDelegate.symbol
|
||||
}
|
||||
}
|
||||
else -> buildConstExpression(null, FirConstKind.Null, null)
|
||||
else -> buildConstExpression(null, ConstantValueKind.Null, null)
|
||||
}
|
||||
|
||||
fun delegateAccess() = buildQualifiedAccessExpression {
|
||||
|
||||
+5
-4
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||
|
||||
@@ -366,8 +367,8 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
|
||||
|
||||
when {
|
||||
leftConst != null && rightConst != null -> return
|
||||
leftConst?.kind == FirConstKind.Null -> processEqNull(node, rightOperand, operation)
|
||||
rightConst?.kind == FirConstKind.Null -> processEqNull(node, leftOperand, operation)
|
||||
leftConst?.kind == ConstantValueKind.Null -> processEqNull(node, rightOperand, operation)
|
||||
rightConst?.kind == ConstantValueKind.Null -> processEqNull(node, leftOperand, operation)
|
||||
leftConst != null -> processEqWithConst(node, rightOperand, leftConst, operation)
|
||||
rightConst != null -> processEqWithConst(node, leftOperand, rightConst, operation)
|
||||
else -> processEq(node, leftOperand, rightOperand, operation)
|
||||
@@ -389,7 +390,7 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
|
||||
}
|
||||
|
||||
// propagating facts for (... == true) and (... == false)
|
||||
if (const.kind == FirConstKind.Boolean) {
|
||||
if (const.kind == ConstantValueKind.Boolean) {
|
||||
val constValue = const.value as Boolean
|
||||
val shouldInvert = isEq xor constValue
|
||||
|
||||
@@ -899,7 +900,7 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
|
||||
}
|
||||
|
||||
if (isAssignment) {
|
||||
if (initializer is FirConstExpression<*> && initializer.kind == FirConstKind.Null) {
|
||||
if (initializer is FirConstExpression<*> && initializer.kind == ConstantValueKind.Null) {
|
||||
flow.addTypeStatement(propertyVariable typeEq property.returnTypeRef.coneType.withNullability(ConeNullability.NULLABLE))
|
||||
} else {
|
||||
flow.addTypeStatement(propertyVariable typeEq initializer.typeRef.coneType)
|
||||
|
||||
+4
-3
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisitor<FirExpression?, Map<Int, FirExpression>>() {
|
||||
@@ -21,8 +22,8 @@ private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisito
|
||||
|
||||
override fun visitConstantDescriptor(constantReference: ConeConstantReference, data: Map<Int, FirExpression>): FirExpression? {
|
||||
return when (constantReference) {
|
||||
ConeBooleanConstantReference.TRUE -> buildConstExpression(null, FirConstKind.Boolean, true)
|
||||
ConeBooleanConstantReference.FALSE -> buildConstExpression(null, FirConstKind.Boolean, false)
|
||||
ConeBooleanConstantReference.TRUE -> buildConstExpression(null, ConstantValueKind.Boolean, true)
|
||||
ConeBooleanConstantReference.FALSE -> buildConstExpression(null, ConstantValueKind.Boolean, false)
|
||||
ConeConstantReference.NULL -> createConstNull()
|
||||
else -> null
|
||||
}
|
||||
@@ -78,7 +79,7 @@ private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisito
|
||||
return data[valueParameterReference.parameterIndex]
|
||||
}
|
||||
|
||||
private fun createConstNull(): FirConstExpression<*> = buildConstExpression(null, FirConstKind.Null, null)
|
||||
private fun createConstNull(): FirConstExpression<*> = buildConstExpression(null, ConstantValueKind.Null, null)
|
||||
}
|
||||
|
||||
fun ConeConditionalEffectDeclaration.buildContractFir(argumentMapping: Map<Int, FirExpression>): FirExpression? {
|
||||
|
||||
+2
-2
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.resolve.transformers
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
|
||||
@@ -20,6 +19,7 @@ import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
fun FirExpression.approximateIfIsIntegerConst(expectedType: ConeKotlinType? = null): FirExpression {
|
||||
return transformSingle(IntegerLiteralTypeApproximationTransformer, expectedType)
|
||||
@@ -38,7 +38,7 @@ private object IntegerLiteralTypeApproximationTransformer : FirTransformer<ConeK
|
||||
val approximatedType = type.getApproximatedType(data)
|
||||
constExpression.resultType = constExpression.resultType.resolvedTypeFromPrototype(approximatedType)
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val kind = approximatedType.toConstKind() as FirConstKind<T>
|
||||
val kind = approximatedType.toConstKind() as ConstantValueKind<T>
|
||||
constExpression.replaceKind(kind)
|
||||
return constExpression.compose()
|
||||
}
|
||||
|
||||
+18
-17
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
inline fun <reified T : FirElement> FirBasedSymbol<*>.firUnsafe(): T {
|
||||
val fir = this.fir
|
||||
@@ -104,30 +105,30 @@ fun FirBlock.writeResultType(session: FirSession) {
|
||||
}
|
||||
}
|
||||
|
||||
fun FirConstKind<*>.expectedConeType(session: FirSession): ConeKotlinType {
|
||||
fun ConstantValueKind<*>.expectedConeType(session: FirSession): ConeKotlinType {
|
||||
fun constructLiteralType(classId: ClassId, isNullable: Boolean = false): ConeKotlinType {
|
||||
val symbol = session.firSymbolProvider.getClassLikeSymbolByFqName(classId)
|
||||
?: return ConeClassErrorType(ConeSimpleDiagnostic("Missing stdlib class: $classId", DiagnosticKind.MissingStdlibClass))
|
||||
return symbol.toLookupTag().constructClassType(emptyArray(), isNullable)
|
||||
}
|
||||
return when (this) {
|
||||
FirConstKind.Null -> session.builtinTypes.nullableNothingType.type
|
||||
FirConstKind.Boolean -> session.builtinTypes.booleanType.type
|
||||
FirConstKind.Char -> constructLiteralType(StandardClassIds.Char)
|
||||
FirConstKind.Byte -> constructLiteralType(StandardClassIds.Byte)
|
||||
FirConstKind.Short -> constructLiteralType(StandardClassIds.Short)
|
||||
FirConstKind.Int -> constructLiteralType(StandardClassIds.Int)
|
||||
FirConstKind.Long -> constructLiteralType(StandardClassIds.Long)
|
||||
FirConstKind.String -> constructLiteralType(StandardClassIds.String)
|
||||
FirConstKind.Float -> constructLiteralType(StandardClassIds.Float)
|
||||
FirConstKind.Double -> constructLiteralType(StandardClassIds.Double)
|
||||
ConstantValueKind.Null -> session.builtinTypes.nullableNothingType.type
|
||||
ConstantValueKind.Boolean -> session.builtinTypes.booleanType.type
|
||||
ConstantValueKind.Char -> constructLiteralType(StandardClassIds.Char)
|
||||
ConstantValueKind.Byte -> constructLiteralType(StandardClassIds.Byte)
|
||||
ConstantValueKind.Short -> constructLiteralType(StandardClassIds.Short)
|
||||
ConstantValueKind.Int -> constructLiteralType(StandardClassIds.Int)
|
||||
ConstantValueKind.Long -> constructLiteralType(StandardClassIds.Long)
|
||||
ConstantValueKind.String -> constructLiteralType(StandardClassIds.String)
|
||||
ConstantValueKind.Float -> constructLiteralType(StandardClassIds.Float)
|
||||
ConstantValueKind.Double -> constructLiteralType(StandardClassIds.Double)
|
||||
|
||||
FirConstKind.UnsignedByte -> constructLiteralType(StandardClassIds.UByte)
|
||||
FirConstKind.UnsignedShort -> constructLiteralType(StandardClassIds.UShort)
|
||||
FirConstKind.UnsignedInt -> constructLiteralType(StandardClassIds.UInt)
|
||||
FirConstKind.UnsignedLong -> constructLiteralType(StandardClassIds.ULong)
|
||||
ConstantValueKind.UnsignedByte -> constructLiteralType(StandardClassIds.UByte)
|
||||
ConstantValueKind.UnsignedShort -> constructLiteralType(StandardClassIds.UShort)
|
||||
ConstantValueKind.UnsignedInt -> constructLiteralType(StandardClassIds.UInt)
|
||||
ConstantValueKind.UnsignedLong -> constructLiteralType(StandardClassIds.ULong)
|
||||
|
||||
FirConstKind.IntegerLiteral -> constructLiteralType(StandardClassIds.Int)
|
||||
FirConstKind.UnsignedIntegerLiteral -> constructLiteralType(StandardClassIds.UInt)
|
||||
ConstantValueKind.IntegerLiteral -> constructLiteralType(StandardClassIds.Int)
|
||||
ConstantValueKind.UnsignedIntegerLiteral -> constructLiteralType(StandardClassIds.UInt)
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.fir.types.builder.*
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
|
||||
|
||||
open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : FirPartialBodyResolveTransformer(transformer) {
|
||||
@@ -682,14 +683,14 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
|
||||
constExpression.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
|
||||
|
||||
val type = when (val kind = constExpression.kind) {
|
||||
FirConstKind.IntegerLiteral, FirConstKind.UnsignedIntegerLiteral -> {
|
||||
ConstantValueKind.IntegerLiteral, ConstantValueKind.UnsignedIntegerLiteral -> {
|
||||
val integerLiteralType =
|
||||
ConeIntegerLiteralTypeImpl(constExpression.value as Long, isUnsigned = kind == FirConstKind.UnsignedIntegerLiteral)
|
||||
ConeIntegerLiteralTypeImpl(constExpression.value as Long, isUnsigned = kind == ConstantValueKind.UnsignedIntegerLiteral)
|
||||
if (data.expectedType != null) {
|
||||
val approximatedType = integerLiteralType.getApproximatedType(data.expectedType?.coneTypeSafe())
|
||||
val newConstKind = approximatedType.toConstKind()
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
constExpression.replaceKind(newConstKind as FirConstKind<T>)
|
||||
constExpression.replaceKind(newConstKind as ConstantValueKind<T>)
|
||||
approximatedType
|
||||
} else {
|
||||
integerLiteralType
|
||||
|
||||
+4
-3
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
class ConeEffectExtractor(
|
||||
private val session: FirSession,
|
||||
@@ -103,7 +104,7 @@ class ConeEffectExtractor(
|
||||
else -> return null
|
||||
}
|
||||
val const = equalityOperatorCall.arguments[1] as? FirConstExpression<*> ?: return null
|
||||
if (const.kind != FirConstKind.Null) return null
|
||||
if (const.kind != ConstantValueKind.Null) return null
|
||||
val arg = equalityOperatorCall.arguments[0].accept(this, null) as? ConeValueParameterReference ?: return null
|
||||
return ConeIsNullPredicate(arg, isNegated)
|
||||
}
|
||||
@@ -148,8 +149,8 @@ class ConeEffectExtractor(
|
||||
|
||||
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: Nothing?): ConeContractDescriptionElement? {
|
||||
return when (constExpression.kind) {
|
||||
FirConstKind.Null -> ConeConstantReference.NULL
|
||||
FirConstKind.Boolean -> when (constExpression.value as Boolean) {
|
||||
ConstantValueKind.Null -> ConeConstantReference.NULL
|
||||
ConstantValueKind.Boolean -> when (constExpression.value as Boolean) {
|
||||
true -> ConeBooleanConstantReference.TRUE
|
||||
false -> ConeBooleanConstantReference.FALSE
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
@@ -18,14 +19,14 @@ abstract class FirConstExpression<T> : FirExpression() {
|
||||
abstract override val source: FirSourceElement?
|
||||
abstract override val typeRef: FirTypeRef
|
||||
abstract override val annotations: List<FirAnnotationCall>
|
||||
abstract val kind: FirConstKind<T>
|
||||
abstract val kind: ConstantValueKind<T>
|
||||
abstract val value: T
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitConstExpression(this, data)
|
||||
|
||||
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
|
||||
|
||||
abstract fun replaceKind(newKind: FirConstKind<T>)
|
||||
abstract fun replaceKind(newKind: ConstantValueKind<T>)
|
||||
|
||||
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirConstExpression<T>
|
||||
}
|
||||
|
||||
+3
-3
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.fir.expressions.impl
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
internal class FirConstExpressionImpl<T> (
|
||||
override val source: FirSourceElement?,
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override var kind: FirConstKind<T>,
|
||||
override var kind: ConstantValueKind<T>,
|
||||
override val value: T,
|
||||
) : FirConstExpression<T>() {
|
||||
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||
@@ -46,7 +46,7 @@ internal class FirConstExpressionImpl<T> (
|
||||
typeRef = newTypeRef
|
||||
}
|
||||
|
||||
override fun replaceKind(newKind: FirConstKind<T>) {
|
||||
override fun replaceKind(newKind: ConstantValueKind<T>) {
|
||||
kind = newKind
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir.expressions
|
||||
|
||||
sealed class FirConstKind<T>(val asString: kotlin.String) {
|
||||
object Null : FirConstKind<Nothing?>("Null")
|
||||
object Boolean : FirConstKind<kotlin.Boolean>("Boolean")
|
||||
object Char : FirConstKind<kotlin.Char>("Char")
|
||||
|
||||
object Byte : FirConstKind<kotlin.Byte>("Byte")
|
||||
object UnsignedByte : FirConstKind<kotlin.Byte>("UByte")
|
||||
object Short : FirConstKind<kotlin.Short>("Short")
|
||||
object UnsignedShort : FirConstKind<kotlin.Short>("UShort")
|
||||
object Int : FirConstKind<kotlin.Int>("Int")
|
||||
object UnsignedInt : FirConstKind<kotlin.Int>("UInt")
|
||||
object Long : FirConstKind<kotlin.Long>("Long")
|
||||
object UnsignedLong : FirConstKind<kotlin.Long>("ULong")
|
||||
|
||||
object String : FirConstKind<kotlin.String>("String")
|
||||
|
||||
object Float : FirConstKind<kotlin.Float>("Float")
|
||||
object Double : FirConstKind<kotlin.Double>("Double")
|
||||
|
||||
object IntegerLiteral : FirConstKind<kotlin.Long>("IntegerLiteral")
|
||||
object UnsignedIntegerLiteral : FirConstKind<kotlin.Long>("UnsignedIntegerLiteral")
|
||||
|
||||
override fun toString() = asString
|
||||
}
|
||||
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.TransformData
|
||||
import org.jetbrains.kotlin.fir.visitors.transformInplace
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
inline val FirAnnotationCall.coneClassLikeType: ConeClassLikeType?
|
||||
get() = ((annotationTypeRef as? FirResolvedTypeRef)?.type as? ConeClassLikeType)
|
||||
@@ -28,7 +29,7 @@ inline val FirAnnotationCall.coneClassLikeType: ConeClassLikeType?
|
||||
inline val FirAnnotationCall.classId: ClassId?
|
||||
get() = coneClassLikeType?.lookupTag?.classId
|
||||
|
||||
fun <T> buildConstOrErrorExpression(source: FirSourceElement?, kind: FirConstKind<T>, value: T?, diagnostic: ConeDiagnostic): FirExpression =
|
||||
fun <T> buildConstOrErrorExpression(source: FirSourceElement?, kind: ConstantValueKind<T>, value: T?, diagnostic: ConeDiagnostic): FirExpression =
|
||||
value?.let {
|
||||
buildConstExpression(source, kind, it)
|
||||
} ?: buildErrorExpression {
|
||||
|
||||
+2
-2
@@ -8,12 +8,12 @@ package org.jetbrains.kotlin.fir.expressions.builder
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
fun <T> buildConstExpression(
|
||||
source: FirSourceElement?,
|
||||
kind: FirConstKind<T>,
|
||||
kind: ConstantValueKind<T>,
|
||||
value: T,
|
||||
annotations: MutableList<FirAnnotationCall> = mutableListOf(),
|
||||
): FirConstExpression<T> {
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
package org.jetbrains.kotlin.fir.types
|
||||
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.contract
|
||||
|
||||
@@ -77,16 +77,16 @@ fun List<FirAnnotationCall>.dropExtensionFunctionAnnotation(): List<FirAnnotatio
|
||||
return filterNot { it.isExtensionFunctionAnnotationCall }
|
||||
}
|
||||
|
||||
fun ConeClassLikeType.toConstKind(): FirConstKind<*>? = when (lookupTag.classId) {
|
||||
StandardClassIds.Byte -> FirConstKind.Byte
|
||||
StandardClassIds.Short -> FirConstKind.Short
|
||||
StandardClassIds.Int -> FirConstKind.Int
|
||||
StandardClassIds.Long -> FirConstKind.Long
|
||||
fun ConeClassLikeType.toConstKind(): ConstantValueKind<*>? = when (lookupTag.classId) {
|
||||
StandardClassIds.Byte -> ConstantValueKind.Byte
|
||||
StandardClassIds.Short -> ConstantValueKind.Short
|
||||
StandardClassIds.Int -> ConstantValueKind.Int
|
||||
StandardClassIds.Long -> ConstantValueKind.Long
|
||||
|
||||
StandardClassIds.UInt -> FirConstKind.UnsignedInt
|
||||
StandardClassIds.ULong -> FirConstKind.UnsignedLong
|
||||
StandardClassIds.UShort -> FirConstKind.UnsignedShort
|
||||
StandardClassIds.UByte -> FirConstKind.UnsignedByte
|
||||
StandardClassIds.UInt -> ConstantValueKind.UnsignedInt
|
||||
StandardClassIds.ULong -> ConstantValueKind.UnsignedLong
|
||||
StandardClassIds.UShort -> ConstantValueKind.UnsignedShort
|
||||
StandardClassIds.UByte -> ConstantValueKind.UnsignedByte
|
||||
else -> null
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.types.Variance
|
||||
|
||||
val sourceElementType = type("fir", "FirSourceElement")
|
||||
val jumpTargetType = type("fir", "FirTarget")
|
||||
val constKindType = generatedType("expressions", "FirConstKind")
|
||||
val constKindType = type("types", "ConstantValueKind")
|
||||
val operationType = type("fir.expressions", "FirOperation")
|
||||
val classKindType = type(ClassKind::class)
|
||||
val eventOccurrencesRangeType = type(EventOccurrencesRange::class)
|
||||
|
||||
+2
-1
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
|
||||
|
||||
private typealias Stack = MutableList<Pair<String, MutableList<String>>>
|
||||
@@ -444,7 +445,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
|
||||
}
|
||||
|
||||
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: StringBuilder) {
|
||||
if (constExpression.kind != FirConstKind.String) {
|
||||
if (constExpression.kind != ConstantValueKind.String) {
|
||||
data.append(constExpression.kind)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.types
|
||||
|
||||
sealed class ConstantValueKind<T>(val asString: kotlin.String) {
|
||||
object Null : ConstantValueKind<Nothing?>("Null")
|
||||
object Boolean : ConstantValueKind<kotlin.Boolean>("Boolean")
|
||||
object Char : ConstantValueKind<kotlin.Char>("Char")
|
||||
|
||||
object Byte : ConstantValueKind<kotlin.Byte>("Byte")
|
||||
object UnsignedByte : ConstantValueKind<kotlin.Byte>("UByte")
|
||||
object Short : ConstantValueKind<kotlin.Short>("Short")
|
||||
object UnsignedShort : ConstantValueKind<kotlin.Short>("UShort")
|
||||
object Int : ConstantValueKind<kotlin.Int>("Int")
|
||||
object UnsignedInt : ConstantValueKind<kotlin.Int>("UInt")
|
||||
object Long : ConstantValueKind<kotlin.Long>("Long")
|
||||
object UnsignedLong : ConstantValueKind<kotlin.Long>("ULong")
|
||||
|
||||
object String : ConstantValueKind<kotlin.String>("String")
|
||||
|
||||
object Float : ConstantValueKind<kotlin.Float>("Float")
|
||||
object Double : ConstantValueKind<kotlin.Double>("Double")
|
||||
|
||||
object IntegerLiteral : ConstantValueKind<kotlin.Long>("IntegerLiteral")
|
||||
object UnsignedIntegerLiteral : ConstantValueKind<kotlin.Long>("UnsignedIntegerLiteral")
|
||||
|
||||
override fun toString() = asString
|
||||
}
|
||||
Reference in New Issue
Block a user