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

changeset 741
58ceeff50af8
parent 700
7b413ac1a720
child 775
536ee9f126b1
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Wed Nov 10 12:37:25 2010 +0000
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Fri Nov 12 12:32:43 2010 +0000
     1.3 @@ -159,33 +159,45 @@
     1.4       *  @param c      The class whose accessibility is checked.
     1.5       */
     1.6      public boolean isAccessible(Env<AttrContext> env, TypeSymbol c) {
     1.7 +        return isAccessible(env, c, false);
     1.8 +    }
     1.9 +
    1.10 +    public boolean isAccessible(Env<AttrContext> env, TypeSymbol c, boolean checkInner) {
    1.11 +        boolean isAccessible = false;
    1.12          switch ((short)(c.flags() & AccessFlags)) {
    1.13 -        case PRIVATE:
    1.14 -            return
    1.15 -                env.enclClass.sym.outermostClass() ==
    1.16 -                c.owner.outermostClass();
    1.17 -        case 0:
    1.18 -            return
    1.19 -                env.toplevel.packge == c.owner // fast special case
    1.20 -                ||
    1.21 -                env.toplevel.packge == c.packge()
    1.22 -                ||
    1.23 -                // Hack: this case is added since synthesized default constructors
    1.24 -                // of anonymous classes should be allowed to access
    1.25 -                // classes which would be inaccessible otherwise.
    1.26 -                env.enclMethod != null &&
    1.27 -                (env.enclMethod.mods.flags & ANONCONSTR) != 0;
    1.28 -        default: // error recovery
    1.29 -        case PUBLIC:
    1.30 -            return true;
    1.31 -        case PROTECTED:
    1.32 -            return
    1.33 -                env.toplevel.packge == c.owner // fast special case
    1.34 -                ||
    1.35 -                env.toplevel.packge == c.packge()
    1.36 -                ||
    1.37 -                isInnerSubClass(env.enclClass.sym, c.owner);
    1.38 +            case PRIVATE:
    1.39 +                isAccessible =
    1.40 +                    env.enclClass.sym.outermostClass() ==
    1.41 +                    c.owner.outermostClass();
    1.42 +                break;
    1.43 +            case 0:
    1.44 +                isAccessible =
    1.45 +                    env.toplevel.packge == c.owner // fast special case
    1.46 +                    ||
    1.47 +                    env.toplevel.packge == c.packge()
    1.48 +                    ||
    1.49 +                    // Hack: this case is added since synthesized default constructors
    1.50 +                    // of anonymous classes should be allowed to access
    1.51 +                    // classes which would be inaccessible otherwise.
    1.52 +                    env.enclMethod != null &&
    1.53 +                    (env.enclMethod.mods.flags & ANONCONSTR) != 0;
    1.54 +                break;
    1.55 +            default: // error recovery
    1.56 +            case PUBLIC:
    1.57 +                isAccessible = true;
    1.58 +                break;
    1.59 +            case PROTECTED:
    1.60 +                isAccessible =
    1.61 +                    env.toplevel.packge == c.owner // fast special case
    1.62 +                    ||
    1.63 +                    env.toplevel.packge == c.packge()
    1.64 +                    ||
    1.65 +                    isInnerSubClass(env.enclClass.sym, c.owner);
    1.66 +                break;
    1.67          }
    1.68 +        return (checkInner == false || c.type.getEnclosingType() == Type.noType) ?
    1.69 +            isAccessible :
    1.70 +            isAccessible & isAccessible(env, c.type.getEnclosingType(), checkInner);
    1.71      }
    1.72      //where
    1.73          /** Is given class a subclass of given base class, or an inner class
    1.74 @@ -202,9 +214,13 @@
    1.75          }
    1.76  
    1.77      boolean isAccessible(Env<AttrContext> env, Type t) {
    1.78 +        return isAccessible(env, t, false);
    1.79 +    }
    1.80 +
    1.81 +    boolean isAccessible(Env<AttrContext> env, Type t, boolean checkInner) {
    1.82          return (t.tag == ARRAY)
    1.83              ? isAccessible(env, types.elemtype(t))
    1.84 -            : isAccessible(env, t.tsym);
    1.85 +            : isAccessible(env, t.tsym, checkInner);
    1.86      }
    1.87  
    1.88      /** Is symbol accessible as a member of given type in given evironment?
    1.89 @@ -214,6 +230,9 @@
    1.90       *  @param sym    The symbol.
    1.91       */
    1.92      public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym) {
    1.93 +        return isAccessible(env, site, sym, false);
    1.94 +    }
    1.95 +    public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym, boolean checkInner) {
    1.96          if (sym.name == names.init && sym.owner != site.tsym) return false;
    1.97          ClassSymbol sub;
    1.98          switch ((short)(sym.flags() & AccessFlags)) {
    1.99 @@ -231,7 +250,7 @@
   1.100                   ||
   1.101                   env.toplevel.packge == sym.packge())
   1.102                  &&
   1.103 -                isAccessible(env, site)
   1.104 +                isAccessible(env, site, checkInner)
   1.105                  &&
   1.106                  sym.isInheritedIn(site.tsym, types)
   1.107                  &&
   1.108 @@ -248,11 +267,11 @@
   1.109                   // (but type names should be disallowed elsewhere!)
   1.110                   env.info.selectSuper && (sym.flags() & STATIC) == 0 && sym.kind != TYP)
   1.111                  &&
   1.112 -                isAccessible(env, site)
   1.113 +                isAccessible(env, site, checkInner)
   1.114                  &&
   1.115                  notOverriddenIn(site, sym);
   1.116          default: // this case includes erroneous combinations as well
   1.117 -            return isAccessible(env, site) && notOverriddenIn(site, sym);
   1.118 +            return isAccessible(env, site, checkInner) && notOverriddenIn(site, sym);
   1.119          }
   1.120      }
   1.121      //where

mercurial