< prev index next >

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

Print this page
*** 413,47 ***
          if (env.info.visitingServiceImplementation &&
              env.toplevel.modle == sym.packge().modle) {
              return true;
          }
  
!         switch ((short)(sym.flags() & AccessFlags)) {
!         case PRIVATE:
!             return
!                 (env.enclClass.sym == sym.owner // fast special case
!                  ||
!                  env.enclClass.sym.outermostClass() ==
!                  sym.owner.outermostClass())
!                 &&
!                 sym.isInheritedIn(site.tsym, types);
!         case 0:
!             return
!                 (env.toplevel.packge == sym.owner.owner // fast special case
!                  ||
!                  env.toplevel.packge == sym.packge())
!                 &&
!                 isAccessible(env, site, checkInner)
!                 &&
!                 sym.isInheritedIn(site.tsym, types)
!                 &&
!                 notOverriddenIn(site, sym);
!         case PROTECTED:
!             return
!                 (env.toplevel.packge == sym.owner.owner // fast special case
!                  ||
!                  env.toplevel.packge == sym.packge()
!                  ||
!                  isProtectedAccessible(sym, env.enclClass.sym, site)
!                  ||
!                  // OK to select instance method or field from 'super' or type name
!                  // (but type names should be disallowed elsewhere!)
!                  env.info.selectSuper && (sym.flags() & STATIC) == 0 && sym.kind != TYP)
!                 &&
!                 isAccessible(env, site, checkInner)
!                 &&
!                 notOverriddenIn(site, sym);
!         default: // this case includes erroneous combinations as well
!             return isAccessible(env, site, checkInner) && notOverriddenIn(site, sym);
          }
      }
      //where
      /* `sym' is accessible only if not overridden by
       * another symbol which is a member of `site'
--- 413,52 ---
          if (env.info.visitingServiceImplementation &&
              env.toplevel.modle == sym.packge().modle) {
              return true;
          }
  
!         ClassSymbol enclosingCsym = env.enclClass.sym;
!         try {
!             switch ((short)(sym.flags() & AccessFlags)) {
!                 case PRIVATE:
!                     return
!                             (env.enclClass.sym == sym.owner // fast special case
!                                     ||
!                                     env.enclClass.sym.outermostClass() ==
!                                             sym.owner.outermostClass())
!                                     &&
!                                     sym.isInheritedIn(site.tsym, types);
!                 case 0:
!                     return
!                             (env.toplevel.packge == sym.owner.owner // fast special case
!                                     ||
!                                     env.toplevel.packge == sym.packge())
!                                     &&
!                                     isAccessible(env, site, checkInner)
!                                     &&
!                                     sym.isInheritedIn(site.tsym, types)
!                                     &&
!                                     notOverriddenIn(site, sym);
!                 case PROTECTED:
!                     return
!                             (env.toplevel.packge == sym.owner.owner // fast special case
!                                     ||
!                                     env.toplevel.packge == sym.packge()
!                                     ||
!                                     isProtectedAccessible(sym, env.enclClass.sym, site)
!                                     ||
!                                     // OK to select instance method or field from 'super' or type name
!                                     // (but type names should be disallowed elsewhere!)
!                                     env.info.selectSuper && (sym.flags() & STATIC) == 0 && sym.kind != TYP)
!                                     &&
!                                     isAccessible(env, site, checkInner)
!                                     &&
!                                     notOverriddenIn(site, sym);
+                 default: // this case includes erroneous combinations as well
+                     return isAccessible(env, site, checkInner) && notOverriddenIn(site, sym);
+             }
+         } finally {
+             env.enclClass.sym = enclosingCsym;
          }
      }
      //where
      /* `sym' is accessible only if not overridden by
       * another symbol which is a member of `site'

*** 1506,12 ***
                  if (sym.kind == VAR &&
                          sym.owner.kind == TYP &&
                          (sym.flags() & STATIC) == 0) {
                      if (staticOnly)
                          return new StaticError(sym);
!                     if (env1.info.ctorPrologue && (sym.flags_field & SYNTHETIC) == 0)
!                         return new RefBeforeCtorCalledError(sym);
                  }
                  return sym;
              } else {
                  bestSoFar = bestOf(bestSoFar, sym);
              }
--- 1511,15 ---
                  if (sym.kind == VAR &&
                          sym.owner.kind == TYP &&
                          (sym.flags() & STATIC) == 0) {
                      if (staticOnly)
                          return new StaticError(sym);
!                     if (env1.info.ctorPrologue && (sym.flags_field & SYNTHETIC) == 0) {
!                         if (!env.tree.hasTag(ASSIGN) || !TreeInfo.isIdentOrThisDotIdent(((JCAssign)env.tree).lhs)) {
+                             return new RefBeforeCtorCalledError(sym);
+                         }
+                     }
                  }
                  return sym;
              } else {
                  bestSoFar = bestOf(bestSoFar, sym);
              }

*** 4205,11 ***
                      return diags.create(dkind, log.currentSource(), pos,
                                "cant.apply.symbol.noargs",
                                rewriter,
                                kindName(ws),
                                ws.name == names.init ? ws.owner.name : ws.name,
-                               kindName(ws.owner),
                                ws.owner.type,
                                c.snd);
                  default:
                      // Avoid saying "constructor Array in class Array"
                      if (ws.owner == syms.arrayClass && ws.name == names.init) {
--- 4213,10 ---
< prev index next >