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

changeset 1348
573ceb23beeb
parent 1347
1408af4cd8b0
child 1352
d4b3cb1ece84
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java	Thu Oct 04 13:04:53 2012 +0100
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java	Fri Oct 05 14:35:24 2012 +0100
     1.3 @@ -421,7 +421,7 @@
     1.4       * checks - depending on the check context, meaning of 'compatibility' might
     1.5       * vary significantly.
     1.6       */
     1.7 -    interface CheckContext {
     1.8 +    public interface CheckContext {
     1.9          /**
    1.10           * Is type 'found' compatible with type 'req' in given context
    1.11           */
    1.12 @@ -438,6 +438,8 @@
    1.13          public Infer.InferenceContext inferenceContext();
    1.14  
    1.15          public DeferredAttr.DeferredAttrContext deferredAttrContext();
    1.16 +
    1.17 +        public boolean allowBoxing();
    1.18      }
    1.19  
    1.20      /**
    1.21 @@ -472,6 +474,10 @@
    1.22          public DeferredAttrContext deferredAttrContext() {
    1.23              return enclosingContext.deferredAttrContext();
    1.24          }
    1.25 +
    1.26 +        public boolean allowBoxing() {
    1.27 +            return enclosingContext.allowBoxing();
    1.28 +        }
    1.29      }
    1.30  
    1.31      /**
    1.32 @@ -496,6 +502,10 @@
    1.33          public DeferredAttrContext deferredAttrContext() {
    1.34              return deferredAttr.emptyDeferredAttrContext;
    1.35          }
    1.36 +
    1.37 +        public boolean allowBoxing() {
    1.38 +            return true;
    1.39 +        }
    1.40      };
    1.41  
    1.42      /** Check that a given type is assignable to a given proto-type.
    1.43 @@ -557,9 +567,9 @@
    1.44       */
    1.45      public void checkRedundantCast(Env<AttrContext> env, JCTypeCast tree) {
    1.46          if (!tree.type.isErroneous() &&
    1.47 -            (env.info.lint == null || env.info.lint.isEnabled(Lint.LintCategory.CAST))
    1.48 -            && types.isSameType(tree.expr.type, tree.clazz.type)
    1.49 -            && !is292targetTypeCast(tree)) {
    1.50 +                (env.info.lint == null || env.info.lint.isEnabled(Lint.LintCategory.CAST))
    1.51 +                && types.isSameType(tree.expr.type, tree.clazz.type)
    1.52 +                && !is292targetTypeCast(tree)) {
    1.53              log.warning(Lint.LintCategory.CAST,
    1.54                      tree.pos(), "redundant.cast", tree.expr.type);
    1.55          }
    1.56 @@ -906,6 +916,65 @@
    1.57                  return;
    1.58          }
    1.59  
    1.60 +        void checkAccessibleFunctionalDescriptor(DiagnosticPosition pos, Env<AttrContext> env, Type desc) {
    1.61 +            AccessChecker accessChecker = new AccessChecker(env);
    1.62 +            //check args accessibility (only if implicit parameter types)
    1.63 +            for (Type arg : desc.getParameterTypes()) {
    1.64 +                if (!accessChecker.visit(arg)) {
    1.65 +                    log.error(pos, "cant.access.arg.type.in.functional.desc", arg);
    1.66 +                    return;
    1.67 +                }
    1.68 +            }
    1.69 +            //check return type accessibility
    1.70 +            if (!accessChecker.visit(desc.getReturnType())) {
    1.71 +                log.error(pos, "cant.access.return.in.functional.desc", desc.getReturnType());
    1.72 +                return;
    1.73 +            }
    1.74 +            //check thrown types accessibility
    1.75 +            for (Type thrown : desc.getThrownTypes()) {
    1.76 +                if (!accessChecker.visit(thrown)) {
    1.77 +                    log.error(pos, "cant.access.thrown.in.functional.desc", thrown);
    1.78 +                    return;
    1.79 +                }
    1.80 +            }
    1.81 +        }
    1.82 +
    1.83 +        class AccessChecker extends Types.UnaryVisitor<Boolean> {
    1.84 +
    1.85 +            Env<AttrContext> env;
    1.86 +
    1.87 +            AccessChecker(Env<AttrContext> env) {
    1.88 +                this.env = env;
    1.89 +            }
    1.90 +
    1.91 +            Boolean visit(List<Type> ts) {
    1.92 +                for (Type t : ts) {
    1.93 +                    if (!visit(t))
    1.94 +                        return false;
    1.95 +                }
    1.96 +                return true;
    1.97 +            }
    1.98 +
    1.99 +            public Boolean visitType(Type t, Void s) {
   1.100 +                return true;
   1.101 +            }
   1.102 +
   1.103 +            @Override
   1.104 +            public Boolean visitArrayType(ArrayType t, Void s) {
   1.105 +                return visit(t.elemtype);
   1.106 +            }
   1.107 +
   1.108 +            @Override
   1.109 +            public Boolean visitClassType(ClassType t, Void s) {
   1.110 +                return rs.isAccessible(env, t, true) &&
   1.111 +                        visit(t.getTypeArguments());
   1.112 +            }
   1.113 +
   1.114 +            @Override
   1.115 +            public Boolean visitWildcardType(WildcardType t, Void s) {
   1.116 +                return visit(t.type);
   1.117 +            }
   1.118 +        };
   1.119      /**
   1.120       * Check that type 't' is a valid instantiation of a generic class
   1.121       * (see JLS 4.5)

mercurial