Introduce conversions from signed pure constants to unsigned ones

#KT-24717 In Progress
 #KT-25996 Open
 #KT-25997 Open
This commit is contained in:
Mikhail Zarechenskiy
2018-08-08 03:52:02 +03:00
parent 7c996dc218
commit be38263fc7
17 changed files with 287 additions and 24 deletions
@@ -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)