From 3a56b7905dfdd45b79e2510d6db4af03dc0a3100 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 25 Apr 2012 20:38:28 +0400 Subject: [PATCH] Default parameter values are not allowed in overriding functions --- .../jet/lang/diagnostics/Errors.java | 2 ++ .../diagnostics/PositioningStrategies.java | 9 ++++++++- .../rendering/DefaultErrorMessages.java | 2 ++ .../jet/lang/resolve/OverrideResolver.java | 20 +++++++++++++++++++ .../DefaultParameterValueInOverride.jet | 15 ++++++++++++++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/override/DefaultParameterValueInOverride.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 929f1350017..add31fcb58d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -380,6 +380,8 @@ public interface Errors { DiagnosticFactory2 MANY_IMPL_MEMBER_NOT_IMPLEMENTED = DiagnosticFactory2.create(ERROR); + SimpleDiagnosticFactory DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE = SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.PARAMETER_DEFAULT_VALUE); + DiagnosticFactory2 CONFLICTING_OVERLOADS = DiagnosticFactory2.create(ERROR, new PositioningStrategy() { @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java index 21746e40652..eb98b2857c4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java @@ -28,7 +28,6 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.lexer.JetTokens; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -144,4 +143,12 @@ public class PositioningStrategies { return markNode(element.getProjectionNode()); } }; + + public static PositioningStrategy PARAMETER_DEFAULT_VALUE = new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetParameter element) { + return markNode(element.getDefaultValue().getNode()); + } + }; } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index fd304e115d7..4b8507b453a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -385,6 +385,8 @@ public class DefaultErrorMessages { MAP.put(NOT_AN_ANNOTATION_CLASS, "''{0}'' is not an annotation class", TO_STRING); + MAP.put(DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE, "An overriding function is not allowed to specify default values for its parameters"); + MAP.setImmutable(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 2884df035e7..75601602ebf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -391,6 +391,11 @@ public class OverrideResolver { } } } + + if (hasOverrideModifier) { + checkOverridesForParameters(declared); + } + if (hasOverrideModifier && declared.getOverriddenDescriptors().size() == 0) { if (!invisibleOverriddenDescriptors.get(declared).isEmpty()) { CallableDescriptor descriptor = invisibleOverriddenDescriptors.values().iterator().next(); @@ -407,6 +412,21 @@ public class OverrideResolver { } } + private void checkOverridesForParameters(CallableMemberDescriptor declared) { + // Let p1 be a parameter of the overriding function + // Let p2 be a parameter of the function being overridden + // Then + // a) p1 is not allowed to have a default value declared + // b) p1 must have the same name as p2 + for (ValueParameterDescriptor parameterFromSubclass : declared.getValueParameters()) { + JetParameter parameter = + (JetParameter) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), parameterFromSubclass); + if (parameterFromSubclass.hasDefaultValue()) { + trace.report(DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE.on(parameter)); + } + } + } + private boolean checkPropertyKind(CallableMemberDescriptor descriptor, boolean isVar) { if (descriptor instanceof PropertyDescriptor) { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; diff --git a/compiler/testData/diagnostics/tests/override/DefaultParameterValueInOverride.jet b/compiler/testData/diagnostics/tests/override/DefaultParameterValueInOverride.jet new file mode 100644 index 00000000000..20ca23ea376 --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/DefaultParameterValueInOverride.jet @@ -0,0 +1,15 @@ +open class A { + open fun foo(a : Int) {} +} + +class C : A() { + override fun foo(a : Int = 1) { + super.foo(a) + } +} + +class D : A() { + override fun foo(b : Int = 1) { + super.foo(b) + } +}