From 640dac834fa23485121e2ad2b6fa20a32a6234c8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 3 Feb 2014 16:09:23 +0400 Subject: [PATCH] Suppress "nothing to override" on equals, hashCode, toString This is needed to smoothly make equals, hashCode and toString members of Any instead of being extensions, as they are now: according to our bootstrapping process, the same compiler code will be built twice, by old compiler (with extensions) and by new compiler (with members). In the resulting code 'override' should be on all these members in all classes, so the old compiler should be able to compile such code --- .../jet/lang/resolve/OverrideResolver.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) 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());