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

📄 pretty.java

📁 java编译器gjc源码 java编译环境
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 * @(#)Pretty.java	1.33 03/01/23
 *
 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.sun.tools.javac.v8.tree;
import java.io.*;

import com.sun.tools.javac.v8.util.*;

import com.sun.tools.javac.v8.code.*;

import com.sun.tools.javac.v8.code.Symbol.*;

import com.sun.tools.javac.v8.tree.Tree.*;


/**
 * Prints out a tree as an indented Java source program.
 */
public class Pretty extends Tree.Visitor implements Flags {

    public Pretty(PrintWriter out, boolean sourceOutput) {
        super();
        this.out = out;
        this.sourceOutput = sourceOutput;
    }

    /**
      * Set when we are producing source output.  If we're not
      *  producing source output, we can sometimes give more detail in
      *  the output even though that detail would not be valid java
      *  soruce.
      */
    private final boolean sourceOutput;

    /**
     * The output stream on which trees are printed.
     */
    PrintWriter out;

    /**
     * Indentation width (can be reassigned from outside).
     */
    public int width = 4;

    /**
     * The current left margin.
     */
    int lmargin = 0;

    /**
     * The enclosing class name.
     */
    Name enclClassName;

    /**
     * A hashtable mapping trees to their documentation comments
     *  (can be null)
     */
    Hashtable docComments = null;

    /**
     * Align code to be indented to left margin.
     */
    void align() {
        for (int i = 0; i < lmargin; i++)
            out.print(" ");
    }

    /**
      * Increase left margin by indentation width.
      */
    void indent() {
        lmargin = lmargin + width;
    }

    /**
      * Decrease left margin by indentation width.
      */
    void undent() {
        lmargin = lmargin - width;
    }

    /**
      * Enter a new precedence level. Emit a `(' if new precedence level
      *  is less than precedence level so far.
      *  @param contextPrec    The precedence level in force so far.
      *  @param ownPrec        The new precedence level.
      */
    void open(int contextPrec, int ownPrec) {
        if (ownPrec < contextPrec)
            out.print("(");
    }

    /**
      * Leave precedence level. Emit a `(' if inner precedence level
      *  is less than precedence level we revert to.
      *  @param contextPrec    The precedence level we revert to.
      *  @param ownPrec        The inner precedence level.
      */
    void close(int contextPrec, int ownPrec) {
        if (ownPrec < contextPrec)
            out.print(")");
    }

    /**
      * Print string, replacing all non-ascii character with unicode escapes.
      */
    public void print(String s) {
        out.print(Convert.escapeUnicode(s));
    }

    /**
      * Print new line.
      */
    public void println() {
        out.println();
    }

    /**
      * Visitor argument: the current precedence level.
      */
    int prec;

    /**
     * Visitor method: print expression tree.
     *  @param prec  The current precedence level.
     */
    public void printExpr(Tree tree, int prec) {
        int prevPrec = this.prec;
        try {
            this.prec = prec;
            if (tree == null)
                print("/*missing*/");
            else
                tree.accept(this);
        }
        finally { this.prec = prevPrec;
                } }

    /**
      * Derived visitor method: print expression tree at minimum precedence level
      *  for expression.
      */
    public void printExpr(Tree tree) {
        printExpr(tree, TreeInfo.noPrec);
    }

    /**
      * Derived visitor method: print statement tree.
      */
    public void printStat(Tree tree) {
        printExpr(tree, TreeInfo.notExpression);
    }

    /**
      * Derived visitor method: print list of expression trees, separated by given string.
      *  @param sep the separator string
      */
    public void printExprs(List trees, String sep) {
        if (trees.nonEmpty()) {
            printExpr((Tree) trees.head);
            for (List l = trees.tail; l.nonEmpty(); l = l.tail) {
                print(sep);
                printExpr((Tree) l.head);
            }
        }
    }

    /**
      * Derived visitor method: print list of expression trees, separated by commas.
      */
    public void printExprs(List trees) {
        printExprs(trees, ", ");
    }

    /**
      * Derived visitor method: print list of statements, each on a separate line.
      */
    public void printStats(List trees) {
        for (List l = trees; l.nonEmpty(); l = l.tail) {
            align();
            printStat((Tree) l.head);
            println();
        }
    }

    /**
      * Print a set of modifiers.
      */
    public void printFlags(long flags) {
        if ((flags & SYNTHETIC) != 0)
            print("/*synthetic*/ ");
        print(TreeInfo.flagNames(flags));
        if ((flags & StandardFlags) != 0)
            print(" ");
    }

    /**
      * Print documentation comment, if it exists
      *  @param tree    The tree for which a documentation comment should be printed.
      */
    public void printDocComment(Tree tree) {
        if (docComments != null) {
            String dc = (String) docComments.get(tree);
            if (dc != null) {
                print("/**");
                println();
                int pos = 0;
                int endpos = lineEndPos(dc, pos);
                while (pos < dc.length()) {
                    align();
                    print(" *");
                    if (pos < dc.length() && dc.charAt(pos) > ' ')
                        print(" ");
                    print(dc.substring(pos, endpos));
                    println();
                    pos = endpos + 1;
                    endpos = lineEndPos(dc, pos);
                }
                align();
                print(" */");
                println();
                align();
            }
        }
    }

    static int lineEndPos(String s, int start) {
        int pos = s.indexOf('\n', start);
        if (pos < 0)
            pos = s.length();
        return pos;
    }

    /**
      * Print a block.
      */
    public void printBlock(List stats) {
        print("{");
        println();
        indent();
        printStats(stats);
        undent();
        align();
        print("}");
    }

    /**
      * Print unit consisting of package clause and import statements in toplevel,
      *  followed by class definition. if class definition == null,
      *  print all definitions in toplevel.
      *  @param tree     The toplevel tree
      *  @param cdef     The class definition, which is assumed to be part of the
      *                  toplevel tree.
      */
    public void printUnit(TopLevel tree, ClassDef cdef) {
        docComments = tree.docComments;
        printDocComment(tree);
        if (tree.pid != null) {
            print("package ");
            printExpr(tree.pid);
            print(";");
            println();
        }
        for (List l = tree.defs; l.nonEmpty() &&
                (cdef == null || ((Tree) l.head).tag == Tree.IMPORT); l = l.tail) {
            printStat((Tree) l.head);
            println();
        }
        if (cdef != null) {
            printStat(cdef);
            println();
        }
    }

    /**
      * Visitor methods
      */
    public void visitTopLevel(TopLevel tree) {
        printUnit(tree, null);
    }

    public void visitImport(Import tree) {
        print("import ");
        printExpr(tree.qualid);
        print(";");
        println();
    }

    public void visitClassDef(ClassDef tree) {
        println();
        align();
        printDocComment(tree);
        printFlags(tree.flags & ~INTERFACE);
        Name enclClassNamePrev = enclClassName;
        enclClassName = tree.name;
        if ((tree.flags & INTERFACE) != 0) {
            print("interface " + tree.name);
            if (tree.implementing.nonEmpty()) {
                print(" extends ");
                printExprs(tree.implementing);
            }
        } else {
            print("class " + tree.name);
            if (tree.extending != null) {
                print(" extends ");
                printExpr(tree.extending);
            }
            if (tree.implementing.nonEmpty()) {
                print(" implements ");
                printExprs(tree.implementing);
            }
        }
        print(" ");
        printBlock(tree.defs);
        enclClassName = enclClassNamePrev;
    }

    public void visitMethodDef(MethodDef tree) {
        if (tree.name == tree.name.table.init && enclClassName == null &&
                sourceOutput)
            return;
        println();
        align();
        printDocComment(tree);
        printFlags(tree.flags);
        if (tree.name == tree.name.table.init) {
            print(enclClassName != null ? enclClassName.toString() :
                    tree.name.toString());
        } else {
            printExpr(tree.restype);
            print(" " + tree.name);
        }
        print("(");
        printExprs(tree.params);
        print(")");
        if (tree.thrown.nonEmpty()) {
            print(" throws ");
            printExprs(tree.thrown);
        }
        if (tree.body != null) {
            print(" ");
            printStat(tree.body);
        } else {
            print(";");
        }
    }

    public void visitVarDef(VarDef tree) {
        if (docComments != null && docComments.get(tree) != null) {
            println();
            align();
        }
        printDocComment(tree);
        printFlags(tree.flags);
        printExpr(tree.vartype);
        print(" " + tree.name);
        if (tree.init != null) {
            print(" = ");
            printExpr(tree.init);
        }
        if (prec == TreeInfo.notExpression)
            print(";");
    }

    public void visitSkip(Skip tree) {
        print(";");
    }

    public void visitBlock(Block tree) {
        printFlags(tree.flags);
        printBlock(tree.stats);
    }

    public void visitDoLoop(DoLoop tree) {
        print("do ");
        printStat(tree.body);
        align();
        print(" while ");
        if (tree.cond.tag == Tree.PARENS) {
            printExpr(tree.cond);
        } else {
            print("(");
            printExpr(tree.cond);
            print(")");
        }
        print(";");
    }

    public void visitWhileLoop(WhileLoop tree) {
        print("while ");
        if (tree.cond.tag == Tree.PARENS) {
            printExpr(tree.cond);
        } else {
            print("(");
            printExpr(tree.cond);
            print(")");
        }
        print(" ");
        printStat(tree.body);
    }

    public void visitForLoop(ForLoop tree) {
        print("for (");
        if (tree.init.nonEmpty()) {
            if (((Tree) tree.init.head).tag == Tree.VARDEF) {
                printExpr((Tree) tree.init.head);
                for (List l = tree.init.tail; l.nonEmpty(); l = l.tail) {
                    VarDef vdef = (VarDef) l.head;
                    print(", " + vdef.name + " = ");
                    printExpr(vdef.init);
                }
            } else {
                printExprs(tree.init);
            }
        }
        print("; ");
        if (tree.cond != null)
            printExpr(tree.cond);
        print("; ");
        printExprs(tree.step);
        print(") ");
        printStat(tree.body);
    }

    public void visitLabelled(Labelled tree) {
        print(tree.label + ": ");
        printStat(tree.body);
    }

    public void visitSwitch(Switch tree) {
        print("switch ");
        if (tree.selector.tag == Tree.PARENS) {
            printExpr(tree.selector);
        } else {
            print("(");
            printExpr(tree.selector);
            print(")");
        }
        print(" {");
        println();

⌨️ 快捷键说明

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