Default parameter values are not allowed in overriding functions
This commit is contained in:
@@ -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());
|
||||
}
|
||||
};
|
||||
}
|
||||
+2
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user