📄 transtypes.java
字号:
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 = tree; } public void visitIf(JCIf tree) { tree.cond = translate(tree.cond, syms.booleanType); tree.thenpart = translate(tree.thenpart); tree.elsepart = translate(tree.elsepart); result = tree; } public void visitExec(JCExpressionStatement tree) { tree.expr = translate(tree.expr, null); result = tree; } public void visitReturn(JCReturn tree) { tree.expr = translate(tree.expr, currentMethod.sym.erasure(types).getReturnType()); result = tree; } public void visitThrow(JCThrow tree) { tree.expr = translate(tree.expr, erasure(tree.expr.type)); result = tree; } public void visitAssert(JCAssert tree) { tree.cond = translate(tree.cond, syms.booleanType); if (tree.detail != null) tree.detail = translate(tree.detail, erasure(tree.detail.type)); result = tree; } public void visitApply(JCMethodInvocation tree) { tree.meth = translate(tree.meth, null); Symbol meth = TreeInfo.symbol(tree.meth); Type mt = meth.erasure(types); List<Type> argtypes = mt.getParameterTypes(); if (allowEnums && meth.name==names.init && meth.owner == syms.enumSym) argtypes = argtypes.tail.tail; if (tree.varargsElement != null) tree.varargsElement = types.erasure(tree.varargsElement); else assert tree.args.length() == argtypes.length(); tree.args = translateArgs(tree.args, argtypes, tree.varargsElement); // Insert casts of method invocation results as needed. result = retype(tree, mt.getReturnType(), pt); } 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; } public void visitNewArray(JCNewArray tree) { tree.elemtype = translate(tree.elemtype, null); translate(tree.dims, syms.intType); tree.elems = translate(tree.elems, (tree.type == null) ? null : erasure(types.elemtype(tree.type))); tree.type = erasure(tree.type); result = tree; } public void visitParens(JCParens tree) { tree.expr = translate(tree.expr, pt); tree.type = erasure(tree.type); result = tree; } public void visitAssign(JCAssign tree) { tree.lhs = translate(tree.lhs, null); tree.rhs = translate(tree.rhs, erasure(tree.lhs.type)); tree.type = erasure(tree.type); result = tree; } public void visitAssignop(JCAssignOp tree) { tree.lhs = translate(tree.lhs, null); tree.rhs = translate(tree.rhs, erasure(tree.rhs.type)); tree.type = erasure(tree.type); result = tree; } public void visitUnary(JCUnary tree) { tree.arg = translate(tree.arg, tree.operator.type.getParameterTypes().head); result = tree; } public void visitBinary(JCBinary tree) { tree.lhs = translate(tree.lhs, tree.operator.type.getParameterTypes().head); tree.rhs = translate(tree.rhs, tree.operator.type.getParameterTypes().tail.head); result = tree; } public void visitTypeCast(JCTypeCast tree) { tree.clazz = translate(tree.clazz, null); tree.type = erasure(tree.type); tree.expr = translate(tree.expr, tree.type); result = tree; } public void visitTypeTest(JCInstanceOf tree) { tree.expr = translate(tree.expr, null); tree.clazz = translate(tree.clazz, null); result = tree; } public void visitIndexed(JCArrayAccess tree) { tree.indexed = translate(tree.indexed, erasure(tree.indexed.type)); tree.index = translate(tree.index, syms.intType); // Insert casts of indexed expressions as needed. result = retype(tree, types.elemtype(tree.indexed.type), pt); } // There ought to be nothing to rewrite here; // we don't generate code. public void visitAnnotation(JCAnnotation tree) { result = tree; } public void visitIdent(JCIdent tree) { Type et = tree.sym.erasure(types); // Map type variables to their bounds. if (tree.sym.kind == TYP && tree.sym.type.tag == TYPEVAR) { result = make.at(tree.pos).Type(et); } else // 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, et, pt); } else { tree.type = erasure(tree.type); result = tree; } } 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 visitTypeArray(JCArrayTypeTree tree) { tree.elemtype = translate(tree.elemtype, null); tree.type = erasure(tree.type); result = tree; } /** Visitor method for parameterized types. */ public void visitTypeApply(JCTypeApply tree) { // Delete all type parameters. result = translate(tree.clazz, null); }/************************************************************************** * utility methods *************************************************************************/ private Type erasure(Type t) { return types.erasure(t); }/************************************************************************** * main method *************************************************************************/ private Env<AttrContext> env; void translateClass(ClassSymbol c) { Type st = types.supertype(c.type); // process superclass before derived if (st.tag == CLASS) translateClass((ClassSymbol)st.tsym); Env<AttrContext> myEnv = enter.typeEnvs.remove(c); if (myEnv == null) return; Env<AttrContext> oldEnv = env; try { env = myEnv; // class has not been translated yet TreeMaker savedMake = make; Type savedPt = pt; make = make.forToplevel(env.toplevel); pt = null; try { JCClassDecl tree = (JCClassDecl) env.tree; tree.typarams = List.nil(); super.visitClassDef(tree); make.at(tree.pos); if (addBridges) { 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; pt = savedPt; } } finally { env = oldEnv; } } /** Translate a toplevel class definition. * @param cdef The definition to be translated. */ public JCTree translateTopLevelClass(JCTree cdef, TreeMaker make) { // note that this method does NOT support recursion. this.make = make; pt = null; return translate(cdef, null); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -