langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java
changeset 10 06bc494ca11e
child 5520 86e4b9a9da40
equal deleted inserted replaced
0:fd16c54261b3 10:06bc494ca11e
       
     1 /*
       
     2  * Copyright 2005-2006 Sun Microsystems, Inc.  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.  Sun designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    23  * have any questions.
       
    24  */
       
    25 
       
    26 package javax.lang.model.util;
       
    27 
       
    28 import javax.lang.model.element.*;
       
    29 import javax.annotation.processing.SupportedSourceVersion;
       
    30 import static javax.lang.model.element.ElementKind.*;
       
    31 import javax.lang.model.SourceVersion;
       
    32 import static javax.lang.model.SourceVersion.*;
       
    33 
       
    34 
       
    35 /**
       
    36  * A scanning visitor of program elements with default behavior
       
    37  * appropriate for the {@link SourceVersion#RELEASE_6 RELEASE_6}
       
    38  * source version.  The <tt>visit<i>XYZ</i></tt> methods in this
       
    39  * class scan their component elements by calling {@code scan} on
       
    40  * their {@linkplain Element#getEnclosedElements enclosed elements},
       
    41  * {@linkplain ExecutableElement#getParameters parameters}, etc., as
       
    42  * indicated in the individual method specifications.  A subclass can
       
    43  * control the order elements are visited by overriding the
       
    44  * <tt>visit<i>XYZ</i></tt> methods.  Note that clients of a scanner
       
    45  * may get the desired behavior be invoking {@code v.scan(e, p)} rather
       
    46  * than {@code v.visit(e, p)} on the root objects of interest.
       
    47  *
       
    48  * <p>When a subclass overrides a <tt>visit<i>XYZ</i></tt> method, the
       
    49  * new method can cause the enclosed elements to be scanned in the
       
    50  * default way by calling <tt>super.visit<i>XYZ</i></tt>.  In this
       
    51  * fashion, the concrete visitor can control the ordering of traversal
       
    52  * over the component elements with respect to the additional
       
    53  * processing; for example, consistently calling
       
    54  * <tt>super.visit<i>XYZ</i></tt> at the start of the overridden
       
    55  * methods will yield a preorder traversal, etc.  If the component
       
    56  * elements should be traversed in some other order, instead of
       
    57  * calling <tt>super.visit<i>XYZ</i></tt>, an overriding visit method
       
    58  * should call {@code scan} with the elements in the desired order.
       
    59  *
       
    60  * <p> Methods in this class may be overridden subject to their
       
    61  * general contract.  Note that annotating methods in concrete
       
    62  * subclasses with {@link java.lang.Override @Override} will help
       
    63  * ensure that methods are overridden as intended.
       
    64  *
       
    65  * <p> <b>WARNING:</b> The {@code ElementVisitor} interface
       
    66  * implemented by this class may have methods added to it in the
       
    67  * future to accommodate new, currently unknown, language structures
       
    68  * added to future versions of the Java&trade; programming language.
       
    69  * Therefore, methods whose names begin with {@code "visit"} may be
       
    70  * added to this class in the future; to avoid incompatibilities,
       
    71  * classes which extend this class should not declare any instance
       
    72  * methods with names beginning with {@code "visit"}.
       
    73  *
       
    74  * <p>When such a new visit method is added, the default
       
    75  * implementation in this class will be to call the {@link
       
    76  * #visitUnknown visitUnknown} method.  A new element scanner visitor
       
    77  * class will also be introduced to correspond to the new language
       
    78  * level; this visitor will have different default behavior for the
       
    79  * visit method in question.  When the new visitor is introduced, all
       
    80  * or portions of this visitor may be deprecated.
       
    81  *
       
    82  * @param <R> the return type of this visitor's methods.  Use {@link
       
    83  *            Void} for visitors that do not need to return results.
       
    84  * @param <P> the type of the additional parameter to this visitor's
       
    85  *            methods.  Use {@code Void} for visitors that do not need an
       
    86  *            additional parameter.
       
    87  *
       
    88  * @author Joseph D. Darcy
       
    89  * @author Scott Seligman
       
    90  * @author Peter von der Ah&eacute;
       
    91  * @since 1.6
       
    92  */
       
    93 @SupportedSourceVersion(RELEASE_6)
       
    94 public class ElementScanner6<R, P> extends AbstractElementVisitor6<R, P> {
       
    95     /**
       
    96      * The specified default value.
       
    97      */
       
    98     protected final R DEFAULT_VALUE;
       
    99 
       
   100     /**
       
   101      * Constructor for concrete subclasses; uses {@code null} for the
       
   102      * default value.
       
   103      */
       
   104     protected ElementScanner6(){
       
   105         DEFAULT_VALUE = null;
       
   106     }
       
   107 
       
   108     /**
       
   109      * Constructor for concrete subclasses; uses the argument for the
       
   110      * default value.
       
   111      */
       
   112     protected ElementScanner6(R defaultValue){
       
   113         DEFAULT_VALUE = defaultValue;
       
   114     }
       
   115 
       
   116     /**
       
   117      * Iterates over the given elements and calls {@link
       
   118      * #scan(Element, Object) scan(Element, P)} on each one.  Returns
       
   119      * the result of the last call to {@code scan} or {@code
       
   120      * DEFAULT_VALUE} for an empty iterable.
       
   121      *
       
   122      * @param iterable the elements to scan
       
   123      * @param  p additional parameter
       
   124      * @return the scan of the last element or {@code DEFAULT_VALUE} if no elements
       
   125      */
       
   126     public final R scan(Iterable<? extends Element> iterable, P p) {
       
   127         R result = DEFAULT_VALUE;
       
   128         for(Element e : iterable)
       
   129             result = scan(e, p);
       
   130         return result;
       
   131     }
       
   132 
       
   133     /**
       
   134      * Processes an element by calling {@code e.accept(this, p)};
       
   135      * this method may be overridden by subclasses.
       
   136      * @return the result of visiting {@code e}.
       
   137      */
       
   138     public R scan(Element e, P p) {
       
   139         return e.accept(this, p);
       
   140     }
       
   141 
       
   142     /**
       
   143      * Convenience method equivalent to {@code v.scan(e, null)}.
       
   144      * @return the result of scanning {@code e}.
       
   145      */
       
   146     public final R scan(Element e) {
       
   147         return scan(e, null);
       
   148     }
       
   149 
       
   150     /**
       
   151      * {@inheritDoc} This implementation scans the enclosed elements.
       
   152      *
       
   153      * @param e  the element to visit
       
   154      * @param p  a visitor-specified parameter
       
   155      * @return the result of scanning
       
   156      */
       
   157     public R visitPackage(PackageElement e, P p) {
       
   158         return scan(e.getEnclosedElements(), p);
       
   159     }
       
   160 
       
   161     /**
       
   162      * {@inheritDoc} This implementation scans the enclosed elements.
       
   163      *
       
   164      * @param e  the element to visit
       
   165      * @param p  a visitor-specified parameter
       
   166      * @return the result of scanning
       
   167      */
       
   168     public R visitType(TypeElement e, P p) {
       
   169         return scan(e.getEnclosedElements(), p);
       
   170     }
       
   171 
       
   172     /**
       
   173      * {@inheritDoc} This implementation scans the enclosed elements.
       
   174      *
       
   175      * @param e  the element to visit
       
   176      * @param p  a visitor-specified parameter
       
   177      * @return the result of scanning
       
   178      */
       
   179     public R visitVariable(VariableElement e, P p) {
       
   180         return scan(e.getEnclosedElements(), p);
       
   181     }
       
   182 
       
   183     /**
       
   184      * {@inheritDoc} This implementation scans the parameters.
       
   185      *
       
   186      * @param e  the element to visit
       
   187      * @param p  a visitor-specified parameter
       
   188      * @return the result of scanning
       
   189      */
       
   190     public R visitExecutable(ExecutableElement e, P p) {
       
   191         return scan(e.getParameters(), p);
       
   192     }
       
   193 
       
   194     /**
       
   195      * {@inheritDoc} This implementation scans the enclosed elements.
       
   196      *
       
   197      * @param e  the element to visit
       
   198      * @param p  a visitor-specified parameter
       
   199      * @return the result of scanning
       
   200      */
       
   201     public R visitTypeParameter(TypeParameterElement e, P p) {
       
   202         return scan(e.getEnclosedElements(), p);
       
   203     }
       
   204 }