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

changeset 901
02b699d97a55
parent 880
0c24826853b2
child 913
74f0c05c51eb
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Tue Mar 01 12:00:06 2011 -0800
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Wed Mar 02 10:56:39 2011 +0000
     1.3 @@ -1736,24 +1736,26 @@
     1.4       */
     1.5      Symbol resolveSelfContaining(DiagnosticPosition pos,
     1.6                                   Env<AttrContext> env,
     1.7 -                                 Symbol member) {
     1.8 +                                 Symbol member,
     1.9 +                                 boolean isSuperCall) {
    1.10          Name name = names._this;
    1.11 -        Env<AttrContext> env1 = env;
    1.12 +        Env<AttrContext> env1 = isSuperCall ? env.outer : env;
    1.13          boolean staticOnly = false;
    1.14 -        while (env1.outer != null) {
    1.15 -            if (isStatic(env1)) staticOnly = true;
    1.16 -            if (env1.enclClass.sym.isSubClass(member.owner, types) &&
    1.17 -                isAccessible(env, env1.enclClass.sym.type, member)) {
    1.18 -                Symbol sym = env1.info.scope.lookup(name).sym;
    1.19 -                if (sym != null) {
    1.20 -                    if (staticOnly) sym = new StaticError(sym);
    1.21 -                    return access(sym, pos, env.enclClass.sym.type,
    1.22 -                                  name, true);
    1.23 +        if (env1 != null) {
    1.24 +            while (env1 != null && env1.outer != null) {
    1.25 +                if (isStatic(env1)) staticOnly = true;
    1.26 +                if (env1.enclClass.sym.isSubClass(member.owner, types)) {
    1.27 +                    Symbol sym = env1.info.scope.lookup(name).sym;
    1.28 +                    if (sym != null) {
    1.29 +                        if (staticOnly) sym = new StaticError(sym);
    1.30 +                        return access(sym, pos, env.enclClass.sym.type,
    1.31 +                                      name, true);
    1.32 +                    }
    1.33                  }
    1.34 +                if ((env1.enclClass.sym.flags() & STATIC) != 0)
    1.35 +                    staticOnly = true;
    1.36 +                env1 = env1.outer;
    1.37              }
    1.38 -            if ((env1.enclClass.sym.flags() & STATIC) != 0)
    1.39 -                staticOnly = true;
    1.40 -            env1 = env1.outer;
    1.41          }
    1.42          log.error(pos, "encl.class.required", member);
    1.43          return syms.errSymbol;
    1.44 @@ -1764,9 +1766,13 @@
    1.45       * JLS2 8.8.5.1 and 15.9.2
    1.46       */
    1.47      Type resolveImplicitThis(DiagnosticPosition pos, Env<AttrContext> env, Type t) {
    1.48 +        return resolveImplicitThis(pos, env, t, false);
    1.49 +    }
    1.50 +
    1.51 +    Type resolveImplicitThis(DiagnosticPosition pos, Env<AttrContext> env, Type t, boolean isSuperCall) {
    1.52          Type thisType = (((t.tsym.owner.kind & (MTH|VAR)) != 0)
    1.53                           ? resolveSelf(pos, env, t.getEnclosingType().tsym, names._this)
    1.54 -                         : resolveSelfContaining(pos, env, t.tsym)).type;
    1.55 +                         : resolveSelfContaining(pos, env, t.tsym, isSuperCall)).type;
    1.56          if (env.info.isSelfCall && thisType.tsym == env.enclClass.sym)
    1.57              log.error(pos, "cant.ref.before.ctor.called", "this");
    1.58          return thisType;

mercurial