src/share/classes/com/sun/source/util/TreeScanner.java

Wed, 27 Apr 2016 01:34:52 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:34:52 +0800
changeset 0
959103a6100f
child 2525
2eb010b6cb22
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/langtools/
changeset: 2573:53ca196be1ae
tag: jdk8u25-b17

     1 /*
     2  * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package com.sun.source.util;
    28 import com.sun.source.tree.*;
    30 /**
    31  * A TreeVisitor that visits all the child tree nodes.
    32  * To visit nodes of a particular type, just override the
    33  * corresponding visitXYZ method.
    34  * Inside your method, call super.visitXYZ to visit descendant
    35  * nodes.
    36  *
    37  * <p>The default implementation of the visitXYZ methods will determine
    38  * a result as follows:
    39  * <ul>
    40  * <li>If the node being visited has no children, the result will be null.
    41  * <li>If the node being visited has one child, the result will be the
    42  * result of calling {@code scan} on that child. The child may be a simple node
    43  * or itself a list of nodes.
    44  * <li> If the node being visited has more than one child, the result will
    45  * be determined by calling {@code scan} each child in turn, and then combining the
    46  * result of each scan after the first with the cumulative result
    47  * so far, as determined by the {@link #reduce} method. Each child may be either
    48  * a simple node of a list of nodes. The default behavior of the {@code reduce}
    49  * method is such that the result of the visitXYZ method will be the result of
    50  * the last child scanned.
    51  * </ul>
    52  *
    53  * <p>Here is an example to count the number of identifier nodes in a tree:
    54  * <pre>
    55  *   class CountIdentifiers extends TreeScanner&lt;Integer,Void&gt; {
    56  *      {@literal @}Override
    57  *      public Integer visitIdentifier(IdentifierTree node, Void p) {
    58  *          return 1;
    59  *      }
    60  *      {@literal @}Override
    61  *      public Integer reduce(Integer r1, Integer r2) {
    62  *          return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2);
    63  *      }
    64  *   }
    65  * </pre>
    66  *
    67  * @author Peter von der Ah&eacute;
    68  * @author Jonathan Gibbons
    69  * @since 1.6
    70  */
    71 @jdk.Exported
    72 public class TreeScanner<R,P> implements TreeVisitor<R,P> {
    74     /** Scan a single node.
    75      */
    76     public R scan(Tree node, P p) {
    77         return (node == null) ? null : node.accept(this, p);
    78     }
    80     private R scanAndReduce(Tree node, P p, R r) {
    81         return reduce(scan(node, p), r);
    82     }
    84     /** Scan a list of nodes.
    85      */
    86     public R scan(Iterable<? extends Tree> nodes, P p) {
    87         R r = null;
    88         if (nodes != null) {
    89             boolean first = true;
    90             for (Tree node : nodes) {
    91                 r = (first ? scan(node, p) : scanAndReduce(node, p, r));
    92                 first = false;
    93             }
    94         }
    95         return r;
    96     }
    98     private R scanAndReduce(Iterable<? extends Tree> nodes, P p, R r) {
    99         return reduce(scan(nodes, p), r);
   100     }
   102     /**
   103      * Reduces two results into a combined result.
   104      * The default implementation is to return the first parameter.
   105      * The general contract of the method is that it may take any action whatsoever.
   106      */
   107     public R reduce(R r1, R r2) {
   108         return r1;
   109     }
   112 /* ***************************************************************************
   113  * Visitor methods
   114  ****************************************************************************/
   116     public R visitCompilationUnit(CompilationUnitTree node, P p) {
   117         R r = scan(node.getPackageAnnotations(), p);
   118         r = scanAndReduce(node.getPackageName(), p, r);
   119         r = scanAndReduce(node.getImports(), p, r);
   120         r = scanAndReduce(node.getTypeDecls(), p, r);
   121         return r;
   122     }
   124     public R visitImport(ImportTree node, P p) {
   125         return scan(node.getQualifiedIdentifier(), p);
   126     }
   128     public R visitClass(ClassTree node, P p) {
   129         R r = scan(node.getModifiers(), p);
   130         r = scanAndReduce(node.getTypeParameters(), p, r);
   131         r = scanAndReduce(node.getExtendsClause(), p, r);
   132         r = scanAndReduce(node.getImplementsClause(), p, r);
   133         r = scanAndReduce(node.getMembers(), p, r);
   134         return r;
   135     }
   137     public R visitMethod(MethodTree node, P p) {
   138         R r = scan(node.getModifiers(), p);
   139         r = scanAndReduce(node.getReturnType(), p, r);
   140         r = scanAndReduce(node.getTypeParameters(), p, r);
   141         r = scanAndReduce(node.getParameters(), p, r);
   142         r = scanAndReduce(node.getReceiverParameter(), p, r);
   143         r = scanAndReduce(node.getThrows(), p, r);
   144         r = scanAndReduce(node.getBody(), p, r);
   145         r = scanAndReduce(node.getDefaultValue(), p, r);
   146         return r;
   147     }
   149     public R visitVariable(VariableTree node, P p) {
   150         R r = scan(node.getModifiers(), p);
   151         r = scanAndReduce(node.getType(), p, r);
   152         r = scanAndReduce(node.getNameExpression(), p, r);
   153         r = scanAndReduce(node.getInitializer(), p, r);
   154         return r;
   155     }
   157     public R visitEmptyStatement(EmptyStatementTree node, P p) {
   158         return null;
   159     }
   161     public R visitBlock(BlockTree node, P p) {
   162         return scan(node.getStatements(), p);
   163     }
   165     public R visitDoWhileLoop(DoWhileLoopTree node, P p) {
   166         R r = scan(node.getStatement(), p);
   167         r = scanAndReduce(node.getCondition(), p, r);
   168         return r;
   169     }
   171     public R visitWhileLoop(WhileLoopTree node, P p) {
   172         R r = scan(node.getCondition(), p);
   173         r = scanAndReduce(node.getStatement(), p, r);
   174         return r;
   175     }
   177     public R visitForLoop(ForLoopTree node, P p) {
   178         R r = scan(node.getInitializer(), p);
   179         r = scanAndReduce(node.getCondition(), p, r);
   180         r = scanAndReduce(node.getUpdate(), p, r);
   181         r = scanAndReduce(node.getStatement(), p, r);
   182         return r;
   183     }
   185     public R visitEnhancedForLoop(EnhancedForLoopTree node, P p) {
   186         R r = scan(node.getVariable(), p);
   187         r = scanAndReduce(node.getExpression(), p, r);
   188         r = scanAndReduce(node.getStatement(), p, r);
   189         return r;
   190     }
   192     public R visitLabeledStatement(LabeledStatementTree node, P p) {
   193         return scan(node.getStatement(), p);
   194     }
   196     public R visitSwitch(SwitchTree node, P p) {
   197         R r = scan(node.getExpression(), p);
   198         r = scanAndReduce(node.getCases(), p, r);
   199         return r;
   200     }
   202     public R visitCase(CaseTree node, P p) {
   203         R r = scan(node.getExpression(), p);
   204         r = scanAndReduce(node.getStatements(), p, r);
   205         return r;
   206     }
   208     public R visitSynchronized(SynchronizedTree node, P p) {
   209         R r = scan(node.getExpression(), p);
   210         r = scanAndReduce(node.getBlock(), p, r);
   211         return r;
   212     }
   214     public R visitTry(TryTree node, P p) {
   215         R r = scan(node.getResources(), p);
   216         r = scanAndReduce(node.getBlock(), p, r);
   217         r = scanAndReduce(node.getCatches(), p, r);
   218         r = scanAndReduce(node.getFinallyBlock(), p, r);
   219         return r;
   220     }
   222     public R visitCatch(CatchTree node, P p) {
   223         R r = scan(node.getParameter(), p);
   224         r = scanAndReduce(node.getBlock(), p, r);
   225         return r;
   226     }
   228     public R visitConditionalExpression(ConditionalExpressionTree node, P p) {
   229         R r = scan(node.getCondition(), p);
   230         r = scanAndReduce(node.getTrueExpression(), p, r);
   231         r = scanAndReduce(node.getFalseExpression(), p, r);
   232         return r;
   233     }
   235     public R visitIf(IfTree node, P p) {
   236         R r = scan(node.getCondition(), p);
   237         r = scanAndReduce(node.getThenStatement(), p, r);
   238         r = scanAndReduce(node.getElseStatement(), p, r);
   239         return r;
   240     }
   242     public R visitExpressionStatement(ExpressionStatementTree node, P p) {
   243         return scan(node.getExpression(), p);
   244     }
   246     public R visitBreak(BreakTree node, P p) {
   247         return null;
   248     }
   250     public R visitContinue(ContinueTree node, P p) {
   251         return null;
   252     }
   254     public R visitReturn(ReturnTree node, P p) {
   255         return scan(node.getExpression(), p);
   256     }
   258     public R visitThrow(ThrowTree node, P p) {
   259         return scan(node.getExpression(), p);
   260     }
   262     public R visitAssert(AssertTree node, P p) {
   263         R r = scan(node.getCondition(), p);
   264         r = scanAndReduce(node.getDetail(), p, r);
   265         return r;
   266     }
   268     public R visitMethodInvocation(MethodInvocationTree node, P p) {
   269         R r = scan(node.getTypeArguments(), p);
   270         r = scanAndReduce(node.getMethodSelect(), p, r);
   271         r = scanAndReduce(node.getArguments(), p, r);
   272         return r;
   273     }
   275     public R visitNewClass(NewClassTree node, P p) {
   276         R r = scan(node.getEnclosingExpression(), p);
   277         r = scanAndReduce(node.getIdentifier(), p, r);
   278         r = scanAndReduce(node.getTypeArguments(), p, r);
   279         r = scanAndReduce(node.getArguments(), p, r);
   280         r = scanAndReduce(node.getClassBody(), p, r);
   281         return r;
   282     }
   284     public R visitNewArray(NewArrayTree node, P p) {
   285         R r = scan(node.getType(), p);
   286         r = scanAndReduce(node.getDimensions(), p, r);
   287         r = scanAndReduce(node.getInitializers(), p, r);
   288         r = scanAndReduce(node.getAnnotations(), p, r);
   289         for (Iterable< ? extends Tree> dimAnno : node.getDimAnnotations()) {
   290             r = scanAndReduce(dimAnno, p, r);
   291         }
   292         return r;
   293     }
   295     public R visitLambdaExpression(LambdaExpressionTree node, P p) {
   296         R r = scan(node.getParameters(), p);
   297         r = scanAndReduce(node.getBody(), p, r);
   298         return r;
   299     }
   301     public R visitParenthesized(ParenthesizedTree node, P p) {
   302         return scan(node.getExpression(), p);
   303     }
   305     public R visitAssignment(AssignmentTree node, P p) {
   306         R r = scan(node.getVariable(), p);
   307         r = scanAndReduce(node.getExpression(), p, r);
   308         return r;
   309     }
   311     public R visitCompoundAssignment(CompoundAssignmentTree node, P p) {
   312         R r = scan(node.getVariable(), p);
   313         r = scanAndReduce(node.getExpression(), p, r);
   314         return r;
   315     }
   317     public R visitUnary(UnaryTree node, P p) {
   318         return scan(node.getExpression(), p);
   319     }
   321     public R visitBinary(BinaryTree node, P p) {
   322         R r = scan(node.getLeftOperand(), p);
   323         r = scanAndReduce(node.getRightOperand(), p, r);
   324         return r;
   325     }
   327     public R visitTypeCast(TypeCastTree node, P p) {
   328         R r = scan(node.getType(), p);
   329         r = scanAndReduce(node.getExpression(), p, r);
   330         return r;
   331     }
   333     public R visitInstanceOf(InstanceOfTree node, P p) {
   334         R r = scan(node.getExpression(), p);
   335         r = scanAndReduce(node.getType(), p, r);
   336         return r;
   337     }
   339     public R visitArrayAccess(ArrayAccessTree node, P p) {
   340         R r = scan(node.getExpression(), p);
   341         r = scanAndReduce(node.getIndex(), p, r);
   342         return r;
   343     }
   345     public R visitMemberSelect(MemberSelectTree node, P p) {
   346         return scan(node.getExpression(), p);
   347     }
   349     public R visitMemberReference(MemberReferenceTree node, P p) {
   350         R r = scan(node.getQualifierExpression(), p);
   351         r = scanAndReduce(node.getTypeArguments(), p, r);
   352         return r;
   353     }
   355     public R visitIdentifier(IdentifierTree node, P p) {
   356         return null;
   357     }
   359     public R visitLiteral(LiteralTree node, P p) {
   360         return null;
   361     }
   363     public R visitPrimitiveType(PrimitiveTypeTree node, P p) {
   364         return null;
   365     }
   367     public R visitArrayType(ArrayTypeTree node, P p) {
   368         return scan(node.getType(), p);
   369     }
   371     public R visitParameterizedType(ParameterizedTypeTree node, P p) {
   372         R r = scan(node.getType(), p);
   373         r = scanAndReduce(node.getTypeArguments(), p, r);
   374         return r;
   375     }
   377     public R visitUnionType(UnionTypeTree node, P p) {
   378         return scan(node.getTypeAlternatives(), p);
   379     }
   381     public R visitIntersectionType(IntersectionTypeTree node, P p) {
   382         return scan(node.getBounds(), p);
   383     }
   385     public R visitTypeParameter(TypeParameterTree node, P p) {
   386         R r = scan(node.getAnnotations(), p);
   387         r = scanAndReduce(node.getBounds(), p, r);
   388         return r;
   389     }
   391     public R visitWildcard(WildcardTree node, P p) {
   392         return scan(node.getBound(), p);
   393     }
   395     public R visitModifiers(ModifiersTree node, P p) {
   396         return scan(node.getAnnotations(), p);
   397     }
   399     public R visitAnnotation(AnnotationTree node, P p) {
   400         R r = scan(node.getAnnotationType(), p);
   401         r = scanAndReduce(node.getArguments(), p, r);
   402         return r;
   403     }
   405    public R visitAnnotatedType(AnnotatedTypeTree node, P p) {
   406        R r = scan(node.getAnnotations(), p);
   407        r = scanAndReduce(node.getUnderlyingType(), p, r);
   408        return r;
   409    }
   411     public R visitOther(Tree node, P p) {
   412         return null;
   413     }
   415     public R visitErroneous(ErroneousTree node, P p) {
   416         return null;
   417     }
   418 }

mercurial