Default parameter values are not allowed in overriding functions

This commit is contained in:
Andrey Breslav
2012-04-25 20:38:28 +04:00
parent 577918a119
commit 3a56b7905d
5 changed files with 47 additions and 1 deletions
@@ -380,6 +380,8 @@ public interface Errors {
DiagnosticFactory2<PsiElement, JetClassOrObject, CallableMemberDescriptor> MANY_IMPL_MEMBER_NOT_IMPLEMENTED =
DiagnosticFactory2.create(ERROR);
SimpleDiagnosticFactory<JetParameter> DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE = SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.PARAMETER_DEFAULT_VALUE);
DiagnosticFactory2<JetDeclaration, CallableMemberDescriptor, String> CONFLICTING_OVERLOADS =
DiagnosticFactory2.create(ERROR, new PositioningStrategy<JetDeclaration>() {
@NotNull
@@ -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<JetParameter> PARAMETER_DEFAULT_VALUE = new PositioningStrategy<JetParameter>() {
@NotNull
@Override
public List<TextRange> mark(@NotNull JetParameter element) {
return markNode(element.getDefaultValue().getNode());
}
};
}
@@ -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();
}
@@ -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;
@@ -0,0 +1,15 @@
open class A {
open fun foo(a : Int) {}
}
class C : A() {
override fun foo(a : Int = <!DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE!>1<!>) {
super<A>.foo(a)
}
}
class D : A() {
override fun foo(b : Int = <!DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE!>1<!>) {
super<A>.foo(b)
}
}