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