From 3513a64351c9e18647256fdf7bf5644db4b24f62 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 25 Dec 2015 19:27:52 +0300 Subject: [PATCH] Move utilities about companion property fields to JvmAbi To reuse that logic in reflection --- .../org/jetbrains/kotlin/codegen/AsmUtil.java | 12 ----------- .../kotlin/codegen/ExpressionCodegen.java | 3 ++- .../codegen/ImplementationBodyCodegen.java | 3 ++- .../kotlin/codegen/MemberCodegen.java | 2 +- .../kotlin/codegen/PropertyCodegen.java | 2 +- .../jetbrains/kotlin/codegen/codegenUtil.kt | 3 ++- .../jetbrains/kotlin/load/java/JvmAbi.java | 21 ++++++++++++++++++- .../jvm/internal/DescriptorBasedProperty.kt | 11 ++++------ .../idea/debugger/KotlinPositionManager.kt | 5 ++--- 9 files changed, 34 insertions(+), 28 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 55a52f72e9b..7acfdf238d5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -39,7 +39,6 @@ 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; @@ -682,11 +681,6 @@ public class AsmUtil { isObject(propertyDescriptor.getContainingDeclaration()); } - public static boolean isPropertyWithBackingFieldInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) { - return propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE && - isCompanionObjectWithBackingFieldsInOuter(propertyDescriptor.getContainingDeclaration()); - } - public static int getVisibilityForSpecialPropertyBackingField(@NotNull PropertyDescriptor propertyDescriptor, boolean isDelegate) { boolean isExtensionProperty = propertyDescriptor.getExtensionReceiverParameter() != null; if (isDelegate || isExtensionProperty) { @@ -718,12 +712,6 @@ public class AsmUtil { && getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false) == ACC_PUBLIC; } - public static boolean isCompanionObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor companionObject) { - return isCompanionObject(companionObject) && - isClassOrEnumClass(companionObject.getContainingDeclaration()) && - !JavaToKotlinClassMap.INSTANCE.isMappedCompanion((ClassDescriptor) companionObject); - } - private static boolean areBothAccessorDefault(@NotNull PropertyDescriptor propertyDescriptor) { return isAccessorWithEmptyBody(propertyDescriptor.getGetter()) && (!propertyDescriptor.isVar() || isAccessorWithEmptyBody(propertyDescriptor.getSetter())); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index bf2d437fffe..af4ff0fd937 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.jvm.RuntimeAssertionInfo; import org.jetbrains.kotlin.jvm.bindingContextSlices.BindingContextSlicesKt; import org.jetbrains.kotlin.lexer.KtTokens; +import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; @@ -2116,7 +2117,7 @@ public class ExpressionCodegen extends KtVisitor impleme DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); FieldAccessorKind fieldAccessorKind = FieldAccessorKind.NORMAL; - boolean isBackingFieldInClassCompanion = AsmUtil.isPropertyWithBackingFieldInOuterClass(propertyDescriptor); + boolean isBackingFieldInClassCompanion = JvmAbi.isPropertyWithBackingFieldInOuterClass(propertyDescriptor); if (isBackingFieldInClassCompanion && forceField) { fieldAccessorKind = FieldAccessorKind.IN_CLASS_COMPANION; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 7c43e5af1f9..5790e5d6270 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.lexer.KtTokens; +import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor; import org.jetbrains.kotlin.name.Name; @@ -1020,7 +1021,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { parentCodegen.generateCompanionObjectInitializer(descriptor); } - if (isCompanionObjectWithBackingFieldsInOuter(descriptor)) { + if (JvmAbi.isCompanionObjectWithBackingFieldsInOuter(descriptor)) { final ImplementationBodyCodegen parentCodegen = (ImplementationBodyCodegen) getParentCodegen(); generateInitializers(new Function0() { @Override diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index cd7ae0659a6..aff0d7f4ca3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -601,7 +601,7 @@ public abstract class MemberCodegen() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAbi.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAbi.java index ffbd084386c..2aa059c82cf 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAbi.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAbi.java @@ -16,14 +16,22 @@ package org.jetbrains.kotlin.load.java; -import kotlin.StringsKt; +import kotlin.text.StringsKt; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; +import org.jetbrains.kotlin.descriptors.ClassDescriptor; +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; +import org.jetbrains.kotlin.descriptors.PropertyDescriptor; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.platform.JavaToKotlinClassMap; import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion; import org.jetbrains.kotlin.util.capitalizeDecapitalize.CapitalizeDecapitalizeKt; +import static org.jetbrains.kotlin.resolve.DescriptorUtils.isClassOrEnumClass; +import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject; + public final class JvmAbi { /** * This constant is used to identify binary format (class file) versions @@ -97,5 +105,16 @@ public final class JvmAbi { public static String sanitizeAsJavaIdentifier(@NotNull String str) { return StringsKt.replace(str, StringsKt.toRegex("[^\\p{L}\\p{Digit}]"), "_"); } + + public static boolean isPropertyWithBackingFieldInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) { + return propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE && + isCompanionObjectWithBackingFieldsInOuter(propertyDescriptor.getContainingDeclaration()); + } + + public static boolean isCompanionObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor companionObject) { + return isCompanionObject(companionObject) && + isClassOrEnumClass(companionObject.getContainingDeclaration()) && + !JavaToKotlinClassMap.INSTANCE.isMappedCompanion((ClassDescriptor) companionObject); + } } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/DescriptorBasedProperty.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/DescriptorBasedProperty.kt index ca52a2f86ae..a0bbf02679c 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/DescriptorBasedProperty.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/DescriptorBasedProperty.kt @@ -16,10 +16,8 @@ package kotlin.reflect.jvm.internal -import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.resolve.DescriptorUtils.isClassOrEnumClass -import org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject +import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import java.lang.reflect.Field import kotlin.reflect.jvm.internal.JvmPropertySignature.JavaField @@ -53,10 +51,9 @@ internal abstract class DescriptorBasedProperty protected constructor( when (jvmSignature) { is KotlinProperty -> { JvmProtoBufUtil.getJvmFieldSignature(jvmSignature.proto, jvmSignature.nameResolver, jvmSignature.typeTable)?.let { - val isCompanionOfClass = (descriptor.containingDeclaration as? ClassDescriptor)?.let { containingClass -> - isCompanionObject(containingClass) && isClassOrEnumClass(containingClass.containingDeclaration) - } ?: false - container.findFieldBySignature(it.name, isCompanionOfClass) + container.findFieldBySignature( + it.name, JvmAbi.isCompanionObjectWithBackingFieldsInOuter(descriptor.containingDeclaration) + ) } } is JavaField -> jvmSignature.field diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt index 8ae45adb803..f806aaba3f3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt @@ -39,7 +39,6 @@ import com.sun.jdi.Location import com.sun.jdi.ReferenceType import com.sun.jdi.request.ClassPrepareRequest import org.jetbrains.annotations.TestOnly -import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.ClassBuilderFactories import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.state.GenerationState @@ -53,10 +52,10 @@ import org.jetbrains.kotlin.fileClasses.internalNameWithoutInnerClasses import org.jetbrains.kotlin.idea.caches.resolve.analyzeAndGetResult import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils -import org.jetbrains.kotlin.idea.refactoring.getLineStartOffset import org.jetbrains.kotlin.idea.debugger.breakpoints.getLambdasAtLineIfAny import org.jetbrains.kotlin.idea.debugger.evaluate.KotlinCodeFragmentFactory import org.jetbrains.kotlin.idea.decompiler.classFile.KtClsFile +import org.jetbrains.kotlin.idea.refactoring.getLineStartOffset import org.jetbrains.kotlin.idea.search.usagesSearch.isImportUsage import org.jetbrains.kotlin.idea.util.DebuggerUtils import org.jetbrains.kotlin.idea.util.ProjectRootsUtil @@ -448,7 +447,7 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M public fun getJvmInternalNameForPropertyOwner(typeMapper: JetTypeMapper, descriptor: PropertyDescriptor): String { return typeMapper.mapOwner( - if (AsmUtil.isPropertyWithBackingFieldInOuterClass(descriptor)) descriptor.containingDeclaration else descriptor + if (JvmAbi.isPropertyWithBackingFieldInOuterClass(descriptor)) descriptor.containingDeclaration else descriptor ).internalName }