pretty.java

来自「是一款用JAVA 编写的编译器 具有很强的编译功能」· Java 代码 · 共 1,225 行 · 第 1/3 页

JAVA
1,225
字号
        try {            if (tree.encl != null) {                printExpr(tree.encl);                print(".");            }            print("new ");            if (!tree.typeargs.isEmpty()) {                print("<");                printExprs(tree.typeargs);                print(">");            }            printExpr(tree.clazz);            print("(");            printExprs(tree.args);            print(")");            if (tree.def != null) {                Name enclClassNamePrev = enclClassName;                enclClassName =                        tree.def.name != null ? tree.def.name :                            tree.type != null && tree.type.tsym.name != tree.type.tsym.name.table.empty ? tree.type.tsym.name :                                null;                if ((tree.def.mods.flags & Flags.ENUM) != 0) print("/*enum*/");                printBlock(tree.def.defs);                enclClassName = enclClassNamePrev;            }        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitNewArray(JCNewArray tree) {        try {            if (tree.elemtype != null) {                print("new ");                JCTree elem = tree.elemtype;                if (elem instanceof JCArrayTypeTree)                    printBaseElementType((JCArrayTypeTree) elem);                else                    printExpr(elem);                for (List<JCExpression> l = tree.dims; l.nonEmpty(); l = l.tail) {                    print("[");                    printExpr(l.head);                    print("]");                }                if (elem instanceof JCArrayTypeTree)                    printBrackets((JCArrayTypeTree) elem);            }            if (tree.elems != null) {                if (tree.elemtype != null) print("[]");                print("{");                printExprs(tree.elems);                print("}");            }        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitParens(JCParens tree) {        try {            print("(");            printExpr(tree.expr);            print(")");        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitAssign(JCAssign tree) {        try {            open(prec, TreeInfo.assignPrec);            printExpr(tree.lhs, TreeInfo.assignPrec + 1);            print(" = ");            printExpr(tree.rhs, TreeInfo.assignPrec);            close(prec, TreeInfo.assignPrec);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public String operatorName(int tag) {        switch(tag) {            case JCTree.POS:     return "+";            case JCTree.NEG:     return "-";            case JCTree.NOT:     return "!";            case JCTree.COMPL:   return "~";            case JCTree.PREINC:  return "++";            case JCTree.PREDEC:  return "--";            case JCTree.POSTINC: return "++";            case JCTree.POSTDEC: return "--";            case JCTree.NULLCHK: return "<*nullchk*>";            case JCTree.OR:      return "||";            case JCTree.AND:     return "&&";            case JCTree.EQ:      return "==";            case JCTree.NE:      return "!=";            case JCTree.LT:      return "<";            case JCTree.GT:      return ">";            case JCTree.LE:      return "<=";            case JCTree.GE:      return ">=";            case JCTree.BITOR:   return "|";            case JCTree.BITXOR:  return "^";            case JCTree.BITAND:  return "&";            case JCTree.SL:      return "<<";            case JCTree.SR:      return ">>";            case JCTree.USR:     return ">>>";            case JCTree.PLUS:    return "+";            case JCTree.MINUS:   return "-";            case JCTree.MUL:     return "*";            case JCTree.DIV:     return "/";            case JCTree.MOD:     return "%";            default: throw new Error();        }    }    public void visitAssignop(JCAssignOp tree) {        try {            open(prec, TreeInfo.assignopPrec);            printExpr(tree.lhs, TreeInfo.assignopPrec + 1);            print(" " + operatorName(tree.getTag() - JCTree.ASGOffset) + "= ");            printExpr(tree.rhs, TreeInfo.assignopPrec);            close(prec, TreeInfo.assignopPrec);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitUnary(JCUnary tree) {        try {            int ownprec = TreeInfo.opPrec(tree.getTag());            String opname = operatorName(tree.getTag());            open(prec, ownprec);            if (tree.getTag() <= JCTree.PREDEC) {                print(opname);                printExpr(tree.arg, ownprec);            } else {                printExpr(tree.arg, ownprec);                print(opname);            }            close(prec, ownprec);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitBinary(JCBinary tree) {        try {            int ownprec = TreeInfo.opPrec(tree.getTag());            String opname = operatorName(tree.getTag());            open(prec, ownprec);            printExpr(tree.lhs, ownprec);            print(" " + opname + " ");            printExpr(tree.rhs, ownprec + 1);            close(prec, ownprec);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitTypeCast(JCTypeCast tree) {        try {            open(prec, TreeInfo.prefixPrec);            print("(");            printExpr(tree.clazz);            print(")");            printExpr(tree.expr, TreeInfo.prefixPrec);            close(prec, TreeInfo.prefixPrec);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitTypeTest(JCInstanceOf tree) {        try {            open(prec, TreeInfo.ordPrec);            printExpr(tree.expr, TreeInfo.ordPrec);            print(" instanceof ");            printExpr(tree.clazz, TreeInfo.ordPrec + 1);            close(prec, TreeInfo.ordPrec);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitIndexed(JCArrayAccess tree) {        try {            printExpr(tree.indexed, TreeInfo.postfixPrec);            print("[");            printExpr(tree.index);            print("]");        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitSelect(JCFieldAccess tree) {        try {            printExpr(tree.selected, TreeInfo.postfixPrec);            print("." + tree.name);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitIdent(JCIdent tree) {        try {            print(tree.name);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitLiteral(JCLiteral tree) {        try {            switch (tree.typetag) {                case TypeTags.INT:                    print(tree.value.toString());                    break;                case TypeTags.LONG:                    print(tree.value + "L");                    break;                case TypeTags.FLOAT:                    print(tree.value + "F");                    break;                case TypeTags.DOUBLE:                    print(tree.value.toString());                    break;                case TypeTags.CHAR:                    print("\'" +                            Convert.quote(                            String.valueOf((char)((Number)tree.value).intValue())) +                            "\'");                    break;		case TypeTags.BOOLEAN:		    print(((Number)tree.value).intValue() == 1 ? "true" : "false");		    break;		case TypeTags.BOT:		    print("null");		    break;                default:                    print("\"" + Convert.quote(tree.value.toString()) + "\"");                    break;            }        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitTypeIdent(JCPrimitiveTypeTree tree) {        try {            switch(tree.typetag) {                case TypeTags.BYTE:                    print("byte");                    break;                case TypeTags.CHAR:                    print("char");                    break;                case TypeTags.SHORT:                    print("short");                    break;                case TypeTags.INT:                    print("int");                    break;                case TypeTags.LONG:                    print("long");                    break;                case TypeTags.FLOAT:                    print("float");                    break;                case TypeTags.DOUBLE:                    print("double");                    break;                case TypeTags.BOOLEAN:                    print("boolean");                    break;                case TypeTags.VOID:                    print("void");                    break;                default:                    print("error");                    break;            }        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitTypeArray(JCArrayTypeTree tree) {        try {            printBaseElementType(tree);            printBrackets(tree);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    // Prints the inner element type of a nested array    private void printBaseElementType(JCArrayTypeTree tree) throws IOException {        JCTree elem = tree.elemtype;        while (elem instanceof JCWildcard)            elem = ((JCWildcard) elem).inner;        if (elem instanceof JCArrayTypeTree)            printBaseElementType((JCArrayTypeTree) elem);        else            printExpr(elem);    }    // prints the brackets of a nested array in reverse order    private void printBrackets(JCArrayTypeTree tree) throws IOException {        JCTree elem;        while (true) {            elem = tree.elemtype;            print("[]");            if (!(elem instanceof JCArrayTypeTree)) break;            tree = (JCArrayTypeTree) elem;        }    }    public void visitTypeApply(JCTypeApply tree) {        try {            printExpr(tree.clazz);            print("<");            printExprs(tree.arguments);            print(">");        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitTypeParameter(JCTypeParameter tree) {        try {            print(tree.name);            if (tree.bounds.nonEmpty()) {                print(" extends ");                printExprs(tree.bounds, " & ");            }        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    @Override    public void visitWildcard(JCWildcard tree) {        try {            print(tree.kind);            if (tree.kind.kind != BoundKind.UNBOUND)                printExpr(tree.inner);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    @Override    public void visitTypeBoundKind(TypeBoundKind tree) {        try {            print(String.valueOf(tree.kind));        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitErroneous(JCErroneous tree) {        try {            print("(ERROR)");        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitLetExpr(LetExpr tree) {        try {            print("(let " + tree.defs + " in " + tree.expr + ")");        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitModifiers(JCModifiers mods) {        try {            printAnnotations(mods.annotations);            printFlags(mods.flags);        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitAnnotation(JCAnnotation tree) {        try {            print("@");            printExpr(tree.annotationType);            print("(");            printExprs(tree.args);            print(")");        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }    public void visitTree(JCTree tree) {        try {            print("(UNKNOWN: " + tree + ")");            println();        } catch (IOException e) {            throw new UncheckedIOException(e);        }    }}

⌨️ 快捷键说明

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