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<PsiElement, JetClassOrObject, CallableMemberDescriptor> MANY_IMPL_MEMBER_NOT_IMPLEMENTED =
|
||||||
DiagnosticFactory2.create(ERROR);
|
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<JetDeclaration, CallableMemberDescriptor, String> CONFLICTING_OVERLOADS =
|
||||||
DiagnosticFactory2.create(ERROR, new PositioningStrategy<JetDeclaration>() {
|
DiagnosticFactory2.create(ERROR, new PositioningStrategy<JetDeclaration>() {
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import org.jetbrains.jet.lang.psi.*;
|
|||||||
import org.jetbrains.jet.lexer.JetKeywordToken;
|
import org.jetbrains.jet.lexer.JetKeywordToken;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -144,4 +143,12 @@ public class PositioningStrategies {
|
|||||||
return markNode(element.getProjectionNode());
|
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(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();
|
MAP.setImmutable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -391,6 +391,11 @@ public class OverrideResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasOverrideModifier) {
|
||||||
|
checkOverridesForParameters(declared);
|
||||||
|
}
|
||||||
|
|
||||||
if (hasOverrideModifier && declared.getOverriddenDescriptors().size() == 0) {
|
if (hasOverrideModifier && declared.getOverriddenDescriptors().size() == 0) {
|
||||||
if (!invisibleOverriddenDescriptors.get(declared).isEmpty()) {
|
if (!invisibleOverriddenDescriptors.get(declared).isEmpty()) {
|
||||||
CallableDescriptor descriptor = invisibleOverriddenDescriptors.values().iterator().next();
|
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) {
|
private boolean checkPropertyKind(CallableMemberDescriptor descriptor, boolean isVar) {
|
||||||
if (descriptor instanceof PropertyDescriptor) {
|
if (descriptor instanceof PropertyDescriptor) {
|
||||||
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
|
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