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

changeset 1620
3806171b52d8
parent 1613
d2a98dde7ecc
child 1627
6db9a3b1a93f
     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      }

mercurial