From 7380abac13999354a916a6a5aa58030dd9072642 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 22 Sep 2020 17:35:59 +0300 Subject: [PATCH] Split AsmUtils to descriptors dependent and independent parts --- .../kotlin/codegen/AnnotationCodegen.java | 2 +- .../kotlin/codegen/ClosureCodegen.java | 5 +- .../kotlin/codegen/ConstructorCodegen.java | 2 +- .../DefaultParameterValueSubstitutor.kt | 4 +- .../{AsmUtil.java => DescriptorAsmUtil.java} | 465 +----------------- .../codegen/ErasedInlineClassBodyCodegen.kt | 2 +- .../kotlin/codegen/ExpressionCodegen.java | 17 +- .../kotlin/codegen/FunctionCodegen.java | 14 +- .../FunctionsFromAnyGeneratorImpl.java | 1 + .../codegen/ImplementationBodyCodegen.java | 6 +- .../kotlin/codegen/MemberCodegen.java | 4 +- .../kotlin/codegen/MultifileClassCodegen.kt | 2 +- .../codegen/MultifileClassPartCodegen.kt | 2 +- .../kotlin/codegen/PackagePartCodegen.java | 2 +- .../kotlin/codegen/PropertyCodegen.java | 10 +- .../codegen/PropertyReferenceCodegen.kt | 6 +- .../kotlin/codegen/SamWrapperCodegen.java | 4 +- .../jetbrains/kotlin/codegen/ScriptCodegen.kt | 3 +- .../codegen/VariableAsmNameManglingUtils.kt | 23 - .../codegen/binding/MutableClosure.java | 3 +- .../kotlin/codegen/callableReferenceUtil.kt | 6 +- .../codegen/context/CodegenContext.java | 4 +- .../kotlin/codegen/context/MethodContext.java | 4 +- .../codegen/coroutines/CoroutineCodegen.kt | 8 +- .../codegen/generateJava8ParameterNames.kt | 2 +- .../inline/AnonymousObjectTransformer.kt | 6 +- .../kotlin/codegen/inline/LambdaInfo.kt | 5 +- .../kotlin/codegen/inline/PsiInlineCodegen.kt | 2 +- .../inline/PsiInlineIntrinsicsSupport.kt | 2 +- .../codegen/inline/SourceCompilerForInline.kt | 4 +- .../codegen/inline/defaultMethodUtil.kt | 6 +- .../kotlin/codegen/intrinsics/Concat.kt | 4 +- .../kotlin/codegen/intrinsics/Equals.kt | 4 +- .../kotlin/codegen/intrinsics/Increment.kt | 2 +- .../kotlin/codegen/range/RangeCodegenUtil.kt | 2 +- .../AbstractForInRangeLoopGenerator.kt | 2 +- .../range/forLoop/ForInArrayLoopGenerator.kt | 4 +- .../kotlin/codegen/state/KotlinTypeMapper.kt | 12 +- .../backend/jvm/codegen/ClassCodegen.kt | 4 +- .../backend/jvm/codegen/ExpressionCodegen.kt | 1 + .../kotlin/backend/jvm/intrinsics/Equals.kt | 3 +- .../kotlin/backend/jvm/intrinsics/HashCode.kt | 3 +- .../backend/jvm/intrinsics/Increment.kt | 3 +- .../kotlin/asJava/classes/ultraLightUtils.kt | 7 +- .../build.gradle.kts | 3 +- .../org/jetbrains/kotlin/codegen/AsmUtil.java | 450 +++++++++++++++++ .../CommonVariableAsmNameManglingUtils.kt | 31 ++ .../codegen/signature/AsmTypeFactory.kt | 0 .../kotlin/resolve/jvm/AsmTypes.java | 8 +- .../jvm/checkers/dalvikIdentifierUtils.kt | 8 +- .../backend/jvm/SerializableCodegenImpl.kt | 4 +- 51 files changed, 625 insertions(+), 556 deletions(-) rename compiler/backend/src/org/jetbrains/kotlin/codegen/{AsmUtil.java => DescriptorAsmUtil.java} (72%) create mode 100644 core/compiler.backend.common.jvm/src/org/jetbrains/kotlin/codegen/AsmUtil.java create mode 100644 core/compiler.backend.common.jvm/src/org/jetbrains/kotlin/codegen/CommonVariableAsmNameManglingUtils.kt rename {compiler/backend => core/compiler.backend.common.jvm}/src/org/jetbrains/kotlin/codegen/signature/AsmTypeFactory.kt (100%) rename {compiler/frontend.java => core/compiler.backend.common.jvm}/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java (97%) rename {compiler/frontend.java => core/compiler.backend.common.jvm}/src/org/jetbrains/kotlin/resolve/jvm/checkers/dalvikIdentifierUtils.kt (71%) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java index 6d3759a9697..2ffacdd6f48 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java @@ -221,7 +221,7 @@ public abstract class AnnotationCodegen { private static boolean isInvisibleFromTheOutside(@Nullable DeclarationDescriptor descriptor) { if (isAccessor(descriptor)) return true; if (descriptor instanceof MemberDescriptor) { - return AsmUtil.getVisibilityAccessFlag((MemberDescriptor) descriptor) == Opcodes.ACC_PRIVATE; + return DescriptorAsmUtil.getVisibilityAccessFlag((MemberDescriptor) descriptor) == Opcodes.ACC_PRIVATE; } return false; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index 3b9858d4d64..48247834fa3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -50,8 +50,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static org.jetbrains.kotlin.codegen.AsmUtil.*; +import static org.jetbrains.kotlin.codegen.AsmUtil.CAPTURED_THIS_FIELD; import static org.jetbrains.kotlin.codegen.CallableReferenceUtilKt.*; +import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.*; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConst; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.CLOSURE; import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION; @@ -139,7 +140,7 @@ public class ClosureCodegen extends MemberCodegen { this.asmType = typeMapper.mapClass(classDescriptor); - visibilityFlag = AsmUtil.getVisibilityAccessFlagForClass(classDescriptor); + visibilityFlag = DescriptorAsmUtil.getVisibilityAccessFlagForClass(classDescriptor); } @Override diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java index a9abe375f87..336210c8b9a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java @@ -298,7 +298,7 @@ public class ConstructorCodegen { int k = 1; for (FieldInfo info : argsFromClosure) { - k = AsmUtil.genAssignInstanceFieldFromParam(info, k, iv); + k = DescriptorAsmUtil.genAssignInstanceFieldFromParam(info, k, iv); } } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index 9b543c0aed6..0eb229f90e1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -127,8 +127,8 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { substituteCount: Int ) { val typeMapper = state.typeMapper - val isStatic = AsmUtil.isStaticMethod(contextKind, functionDescriptor) - val baseMethodFlags = AsmUtil.getCommonCallableFlags(functionDescriptor, state) and Opcodes.ACC_VARARGS.inv() + val isStatic = DescriptorAsmUtil.isStaticMethod(contextKind, functionDescriptor) + val baseMethodFlags = DescriptorAsmUtil.getCommonCallableFlags(functionDescriptor, state) and Opcodes.ACC_VARARGS.inv() val remainingParameters = getRemainingParameters(functionDescriptor.original, substituteCount) val remainingParametersDeclarations = remainingParameters.map { DescriptorToSourceUtils.descriptorToDeclaration(it) as? KtParameter } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java similarity index 72% rename from compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java rename to compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java index 8c08f229b78..15b7ce13c4c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.codegen; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import com.intellij.openapi.util.Pair; import com.intellij.psi.tree.IElementType; @@ -14,7 +13,6 @@ import kotlin.Unit; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; -import org.jetbrains.kotlin.builtins.PrimitiveType; import org.jetbrains.kotlin.codegen.binding.CalculatedClosure; import org.jetbrains.kotlin.codegen.binding.CodegenBinding; import org.jetbrains.kotlin.codegen.context.CodegenContext; @@ -22,16 +20,15 @@ import org.jetbrains.kotlin.codegen.intrinsics.HashCode; import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper; -import org.jetbrains.kotlin.config.*; +import org.jetbrains.kotlin.config.JvmDefaultMode; +import org.jetbrains.kotlin.config.JvmTarget; +import org.jetbrains.kotlin.config.LanguageFeature; +import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.lexer.KtTokens; -import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities; -import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil; import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable; -import org.jetbrains.kotlin.name.ClassId; -import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.protobuf.MessageLite; import org.jetbrains.kotlin.renderer.DescriptorRenderer; @@ -41,7 +38,9 @@ import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver; import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt; import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver; import org.jetbrains.kotlin.resolve.inline.InlineUtil; -import org.jetbrains.kotlin.resolve.jvm.*; +import org.jetbrains.kotlin.resolve.jvm.AsmTypes; +import org.jetbrains.kotlin.resolve.jvm.InlineClassManglingRulesKt; +import org.jetbrains.kotlin.resolve.jvm.RuntimeAssertionInfo; import org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; import org.jetbrains.kotlin.serialization.DescriptorSerializer; @@ -50,15 +49,14 @@ import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.SimpleType; import org.jetbrains.org.objectweb.asm.*; import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; -import org.jetbrains.org.objectweb.asm.commons.Method; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Set; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isBoolean; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isPrimitiveClass; +import static org.jetbrains.kotlin.codegen.AsmUtil.*; import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isToArrayFromCollection; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface; @@ -70,81 +68,14 @@ import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.h import static org.jetbrains.kotlin.types.TypeUtils.isNullableType; import static org.jetbrains.org.objectweb.asm.Opcodes.*; -public class AsmUtil { - +public class DescriptorAsmUtil { private static final Set STRING_BUILDER_OBJECT_APPEND_ARG_TYPES = Sets.newHashSet( getType(String.class), getType(StringBuffer.class), getType(CharSequence.class) ); - private static final int NO_FLAG_LOCAL = 0; - public static final int NO_FLAG_PACKAGE_PRIVATE = 0; - - @NotNull - private static final Map visibilityToAccessFlag = ImmutableMap.builder() - .put(DescriptorVisibilities.PRIVATE, ACC_PRIVATE) - .put(DescriptorVisibilities.PRIVATE_TO_THIS, ACC_PRIVATE) - .put(DescriptorVisibilities.PROTECTED, ACC_PROTECTED) - .put(JavaDescriptorVisibilities.PROTECTED_STATIC_VISIBILITY, ACC_PROTECTED) - .put(JavaDescriptorVisibilities.PROTECTED_AND_PACKAGE, ACC_PROTECTED) - .put(DescriptorVisibilities.PUBLIC, ACC_PUBLIC) - .put(DescriptorVisibilities.INTERNAL, ACC_PUBLIC) - .put(DescriptorVisibilities.LOCAL, NO_FLAG_LOCAL) - .put(JavaDescriptorVisibilities.PACKAGE_VISIBILITY, NO_FLAG_PACKAGE_PRIVATE) - .build(); - - public static final String CAPTURED_PREFIX = "$"; - - public static final String THIS = "this"; - - public static final String THIS_IN_DEFAULT_IMPLS = "$this"; - - public static final String LABELED_THIS_FIELD = THIS + "_"; - - public static final String CAPTURED_LABELED_THIS_FIELD = CAPTURED_PREFIX + LABELED_THIS_FIELD; - - public static final String INLINE_DECLARATION_SITE_THIS = "this_"; - - public static final String LABELED_THIS_PARAMETER = CAPTURED_PREFIX + THIS + "$"; - - public static final String CAPTURED_THIS_FIELD = "this$0"; - - public static final String RECEIVER_PARAMETER_NAME = "$receiver"; - - /* - This is basically an old convention. Starting from Kotlin 1.3, it was replaced with `$this_