< prev index next >

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

Print this page




2236             }
2237 
2238             boolean needsVarArgsConversion() {
2239                 return tree.varargsElement != null;
2240             }
2241 
2242             /**
2243              * @return Is this an array operation like clone()
2244              */
2245             boolean isArrayOp() {
2246                 return tree.sym.owner == syms.arrayClass;
2247             }
2248 
2249             boolean receiverAccessible() {
2250                 //hack needed to workaround 292 bug (7087658)
2251                 //when 292 issue is fixed we should remove this and change the backend
2252                 //code to always generate a method handle to an accessible method
2253                 return tree.ownerAccessible;
2254             }
2255 
2256             /**
2257              * The VM does not support access across nested classes (8010319).
2258              * Were that ever to change, this should be removed.
2259              */
2260             boolean isPrivateInOtherClass() {
2261                 return  (tree.sym.flags() & PRIVATE) != 0 &&
2262                         !types.isSameType(
2263                               types.erasure(tree.sym.enclClass().asType()),
2264                               types.erasure(owner.enclClass().asType()));
2265             }
2266 
2267             boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage() {
2268                 return ((tree.sym.flags() & PROTECTED) != 0 &&
2269                         tree.sym.packge() != owner.packge());
2270             }
2271 
2272             /**
2273              * Erasure destroys the implementation parameter subtype
2274              * relationship for intersection types.
2275              * Have similar problems for union types too.
2276              */
2277             boolean interfaceParameterIsIntersectionOrUnionType() {
2278                 List<Type> tl = tree.getDescriptorType(types).getParameterTypes();
2279                 for (; tl.nonEmpty(); tl = tl.tail) {
2280                     Type pt = tl.head;
2281                     return isIntersectionOrUnionType(pt);
2282                 }
2283                 return false;
2284             }
2285 
2286             boolean isIntersectionOrUnionType(Type t) {
2287                 switch (t.getKind()) {
2288                     case INTERSECTION:
2289                     case UNION:
2290                         return true;
2291                     case TYPEVAR:
2292                         TypeVar tv = (TypeVar) t;
2293                         return isIntersectionOrUnionType(tv.getUpperBound());
2294                 }
2295                 return false;
2296             }
2297 
2298             /**
2299              * Does this reference need to be converted to a lambda
2300              * (i.e. var args need to be expanded or "super" is used)
2301              */
2302             final boolean needsConversionToLambda() {
2303                 return interfaceParameterIsIntersectionOrUnionType() ||
2304                         isSuper ||
2305                         needsVarArgsConversion() ||
2306                         isArrayOp() ||
2307                         isPrivateInOtherClass() ||
2308                         isProtectedInSuperClassOfEnclosingClassInOtherPackage() ||
2309                         !receiverAccessible() ||
2310                         (tree.getMode() == ReferenceMode.NEW &&
2311                           tree.kind != ReferenceKind.ARRAY_CTOR &&
2312                           (tree.sym.owner.isLocal() || tree.sym.owner.isInner()));
2313             }
2314 
2315             Type generatedRefSig() {
2316                 return types.erasure(tree.sym.type);
2317             }
2318 
2319             Type bridgedRefSig() {
2320                 return types.erasure(types.findDescriptorSymbol(tree.target.tsym).type);
2321             }
2322         }
2323     }
2324     // </editor-fold>
2325 
2326     /*
2327      * These keys provide mappings for various translated lambda symbols




2236             }
2237 
2238             boolean needsVarArgsConversion() {
2239                 return tree.varargsElement != null;
2240             }
2241 
2242             /**
2243              * @return Is this an array operation like clone()
2244              */
2245             boolean isArrayOp() {
2246                 return tree.sym.owner == syms.arrayClass;
2247             }
2248 
2249             boolean receiverAccessible() {
2250                 //hack needed to workaround 292 bug (7087658)
2251                 //when 292 issue is fixed we should remove this and change the backend
2252                 //code to always generate a method handle to an accessible method
2253                 return tree.ownerAccessible;
2254             }
2255 











2256             boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage() {
2257                 return ((tree.sym.flags() & PROTECTED) != 0 &&
2258                         tree.sym.packge() != owner.packge());
2259             }
2260 
2261             /**
2262              * Erasure destroys the implementation parameter subtype
2263              * relationship for intersection types.
2264              * Have similar problems for union types too.
2265              */
2266             boolean interfaceParameterIsIntersectionOrUnionType() {
2267                 List<Type> tl = tree.getDescriptorType(types).getParameterTypes();
2268                 for (; tl.nonEmpty(); tl = tl.tail) {
2269                     Type pt = tl.head;
2270                     return isIntersectionOrUnionType(pt);
2271                 }
2272                 return false;
2273             }
2274 
2275             boolean isIntersectionOrUnionType(Type t) {
2276                 switch (t.getKind()) {
2277                     case INTERSECTION:
2278                     case UNION:
2279                         return true;
2280                     case TYPEVAR:
2281                         TypeVar tv = (TypeVar) t;
2282                         return isIntersectionOrUnionType(tv.getUpperBound());
2283                 }
2284                 return false;
2285             }
2286 
2287             /**
2288              * Does this reference need to be converted to a lambda
2289              * (i.e. var args need to be expanded or "super" is used)
2290              */
2291             final boolean needsConversionToLambda() {
2292                 return interfaceParameterIsIntersectionOrUnionType() ||
2293                         isSuper ||
2294                         needsVarArgsConversion() ||
2295                         isArrayOp() ||

2296                         isProtectedInSuperClassOfEnclosingClassInOtherPackage() ||
2297                         !receiverAccessible() ||
2298                         (tree.getMode() == ReferenceMode.NEW &&
2299                           tree.kind != ReferenceKind.ARRAY_CTOR &&
2300                           (tree.sym.owner.isLocal() || tree.sym.owner.isInner()));
2301             }
2302 
2303             Type generatedRefSig() {
2304                 return types.erasure(tree.sym.type);
2305             }
2306 
2307             Type bridgedRefSig() {
2308                 return types.erasure(types.findDescriptorSymbol(tree.target.tsym).type);
2309             }
2310         }
2311     }
2312     // </editor-fold>
2313 
2314     /*
2315      * These keys provide mappings for various translated lambda symbols


< prev index next >