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)