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 83cacc19f4b..16b648aea28 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -565,12 +565,34 @@ public class OverrideResolver { if (invisibleOverriddenDescriptor != null) { reportError.cannotOverrideInvisibleMember(invisibleOverriddenDescriptor); } - else { + else if (!shouldSuppressOverride(declared)) { reportError.nothingToOverride(); } } } + // TODO: this is temporary to migrate equals, hashCode, toString from extensions to Any + private static boolean shouldSuppressOverride(@NotNull CallableMemberDescriptor descriptor) { + String name = descriptor.getName().asString(); + JetType returnType = descriptor.getReturnType(); + KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance(); + + if (name.equals("equals") && builtIns.getBooleanType().equals(returnType)) { + List parameters = descriptor.getValueParameters(); + return parameters.size() == 1 && builtIns.isAnyOrNullableAny(parameters.iterator().next().getType()); + } + + if (name.equals("hashCode") && builtIns.getIntType().equals(returnType)) { + return descriptor.getValueParameters().isEmpty(); + } + + if (name.equals("toString") && builtIns.getStringType().equals(returnType)) { + return descriptor.getValueParameters().isEmpty(); + } + + return false; + } + private void checkOverrideForComponentFunction(@NotNull final CallableMemberDescriptor componentFunction) { final JetAnnotationEntry dataAnnotation = findDataAnnotationForDataClass(componentFunction.getContainingDeclaration());