From 9a9c78da9e16bfb8ca7ac7a4c4002323879dfa8d Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 30 May 2011 16:22:30 +0400 Subject: [PATCH] JET-67 Property with abstract getter forces class to have primary constructor --- .../descriptors/PropertyAccessorDescriptor.java | 17 +++++++++++++++-- .../descriptors/PropertyGetterDescriptor.java | 4 ++-- .../descriptors/PropertySetterDescriptor.java | 4 ++-- .../jet/lang/resolve/BindingTraceContext.java | 4 ++-- .../lang/resolve/ClassDescriptorResolver.java | 8 ++++++-- .../infos/PropertiesWithBackingFields.jet | 6 ++++++ idea/testData/checker/regression/Jet67.jet | 4 ++++ 7 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 idea/testData/checker/regression/Jet67.jet diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java index dcf5c90b6d2..176e7fcee59 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java @@ -9,12 +9,19 @@ import java.util.List; /** * @author abreslav */ -public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorImpl implements FunctionDescriptor { +public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorImpl implements FunctionDescriptor, MemberDescriptor { private final boolean hasBody; + private final MemberModifiers modifiers; - protected PropertyAccessorDescriptor(@NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @NotNull String name, boolean hasBody) { + protected PropertyAccessorDescriptor( + @NotNull MemberModifiers modifiers, + @NotNull PropertyDescriptor correspondingProperty, + @NotNull List annotations, + @NotNull String name, + boolean hasBody) { super(correspondingProperty.getContainingDeclaration(), annotations, name); + this.modifiers = modifiers; this.hasBody = hasBody; } @@ -39,4 +46,10 @@ public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorIm public List getTypeParameters() { return Collections.emptyList(); } + + @NotNull + @Override + public MemberModifiers getModifiers() { + return modifiers; + } } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java index d038394fd89..4adcb040da5 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java @@ -16,8 +16,8 @@ public class PropertyGetterDescriptor extends PropertyAccessorDescriptor { private final Set overriddenGetters = Sets.newHashSet(); private JetType returnType; - public PropertyGetterDescriptor(@NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @Nullable JetType returnType, boolean hasBody) { - super(correspondingProperty, annotations, "get-" + correspondingProperty.getName(), hasBody); + public PropertyGetterDescriptor(@NotNull MemberModifiers modifiers, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, @Nullable JetType returnType, boolean hasBody) { + super(modifiers, correspondingProperty, annotations, "get-" + correspondingProperty.getName(), hasBody); 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 46813568689..b9307102889 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java @@ -17,8 +17,8 @@ public class PropertySetterDescriptor extends PropertyAccessorDescriptor { private MutableValueParameterDescriptor parameter; private final Set overriddenSetters = Sets.newHashSet(); - public PropertySetterDescriptor(@NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, boolean hasBody) { - super(correspondingProperty, annotations, "set-" + correspondingProperty.getName(), hasBody); + public PropertySetterDescriptor(@NotNull MemberModifiers modifiers, @NotNull PropertyDescriptor correspondingProperty, @NotNull List annotations, boolean hasBody) { + super(modifiers, correspondingProperty, annotations, "set-" + correspondingProperty.getName(), hasBody); } public void initialize(@NotNull MutableValueParameterDescriptor parameter) { diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java index 03c16b77261..675f0faefd5 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java @@ -256,10 +256,10 @@ public class BindingTraceContext implements BindingContext, BindingTrace { else if (propertyDescriptor.isVar() && setter == null) { return true; } - else if (setter != null && !setter.hasBody()) { + else if (setter != null && !setter.hasBody() && !setter.getModifiers().isAbstract()) { return true; } - else if (!getter.hasBody()) { + else if (!getter.hasBody() && !getter.getModifiers().isAbstract()) { return true; } return backingFieldRequired.contains(propertyDescriptor); diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index 2350caab72b..29af437d53d 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -453,7 +453,9 @@ public class ClassDescriptorResolver { List annotations = AnnotationResolver.INSTANCE.resolveAnnotations(setter.getModifierList()); JetParameter parameter = setter.getParameter(); - setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, annotations, setter.getBodyExpression() != null); + setterDescriptor = new PropertySetterDescriptor( + resolveModifiers(setter.getModifierList(), DEFAULT_MODIFIERS), // TODO : default modifiers differ in different contexts + propertyDescriptor, annotations, setter.getBodyExpression() != null); if (parameter != null) { if (parameter.isRef()) { trace.getErrorHandler().genericError(parameter.getRefNode(), "Setter parameters can not be 'ref'"); @@ -504,7 +506,9 @@ public class ClassDescriptorResolver { returnType = typeResolver.resolveType(scope, returnTypeReference); } - getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null); + getterDescriptor = new PropertyGetterDescriptor( + resolveModifiers(getter.getModifierList(), DEFAULT_MODIFIERS), // TODO : default modifiers differ in different contexts + propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null); trace.recordDeclarationResolution(getter, getterDescriptor); } return getterDescriptor; diff --git a/idea/testData/checker/infos/PropertiesWithBackingFields.jet b/idea/testData/checker/infos/PropertiesWithBackingFields.jet index 5b9279611b4..702fee7d19b 100644 --- a/idea/testData/checker/infos/PropertiesWithBackingFields.jet +++ b/idea/testData/checker/infos/PropertiesWithBackingFields.jet @@ -33,6 +33,12 @@ class Test() { var v5 : Int get() = 1; set(x){$v5 = x} var v6 : Int get() = $v6 + 1; set(x){} + + val v7 : Int abstract get + var v8 : Int abstract get abstract set + var v9 : Int abstract set + var v10 : Int abstract get + } open class Super(i : Int) diff --git a/idea/testData/checker/regression/Jet67.jet b/idea/testData/checker/regression/Jet67.jet new file mode 100644 index 00000000000..13b000754e4 --- /dev/null +++ b/idea/testData/checker/regression/Jet67.jet @@ -0,0 +1,4 @@ +class XXX { + val a : Int abstract get + +}