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.
This commit is contained in:
Pavel V. Talanov
2012-08-28 20:26:26 +04:00
parent 76e407e168
commit 544be17c3d
5 changed files with 52 additions and 34 deletions
@@ -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 {
@@ -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<ValueParameterDescriptor> paramDescrs = functionDescriptor.getValueParameters();
int flags = JetTypeMapper.getAccessModifiers(functionDescriptor, 0);
int flags = getVisibilityAccessFlag(functionDescriptor);
if (!functionDescriptor.getValueParameters().isEmpty()
&& functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1)
@@ -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;
@@ -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<Visibility, Integer> visibilityToAccessFlag = ImmutableMap.<Visibility, Integer>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) {
@@ -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);
}