public void visitTypeCast(JCTypeCast tree) { tree.clazz = translate(tree.clazz, null); Type originalTarget = tree.type; tree.type = erasure(tree.type); tree.expr = translate(tree.expr, tree.type); if (originalTarget.isCompound()) { Type.IntersectionClassType ict = (Type.IntersectionClassType)originalTarget; for (Type c : ict.getExplicitComponents()) { Type ec = erasure(c); if (!types.isSameType(ec, tree.type)) { tree.expr = coerce(tree.expr, ec); } } } result = tree; }
public void visitConditional(JCConditional tree) { tree.cond = translate(tree.cond, syms.booleanType); tree.truepart = translate(tree.truepart, erasure(tree.type)); tree.falsepart = translate(tree.falsepart, erasure(tree.type)); tree.type = erasure(tree.type); result = retype(tree, tree.type, pt); }
public void visitSwitch(JCSwitch tree) { Type selsuper = types.supertype(tree.selector.type); boolean enumSwitch = selsuper != null && selsuper.tsym == syms.enumSym; Type target = enumSwitch ? erasure(tree.selector.type) : syms.intType; tree.selector = translate(tree.selector, target); tree.cases = translateCases(tree.cases); result = tree; }
make.at(pos); Type origType = types.memberType(origin.type, meth); Type origErasure = erasure(origType); Type calltype = erasure(impl.type.getReturnType()); null, make.Select(receiver, impl).setType(calltype), translateArgs(make.Idents(md.params), origErasure.getParameterTypes(), null)) .setType(calltype); JCStatement stat = (origErasure.getReturnType().tag == VOID) ? make.Exec(call) : make.Return(coerce(call, bridgeType.getReturnType())); md.body = make.Block(0, List.of(stat));
translateClass((ClassSymbol)st.tsym); ListBuffer<JCTree> bridges = new ListBuffer<JCTree>(); if ((tree.sym.flags() & INTERFACE) == 0) addBridges(tree.pos(), tree.sym, bridges); tree.defs = bridges.toList().prependList(tree.defs); tree.type = erasure(tree.type); } finally { make = savedMake;
public void visitSelect(JCFieldAccess tree) { Type t = tree.selected.type; if (t.isCompound() || (t.tag == TYPEVAR && t.getUpperBound().isCompound())) { if ((tree.sym.flags() & IPROXY) != 0) { tree.sym = ((MethodSymbol)tree.sym). implemented((TypeSymbol)tree.sym.owner, types); } tree.selected = cast( translate(tree.selected, erasure(t)), erasure(tree.sym.owner.type)); } else tree.selected = translate(tree.selected, erasure(t)); // Map constants expressions to themselves. if (tree.type.constValue() != null) { result = tree; } // Insert casts of variable uses as needed. else if (tree.sym.kind == VAR) { result = retype(tree, tree.sym.erasure(types), pt); } else { tree.type = erasure(tree.type); result = tree; } }
public void visitSelect(JCFieldAccess tree) { Type t = tree.selected.type; while (t.hasTag(TYPEVAR)) t = t.getUpperBound(); if (t.isCompound()) { if ((tree.sym.flags() & IPROXY) != 0) { tree.sym = ((MethodSymbol)tree.sym). implemented((TypeSymbol)tree.sym.owner, types); } tree.selected = coerce( translate(tree.selected, erasure(tree.selected.type)), erasure(tree.sym.owner.type)); } else tree.selected = translate(tree.selected, erasure(t)); // Map constants expressions to themselves. if (tree.type.constValue() != null) { result = tree; } // Insert casts of variable uses as needed. else if (tree.sym.kind == VAR) { result = retype(tree, tree.sym.erasure(types), pt); } else { tree.type = erasure(tree.type); result = tree; } }
make.at(pos); Type origType = types.memberType(origin.type, meth); Type origErasure = erasure(origType); bridge.params = createBridgeParams(impl, bridge, bridgeType); bridge.setAttributes(impl); Type calltype = erasure(impl.type.getReturnType()); null, make.Select(receiver, impl).setType(calltype), translateArgs(make.Idents(md.params), origErasure.getParameterTypes(), null)) .setType(calltype); JCStatement stat = (origErasure.getReturnType().hasTag(VOID)) ? make.Exec(call) : make.Return(coerce(call, bridgeType.getReturnType())); md.body = make.Block(0, List.of(stat));
public void visitNewClass(JCNewClass tree) { if (tree.encl != null) tree.encl = translate(tree.encl, erasure(tree.encl.type)); tree.clazz = translate(tree.clazz, null); if (tree.varargsElement != null) tree.varargsElement = types.erasure(tree.varargsElement); tree.args = translateArgs( tree.args, tree.constructor.erasure(types).getParameterTypes(), tree.varargsElement); tree.def = translate(tree.def, null); tree.type = erasure(tree.type); result = tree; }
void addBridges(DiagnosticPosition pos, TypeSymbol i, ClassSymbol origin, ListBuffer<JCTree> bridges) { for (Scope.Entry e = i.members().elems; e != null; e = e.sibling) addBridgeIfNeeded(pos, e.sym, origin, bridges); for (List<Type> l = types.interfaces(i.type); l.nonEmpty(); l = l.tail) addBridges(pos, l.head.tsym, origin, bridges); }
(impl != null && !bridge.owner.isSubClass(impl.owner, types))) { if (impl != null && isBridgeNeeded(meth, impl, origin.type)) { addBridge(pos, meth, impl, origin, bridge==impl, bridges); } else if (impl == meth && impl.owner != origin addBridge(pos, meth, impl, origin, false, bridges);
private void reassignAllEarlyHolders( Context ctx ) { Object[] earlyAttrHolders = { Resolve.instance( ctx ), DeferredAttr.instance( ctx ), MemberEnter.instance( ctx ), Lower.instance( ctx ), TransTypes.instance( ctx ), Annotate.instance( ctx ), TypeAnnotations.instance( ctx ), JavacTrees.instance( ctx ), JavaCompiler.instance( ctx ), }; for( Object instance: earlyAttrHolders ) { ReflectUtil.LiveFieldRef attr = ReflectUtil.WithNull.field( instance, "attr" ); if( attr != null ) { attr.set( this ); } } }
/** Construct an attributed tree to coerce an expression to some erased * target type, unless the expression is already assignable to that type. * If target type is a constant type, use its base type instead. * @param tree The expression tree. * @param target The target type. */ public JCExpression coerce(Env<AttrContext> env, JCExpression tree, Type target) { Env<AttrContext> prevEnv = this.env; try { this.env = env; return coerce(tree, target); } finally { this.env = prevEnv; } } JCExpression coerce(JCExpression tree, Type target) {
JCExpression coerce(JCExpression tree, Type target) { Type btarget = target.baseType(); if (tree.type.isPrimitive() == target.isPrimitive()) { return types.isAssignable(tree.type, btarget, types.noWarnings) ? tree : cast(tree, btarget); } return tree; }
/** Get the instance for this context. */ public static TransTypes instance(Context context) { TransTypes instance = context.get(transTypesKey); if (instance == null) instance = new TransTypes(context); return instance; }
/** Add all necessary bridges to some class appending them to list buffer. * @param pos The source code position to be used for the bridges. * @param origin The class in which the bridges go. * @param bridges The list buffer to which the bridges are added. */ void addBridges(DiagnosticPosition pos, ClassSymbol origin, ListBuffer<JCTree> bridges) { Type st = types.supertype(origin.type); while (st.tag == CLASS) { // if (isSpecialization(st)) addBridges(pos, st.tsym, origin, bridges); st = types.supertype(st); } for (List<Type> l = types.interfaces(origin.type); l.nonEmpty(); l = l.tail) // if (isSpecialization(l.head)) addBridges(pos, l.head.tsym, origin, bridges); }
if (!isSameMemberWhenErased(dest, method, method_erasure)) return true; Type impl_erasure = impl.erasure(types); if (!isSameMemberWhenErased(dest, impl, impl_erasure)) return true; return !isSameMemberWhenErased(dest, method, method.erasure(types));