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

changeset 59
4a3b9801f7a0
parent 42
f7e64b33d5a4
child 60
29d2485c1085
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java	Thu Jun 19 15:52:31 2008 -0700
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java	Fri Jun 20 11:25:03 2008 +0100
     1.3 @@ -1367,13 +1367,47 @@
     1.4                          types.isSameType(rt1, rt2) ||
     1.5                          rt1.tag >= CLASS && rt2.tag >= CLASS &&
     1.6                          (types.covariantReturnType(rt1, rt2, Warner.noWarnings) ||
     1.7 -                         types.covariantReturnType(rt2, rt1, Warner.noWarnings));
     1.8 +                         types.covariantReturnType(rt2, rt1, Warner.noWarnings)) ||
     1.9 +                         checkCommonOverriderIn(s1,s2,site);
    1.10                      if (!compat) return s2;
    1.11                  }
    1.12              }
    1.13          }
    1.14          return null;
    1.15      }
    1.16 +    //WHERE
    1.17 +    boolean checkCommonOverriderIn(Symbol s1, Symbol s2, Type site) {
    1.18 +        Map<TypeSymbol,Type> supertypes = new HashMap<TypeSymbol,Type>();
    1.19 +        Type st1 = types.memberType(site, s1);
    1.20 +        Type st2 = types.memberType(site, s2);
    1.21 +        closure(site, supertypes);
    1.22 +        for (Type t : supertypes.values()) {
    1.23 +            for (Scope.Entry e = t.tsym.members().lookup(s1.name); e.scope != null; e = e.next()) {
    1.24 +                Symbol s3 = e.sym;
    1.25 +                if (s3 == s1 || s3 == s2 || s3.kind != MTH || (s3.flags() & (BRIDGE|SYNTHETIC)) != 0) continue;
    1.26 +                Type st3 = types.memberType(site,s3);
    1.27 +                if (types.overrideEquivalent(st3, st1) && types.overrideEquivalent(st3, st2)) {
    1.28 +                    if (s3.owner == site.tsym) {
    1.29 +                        return true;
    1.30 +                    }
    1.31 +                    List<Type> tvars1 = st1.getTypeArguments();
    1.32 +                    List<Type> tvars2 = st2.getTypeArguments();
    1.33 +                    List<Type> tvars3 = st3.getTypeArguments();
    1.34 +                    Type rt1 = st1.getReturnType();
    1.35 +                    Type rt2 = st2.getReturnType();
    1.36 +                    Type rt13 = types.subst(st3.getReturnType(), tvars3, tvars1);
    1.37 +                    Type rt23 = types.subst(st3.getReturnType(), tvars3, tvars2);
    1.38 +                    boolean compat =
    1.39 +                        rt13.tag >= CLASS && rt23.tag >= CLASS &&
    1.40 +                        (types.covariantReturnType(rt13, rt1, Warner.noWarnings) &&
    1.41 +                         types.covariantReturnType(rt23, rt2, Warner.noWarnings));
    1.42 +                    if (compat)
    1.43 +                        return true;
    1.44 +                }
    1.45 +            }
    1.46 +        }
    1.47 +        return false;
    1.48 +    }
    1.49  
    1.50      /** Check that a given method conforms with any method it overrides.
    1.51       *  @param tree         The tree from which positions are extracted

mercurial