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:
@@ -31,6 +31,7 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.asm4.Opcodes.*;
|
import static org.jetbrains.asm4.Opcodes.*;
|
||||||
|
import static org.jetbrains.jet.codegen.JetTypeMapper.getVisibilityAccessFlag;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author max
|
* @author max
|
||||||
@@ -100,10 +101,10 @@ public abstract class ClassBodyCodegen {
|
|||||||
if (!isAnnotation) {
|
if (!isAnnotation) {
|
||||||
propertyCodegen.generateBackingField(p, propertyDescriptor);
|
propertyCodegen.generateBackingField(p, propertyDescriptor);
|
||||||
propertyCodegen
|
propertyCodegen
|
||||||
.generateDefaultGetter(propertyDescriptor, JetTypeMapper.getAccessModifiers(propertyDescriptor, 0), p);
|
.generateDefaultGetter(propertyDescriptor, getVisibilityAccessFlag(propertyDescriptor), p);
|
||||||
if (propertyDescriptor.isVar()) {
|
if (propertyDescriptor.isVar()) {
|
||||||
propertyCodegen
|
propertyCodegen
|
||||||
.generateDefaultSetter(propertyDescriptor, JetTypeMapper.getAccessModifiers(propertyDescriptor, 0), p);
|
.generateDefaultSetter(propertyDescriptor, getVisibilityAccessFlag(propertyDescriptor), p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.jetbrains.asm4.Opcodes.*;
|
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.codegen.context.CodegenBinding.isLocalFun;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration;
|
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
|
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
|
||||||
@@ -97,7 +98,7 @@ public class FunctionCodegen {
|
|||||||
|
|
||||||
List<ValueParameterDescriptor> paramDescrs = functionDescriptor.getValueParameters();
|
List<ValueParameterDescriptor> paramDescrs = functionDescriptor.getValueParameters();
|
||||||
|
|
||||||
int flags = JetTypeMapper.getAccessModifiers(functionDescriptor, 0);
|
int flags = getVisibilityAccessFlag(functionDescriptor);
|
||||||
|
|
||||||
if (!functionDescriptor.getValueParameters().isEmpty()
|
if (!functionDescriptor.getValueParameters().isEmpty()
|
||||||
&& functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1)
|
&& functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1)
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ import java.util.*;
|
|||||||
|
|
||||||
import static org.jetbrains.asm4.Opcodes.*;
|
import static org.jetbrains.asm4.Opcodes.*;
|
||||||
import static org.jetbrains.jet.codegen.JetTypeMapper.OBJECT_TYPE;
|
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.eclosingClassDescriptor;
|
||||||
import static org.jetbrains.jet.codegen.context.CodegenBinding.enumEntryNeedSubclass;
|
import static org.jetbrains.jet.codegen.context.CodegenBinding.enumEntryNeedSubclass;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration;
|
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration;
|
||||||
@@ -568,7 +569,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
final JvmMethodSignature constructorMethod = callableMethod.getSignature();
|
final JvmMethodSignature constructorMethod = callableMethod.getSignature();
|
||||||
|
|
||||||
assert constructorDescriptor != null;
|
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(),
|
final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getAsmMethod().getDescriptor(),
|
||||||
constructorMethod.getGenericsSignature(), null);
|
constructorMethod.getGenericsSignature(), null);
|
||||||
if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) return;
|
if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) return;
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.codegen;
|
package org.jetbrains.jet.codegen;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -80,8 +81,21 @@ public class JetTypeMapper {
|
|||||||
|
|
||||||
public BindingContext bindingContext;
|
public BindingContext bindingContext;
|
||||||
private boolean mapBuiltinsToJava;
|
private boolean mapBuiltinsToJava;
|
||||||
|
|
||||||
private ClassBuilderMode classBuilderMode;
|
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
|
@Inject
|
||||||
public void setBindingContext(BindingContext bindingContext) {
|
public void setBindingContext(BindingContext bindingContext) {
|
||||||
this.bindingContext = bindingContext;
|
this.bindingContext = bindingContext;
|
||||||
@@ -979,44 +993,44 @@ public class JetTypeMapper {
|
|||||||
return new CallableMethod(owner, owner, owner, method, INVOKESPECIAL, null, null, null);
|
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) {
|
@Nullable
|
||||||
DeclarationDescriptor containingDeclaration = p.getContainingDeclaration();
|
private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) {
|
||||||
|
DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration();
|
||||||
if (CodegenUtil.isInterface(containingDeclaration)) {
|
if (CodegenUtil.isInterface(containingDeclaration)) {
|
||||||
return ACC_PUBLIC;
|
return ACC_PUBLIC;
|
||||||
}
|
}
|
||||||
if (p.getVisibility() == Visibilities.PUBLIC) {
|
Visibility memberVisibility = memberDescriptor.getVisibility();
|
||||||
return ACC_PUBLIC;
|
if (memberVisibility != Visibilities.PRIVATE) {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
else if (p.getVisibility() == Visibilities.PROTECTED) {
|
if (isClassObject(containingDeclaration)) {
|
||||||
return ACC_PROTECTED;
|
return ACC_PACKAGE_PRIVATE;
|
||||||
}
|
}
|
||||||
else if (p.getVisibility() == Visibilities.PRIVATE) {
|
if (memberDescriptor instanceof ConstructorDescriptor) {
|
||||||
if (isClassObject(containingDeclaration)) {
|
ClassKind kind = ((ClassDescriptor) containingDeclaration).getKind();
|
||||||
return defaultFlags;
|
if (kind == ClassKind.OBJECT) {
|
||||||
}
|
|
||||||
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) {
|
|
||||||
return ACC_PUBLIC;
|
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;
|
return ACC_PUBLIC;
|
||||||
}
|
}
|
||||||
else {
|
return null;
|
||||||
if (p.getVisibility() == Visibilities.INHERITED) {
|
|
||||||
throw new IllegalStateException("'inherited' visibility is unresolved on code generation stage");
|
|
||||||
}
|
|
||||||
return defaultFlags;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isGenericsArray(JetType type) {
|
private static boolean isGenericsArray(JetType type) {
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
|||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
import static org.jetbrains.asm4.Opcodes.*;
|
import static org.jetbrains.asm4.Opcodes.*;
|
||||||
|
import static org.jetbrains.jet.codegen.JetTypeMapper.getVisibilityAccessFlag;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
|
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -160,7 +161,7 @@ public class PropertyCodegen {
|
|||||||
private void generateDefaultGetter(JetProperty p) {
|
private void generateDefaultGetter(JetProperty p) {
|
||||||
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, p);
|
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, p);
|
||||||
assert propertyDescriptor != null;
|
assert propertyDescriptor != null;
|
||||||
int flags = JetTypeMapper.getAccessModifiers(propertyDescriptor, 0) |
|
int flags = getVisibilityAccessFlag(propertyDescriptor) |
|
||||||
(propertyDescriptor.getModality() == Modality.ABSTRACT
|
(propertyDescriptor.getModality() == Modality.ABSTRACT
|
||||||
? ACC_ABSTRACT
|
? ACC_ABSTRACT
|
||||||
: (propertyDescriptor.getModality() == Modality.FINAL ? ACC_FINAL : 0));
|
: (propertyDescriptor.getModality() == Modality.FINAL ? ACC_FINAL : 0));
|
||||||
@@ -266,9 +267,9 @@ public class PropertyCodegen {
|
|||||||
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, p);
|
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, p);
|
||||||
assert propertyDescriptor != null;
|
assert propertyDescriptor != null;
|
||||||
|
|
||||||
int modifiers = JetTypeMapper.getAccessModifiers(propertyDescriptor, 0);
|
int modifiers = getVisibilityAccessFlag(propertyDescriptor);
|
||||||
PropertySetterDescriptor setter = propertyDescriptor.getSetter();
|
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);
|
flags |= (propertyDescriptor.getModality() == Modality.ABSTRACT ? ACC_ABSTRACT : 0);
|
||||||
generateDefaultSetter(propertyDescriptor, flags, p);
|
generateDefaultSetter(propertyDescriptor, flags, p);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user