Introduce conversions from signed pure constants to unsigned ones
#KT-24717 In Progress #KT-25996 Open #KT-25997 Open
This commit is contained in:
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import kotlin.reflect.KClass
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
|
||||
|
||||
enum class UnsignedType(val classId: ClassId) {
|
||||
@@ -28,6 +28,8 @@ object UnsignedTypes {
|
||||
val unsignedTypeNames = enumValues<UnsignedType>().map { it.typeName }.toSet()
|
||||
|
||||
fun isUnsignedType(type: KotlinType): Boolean {
|
||||
if (TypeUtils.noExpectedType(type)) return false
|
||||
|
||||
val descriptor = type.constructor.declarationDescriptor ?: return false
|
||||
return isUnsignedClass(descriptor)
|
||||
}
|
||||
|
||||
@@ -122,10 +122,28 @@ class UnsignedErrorValueTypeConstant(
|
||||
}
|
||||
|
||||
class IntegerValueTypeConstant(
|
||||
private val value: Number,
|
||||
module: ModuleDescriptor,
|
||||
override val parameters: CompileTimeConstant.Parameters
|
||||
private val value: Number,
|
||||
module: ModuleDescriptor,
|
||||
override val parameters: CompileTimeConstant.Parameters,
|
||||
val convertedFromSigned: Boolean = false
|
||||
) : CompileTimeConstant<Number> {
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun IntegerValueTypeConstant.convertToUnsignedConstant(module: ModuleDescriptor): IntegerValueTypeConstant {
|
||||
val newParameters = CompileTimeConstant.Parameters(
|
||||
parameters.canBeUsedInAnnotation,
|
||||
parameters.isPure,
|
||||
isUnsignedNumberLiteral = true,
|
||||
isUnsignedLongNumberLiteral = parameters.isUnsignedLongNumberLiteral,
|
||||
usesVariableAsConstant = parameters.usesVariableAsConstant,
|
||||
usesNonConstValAsConstant = parameters.usesNonConstValAsConstant,
|
||||
isConvertableConstVal = parameters.isConvertableConstVal
|
||||
)
|
||||
|
||||
return IntegerValueTypeConstant(value, module, newParameters, convertedFromSigned = true)
|
||||
}
|
||||
}
|
||||
|
||||
private val typeConstructor = IntegerValueTypeConstructor(value.toLong(), module, parameters)
|
||||
|
||||
override fun toConstantValue(expectedType: KotlinType): ConstantValue<Number> {
|
||||
@@ -146,8 +164,8 @@ class IntegerValueTypeConstant(
|
||||
}
|
||||
|
||||
val unknownIntegerType = KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(
|
||||
Annotations.EMPTY, typeConstructor, emptyList(), false,
|
||||
ErrorUtils.createErrorScope("Scope for number value type ($typeConstructor)", true)
|
||||
Annotations.EMPTY, typeConstructor, emptyList(), false,
|
||||
ErrorUtils.createErrorScope("Scope for number value type ($typeConstructor)", true)
|
||||
)
|
||||
|
||||
fun getType(expectedType: KotlinType): KotlinType = TypeUtils.getPrimitiveNumberType(typeConstructor, expectedType)
|
||||
|
||||
Reference in New Issue
Block a user