src/share/classes/com/sun/tools/javac/comp/Check.java

changeset 1607
bd49e0304281
parent 1603
6118072811e5
child 1613
d2a98dde7ecc
     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          }

mercurial