1 /*
2  * Copyright (c) 2010, 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  */
25 
26 package javax.lang.model.util;
27 
28 import javax.annotation.processing.SupportedSourceVersion;
29 import javax.lang.model.SourceVersion;
30 import javax.lang.model.element.*;
31 import static javax.lang.model.SourceVersion.*;
32 
33 /**
34  * A visitor of program elements based on their {@linkplain
35  * ElementKind kind} with default behavior appropriate for the {@link
36  * SourceVersion#RELEASE_7 RELEASE_7} source version.  For {@linkplain
37  * Element elements} <tt><i>XYZ</i></tt> that may have more than one
38  * kind, the <tt>visit<i>XYZ</i></tt> methods in this class delegate
39  * to the <tt>visit<i>XYZKind</i></tt> method corresponding to the
40  * first argument's kind.  The <tt>visit<i>XYZKind</i></tt> methods
41  * call {@link #defaultAction defaultAction}, passing their arguments
42  * to {@code defaultAction}'s corresponding parameters.
43  *
44  * <p> Methods in this class may be overridden subject to their
45  * general contract.  Note that annotating methods in concrete
46  * subclasses with {@link java.lang.Override @Override} will help
47  * ensure that methods are overridden as intended.
48  *
49  * <p> <b>WARNING:</b> The {@code ElementVisitor} interface
50  * implemented by this class may have methods added to it or the
51  * {@code ElementKind} {@code enum} used in this case may have
52  * constants added to it in the future to accommodate new, currently
53  * unknown, language structures added to future versions of the
54  * Java&trade; programming language.  Therefore, methods whose names
55  * begin with {@code "visit"} may be added to this class in the
56  * future; to avoid incompatibilities, classes which extend this class
57  * should not declare any instance methods with names beginning with
58  * {@code "visit"}.
59  *
60  * <p>When such a new visit method is added, the default
61  * implementation in this class will be to call the {@link
62  * #visitUnknown visitUnknown} method.  A new abstract element kind
63  * visitor class will also be introduced to correspond to the new
64  * language level; this visitor will have different default behavior
65  * for the visit method in question.  When the new visitor is
66  * introduced, all or portions of this visitor may be deprecated.
67  *
68  * <p>Note that adding a default implementation of a new visit method
69  * in a visitor class will occur instead of adding a <em>default
70  * method</em> directly in the visitor interface since a Java SE 8
71  * language feature cannot be used to this version of the API since
72  * this version is required to be runnable on Java SE 7
73  * implementations.  Future versions of the API that are only required
74  * to run on Java SE 8 and later may take advantage of default methods
75  * in this situation.
76  *
77  * @param <R> the return type of this visitor's methods.  Use {@link
78  *            Void} for visitors that do not need to return results.
79  * @param <P> the type of the additional parameter to this visitor's
80  *            methods.  Use {@code Void} for visitors that do not need an
81  *            additional parameter.
82  *
83  * @see ElementKindVisitor6
84  * @see ElementKindVisitor8
85  * @since 1.7
86  */
87 @SupportedSourceVersion(RELEASE_7)
88 public class ElementKindVisitor7<R, P> extends ElementKindVisitor6<R, P> {
89     /**
90      * Constructor for concrete subclasses; uses {@code null} for the
91      * default value.
92      */
ElementKindVisitor7()93     protected ElementKindVisitor7() {
94         super(null);
95     }
96 
97     /**
98      * Constructor for concrete subclasses; uses the argument for the
99      * default value.
100      *
101      * @param defaultValue the value to assign to {@link #DEFAULT_VALUE}
102      */
ElementKindVisitor7(R defaultValue)103     protected ElementKindVisitor7(R defaultValue) {
104         super(defaultValue);
105     }
106 
107     /**
108      * Visits a {@code RESOURCE_VARIABLE} variable element by calling
109      * {@code defaultAction}.
110      *
111      * @param e {@inheritDoc}
112      * @param p {@inheritDoc}
113      * @return  the result of {@code defaultAction}
114      */
115     @Override
visitVariableAsResourceVariable(VariableElement e, P p)116     public R visitVariableAsResourceVariable(VariableElement e, P p) {
117         return defaultAction(e, p);
118     }
119 }
120