Fixed loading integral constants from compiled classes.

This commit is contained in:
Evgeny Gerashchenko
2014-06-20 17:47:48 +04:00
parent 111feb2574
commit bf442a9700
9 changed files with 125 additions and 1 deletions
@@ -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)
@@ -0,0 +1,12 @@
import constants.*
AnnotationClass("$b $s $i $l $f $d $bb $c $str")
class DummyClass()
fun main(args: Array<String>) {
val klass = javaClass<DummyClass>()!!
val annotationClass = javaClass<AnnotationClass>()
val annotation = klass.getAnnotation(annotationClass)!!
val value = annotation.value
require(value == "100 20000 2000000 2000000000000 3.14 3.14 true \u03c0 :)", "Annotation value: $value")
}
@@ -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 = ":)"
@@ -0,0 +1,28 @@
package test
internal val b: kotlin.Byte = 100.toByte()
internal fun <get-b>(): kotlin.Byte
internal val b1: kotlin.Byte = 1.toByte()
internal fun <get-b1>(): kotlin.Byte
internal val bb: kotlin.Boolean = true
internal fun <get-bb>(): kotlin.Boolean
internal val c: kotlin.Char = #960(π)
internal fun <get-c>(): kotlin.Char
internal val d: kotlin.Double = 3.14.toDouble()
internal fun <get-d>(): kotlin.Double
internal val f: kotlin.Float = 3.14.toFloat()
internal fun <get-f>(): kotlin.Float
internal val i: kotlin.Int = 2000000
internal fun <get-i>(): kotlin.Int
internal val i1: kotlin.Short = 1.toShort()
internal fun <get-i1>(): kotlin.Short
internal val l: kotlin.Long = 2000000000000.toLong()
internal fun <get-l>(): kotlin.Long
internal val l1: kotlin.Long = 1.toLong()
internal fun <get-l1>(): kotlin.Long
internal val s: kotlin.Short = 20000.toShort()
internal fun <get-s>(): kotlin.Short
internal val s1: kotlin.Short = 1.toShort()
internal fun <get-s1>(): kotlin.Short
internal val str: kotlin.String = ":)"
internal fun <get-str>(): kotlin.String
@@ -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");
@@ -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");
@@ -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");
@@ -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);
}
@@ -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");