From af3437626b2f45072b9de7317e97d436cb5f10b6 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Wed, 17 Feb 2016 13:58:23 +0300 Subject: [PATCH] Properly calculate isConst for java properties --- .../inlineJavaStaticFields/JClass.java | 3 +++ .../inlineJavaStaticFields/test.kt | 13 ++++++++++--- .../java/descriptors/JavaPropertyDescriptor.java | 6 +++++- .../org/jetbrains/kotlin/descriptors/ConstUtil.kt | 3 ++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/compiler/testData/codegen/bytecodeTextMultifile/inlineJavaStaticFields/JClass.java b/compiler/testData/codegen/bytecodeTextMultifile/inlineJavaStaticFields/JClass.java index ab7378e4c41..9ab411639f6 100644 --- a/compiler/testData/codegen/bytecodeTextMultifile/inlineJavaStaticFields/JClass.java +++ b/compiler/testData/codegen/bytecodeTextMultifile/inlineJavaStaticFields/JClass.java @@ -12,6 +12,9 @@ public class JClass { public final static char PrimitiveChar = 'K'; public final static String Str = ":J"; + @Nullable + public final static String StrNullable = "nullable"; + @NotNull public final static Integer BoxedInt = 9500; diff --git a/compiler/testData/codegen/bytecodeTextMultifile/inlineJavaStaticFields/test.kt b/compiler/testData/codegen/bytecodeTextMultifile/inlineJavaStaticFields/test.kt index a547050af34..951fd4a6495 100644 --- a/compiler/testData/codegen/bytecodeTextMultifile/inlineJavaStaticFields/test.kt +++ b/compiler/testData/codegen/bytecodeTextMultifile/inlineJavaStaticFields/test.kt @@ -1,6 +1,9 @@ object KoKobject { - @JvmStatic + @JvmField val JvmStatic: Int = 1 + + @JvmField + val JvmStaticString: String? = "123" } fun test() { @@ -20,10 +23,12 @@ fun test() { JClass.BoxedInt JClass.NonFinal + JClass.StrNullable JClass().NonStatic KoKobject.JvmStatic + KoKobject.JvmStaticString } // @TestKt.class: @@ -42,6 +47,8 @@ fun test() { // 1 GETSTATIC JClass.BoxedInt : Ljava/lang/Integer; // 1 GETSTATIC JClass.NonFinal : I // 1 GETFIELD JClass.NonStatic : I -// 1 INVOKESTATIC KoKobject.getJvmStatic \(\)I +// 1 LDC "nullable" +// 1 GETSTATIC KoKobject.JvmStatic : I +// 1 GETSTATIC KoKobject.JvmStaticString : Ljava/lang/String // 3 POP2 -// 16 POP \ No newline at end of file +// 18 POP \ No newline at end of file diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java index 479072ed692..2fef3289a97 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java @@ -18,11 +18,13 @@ package org.jetbrains.kotlin.load.java.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl; import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl; import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl; +import org.jetbrains.kotlin.load.java.typeEnhancement.TypeEnhancementKt; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.types.KotlinType; @@ -110,6 +112,8 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja @Override public boolean isConst() { - return isStaticFinal && ConstUtil.canBeUsedForConstVal(getType()); + KotlinType type = getType(); + return isStaticFinal && ConstUtil.canBeUsedForConstVal(type) && + (!TypeEnhancementKt.hasEnhancedNullability(type) || KotlinBuiltIns.isString(type)); } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstUtil.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstUtil.kt index d688c8cc24b..6f59f3754dc 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstUtil.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstUtil.kt @@ -20,9 +20,10 @@ package org.jetbrains.kotlin.descriptors import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.TypeUtils object ConstUtil { @JvmStatic fun canBeUsedForConstVal(type: KotlinType) = type.canBeUsedForConstVal() } -fun KotlinType.canBeUsedForConstVal() = KotlinBuiltIns.isPrimitiveType(this) || KotlinBuiltIns.isString(this) +fun KotlinType.canBeUsedForConstVal() = KotlinBuiltIns.isPrimitiveType(this) && !TypeUtils.isNullableType(this) || KotlinBuiltIns.isString(this)