diff -r 1408af4cd8b0 -r 573ceb23beeb src/share/classes/com/sun/tools/javac/comp/Check.java --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Oct 04 13:04:53 2012 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Oct 05 14:35:24 2012 +0100 @@ -421,7 +421,7 @@ * checks - depending on the check context, meaning of 'compatibility' might * vary significantly. */ - interface CheckContext { + public interface CheckContext { /** * Is type 'found' compatible with type 'req' in given context */ @@ -438,6 +438,8 @@ public Infer.InferenceContext inferenceContext(); public DeferredAttr.DeferredAttrContext deferredAttrContext(); + + public boolean allowBoxing(); } /** @@ -472,6 +474,10 @@ public DeferredAttrContext deferredAttrContext() { return enclosingContext.deferredAttrContext(); } + + public boolean allowBoxing() { + return enclosingContext.allowBoxing(); + } } /** @@ -496,6 +502,10 @@ public DeferredAttrContext deferredAttrContext() { return deferredAttr.emptyDeferredAttrContext; } + + public boolean allowBoxing() { + return true; + } }; /** Check that a given type is assignable to a given proto-type. @@ -557,9 +567,9 @@ */ public void checkRedundantCast(Env env, JCTypeCast tree) { if (!tree.type.isErroneous() && - (env.info.lint == null || env.info.lint.isEnabled(Lint.LintCategory.CAST)) - && types.isSameType(tree.expr.type, tree.clazz.type) - && !is292targetTypeCast(tree)) { + (env.info.lint == null || env.info.lint.isEnabled(Lint.LintCategory.CAST)) + && types.isSameType(tree.expr.type, tree.clazz.type) + && !is292targetTypeCast(tree)) { log.warning(Lint.LintCategory.CAST, tree.pos(), "redundant.cast", tree.expr.type); } @@ -906,6 +916,65 @@ return; } + void checkAccessibleFunctionalDescriptor(DiagnosticPosition pos, Env env, Type desc) { + AccessChecker accessChecker = new AccessChecker(env); + //check args accessibility (only if implicit parameter types) + for (Type arg : desc.getParameterTypes()) { + if (!accessChecker.visit(arg)) { + log.error(pos, "cant.access.arg.type.in.functional.desc", arg); + return; + } + } + //check return type accessibility + if (!accessChecker.visit(desc.getReturnType())) { + log.error(pos, "cant.access.return.in.functional.desc", desc.getReturnType()); + return; + } + //check thrown types accessibility + for (Type thrown : desc.getThrownTypes()) { + if (!accessChecker.visit(thrown)) { + log.error(pos, "cant.access.thrown.in.functional.desc", thrown); + return; + } + } + } + + class AccessChecker extends Types.UnaryVisitor { + + Env env; + + AccessChecker(Env env) { + this.env = env; + } + + Boolean visit(List ts) { + for (Type t : ts) { + if (!visit(t)) + return false; + } + return true; + } + + public Boolean visitType(Type t, Void s) { + return true; + } + + @Override + public Boolean visitArrayType(ArrayType t, Void s) { + return visit(t.elemtype); + } + + @Override + public Boolean visitClassType(ClassType t, Void s) { + return rs.isAccessible(env, t, true) && + visit(t.getTypeArguments()); + } + + @Override + public Boolean visitWildcardType(WildcardType t, Void s) { + return visit(t.type); + } + }; /** * Check that type 't' is a valid instantiation of a generic class * (see JLS 4.5)