diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index d6409456ec1..42556728d58 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.load.java.JavaVisibilities; import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.platform.JavaToKotlinClassMap; import org.jetbrains.kotlin.resolve.DeprecationUtilKt; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt; @@ -298,9 +299,6 @@ public class AsmUtil { public static int getDeprecatedAccessFlag(@NotNull MemberDescriptor descriptor) { if (descriptor instanceof PropertyAccessorDescriptor) { - if (((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty().isConst()) { - return ACC_DEPRECATED; - } return KotlinBuiltIns.isDeprecated(descriptor) ? ACC_DEPRECATED : getDeprecatedAccessFlag(((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty()); @@ -680,14 +678,8 @@ public class AsmUtil { } public static boolean isInstancePropertyWithStaticBackingField(@NotNull PropertyDescriptor propertyDescriptor) { - if (propertyDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { - return false; - } - - DeclarationDescriptor container = propertyDescriptor.getContainingDeclaration(); - return isNonCompanionObject(container) || - isPropertyWithBackingFieldInOuterClass(propertyDescriptor) || - (isCompanionObject(container) && isInterface(container.getContainingDeclaration())); + return propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE && + isObject(propertyDescriptor.getContainingDeclaration()); } public static boolean isPropertyWithBackingFieldInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) { @@ -727,7 +719,9 @@ public class AsmUtil { } public static boolean isCompanionObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor companionObject) { - return isCompanionObject(companionObject) && isClassOrEnumClass(companionObject.getContainingDeclaration()); + return isCompanionObject(companionObject) && + isClassOrEnumClass(companionObject.getContainingDeclaration()) && + !JavaToKotlinClassMap.INSTANCE.isMappedCompanion((ClassDescriptor) companionObject); } private static boolean areBothAccessorDefault(@NotNull PropertyDescriptor propertyDescriptor) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index f5fbbe1d210..59fbb73f72f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -92,15 +92,13 @@ import java.util.*; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isInt; import static org.jetbrains.kotlin.codegen.AsmUtil.*; -import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.couldUseDirectAccessToProperty; -import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface; +import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.*; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.*; import static org.jetbrains.kotlin.resolve.BindingContext.*; import static org.jetbrains.kotlin.resolve.BindingContextUtils.*; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isObject; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*; -import static org.jetbrains.kotlin.resolve.jvm.annotations.AnnotationUtilKt.hasJvmFieldAnnotation; import static org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isFunctionExpression; import static org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isFunctionLiteral; import static org.jetbrains.org.objectweb.asm.Opcodes.*; @@ -2168,7 +2166,7 @@ public class ExpressionCodegen extends KtVisitor impleme propertyDescriptor = context.accessibleDescriptor(propertyDescriptor, superCallTarget); PropertyGetterDescriptor getter = propertyDescriptor.getGetter(); - if (getter != null && !hasJvmFieldAnnotation(propertyDescriptor)) { + if (getter != null && !isConstOrHasJvmFieldAnnotation(propertyDescriptor)) { callableGetter = typeMapper.mapToCallableMethod(getter, isSuper); } } @@ -2177,7 +2175,7 @@ public class ExpressionCodegen extends KtVisitor impleme PropertySetterDescriptor setter = propertyDescriptor.getSetter(); if (setter != null && !couldUseDirectAccessToProperty(propertyDescriptor, false, isDelegatedProperty, context) && - !hasJvmFieldAnnotation(propertyDescriptor)) { + !isConstOrHasJvmFieldAnnotation(propertyDescriptor)) { callableSetter = typeMapper.mapToCallableMethod(setter, isSuper); } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index 0307153dd91..a6fbbcca105 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -50,6 +50,7 @@ import java.io.File; import static org.jetbrains.kotlin.descriptors.Modality.ABSTRACT; import static org.jetbrains.kotlin.descriptors.Modality.FINAL; +import static org.jetbrains.kotlin.resolve.jvm.annotations.AnnotationUtilKt.hasJvmFieldAnnotation; public class JvmCodegenUtil { @@ -130,6 +131,10 @@ public class JvmCodegenUtil { ); } + public static boolean isConstOrHasJvmFieldAnnotation(@NotNull PropertyDescriptor propertyDescriptor) { + return propertyDescriptor.isConst() || hasJvmFieldAnnotation(propertyDescriptor); + } + public static boolean couldUseDirectAccessToProperty( @NotNull PropertyDescriptor property, boolean forGetter, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java index 023dd91bdaa..352ed50b6b5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java @@ -55,6 +55,7 @@ import org.jetbrains.org.objectweb.asm.commons.Method; import java.util.List; import static org.jetbrains.kotlin.codegen.AsmUtil.*; +import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface; import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.*; import static org.jetbrains.kotlin.resolve.DescriptorUtils.*; @@ -155,7 +156,7 @@ public class PropertyCodegen { @NotNull PropertyDescriptor descriptor, @Nullable KtPropertyAccessor accessor ) { - if (hasJvmFieldAnnotation(descriptor)) return false; + if (isConstOrHasJvmFieldAnnotation(descriptor)) return false; boolean isDefaultAccessor = accessor == null || !accessor.hasBody(); diff --git a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/TraitClassObjectField.NoCompile.java b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/TraitClassObjectField.NoCompile.java index 8c49e6d1133..6706914c045 100644 --- a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/TraitClassObjectField.NoCompile.java +++ b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/TraitClassObjectField.NoCompile.java @@ -8,12 +8,6 @@ public interface TraitClassObjectField { public static final java.lang.String x = ""; private static final java.lang.String y = ""; - /** - * @deprecated - */ - @org.jetbrains.annotations.Nullable - public final java.lang.String getX() { /* compiled code */ } - private final java.lang.String getY() { /* compiled code */ } private Companion() { /* compiled code */ } diff --git a/compiler/testData/codegen/boxInline/syntheticAccessors/constField.1.kt b/compiler/testData/codegen/boxInline/syntheticAccessors/constField.1.kt new file mode 100644 index 00000000000..a766a08464a --- /dev/null +++ b/compiler/testData/codegen/boxInline/syntheticAccessors/constField.1.kt @@ -0,0 +1,11 @@ +import test.* + +fun box(): String { + val packageResult = packageInline { it + "K" } + if (packageResult != "OK") return "package inline fail: $packageResult" + + val samePackageResult = samePackageCall() + if (samePackageResult != "OK") return "same package inline fail: $samePackageResult" + + return "OK" +} diff --git a/compiler/testData/codegen/boxInline/syntheticAccessors/constField.2.kt b/compiler/testData/codegen/boxInline/syntheticAccessors/constField.2.kt new file mode 100644 index 00000000000..f98efdc9f97 --- /dev/null +++ b/compiler/testData/codegen/boxInline/syntheticAccessors/constField.2.kt @@ -0,0 +1,11 @@ +package test + +private const val packageProp = "O" + +internal inline fun packageInline(p: (String) -> String): String { + return p(packageProp) +} + +internal fun samePackageCall(): String { + return packageInline { it + "K"} +} \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/constValsGetterDeprecated.kt b/compiler/testData/codegen/bytecodeText/constValsGetterDeprecated.kt deleted file mode 100644 index 8cb26d5a876..00000000000 --- a/compiler/testData/codegen/bytecodeText/constValsGetterDeprecated.kt +++ /dev/null @@ -1,17 +0,0 @@ -const val CONST_VAL = 1 - -object A { - const val CONST_VAL = 2 -} - -class B { - companion object { - const val CONST_VAL = 2 - } -} - -/* - 3 DEPRECATED are for getCONST_VAL -*/ - -// 3 DEPRECATED \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index fdbb385e8e1..c8518980125 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -101,12 +101,6 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { doTest(fileName); } - @TestMetadata("constValsGetterDeprecated.kt") - public void testConstValsGetterDeprecated() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/constValsGetterDeprecated.kt"); - doTest(fileName); - } - @TestMetadata("falseSmartCast.kt") public void testFalseSmartCast() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/falseSmartCast.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java index ec1e3d331e7..ab6c09d11e9 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java @@ -1645,6 +1645,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/syntheticAccessors"), Pattern.compile("^(.+)\\.1.kt$"), true); } + @TestMetadata("constField.1.kt") + public void testConstField() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/syntheticAccessors/constField.1.kt"); + doTestMultiFileWithInlineCheck(fileName); + } + @TestMetadata("packagePrivateMembers.1.kt") public void testPackagePrivateMembers() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/syntheticAccessors/packagePrivateMembers.1.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java index a1e161cea2c..4757c323ae9 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -1645,6 +1645,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/syntheticAccessors"), Pattern.compile("^(.+)\\.1.kt$"), true); } + @TestMetadata("constField.1.kt") + public void testConstField() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/syntheticAccessors/constField.1.kt"); + doBoxTestWithInlineCheck(fileName); + } + @TestMetadata("packagePrivateMembers.1.kt") public void testPackagePrivateMembers() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/syntheticAccessors/packagePrivateMembers.1.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java index e3a31332966..a247ceb6d11 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java @@ -42,6 +42,7 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { private final Map mutableToReadOnly = new HashMap(); private final Map readOnlyToMutable = new HashMap(); + private final CompanionObjectMapping companionObjectMapping; private JavaToKotlinClassMap() { KotlinBuiltIns builtIns = JvmBuiltIns.getInstance(); @@ -69,7 +70,7 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { add(ClassId.topLevel(jvmType.getWrapperFqName()), builtIns.getPrimitiveClassDescriptor(jvmType.getPrimitiveType())); } - CompanionObjectMapping companionObjectMapping = new CompanionObjectMapping(builtIns); + companionObjectMapping = new CompanionObjectMapping(builtIns); for (ClassDescriptor descriptor : companionObjectMapping.allClassesWithIntrinsicCompanions()) { ClassDescriptor companion = descriptor.getCompanionObjectDescriptor(); assert companion != null : "No companion object found for " + descriptor; @@ -118,6 +119,10 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { return kotlinToJava.get(kotlinFqName); } + public boolean isMappedCompanion(@NotNull ClassDescriptor descriptor) { + return companionObjectMapping.hasMappingToObject(descriptor); + } + private void add( @NotNull Class javaClass, @NotNull ClassDescriptor kotlinDescriptor,