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 582cd6708e9..189655ec333 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -383,6 +383,8 @@ public interface Errors { SimpleDiagnosticFactory DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE = SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.PARAMETER_DEFAULT_VALUE); DiagnosticFactory1 MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES = DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); DiagnosticFactory1 MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE = DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); + DiagnosticFactory2 PARAMETER_NAME_CHANGED_ON_OVERRIDE = DiagnosticFactory2.create(WARNING, PositioningStrategies.POSITION_NAME_IDENTIFIER); + DiagnosticFactory2, Integer> DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES = DiagnosticFactory2.create(WARNING, PositioningStrategies.POSITION_NAME_IDENTIFIER); DiagnosticFactory2 CONFLICTING_OVERLOADS = DiagnosticFactory2.create(ERROR, new PositioningStrategy() { 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 b70a76a378c..dc96f771033 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 @@ -386,11 +386,19 @@ 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.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, "More than one overridden descriptor declares a default value for ''{0}''. " + - "As the compiler can not make sure these values agree, this is not allowed.", TO_STRING); - MAP.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, "More than one overridden descriptor declares a default value for ''{0}''. " + - "As the compiler can not make sure these values agree, this is not allowed.", TO_STRING); + + String multipleDefaultsMessage = "More than one overridden descriptor declares a default value for ''{0}''. " + + "As the compiler can not make sure these values agree, this is not allowed."; + MAP.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, multipleDefaultsMessage, TO_STRING); + MAP.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, multipleDefaultsMessage, TO_STRING); + + MAP.put(PARAMETER_NAME_CHANGED_ON_OVERRIDE, "The corresponding parameter in the supertype ''{0}'' is named ''{1}''. " + + "This may cause problems when calling this function with named arguments.", NAME, NAME); + + MAP.put(DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES, + "Names of the parameter #{1} conflict in the following members of supertypes: ''{0}''" + + "This may cause problems when calling this function with named arguments.", commaSeparated(TO_STRING), TO_STRING); MAP.setImmutable(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java index 16527b27a30..48a39fc518e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.resolve.DescriptorRenderer; import java.util.Collection; +import java.util.Iterator; /** * @author svtk @@ -98,6 +99,24 @@ public class Renderers { } }; + public static Renderer> commaSeparated(final Renderer itemRenderer) { + return new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection object) { + StringBuilder result = new StringBuilder(); + for (Iterator iterator = object.iterator(); iterator.hasNext(); ) { + T next = iterator.next(); + result.append(itemRenderer.render(next)); + if (iterator.hasNext()) { + result.append(", "); + } + } + return result.toString(); + } + }; + } + private Renderers() { } } 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 9665b4c5292..8a8a521cc7a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -437,6 +437,9 @@ public class OverrideResolver { fakeOverride ? null : (JetParameter) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), parameterFromSubclass); + JetClassOrObject classElement = fakeOverride ? (JetClassOrObject) BindingContextUtils + .descriptorToDeclaration(trace.getBindingContext(), declared.getContainingDeclaration()) : null; + if (parameterFromSubclass.declaresDefaultValue() && !fakeOverride) { trace.report(DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE.on(parameter)); } @@ -449,8 +452,6 @@ public class OverrideResolver { } else { if (fakeOverride) { - JetClassOrObject classElement = (JetClassOrObject) BindingContextUtils - .descriptorToDeclaration(trace.getBindingContext(), declared.getContainingDeclaration()); trace.report(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE.on(classElement, parameterFromSubclass)); } else { @@ -459,6 +460,15 @@ public class OverrideResolver { break; } } + + if (!parameterFromSuperclass.getName().equals(parameterFromSubclass.getName())) { + if (fakeOverride) { + trace.report(DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES.on(classElement, declared.getOverriddenDescriptors(), parameterFromSuperclass.getIndex() + 1)); + } + else { + trace.report(PARAMETER_NAME_CHANGED_ON_OVERRIDE.on(parameter, (ClassDescriptor) parameterFromSuperclass.getContainingDeclaration().getContainingDeclaration(), parameterFromSuperclass)); + } + } } } } diff --git a/compiler/testData/diagnostics/tests/override/ConflictingParameterNames-MultipleSupertypes.jet b/compiler/testData/diagnostics/tests/override/ConflictingParameterNames-MultipleSupertypes.jet new file mode 100644 index 00000000000..e8c2e78d389 --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/ConflictingParameterNames-MultipleSupertypes.jet @@ -0,0 +1,15 @@ +trait C { + fun foo(a : Int) +} + +trait D { + fun foo(b : Int) +} + +trait E : C, D +trait F : C, D { + + override fun foo(a : Int) { + throw UnsupportedOperationException() + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/ConflictingParameterNames.jet b/compiler/testData/diagnostics/tests/override/ConflictingParameterNames.jet new file mode 100644 index 00000000000..99580fc2937 --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/ConflictingParameterNames.jet @@ -0,0 +1,13 @@ +trait A { + fun b(a : Int) +} + +trait B : A {} + +class C1 : A { + override fun b(b : Int) {} +} + +class C2 : B { + override fun b(b : Int) {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/DefaultParameterValueInOverride.jet b/compiler/testData/diagnostics/tests/override/DefaultParameterValueInOverride.jet index 20ca23ea376..804e30479a1 100644 --- a/compiler/testData/diagnostics/tests/override/DefaultParameterValueInOverride.jet +++ b/compiler/testData/diagnostics/tests/override/DefaultParameterValueInOverride.jet @@ -4,12 +4,10 @@ open class A { class C : A() { override fun foo(a : Int = 1) { - super.foo(a) } } class D : A() { - override fun foo(b : Int = 1) { - super.foo(b) + override fun foo(a : Int = 1) { } } diff --git a/compiler/testData/diagnostics/tests/override/Generics.jet b/compiler/testData/diagnostics/tests/override/Generics.jet index 2b120f0a5ab..f356b2b0117 100644 --- a/compiler/testData/diagnostics/tests/override/Generics.jet +++ b/compiler/testData/diagnostics/tests/override/Generics.jet @@ -30,14 +30,14 @@ class MyChildClass2(t : T) : MyGenericClass(t) { } open class MyClass() : MyTrait, MyAbstractClass() { - override fun foo(i: Int) = i - override fun bar(s: String) = s + override fun foo(t: Int) = t + override fun bar(t: String) = t override val pr : String = "1" } abstract class MyAbstractClass1 : MyTrait, MyAbstractClass() { - override fun foo(i: Int) = i - override fun bar(s: String) = s + override fun foo(t: Int) = t + override fun bar(t: String) = t } class MyIllegalGenericClass1 : MyTrait, MyAbstractClass() {} diff --git a/idea/testData/checker/OverridesAndGenerics.jet b/idea/testData/checker/OverridesAndGenerics.jet index eaac04b3db3..8452a4dcb9e 100644 --- a/idea/testData/checker/OverridesAndGenerics.jet +++ b/idea/testData/checker/OverridesAndGenerics.jet @@ -19,8 +19,8 @@ } open class MyClass : MyTrait, MyAbstractClass() { - override fun foo(i: Int) = i - override fun bar(s: String) = s + override fun foo(t: Int) = t + override fun bar(t: String) = t } class MyIllegalGenericClass1 : MyTrait, MyAbstractClass() {}