Refactor PropertyCodegen

1) Introduce AsmUtil.getModalityAccessFlag()
2) Inline private methods generateDefaultGetter() and generateDefaultSetter() not
to confuse them with anything else
3) Remove dead code in PropertyCodegen.gen(), assert that it never happens
This commit is contained in:
Alexander Udalov
2012-10-10 19:52:14 +04:00
parent 78d22e9f81
commit 5bc9291d61
3 changed files with 33 additions and 54 deletions
@@ -143,6 +143,15 @@ public class AsmUtil {
return defaultMapping; return defaultMapping;
} }
public static int getModalityAccessFlag(@NotNull MemberDescriptor descriptor) {
switch (descriptor.getModality()) {
case ABSTRACT: return ACC_ABSTRACT;
case FINAL: return ACC_FINAL;
case OPEN: return 0;
default: throw new UnsupportedOperationException("Unknown modality: " + descriptor.getModality());
}
}
@Nullable @Nullable
private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) { private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) {
DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration();
@@ -33,8 +33,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.AsmUtil.genMethodThrow; import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.AsmUtil.getVisibilityAccessFlag;
/** /**
* @author max * @author max
@@ -100,11 +99,10 @@ public abstract class ClassBodyCodegen extends MemberCodegen {
if (propertyDescriptor != null) { if (propertyDescriptor != null) {
if (!isAnnotation) { if (!isAnnotation) {
propertyCodegen.generateBackingField(p, propertyDescriptor); propertyCodegen.generateBackingField(p, propertyDescriptor);
propertyCodegen int accessFlags = getVisibilityAccessFlag(propertyDescriptor) | getModalityAccessFlag(propertyDescriptor);
.generateDefaultGetter(propertyDescriptor, getVisibilityAccessFlag(propertyDescriptor), p); propertyCodegen.generateDefaultGetter(propertyDescriptor, accessFlags, p);
if (propertyDescriptor.isVar()) { if (propertyDescriptor.isVar()) {
propertyCodegen propertyCodegen.generateDefaultSetter(propertyDescriptor, accessFlags, p);
.generateDefaultSetter(propertyDescriptor, getVisibilityAccessFlag(propertyDescriptor), p);
} }
} }
else { else {
@@ -40,8 +40,7 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.asm4.Opcodes.*;
import static org.jetbrains.jet.codegen.AsmUtil.genStubThrow; import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.AsmUtil.getVisibilityAccessFlag;
import static org.jetbrains.jet.codegen.CodegenUtil.*; import static org.jetbrains.jet.codegen.CodegenUtil.*;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
@@ -65,24 +64,19 @@ public class PropertyCodegen extends GenerationStateAware {
} }
public void gen(JetProperty p) { public void gen(JetProperty p) {
final VariableDescriptor descriptor = bindingContext.get(BindingContext.VARIABLE, p); VariableDescriptor descriptor = bindingContext.get(BindingContext.VARIABLE, p);
if (!(descriptor instanceof PropertyDescriptor)) { if (!(descriptor instanceof PropertyDescriptor)) {
throw new UnsupportedOperationException("expect a property to have a property descriptor"); throw new UnsupportedOperationException("expect a property to have a property descriptor");
} }
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
if (kind == OwnerKind.NAMESPACE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.TRAIT_IMPL) { assert kind == OwnerKind.NAMESPACE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.TRAIT_IMPL
if (kind != OwnerKind.TRAIT_IMPL) { : "Generating property with a wrong kind (" + kind + "): " + descriptor;
generateBackingField(p, propertyDescriptor);
} if (kind != OwnerKind.TRAIT_IMPL) {
generateGetter(p, propertyDescriptor); generateBackingField(p, propertyDescriptor);
generateSetter(p, propertyDescriptor);
}
else if (kind instanceof OwnerKind.DelegateKind) {
generateDefaultGetter(propertyDescriptor, ACC_PUBLIC, p);
if (propertyDescriptor.isVar()) {
generateDefaultSetter(propertyDescriptor, ACC_PUBLIC, p);
}
} }
generateGetter(p, propertyDescriptor);
generateSetter(p, propertyDescriptor);
} }
public void generateBackingField(PsiElement p, PropertyDescriptor propertyDescriptor) { public void generateBackingField(PsiElement p, PropertyDescriptor propertyDescriptor) {
@@ -128,7 +122,10 @@ public class PropertyCodegen extends GenerationStateAware {
propertyDescriptor.getGetter()); propertyDescriptor.getGetter());
} }
else if (isExternallyAccessible(propertyDescriptor)) { else if (isExternallyAccessible(propertyDescriptor)) {
generateDefaultGetter(p); int flags = getVisibilityAccessFlag(propertyDescriptor);
flags |= getModalityAccessFlag(propertyDescriptor);
generateDefaultGetter(propertyDescriptor, flags, p);
JvmPropertyAccessorSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind); JvmPropertyAccessorSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind);
FunctionCodegen.generateBridgeIfNeeded(context, state, v, signature.getJvmMethodSignature().getAsmMethod(), FunctionCodegen.generateBridgeIfNeeded(context, state, v, signature.getJvmMethodSignature().getAsmMethod(),
propertyDescriptor.getGetter(), kind); propertyDescriptor.getGetter(), kind);
@@ -148,23 +145,17 @@ public class PropertyCodegen extends GenerationStateAware {
propertyDescriptor.getSetter()); propertyDescriptor.getSetter());
} }
else if (isExternallyAccessible(propertyDescriptor) && propertyDescriptor.isVar()) { else if (isExternallyAccessible(propertyDescriptor) && propertyDescriptor.isVar()) {
generateDefaultSetter(p); PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter();
int flags = setterDescriptor == null ? getVisibilityAccessFlag(propertyDescriptor) : getVisibilityAccessFlag(setterDescriptor);
flags |= getModalityAccessFlag(propertyDescriptor);
generateDefaultSetter(propertyDescriptor, flags, p);
JvmPropertyAccessorSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind); JvmPropertyAccessorSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind);
FunctionCodegen.generateBridgeIfNeeded(context, state, v, signature.getJvmMethodSignature().getAsmMethod(), FunctionCodegen.generateBridgeIfNeeded(context, state, v, signature.getJvmMethodSignature().getAsmMethod(),
propertyDescriptor.getSetter(), kind); setterDescriptor, kind);
} }
} }
private void generateDefaultGetter(JetProperty p) {
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) bindingContext.get(BindingContext.VARIABLE, p);
assert propertyDescriptor != null;
int flags = getVisibilityAccessFlag(propertyDescriptor) |
(propertyDescriptor.getModality() == Modality.ABSTRACT
? ACC_ABSTRACT
: (propertyDescriptor.getModality() == Modality.FINAL ? ACC_FINAL : 0));
generateDefaultGetter(propertyDescriptor, flags, p);
}
public void generateDefaultGetter(PropertyDescriptor propertyDescriptor, int flags, PsiElement origin) { public void generateDefaultGetter(PropertyDescriptor propertyDescriptor, int flags, PsiElement origin) {
checkMustGenerateCode(propertyDescriptor); checkMustGenerateCode(propertyDescriptor);
@@ -182,10 +173,6 @@ public class PropertyCodegen extends GenerationStateAware {
flags |= ACC_ABSTRACT; flags |= ACC_ABSTRACT;
} }
if (propertyDescriptor.getModality() == Modality.FINAL) {
flags |= ACC_FINAL;
}
JvmPropertyAccessorSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind); JvmPropertyAccessorSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind);
final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature(); final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature();
final String descriptor = jvmMethodSignature.getAsmMethod().getDescriptor(); final String descriptor = jvmMethodSignature.getAsmMethod().getDescriptor();
@@ -258,17 +245,6 @@ public class PropertyCodegen extends GenerationStateAware {
aw.visitEnd(); aw.visitEnd();
} }
private void generateDefaultSetter(JetProperty p) {
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) bindingContext.get(BindingContext.VARIABLE, p);
assert propertyDescriptor != null;
int modifiers = getVisibilityAccessFlag(propertyDescriptor);
PropertySetterDescriptor setter = propertyDescriptor.getSetter();
int flags = setter == null ? modifiers : getVisibilityAccessFlag(setter);
flags |= (propertyDescriptor.getModality() == Modality.ABSTRACT ? ACC_ABSTRACT : 0);
generateDefaultSetter(propertyDescriptor, flags, p);
}
public void generateDefaultSetter(PropertyDescriptor propertyDescriptor, int flags, PsiElement origin) { public void generateDefaultSetter(PropertyDescriptor propertyDescriptor, int flags, PsiElement origin) {
checkMustGenerateCode(propertyDescriptor); checkMustGenerateCode(propertyDescriptor);
@@ -286,10 +262,6 @@ public class PropertyCodegen extends GenerationStateAware {
flags |= ACC_ABSTRACT; flags |= ACC_ABSTRACT;
} }
if (propertyDescriptor.getModality() == Modality.FINAL) {
flags |= ACC_FINAL;
}
JvmPropertyAccessorSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind); JvmPropertyAccessorSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind);
assert true; assert true;
final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature(); final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature();