From 555ebebe1b9f5d7ad194fd152f01836239e7b0bc Mon Sep 17 00:00:00 2001 From: svtk Date: Fri, 2 Sep 2011 18:18:16 +0400 Subject: [PATCH] added default property accessor descriptors --- .../jet/codegen/ExpressionCodegen.java | 6 +++-- .../PropertyAccessorDescriptor.java | 9 ++++++- .../descriptors/PropertyGetterDescriptor.java | 4 ++-- .../descriptors/PropertySetterDescriptor.java | 4 ++-- .../lang/resolve/ClassDescriptorResolver.java | 24 ++++++++++++++----- 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index f0609efca0f..2c956b120c1 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -784,8 +784,10 @@ public class ExpressionCodegen extends JetVisitor { setter = null; } else { - getter = isInsideClass && propertyDescriptor.getGetter() == null ? null : typeMapper.mapGetterSignature(propertyDescriptor); - setter = isInsideClass && propertyDescriptor.getSetter() == null ? null : typeMapper.mapSetterSignature(propertyDescriptor); + getter = isInsideClass && (propertyDescriptor.getGetter() == null || propertyDescriptor.getGetter().isDefault()) + ? null : typeMapper.mapGetterSignature(propertyDescriptor); + setter = isInsideClass && (propertyDescriptor.getSetter() == null || propertyDescriptor.getSetter().isDefault()) + ? null : typeMapper.mapSetterSignature(propertyDescriptor); } String owner; diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java index a24561ec27a..7192db55745 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java @@ -13,6 +13,7 @@ import java.util.List; public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorImpl implements FunctionDescriptor, MemberDescriptor { private final boolean hasBody; + private final boolean isDefault; private final MemberModifiers modifiers; protected PropertyAccessorDescriptor( @@ -20,16 +21,22 @@ public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorIm @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @NotNull String name, - boolean hasBody) { + boolean hasBody, + boolean isDefault) { super(correspondingProperty.getContainingDeclaration(), annotations, name); this.modifiers = modifiers; this.hasBody = hasBody; + this.isDefault = isDefault; } public boolean hasBody() { return hasBody; } + public boolean isDefault() { + return isDefault; + } + @NotNull @Override public PropertyAccessorDescriptor getOriginal() { diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java index e434436c598..110dc5cfd38 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java @@ -17,8 +17,8 @@ public class PropertyGetterDescriptor extends PropertyAccessorDescriptor { private final Set overriddenGetters = Sets.newHashSet(); private JetType returnType; - public PropertyGetterDescriptor(@NotNull MemberModifiers modifiers, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @Nullable JetType returnType, boolean hasBody) { - super(modifiers, correspondingProperty, annotations, "get-" + correspondingProperty.getName(), hasBody); + public PropertyGetterDescriptor(@NotNull MemberModifiers modifiers, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @Nullable JetType returnType, boolean hasBody, boolean isDefault) { + super(modifiers, correspondingProperty, annotations, "get-" + correspondingProperty.getName(), hasBody, isDefault); this.returnType = returnType == null ? correspondingProperty.getOutType() : returnType; } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java index 2e31121f278..3c2a483a09b 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java @@ -18,8 +18,8 @@ public class PropertySetterDescriptor extends PropertyAccessorDescriptor { private MutableValueParameterDescriptor parameter; private final Set overriddenSetters = Sets.newHashSet(); - public PropertySetterDescriptor(@NotNull MemberModifiers modifiers, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, boolean hasBody) { - super(modifiers, correspondingProperty, annotations, "set-" + correspondingProperty.getName(), hasBody); + public PropertySetterDescriptor(@NotNull MemberModifiers modifiers, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, boolean hasBody, boolean isDefault) { + super(modifiers, correspondingProperty, annotations, "set-" + correspondingProperty.getName(), hasBody, isDefault); } public void initialize(@NotNull MutableValueParameterDescriptor parameter) { diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index 7a94482da7f..ebff18e8796 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -568,18 +568,20 @@ public class ClassDescriptorResolver { @Nullable private PropertySetterDescriptor resolvePropertySetterDescriptor(@NotNull JetScope scope, @NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) { JetPropertyAccessor setter = property.getSetter(); - if (setter != null && !property.isVar()) { - trace.getErrorHandler().genericError(setter.asElement().getNode(), "A 'val'-property cannot have a setter"); + if (! property.isVar()) { + if (setter != null) { + trace.getErrorHandler().genericError(setter.asElement().getNode(), "A 'val'-property cannot have a setter"); + } return null; } - PropertySetterDescriptor setterDescriptor = null; + PropertySetterDescriptor setterDescriptor; if (setter != null) { List annotations = annotationResolver.resolveAnnotations(scope, setter.getModifierList()); JetParameter parameter = setter.getParameter(); setterDescriptor = new PropertySetterDescriptor( resolveModifiers(setter.getModifierList(), DEFAULT_MODIFIERS), // TODO : default modifiers differ in different contexts - propertyDescriptor, annotations, setter.getBodyExpression() != null); + propertyDescriptor, annotations, setter.getBodyExpression() != null, false); if (parameter != null) { if (parameter.isRef()) { trace.getErrorHandler().genericError(parameter.getRefNode(), "Setter parameters can not be 'ref'"); @@ -614,12 +616,17 @@ public class ClassDescriptorResolver { } trace.record(BindingContext.PROPERTY_ACCESSOR, setter, setterDescriptor); } + else { + setterDescriptor = new PropertySetterDescriptor( + propertyDescriptor.getModifiers(), + propertyDescriptor, Collections.emptyList(), false, true); + } return setterDescriptor; } @Nullable private PropertyGetterDescriptor resolvePropertyGetterDescriptor(@NotNull JetScope scope, @NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) { - PropertyGetterDescriptor getterDescriptor = null; + PropertyGetterDescriptor getterDescriptor; JetPropertyAccessor getter = property.getGetter(); if (getter != null) { List annotations = annotationResolver.resolveAnnotations(scope, getter.getModifierList()); @@ -632,9 +639,14 @@ public class ClassDescriptorResolver { getterDescriptor = new PropertyGetterDescriptor( resolveModifiers(getter.getModifierList(), DEFAULT_MODIFIERS), // TODO : default modifiers differ in different contexts - propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null); + propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null, false); trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor); } + else { + getterDescriptor = new PropertyGetterDescriptor( + propertyDescriptor.getModifiers(), + propertyDescriptor, Collections.emptyList(), propertyDescriptor.getOutType(), false, true); + } return getterDescriptor; }