diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index ba8253c4d69..b0444ab8b4b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -143,6 +143,15 @@ public class AsmUtil { 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 private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) { DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java index 218c74a4a44..b49bde17457 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java @@ -33,8 +33,7 @@ import java.util.Collections; import java.util.List; import static org.jetbrains.asm4.Opcodes.*; -import static org.jetbrains.jet.codegen.AsmUtil.genMethodThrow; -import static org.jetbrains.jet.codegen.AsmUtil.getVisibilityAccessFlag; +import static org.jetbrains.jet.codegen.AsmUtil.*; /** * @author max @@ -100,11 +99,10 @@ public abstract class ClassBodyCodegen extends MemberCodegen { if (propertyDescriptor != null) { if (!isAnnotation) { propertyCodegen.generateBackingField(p, propertyDescriptor); - propertyCodegen - .generateDefaultGetter(propertyDescriptor, getVisibilityAccessFlag(propertyDescriptor), p); + int accessFlags = getVisibilityAccessFlag(propertyDescriptor) | getModalityAccessFlag(propertyDescriptor); + propertyCodegen.generateDefaultGetter(propertyDescriptor, accessFlags, p); if (propertyDescriptor.isVar()) { - propertyCodegen - .generateDefaultSetter(propertyDescriptor, getVisibilityAccessFlag(propertyDescriptor), p); + propertyCodegen.generateDefaultSetter(propertyDescriptor, accessFlags, p); } } else { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 0baf3ce6c88..58871f608a1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -40,8 +40,7 @@ import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import static org.jetbrains.asm4.Opcodes.*; -import static org.jetbrains.jet.codegen.AsmUtil.genStubThrow; -import static org.jetbrains.jet.codegen.AsmUtil.getVisibilityAccessFlag; +import static org.jetbrains.jet.codegen.AsmUtil.*; import static org.jetbrains.jet.codegen.CodegenUtil.*; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; 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) { - final VariableDescriptor descriptor = bindingContext.get(BindingContext.VARIABLE, p); + VariableDescriptor descriptor = bindingContext.get(BindingContext.VARIABLE, p); if (!(descriptor instanceof PropertyDescriptor)) { throw new UnsupportedOperationException("expect a property to have a property descriptor"); } - final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; - if (kind == OwnerKind.NAMESPACE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.TRAIT_IMPL) { - if (kind != OwnerKind.TRAIT_IMPL) { - generateBackingField(p, propertyDescriptor); - } - generateGetter(p, propertyDescriptor); - generateSetter(p, propertyDescriptor); - } - else if (kind instanceof OwnerKind.DelegateKind) { - generateDefaultGetter(propertyDescriptor, ACC_PUBLIC, p); - if (propertyDescriptor.isVar()) { - generateDefaultSetter(propertyDescriptor, ACC_PUBLIC, p); - } + PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; + assert kind == OwnerKind.NAMESPACE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.TRAIT_IMPL + : "Generating property with a wrong kind (" + kind + "): " + descriptor; + + if (kind != OwnerKind.TRAIT_IMPL) { + generateBackingField(p, propertyDescriptor); } + generateGetter(p, propertyDescriptor); + generateSetter(p, propertyDescriptor); } public void generateBackingField(PsiElement p, PropertyDescriptor propertyDescriptor) { @@ -128,7 +122,10 @@ public class PropertyCodegen extends GenerationStateAware { propertyDescriptor.getGetter()); } else if (isExternallyAccessible(propertyDescriptor)) { - generateDefaultGetter(p); + int flags = getVisibilityAccessFlag(propertyDescriptor); + flags |= getModalityAccessFlag(propertyDescriptor); + generateDefaultGetter(propertyDescriptor, flags, p); + JvmPropertyAccessorSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind); FunctionCodegen.generateBridgeIfNeeded(context, state, v, signature.getJvmMethodSignature().getAsmMethod(), propertyDescriptor.getGetter(), kind); @@ -148,23 +145,17 @@ public class PropertyCodegen extends GenerationStateAware { propertyDescriptor.getSetter()); } 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); 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) { checkMustGenerateCode(propertyDescriptor); @@ -182,10 +173,6 @@ public class PropertyCodegen extends GenerationStateAware { flags |= ACC_ABSTRACT; } - if (propertyDescriptor.getModality() == Modality.FINAL) { - flags |= ACC_FINAL; - } - JvmPropertyAccessorSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind); final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature(); final String descriptor = jvmMethodSignature.getAsmMethod().getDescriptor(); @@ -258,17 +245,6 @@ public class PropertyCodegen extends GenerationStateAware { 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) { checkMustGenerateCode(propertyDescriptor); @@ -286,10 +262,6 @@ public class PropertyCodegen extends GenerationStateAware { flags |= ACC_ABSTRACT; } - if (propertyDescriptor.getModality() == Modality.FINAL) { - flags |= ACC_FINAL; - } - JvmPropertyAccessorSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind); assert true; final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature();