From 544be17c3d3fed6587766a09dfd4c331b5101d2b Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 28 Aug 2012 20:26:26 +0400 Subject: [PATCH] Refactor JetTypeMapper#getAccessFlags. Rename to getVisibilityAccessFlag. Separate logic for special cases and default mapping. Use meaningful name instead of "magic" zero number. Add TODO for future refactoring. Various logic clarifications. --- .../jet/codegen/ClassBodyCodegen.java | 5 +- .../jet/codegen/FunctionCodegen.java | 3 +- .../codegen/ImplementationBodyCodegen.java | 3 +- .../jetbrains/jet/codegen/JetTypeMapper.java | 68 +++++++++++-------- .../jet/codegen/PropertyCodegen.java | 7 +- 5 files changed, 52 insertions(+), 34 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java index 0aad7b03584..be213312a04 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java @@ -31,6 +31,7 @@ import java.util.Collections; import java.util.List; import static org.jetbrains.asm4.Opcodes.*; +import static org.jetbrains.jet.codegen.JetTypeMapper.getVisibilityAccessFlag; /** * @author max @@ -100,10 +101,10 @@ public abstract class ClassBodyCodegen { if (!isAnnotation) { propertyCodegen.generateBackingField(p, propertyDescriptor); propertyCodegen - .generateDefaultGetter(propertyDescriptor, JetTypeMapper.getAccessModifiers(propertyDescriptor, 0), p); + .generateDefaultGetter(propertyDescriptor, getVisibilityAccessFlag(propertyDescriptor), p); if (propertyDescriptor.isVar()) { propertyCodegen - .generateDefaultSetter(propertyDescriptor, JetTypeMapper.getAccessModifiers(propertyDescriptor, 0), p); + .generateDefaultSetter(propertyDescriptor, getVisibilityAccessFlag(propertyDescriptor), p); } } else { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index a361d930f1d..ddde1288e4f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -42,6 +42,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.*; import static org.jetbrains.asm4.Opcodes.*; +import static org.jetbrains.jet.codegen.JetTypeMapper.getVisibilityAccessFlag; import static org.jetbrains.jet.codegen.context.CodegenBinding.isLocalFun; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; @@ -97,7 +98,7 @@ public class FunctionCodegen { List paramDescrs = functionDescriptor.getValueParameters(); - int flags = JetTypeMapper.getAccessModifiers(functionDescriptor, 0); + int flags = getVisibilityAccessFlag(functionDescriptor); if (!functionDescriptor.getValueParameters().isEmpty() && functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index a506fd96739..7d478da81b8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -50,6 +50,7 @@ import java.util.*; import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.jet.codegen.JetTypeMapper.OBJECT_TYPE; +import static org.jetbrains.jet.codegen.JetTypeMapper.getVisibilityAccessFlag; import static org.jetbrains.jet.codegen.context.CodegenBinding.eclosingClassDescriptor; import static org.jetbrains.jet.codegen.context.CodegenBinding.enumEntryNeedSubclass; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration; @@ -568,7 +569,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { final JvmMethodSignature constructorMethod = callableMethod.getSignature(); assert constructorDescriptor != null; - int flags = JetTypeMapper.getAccessModifiers(constructorDescriptor, 0); + int flags = getVisibilityAccessFlag(constructorDescriptor); final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getAsmMethod().getDescriptor(), constructorMethod.getGenericsSignature(), null); if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) return; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 4aa9f3d09ce..1859bffe5d8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.codegen; +import com.google.common.collect.ImmutableMap; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -80,8 +81,21 @@ public class JetTypeMapper { public BindingContext bindingContext; private boolean mapBuiltinsToJava; + private ClassBuilderMode classBuilderMode; + private static final int ACC_LOCAL = 0; + private static final int ACC_PACKAGE_PRIVATE = 0; + + @NotNull + private static final Map visibilityToAccessFlag = ImmutableMap.builder() + .put(Visibilities.PRIVATE, ACC_PRIVATE) + .put(Visibilities.PROTECTED, ACC_PROTECTED) + .put(Visibilities.PUBLIC, ACC_PUBLIC) + .put(Visibilities.INTERNAL, ACC_PUBLIC) + .put(Visibilities.LOCAL, ACC_LOCAL) + .build(); + @Inject public void setBindingContext(BindingContext bindingContext) { this.bindingContext = bindingContext; @@ -979,44 +993,44 @@ public class JetTypeMapper { return new CallableMethod(owner, owner, owner, method, INVOKESPECIAL, null, null, null); } + //TODO: move mapping logic to front-end java + public static int getVisibilityAccessFlag(@NotNull MemberDescriptor descriptor) { + Integer specialCase = specialCaseVisibility(descriptor); + if (specialCase != null) { + return specialCase; + } + Integer defaultMapping = visibilityToAccessFlag.get(descriptor.getVisibility()); + if (defaultMapping == null) { + throw new IllegalStateException(descriptor.getVisibility() + " is not a valid visibility in backend."); + } + return defaultMapping; + } - public static int getAccessModifiers(@NotNull MemberDescriptor p, int defaultFlags) { - DeclarationDescriptor containingDeclaration = p.getContainingDeclaration(); + @Nullable + private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) { + DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration(); if (CodegenUtil.isInterface(containingDeclaration)) { return ACC_PUBLIC; } - if (p.getVisibility() == Visibilities.PUBLIC) { - return ACC_PUBLIC; + Visibility memberVisibility = memberDescriptor.getVisibility(); + if (memberVisibility != Visibilities.PRIVATE) { + return null; } - else if (p.getVisibility() == Visibilities.PROTECTED) { - return ACC_PROTECTED; + if (isClassObject(containingDeclaration)) { + return ACC_PACKAGE_PRIVATE; } - else if (p.getVisibility() == Visibilities.PRIVATE) { - if (isClassObject(containingDeclaration)) { - return defaultFlags; - } - if (p instanceof ConstructorDescriptor) { - ClassKind kind = ((ClassDescriptor) containingDeclaration).getKind(); - if (kind == ClassKind.OBJECT) { - return ACC_PUBLIC; - } else if (kind == ClassKind.ENUM_ENTRY) { - return 0; - } - } - if (containingDeclaration instanceof NamespaceDescriptor) { + if (memberDescriptor instanceof ConstructorDescriptor) { + ClassKind kind = ((ClassDescriptor) containingDeclaration).getKind(); + if (kind == ClassKind.OBJECT) { return ACC_PUBLIC; + } else if (kind == ClassKind.ENUM_ENTRY) { + return ACC_PACKAGE_PRIVATE; } - return ACC_PRIVATE; } - else if (p.getVisibility() == Visibilities.INTERNAL) { + if (containingDeclaration instanceof NamespaceDescriptor) { return ACC_PUBLIC; } - else { - if (p.getVisibility() == Visibilities.INHERITED) { - throw new IllegalStateException("'inherited' visibility is unresolved on code generation stage"); - } - return defaultFlags; - } + return null; } private static boolean isGenericsArray(JetType type) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index a5589150946..8953bdbeb07 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import java.util.BitSet; import static org.jetbrains.asm4.Opcodes.*; +import static org.jetbrains.jet.codegen.JetTypeMapper.getVisibilityAccessFlag; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; /** @@ -160,7 +161,7 @@ public class PropertyCodegen { private void generateDefaultGetter(JetProperty p) { final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, p); assert propertyDescriptor != null; - int flags = JetTypeMapper.getAccessModifiers(propertyDescriptor, 0) | + int flags = getVisibilityAccessFlag(propertyDescriptor) | (propertyDescriptor.getModality() == Modality.ABSTRACT ? ACC_ABSTRACT : (propertyDescriptor.getModality() == Modality.FINAL ? ACC_FINAL : 0)); @@ -266,9 +267,9 @@ public class PropertyCodegen { final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, p); assert propertyDescriptor != null; - int modifiers = JetTypeMapper.getAccessModifiers(propertyDescriptor, 0); + int modifiers = getVisibilityAccessFlag(propertyDescriptor); PropertySetterDescriptor setter = propertyDescriptor.getSetter(); - int flags = setter == null ? modifiers : JetTypeMapper.getAccessModifiers(setter, modifiers); + int flags = setter == null ? modifiers : getVisibilityAccessFlag(setter); flags |= (propertyDescriptor.getModality() == Modality.ABSTRACT ? ACC_ABSTRACT : 0); generateDefaultSetter(propertyDescriptor, flags, p); }