diff --git a/compiler/testData/compileKotlinAgainstKotlin/unsignedTypesInAnnotations.kt b/compiler/testData/compileKotlinAgainstKotlin/unsignedTypesInAnnotations.kt index 8e4529bc211..19b89578f87 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/unsignedTypesInAnnotations.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/unsignedTypesInAnnotations.kt @@ -5,17 +5,27 @@ @kotlin.annotation.Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION) annotation class Anno(val u: UInt) +const val ONE_UINT = 1u + object ForTest { @Anno(0u) fun f(a: @Anno(43u) String) {} + + @Anno(ONE_UINT) + fun g(b: @Anno(ONE_UINT) String) {} } // FILE: B.kt fun box(): String { - val result = (ForTest::f.annotations.first() as Anno).u // force annotation deserialization - if (result != 0u) return "Fail" + val fResult = (ForTest::f.annotations.first() as Anno).u // force annotation deserialization + if (fResult != 0u) return "Fail" + + val gResult = (ForTest::g.annotations.first() as Anno).u + if (gResult != 1u) return "Fail" + + if (ONE_UINT != 1u) return "Fail" return "OK" } \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/WithUnsignedTypeParameters.kt b/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/WithUnsignedTypeParameters.kt index 6d58b717699..20ed151a65a 100644 --- a/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/WithUnsignedTypeParameters.kt +++ b/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/WithUnsignedTypeParameters.kt @@ -10,7 +10,13 @@ annotation class Ann( val ulong: ULong ) +const val ubyteConst: UByte = 10u +const val ushortConst: UShort = 20u +const val uintConst = 30u +const val ulongConst = 40uL + class A { fun unsigned(s: @Ann(1u, 2u, 3u, 4u) String) {} fun <@Ann(0xFFu, 0xFFFFu, 0xFFFF_FFFFu, 0xFFFF_FFFF_FFFF_FFFFuL) T> typeParam() {} + fun unsignedConsts(s: @Ann(ubyteConst, ushortConst, uintConst, ulongConst) String) {} } diff --git a/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/WithUnsignedTypeParameters.txt b/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/WithUnsignedTypeParameters.txt index e7fe58b7932..8aefe4c943e 100644 --- a/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/WithUnsignedTypeParameters.txt +++ b/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/WithUnsignedTypeParameters.txt @@ -1,9 +1,19 @@ package test +public const val ubyteConst: kotlin.UByte = 10.toUByte() + public fun (): kotlin.UByte +public const val uintConst: kotlin.UInt = 30.toUInt() + public fun (): kotlin.UInt +public const val ulongConst: kotlin.ULong = 40.toULong() + public fun (): kotlin.ULong +public const val ushortConst: kotlin.UShort = 20.toUShort() + public fun (): kotlin.UShort + public final class A { /*primary*/ public constructor A() public final fun typeParam(): kotlin.Unit public final fun unsigned(/*0*/ s: @test.Ann(ubyte = 1.toUByte(), uint = 3.toUInt(), ulong = 4.toULong(), ushort = 2.toUShort()) kotlin.String): kotlin.Unit + public final fun unsignedConsts(/*0*/ s: @test.Ann(ubyte = 10.toUByte(), uint = 30.toUInt(), ulong = 40.toULong(), ushort = 20.toUShort()) kotlin.String): kotlin.Unit } @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER}) public final annotation class Ann : kotlin.Annotation { diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt index 1e1cac8540b..5d9e631d0ab 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.load.kotlin +import org.jetbrains.kotlin.builtins.UnsignedTypes import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.load.java.JvmAbi @@ -48,6 +49,8 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader): ConstantValue<*>? { + return when (constant) { + is ByteValue -> UByteValue(constant.value) + is ShortValue -> UShortValue(constant.value) + is IntValue -> UIntValue(constant.value) + is LongValue -> ULongValue(constant.value) + else -> constant + } + } + override fun loadPropertyAnnotations( propertyAnnotations: List, fieldAnnotations: List, diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt index 10db6bc77da..9a7ceacc60a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt @@ -126,6 +126,8 @@ class AnnotationLoaderForClassFileStubBuilder( override fun loadConstant(desc: String, initializer: Any) = null + override fun transformToUnsignedConstant(constant: Unit) = null + override fun loadAnnotation( annotationClassId: ClassId, source: SourceElement, result: MutableList ): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {