⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transinner.java

📁 这是实现Javac功能的GJC的最新源码
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
            rethrow = make.Throw( makeNewClass(syms.noClassDefFoundErrorType,                    List.make(                    make.App(make.Select(make.Ident(catchParam), getMessageSym),                    Tree.emptyList))));        }        Tree rethrowStmt = make.Block(0, Tree.emptyList.prepend(rethrow));        Catch catchBlock = make.Catch(make.VarDef(catchParam, null), rethrowStmt);        Tree tryCatch =                make.Try(returnResult, Catch.emptyList.prepend(catchBlock), null);        return make.Block(0, Tree.emptyList.prepend(tryCatch));    }    /**      * Create an attributed tree of the form left.name().      */    private Tree makeCall(Tree left, Name name, List args) {        assert left.type != null;        List types = Type.emptyList;        Symbol funcsym = rs.resolveInternalMethod(make.pos, attrEnv, left.type, name,                TreeInfo.types(args));        return make.App(make.Select(left, funcsym), args);    }    /**      * The Name Of The variable to cache T.class values.      *  @param sig      The signature of type T.      */    private Name cacheName(String sig) {        StringBuffer buf = new StringBuffer();        if (sig.startsWith("[")) {            buf = buf.append("array");            while (sig.startsWith("[")) {                buf = buf.append("$");                sig = sig.substring(1);            }            if (sig.startsWith("L")) {                sig = sig.substring(0, sig.length() - 1);            }        } else {            buf = buf.append("class$");        }        buf = buf.append(sig.replace('.', '$'));        return names.fromString(buf.toString());    }    /**      * The variable symbol that caches T.class values.      *  If none exists yet, create a definition.      *  @param sig      The signature of type T.      *  @param pos	The position to report diagnostics, if any.      */    private VarSymbol cacheSym(int pos, String sig) {        ClassSymbol outerCacheClass = outerCacheClass();        Name cname = cacheName(sig);        VarSymbol cacheSym =                (VarSymbol) lookupSynthetic(cname, outerCacheClass.members());        if (cacheSym == null) {            cacheSym = new VarSymbol(STATIC | SYNTHETIC, cname, syms.classType,                    outerCacheClass);            enterSynthetic(pos, cacheSym, outerCacheClass.members());            VarDef cacheDef = make.VarDef(cacheSym, null);            ClassDef outerCacheClassDef = classDef(outerCacheClass);            outerCacheClassDef.defs = outerCacheClassDef.defs.prepend(cacheDef);        }        return cacheSym;    }    /**      * The tree simulating a T.class expression.      *  @param clazz      The tree identifying type T.      */    private Tree classOf(Tree clazz) {        return classOfType(clazz.type, clazz.pos);    }    private Tree classOfType(Type type, int pos) {        switch (type.tag) {        case BYTE:        case SHORT:        case CHAR:        case INT:        case LONG:        case FLOAT:        case DOUBLE:        case BOOLEAN:        case VOID:            Name bname = syms.boxedName[type.tag];            ClassSymbol c = reader.enterClass(bname);            Symbol typeSym = rs.access(                    rs.findIdentInType(attrEnv, c.type, names.TYPE, VAR), pos,                    c.type, names.TYPE, true);            if (typeSym.kind == VAR)                attr.evalInit((VarSymbol) typeSym);            return make.QualIdent(typeSym);        case CLASS:        case ARRAY:            String sig = writer.xClassName(type).toString().replace('/', '.');            Symbol cs = cacheSym(pos, sig);            return make.at(pos).Conditional( makeBinary(Tree.EQ, make.Ident(cs),                    make.Ident(syms.nullConst)),                    make.Assign(make.Ident(cs),                    make.App(make.Ident(classDollarSym(pos)),                    List.make(                    make.Literal(Type.CLASS, sig).setType(syms.stringType)))).                    setType(syms.classType), make.Ident(cs)).setType(syms.classType);        default:            throw new AssertionError();        }    }    /**      * Code for enabling/disabling assertions.      */    private Tree assertFlagTest(int pos) {        ClassSymbol outermostClass = outermostClassDef.sym;        ClassSymbol container = currentClass;        VarSymbol assertDisabledSym =                (VarSymbol) lookupSynthetic(names.dollarAssertionsDisabled,                container.members());        if (assertDisabledSym == null) {            assertDisabledSym = new VarSymbol(STATIC | FINAL | SYNTHETIC,                    names.dollarAssertionsDisabled, syms.booleanType, container);            enterSynthetic(pos, assertDisabledSym, container.members());            Symbol desiredAssertionStatusSym =                    rs.resolveInternalMethod(pos, attrEnv, syms.classType,                    names.desiredAssertionStatus, Type.emptyList);            ClassDef containerDef = classDef(container);            make.at(containerDef.pos);            Tree notStatus = makeUnary(Tree.NOT,                    make.App( make.Select(                    classOfType(outermostClass.type, containerDef.pos),                    desiredAssertionStatusSym), Tree.emptyList));            VarDef assertDisabledDef = make.VarDef(assertDisabledSym, notStatus);            containerDef.defs = containerDef.defs.prepend(assertDisabledDef);        }        make.at(pos);        return makeUnary(Tree.NOT, make.Ident(assertDisabledSym));    }    /**      * Visitor argument: enclosing operator node.      */    private Tree enclOp;    /**     * Visitor method: Translate a single node.     *  Attach the source position from the old tree to its replacement tree.     */    public Tree translate(Tree tree) {        if (tree == null) {            return null;        } else {            make.at(tree.pos);            tree.accept(this);            if (endPositions != null && result != tree) {                Integer endPos = (Integer) endPositions.remove(tree);                if (endPos != null)                    endPositions.put(result, endPos);            }            return result;        }    }    /**      * Visitor method: Translate tree.      */    public Tree translate(Tree tree, Tree enclOp) {        Tree prevEnclOp = this.enclOp;        this.enclOp = enclOp;        Tree res = translate(tree);        this.enclOp = prevEnclOp;        return res;    }    /**      * Visitor method: Translate list of trees.      */    public List translate(List trees, Tree enclOp) {        Tree prevEnclOp = this.enclOp;        this.enclOp = enclOp;        List res = translate(trees);        this.enclOp = prevEnclOp;        return res;    }    public void visitClassDef(ClassDef tree) {        ClassSymbol currentClassPrev = currentClass;        currentClass = tree.sym;        classdefs.put(currentClass, tree);        proxies = proxies.dup();        List prevOuterThisStack = outerThisStack;        VarDef otdef = null;        if (currentClass.hasOuterInstance())            otdef = outerThisDef(tree.pos, currentClass);        List fvdefs = freevarDefs(tree.pos, freevars(currentClass), currentClass);        tree.extending = translate(tree.extending);        tree.implementing = translate(tree.implementing);        List seen = Tree.emptyList;        while (tree.defs != seen) {            List unseen = tree.defs;            for (List l = unseen; l.nonEmpty() && l != seen; l = l.tail) {                Tree outermostMemberDefPrev = outermostMemberDef;                if (outermostMemberDefPrev == null)                    outermostMemberDef = (Tree) l.head;                l.head = translate((Tree) l.head);                outermostMemberDef = outermostMemberDefPrev;            }            seen = unseen;        }        if ((tree.flags & PROTECTED) != 0)            tree.flags |= PUBLIC;        tree.flags &= ClassFlags;        tree.name = Convert.shortName(currentClass.flatName());        for (List l = fvdefs; l.nonEmpty(); l = l.tail) {            tree.defs = tree.defs.prepend(l.head);            enterSynthetic(tree.pos, ((Tree.VarDef) l.head).sym,                    currentClass.members());        }        if (currentClass.hasOuterInstance()) {            tree.defs = tree.defs.prepend(otdef);            enterSynthetic(tree.pos, otdef.sym, currentClass.members());        }        proxies = proxies.leave();        outerThisStack = prevOuterThisStack;        translated.append(tree);        currentClass = currentClassPrev;        result = make.at(tree.pos).Block(0, Tree.emptyList);    }    public void visitMethodDef(MethodDef tree) {        if (tree.name == names.init && (currentClass.isInner() ||                (currentClass.owner.kind & (VAR | MTH)) != 0)) {            MethodSymbol m = tree.sym;            proxies = proxies.dup();            List prevOuterThisStack = outerThisStack;            List fvs = freevars(currentClass);            VarDef otdef = null;            if (currentClass.hasOuterInstance())                otdef = outerThisDef(tree.pos, m);            List fvdefs = freevarDefs(tree.pos, fvs, m);            tree.restype = translate(tree.restype);            tree.params = translateVarDefs(tree.params);            tree.thrown = translate(tree.thrown);            tree.params = tree.params.appendList(fvdefs);            if (currentClass.hasOuterInstance())                tree.params = tree.params.prepend(otdef);            Tree selfCall = translate((Tree) tree.body.stats.head);            List added = Tree.emptyList;            if (fvs.nonEmpty()) {                List addedargtypes = new List();                for (List l = fvs; l.nonEmpty(); l = l.tail) {                    if (TreeInfo.isInitialConstructor(tree))                        added = added.prepend( initField(tree.body.pos,                                proxyName(((Symbol.VarSymbol) l.head).name)));                    addedargtypes = addedargtypes.prepend(                            ((Symbol.VarSymbol) l.head).erasure());                }                Type olderasure = m.erasure();                m.erasure_field = new MethodType(                        olderasure.argtypes().appendList(addedargtypes),                        olderasure.restype(), olderasure.thrown(), syms.methodClass);            }            if (currentClass.hasOuterInstance() &&                    TreeInfo.isInitialConstructor(tree)) {                added = added.prepend(initOuterThis(tree.body.pos));            }            proxies = proxies.leave();            List stats = translate(tree.body.stats.tail);            if (target.initializeFieldsBeforeSuper())                tree.body.stats = stats.prepend(selfCall).prependList(added);            else                tree.body.stats = stats.prependList(added).prepend(selfCall);            outerThisStack = prevOuterThisStack;        } else {            super.visitMethodDef(tree);        }        result = tree;    }    public void visitNewClass(NewClass tree) {        ClassSymbol c = (ClassSymbol) tree.constructor.owner;        tree.args = translate(tree.args);        if ((c.owner.kind & (VAR | MTH)) != 0) {            tree.args = tree.args.appendList(loadFreevars(tree.pos, freevars(c)));        }        Symbol constructor = accessConstructor(tree.pos, tree.constructor);        if (constructor != tree.constructor) {            tree.args = tree.args.append(make.Ident(syms.nullConst));            tree.constructor = constructor;        }        if (c.hasOuterInstance()) {            Tree thisArg;            if (tree.encl != null) {                thisArg = attr.makeNullCheck(translate(tree.encl));                thisArg.type = tree.encl.type;            } else if ((c.owner.kind & (MTH | VAR)) != 0) {                thisArg = makeThis(tree.pos, c.type.outer().tsym);            } else {                thisArg = makeOwnerThis(tree.pos, c, false);            }            tree.args = tree.args.prepend(thisArg);        }        tree.encl = null;        if (tree.def != null) {            translate(tree.def);            tree.clazz = access(make.at(tree.clazz.pos).Ident(tree.def.sym));            tree.def = null;        } else {            tree.clazz = access(c, tree.clazz, enclOp, false);        }        result = tree;    }    /**      * Visitor method for conditional expressions.      */    public void visitConditional(Conditional tree) {        Tree cond = tree.cond = translate(tree.cond);        if (cond.type.isTrue()) {            result = convert(translate(tree.truepart), tree.type);        } else if (cond.type.isFalse()) {            result = convert(translate(tree.falsepart), tree.type);        } else {            tree.truepart = translate(tree.truepart);            tree.falsepart = translate(tree.falsepart);            result = tree;        }    }    private Tree convert(Tree tree, Type pt) {        if (tree.type == pt)            return tree;        Tree result = make.at(tree.pos).TypeCast(make.Type(pt), tree);        result.type =                (tree.type.constValue != null) ? cfolder.coerce(tree.type, pt) : pt;        return result;    }    /**      * Visitor method for if statements.      */    public void visitIf(If tree) {        Tree cond = tree.cond = translate(tree.cond);  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -