1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Sun Feb 24 11:36:58 2013 -0800 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Feb 26 09:04:19 2013 +0000 1.3 @@ -1964,28 +1964,29 @@ 1.4 } 1.5 } 1.6 1.7 - public void checkClassOverrideEqualsAndHash(ClassSymbol someClass) { 1.8 + private Filter<Symbol> equalsHasCodeFilter = new Filter<Symbol>() { 1.9 + public boolean accepts(Symbol s) { 1.10 + return MethodSymbol.implementation_filter.accepts(s) && 1.11 + (s.flags() & BAD_OVERRIDE) == 0; 1.12 + 1.13 + } 1.14 + }; 1.15 + 1.16 + public void checkClassOverrideEqualsAndHash(DiagnosticPosition pos, 1.17 + ClassSymbol someClass) { 1.18 if (lint.isEnabled(LintCategory.OVERRIDES)) { 1.19 - boolean hasEquals = false; 1.20 - boolean hasHashCode = false; 1.21 - 1.22 - Scope.Entry equalsAtObject = syms.objectType.tsym.members().lookup(names.equals); 1.23 - Scope.Entry hashCodeAtObject = syms.objectType.tsym.members().lookup(names.hashCode); 1.24 - for (Symbol s: someClass.members().getElements(new Filter<Symbol>() { 1.25 - public boolean accepts(Symbol s) { 1.26 - return s.kind == Kinds.MTH && 1.27 - (s.flags() & BAD_OVERRIDE) == 0; 1.28 - } 1.29 - })) { 1.30 - MethodSymbol m = (MethodSymbol)s; 1.31 - hasEquals |= m.name.equals(names.equals) && 1.32 - m.overrides(equalsAtObject.sym, someClass, types, false); 1.33 - 1.34 - hasHashCode |= m.name.equals(names.hashCode) && 1.35 - m.overrides(hashCodeAtObject.sym, someClass, types, false); 1.36 - } 1.37 - if (hasEquals && !hasHashCode) { 1.38 - log.warning(LintCategory.OVERRIDES, (DiagnosticPosition) null, 1.39 + MethodSymbol equalsAtObject = (MethodSymbol)syms.objectType 1.40 + .tsym.members().lookup(names.equals).sym; 1.41 + MethodSymbol hashCodeAtObject = (MethodSymbol)syms.objectType 1.42 + .tsym.members().lookup(names.hashCode).sym; 1.43 + 1.44 + boolean overridesEquals = types.implementation(equalsAtObject, 1.45 + someClass, false, equalsHasCodeFilter).owner == someClass; 1.46 + boolean overridesHashCode = types.implementation(hashCodeAtObject, 1.47 + someClass, false, equalsHasCodeFilter) != hashCodeAtObject; 1.48 + 1.49 + if (overridesEquals && !overridesHashCode) { 1.50 + log.warning(LintCategory.OVERRIDES, pos, 1.51 "override.equals.but.not.hashcode", someClass.fullname); 1.52 } 1.53 }