diff --git a/compiler/testData/compileKotlinAgainstKotlin/InlinedConstants.A.kt b/compiler/testData/compileKotlinAgainstKotlin/InlinedConstants.A.kt new file mode 100644 index 00000000000..6e624ae137e --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/InlinedConstants.A.kt @@ -0,0 +1,18 @@ +package constants + +import java.lang.annotation.Retention +import java.lang.annotation.RetentionPolicy + +public val b: Byte = 100 +public val s: Short = 20000 +public val i: Int = 2000000 +public val l: Long = 2000000000000L +public val f: Float = 3.14f +public val d: Double = 3.14 +public val bb: Boolean = true +public val c: Char = '\u03c0' // pi symbol + +public val str: String = ":)" + +[Retention(RetentionPolicy.RUNTIME)] +public annotation class AnnotationClass(public val value: String) \ No newline at end of file diff --git a/compiler/testData/compileKotlinAgainstKotlin/InlinedConstants.B.kt b/compiler/testData/compileKotlinAgainstKotlin/InlinedConstants.B.kt new file mode 100644 index 00000000000..4c341b87225 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/InlinedConstants.B.kt @@ -0,0 +1,12 @@ +import constants.* + +AnnotationClass("$b $s $i $l $f $d $bb $c $str") +class DummyClass() + +fun main(args: Array) { + val klass = javaClass()!! + val annotationClass = javaClass() + val annotation = klass.getAnnotation(annotationClass)!! + val value = annotation.value + require(value == "100 20000 2000000 2000000000000 3.14 3.14 true \u03c0 :)", "Annotation value: $value") +} \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledKotlin/prop/Constants.kt b/compiler/testData/loadJava/compiledKotlin/prop/Constants.kt new file mode 100644 index 00000000000..935c1a68f5b --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/prop/Constants.kt @@ -0,0 +1,17 @@ +//ALLOW_AST_ACCESS +package test + +val b: Byte = 100 +val b1: Byte = 1 +val s: Short = 20000 +val s1: Short = 1 +val i: Int = 2000000 +val i1: Short = 1 +val l: Long = 2000000000000L +val l1: Long = 1 +val f: Float = 3.14f +val d: Double = 3.14 +val bb: Boolean = true +val c: Char = '\u03c0' // pi symbol + +val str: String = ":)" \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledKotlin/prop/Constants.txt b/compiler/testData/loadJava/compiledKotlin/prop/Constants.txt new file mode 100644 index 00000000000..d465db083c5 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/prop/Constants.txt @@ -0,0 +1,28 @@ +package test + +internal val b: kotlin.Byte = 100.toByte() + internal fun (): kotlin.Byte +internal val b1: kotlin.Byte = 1.toByte() + internal fun (): kotlin.Byte +internal val bb: kotlin.Boolean = true + internal fun (): kotlin.Boolean +internal val c: kotlin.Char = #960(π) + internal fun (): kotlin.Char +internal val d: kotlin.Double = 3.14.toDouble() + internal fun (): kotlin.Double +internal val f: kotlin.Float = 3.14.toFloat() + internal fun (): kotlin.Float +internal val i: kotlin.Int = 2000000 + internal fun (): kotlin.Int +internal val i1: kotlin.Short = 1.toShort() + internal fun (): kotlin.Short +internal val l: kotlin.Long = 2000000000000.toLong() + internal fun (): kotlin.Long +internal val l1: kotlin.Long = 1.toLong() + internal fun (): kotlin.Long +internal val s: kotlin.Short = 20000.toShort() + internal fun (): kotlin.Short +internal val s1: kotlin.Short = 1.toShort() + internal fun (): kotlin.Short +internal val str: kotlin.String = ":)" + internal fun (): kotlin.String \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstKotlinTestGenerated.java index 7a56fb31825..fcece966531 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstKotlinTestGenerated.java @@ -66,6 +66,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl doTest("compiler/testData/compileKotlinAgainstKotlin/ImportObject.A.kt"); } + @TestMetadata("InlinedConstants.A.kt") + public void testInlinedConstants() throws Exception { + doTest("compiler/testData/compileKotlinAgainstKotlin/InlinedConstants.A.kt"); + } + @TestMetadata("InnerClass.A.kt") public void testInnerClass() throws Exception { doTest("compiler/testData/compileKotlinAgainstKotlin/InnerClass.A.kt"); diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 4f20fb8b50a..a28d2b7d79f 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -2593,6 +2593,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/prop/CollectionSize.kt"); } + @TestMetadata("Constants.kt") + public void testConstants() throws Exception { + doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/prop/Constants.kt"); + } + @TestMetadata("ExtValClass.kt") public void testExtValClass() throws Exception { doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/prop/ExtValClass.kt"); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java index 9ef982632ec..5ab9d342207 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java @@ -1061,6 +1061,11 @@ public class LazyResolveRecursiveComparingTestGenerated extends AbstractLazyReso doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/prop/CollectionSize.kt"); } + @TestMetadata("Constants.kt") + public void testConstants() throws Exception { + doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/prop/Constants.kt"); + } + @TestMetadata("ExtValClass.kt") public void testExtValClass() throws Exception { doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/prop/ExtValClass.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java index 866c8899d95..48b03d61877 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java @@ -87,9 +87,38 @@ public class DescriptorDeserializersStorage { @Override public KotlinJvmBinaryClass.AnnotationVisitor visitField(@NotNull Name name, @NotNull String desc, @Nullable Object initializer) { MemberSignature signature = MemberSignature.fromFieldNameAndDesc(name, desc); + if (initializer != null) { + Object normalizedValue; + if ("ZBCS".contains(desc)) { + int intValue = ((Integer) initializer).intValue(); + if ("Z".equals(desc)) { + normalizedValue = intValue != 0; + } + else if ("B".equals(desc)) { + normalizedValue = ((byte) intValue); + } + else if ("C".equals(desc)) { + normalizedValue = ((char) intValue); + } + else if ("S".equals(desc)) { + normalizedValue = ((short) intValue); + } + else { + throw new AssertionError(desc); + } + } + else { + normalizedValue = initializer; + } + propertyConstants.put(signature, ConstantsPackage.createCompileTimeConstant( - initializer, /* canBeUsedInAnnotation */ true, /* isPureIntConstant */ true, /* usesVariableAsConstant */ true, /* expectedType */ null)); + normalizedValue, + /* canBeUsedInAnnotation */ true, + /* isPureIntConstant */ true, + /* usesVariableAsConstant */ true, + /* expectedType */ null + )); } return new MemberAnnotationVisitor(signature); } diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/LazyResolveByStubTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/stubs/LazyResolveByStubTestGenerated.java index 83ae5f63739..8febd6a824d 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/LazyResolveByStubTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/LazyResolveByStubTestGenerated.java @@ -1061,6 +1061,11 @@ public class LazyResolveByStubTestGenerated extends AbstractLazyResolveByStubTes doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/prop/CollectionSize.kt"); } + @TestMetadata("Constants.kt") + public void testConstants() throws Exception { + doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/prop/Constants.kt"); + } + @TestMetadata("ExtValClass.kt") public void testExtValClass() throws Exception { doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/prop/ExtValClass.kt");