1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Wed Mar 06 15:33:39 2013 +0000 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Mar 07 10:04:28 2013 +0000 1.3 @@ -1972,14 +1972,32 @@ 1.4 } 1.5 }; 1.6 1.7 - public void checkClassOverrideEqualsAndHash(DiagnosticPosition pos, 1.8 + public void checkClassOverrideEqualsAndHashIfNeeded(DiagnosticPosition pos, 1.9 + ClassSymbol someClass) { 1.10 + /* At present, annotations cannot possibly have a method that is override 1.11 + * equivalent with Object.equals(Object) but in any case the condition is 1.12 + * fine for completeness. 1.13 + */ 1.14 + if (someClass == (ClassSymbol)syms.objectType.tsym || 1.15 + someClass.isInterface() || someClass.isEnum() || 1.16 + (someClass.flags() & ANNOTATION) != 0 || 1.17 + (someClass.flags() & ABSTRACT) != 0) return; 1.18 + //anonymous inner classes implementing interfaces need especial treatment 1.19 + if (someClass.isAnonymous()) { 1.20 + List<Type> interfaces = types.interfaces(someClass.type); 1.21 + if (interfaces != null && !interfaces.isEmpty() && 1.22 + interfaces.head.tsym == syms.comparatorType.tsym) return; 1.23 + } 1.24 + checkClassOverrideEqualsAndHash(pos, someClass); 1.25 + } 1.26 + 1.27 + private void checkClassOverrideEqualsAndHash(DiagnosticPosition pos, 1.28 ClassSymbol someClass) { 1.29 if (lint.isEnabled(LintCategory.OVERRIDES)) { 1.30 MethodSymbol equalsAtObject = (MethodSymbol)syms.objectType 1.31 .tsym.members().lookup(names.equals).sym; 1.32 MethodSymbol hashCodeAtObject = (MethodSymbol)syms.objectType 1.33 .tsym.members().lookup(names.hashCode).sym; 1.34 - 1.35 boolean overridesEquals = types.implementation(equalsAtObject, 1.36 someClass, false, equalsHasCodeFilter).owner == someClass; 1.37 boolean overridesHashCode = types.implementation(hashCodeAtObject, 1.38 @@ -1987,7 +2005,7 @@ 1.39 1.40 if (overridesEquals && !overridesHashCode) { 1.41 log.warning(LintCategory.OVERRIDES, pos, 1.42 - "override.equals.but.not.hashcode", someClass.fullname); 1.43 + "override.equals.but.not.hashcode", someClass); 1.44 } 1.45 } 1.46 }