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

changeset 1588
2620c953e9fe
parent 1579
0baaae675b19
child 1603
6118072811e5
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java	Fri Feb 15 18:40:38 2013 -0800
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java	Mon Feb 18 14:33:25 2013 +0000
     1.3 @@ -1588,6 +1588,7 @@
     1.4                     (other.flags() & STATIC) == 0) {
     1.5              log.error(TreeInfo.diagnosticPositionFor(m, tree), "override.static",
     1.6                        cannotOverride(m, other));
     1.7 +            m.flags_field |= BAD_OVERRIDE;
     1.8              return;
     1.9          }
    1.10  
    1.11 @@ -1599,6 +1600,7 @@
    1.12              log.error(TreeInfo.diagnosticPositionFor(m, tree), "override.meth",
    1.13                        cannotOverride(m, other),
    1.14                        asFlagSet(other.flags() & (FINAL | STATIC)));
    1.15 +            m.flags_field |= BAD_OVERRIDE;
    1.16              return;
    1.17          }
    1.18  
    1.19 @@ -1615,6 +1617,7 @@
    1.20                        other.flags() == 0 ?
    1.21                            Flag.PACKAGE :
    1.22                            asFlagSet(other.flags() & AccessFlags));
    1.23 +            m.flags_field |= BAD_OVERRIDE;
    1.24              return;
    1.25          }
    1.26  
    1.27 @@ -1642,6 +1645,7 @@
    1.28                            "override.incompatible.ret",
    1.29                            cannotOverride(m, other),
    1.30                            mtres, otres);
    1.31 +                m.flags_field |= BAD_OVERRIDE;
    1.32                  return;
    1.33              }
    1.34          } else if (overrideWarner.hasNonSilentLint(LintCategory.UNCHECKED)) {
    1.35 @@ -1661,6 +1665,7 @@
    1.36                        "override.meth.doesnt.throw",
    1.37                        cannotOverride(m, other),
    1.38                        unhandledUnerased.head);
    1.39 +            m.flags_field |= BAD_OVERRIDE;
    1.40              return;
    1.41          }
    1.42          else if (unhandledUnerased.nonEmpty()) {
    1.43 @@ -1956,6 +1961,33 @@
    1.44          }
    1.45      }
    1.46  
    1.47 +    public void checkClassOverrideEqualsAndHash(ClassSymbol someClass) {
    1.48 +        if (lint.isEnabled(LintCategory.OVERRIDES)) {
    1.49 +            boolean hasEquals = false;
    1.50 +            boolean hasHashCode = false;
    1.51 +
    1.52 +            Scope.Entry equalsAtObject = syms.objectType.tsym.members().lookup(names.equals);
    1.53 +            Scope.Entry hashCodeAtObject = syms.objectType.tsym.members().lookup(names.hashCode);
    1.54 +            for (Symbol s: someClass.members().getElements(new Filter<Symbol>() {
    1.55 +                    public boolean accepts(Symbol s) {
    1.56 +                        return s.kind == Kinds.MTH &&
    1.57 +                                (s.flags() & BAD_OVERRIDE) == 0;
    1.58 +                    }
    1.59 +                })) {
    1.60 +                MethodSymbol m = (MethodSymbol)s;
    1.61 +                hasEquals |= m.name.equals(names.equals) &&
    1.62 +                        m.overrides(equalsAtObject.sym, someClass, types, false);
    1.63 +
    1.64 +                hasHashCode |= m.name.equals(names.hashCode) &&
    1.65 +                        m.overrides(hashCodeAtObject.sym, someClass, types, false);
    1.66 +            }
    1.67 +            if (hasEquals && !hasHashCode) {
    1.68 +                log.warning(LintCategory.OVERRIDES, (DiagnosticPosition) null,
    1.69 +                        "override.equals.but.not.hashcode", someClass.fullname);
    1.70 +            }
    1.71 +        }
    1.72 +    }
    1.73 +
    1.74      private boolean checkNameClash(ClassSymbol origin, Symbol s1, Symbol s2) {
    1.75          ClashFilter cf = new ClashFilter(origin.type);
    1.76          return (cf.accepts(s1) &&

mercurial