TypeKindVisitor6.java revision 3884:b6960e2da008
1/*
2 * Copyright (c) 2005, 2017, 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
26package javax.lang.model.util;
27
28import javax.annotation.processing.SupportedSourceVersion;
29import javax.lang.model.SourceVersion;
30import javax.lang.model.type.*;
31import static javax.lang.model.SourceVersion.*;
32
33/**
34 * A visitor of types based on their {@linkplain TypeKind kind} with
35 * default behavior appropriate for the {@link SourceVersion#RELEASE_6
36 * RELEASE_6} source version.  For {@linkplain
37 * TypeMirror types} <code><i>Xyz</i></code> that may have more than one
38 * kind, the <code>visit<i>Xyz</i></code> methods in this class delegate
39 * to the <code>visit<i>Xyz</i>As<i>Kind</i></code> method corresponding to the
40 * first argument's kind.  The <code>visit<i>Xyz</i>As<i>Kind</i></code> 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 TypeVisitor} interface implemented
50 * by this class may have methods added to it in the future to
51 * accommodate new, currently unknown, language structures added to
52 * future versions of the Java&trade; programming language.
53 * Therefore, methods whose names begin with {@code "visit"} may be
54 * added to this class in the future; to avoid incompatibilities,
55 * classes which extend this class should not declare any instance
56 * methods with names beginning with {@code "visit"}.
57 *
58 * <p>When such a new visit method is added, the default
59 * implementation in this class will be to call the {@link
60 * #visitUnknown visitUnknown} method.  A new type kind visitor class
61 * will also be introduced to correspond to the new language level;
62 * this visitor will have different default behavior for the visit
63 * method in question.  When the new visitor is introduced, all or
64 * portions of this visitor may be deprecated.
65 *
66 * @param <R> the return type of this visitor's methods.  Use {@link
67 *            Void} for visitors that do not need to return results.
68 * @param <P> the type of the additional parameter to this visitor's
69 *            methods.  Use {@code Void} for visitors that do not need an
70 *            additional parameter.
71 *
72 * @author Joseph D. Darcy
73 * @author Scott Seligman
74 * @author Peter von der Ah&eacute;
75 *
76 * @see TypeKindVisitor7
77 * @see TypeKindVisitor8
78 * @since 1.6
79 * @deprecated Release 6 is obsolete; update to a visitor for a newer
80 * release level.
81 */
82@Deprecated
83@SupportedSourceVersion(RELEASE_6)
84public class TypeKindVisitor6<R, P> extends SimpleTypeVisitor6<R, P> {
85    /**
86     * Constructor for concrete subclasses to call; uses {@code null}
87     * for the default value.
88     */
89    protected TypeKindVisitor6() {
90        super(null);
91    }
92
93
94    /**
95     * Constructor for concrete subclasses to call; uses the argument
96     * for the default value.
97     *
98     * @param defaultValue the value to assign to {@link #DEFAULT_VALUE}
99     */
100    protected TypeKindVisitor6(R defaultValue) {
101        super(defaultValue);
102    }
103
104    /**
105     * Visits a primitive type, dispatching to the visit method for
106     * the specific {@linkplain TypeKind kind} of primitive type:
107     * {@code BOOLEAN}, {@code BYTE}, etc.
108     *
109     * @param t {@inheritDoc}
110     * @param p {@inheritDoc}
111     * @return  the result of the kind-specific visit method
112     */
113    @Override
114    public R visitPrimitive(PrimitiveType t, P p) {
115        TypeKind k = t.getKind();
116        switch (k) {
117        case BOOLEAN:
118            return visitPrimitiveAsBoolean(t, p);
119
120        case BYTE:
121            return visitPrimitiveAsByte(t, p);
122
123        case SHORT:
124            return visitPrimitiveAsShort(t, p);
125
126        case INT:
127            return visitPrimitiveAsInt(t, p);
128
129        case LONG:
130            return visitPrimitiveAsLong(t, p);
131
132        case CHAR:
133            return visitPrimitiveAsChar(t, p);
134
135        case FLOAT:
136            return visitPrimitiveAsFloat(t, p);
137
138        case DOUBLE:
139            return visitPrimitiveAsDouble(t, p);
140
141        default:
142            throw new AssertionError("Bad kind " + k + " for PrimitiveType" + t);
143        }
144    }
145
146    /**
147     * Visits a {@code BOOLEAN} primitive type by calling
148     * {@code defaultAction}.
149     *
150     * @param t the type to visit
151     * @param p a visitor-specified parameter
152     * @return  the result of {@code defaultAction}
153     */
154    public R visitPrimitiveAsBoolean(PrimitiveType t, P p) {
155        return defaultAction(t, p);
156    }
157
158    /**
159     * Visits a {@code BYTE} primitive type by calling
160     * {@code defaultAction}.
161     *
162     * @param t the type to visit
163     * @param p a visitor-specified parameter
164     * @return  the result of {@code defaultAction}
165     */
166    public R visitPrimitiveAsByte(PrimitiveType t, P p) {
167        return defaultAction(t, p);
168    }
169
170    /**
171     * Visits a {@code SHORT} primitive type by calling
172     * {@code defaultAction}.
173     *
174     * @param t the type to visit
175     * @param p a visitor-specified parameter
176     * @return  the result of {@code defaultAction}
177     */
178    public R visitPrimitiveAsShort(PrimitiveType t, P p) {
179        return defaultAction(t, p);
180    }
181
182    /**
183     * Visits an {@code INT} primitive type by calling
184     * {@code defaultAction}.
185     *
186     * @param t the type to visit
187     * @param p a visitor-specified parameter
188     * @return  the result of {@code defaultAction}
189     */
190    public R visitPrimitiveAsInt(PrimitiveType t, P p) {
191        return defaultAction(t, p);
192    }
193
194    /**
195     * Visits a {@code LONG} primitive type by calling
196     * {@code defaultAction}.
197     *
198     * @param t the type to visit
199     * @param p a visitor-specified parameter
200     * @return  the result of {@code defaultAction}
201     */
202    public R visitPrimitiveAsLong(PrimitiveType t, P p) {
203        return defaultAction(t, p);
204    }
205
206    /**
207     * Visits a {@code CHAR} primitive type by calling
208     * {@code defaultAction}.
209     *
210     * @param t the type to visit
211     * @param p a visitor-specified parameter
212     * @return  the result of {@code defaultAction}
213     */
214    public R visitPrimitiveAsChar(PrimitiveType t, P p) {
215        return defaultAction(t, p);
216    }
217
218    /**
219     * Visits a {@code FLOAT} primitive type by calling
220     * {@code defaultAction}.
221     *
222     * @param t the type to visit
223     * @param p a visitor-specified parameter
224     * @return  the result of {@code defaultAction}
225     */
226    public R visitPrimitiveAsFloat(PrimitiveType t, P p) {
227        return defaultAction(t, p);
228    }
229
230    /**
231     * Visits a {@code DOUBLE} primitive type by calling
232     * {@code defaultAction}.
233     *
234     * @param t the type to visit
235     * @param p a visitor-specified parameter
236     * @return  the result of {@code defaultAction}
237     */
238    public R visitPrimitiveAsDouble(PrimitiveType t, P p) {
239        return defaultAction(t, p);
240    }
241
242    /**
243     * Visits a {@link NoType} instance, dispatching to the visit method for
244     * the specific {@linkplain TypeKind kind} of pseudo-type:
245     * {@code VOID}, {@code PACKAGE}, or {@code NONE}.
246     *
247     * @param t {@inheritDoc}
248     * @param p {@inheritDoc}
249     * @return  the result of the kind-specific visit method
250     */
251    @Override
252    public R visitNoType(NoType t, P p) {
253        TypeKind k = t.getKind();
254        switch (k) {
255        case VOID:
256            return visitNoTypeAsVoid(t, p);
257
258        case PACKAGE:
259            return visitNoTypeAsPackage(t, p);
260
261        case NONE:
262            return visitNoTypeAsNone(t, p);
263
264        default:
265            throw new AssertionError("Bad kind " + k + " for NoType" + t);
266        }
267    }
268
269    /**
270     * Visits a {@link TypeKind#VOID VOID} pseudo-type by calling
271     * {@code defaultAction}.
272     *
273     * @param t the type to visit
274     * @param p a visitor-specified parameter
275     * @return  the result of {@code defaultAction}
276     */
277    public R visitNoTypeAsVoid(NoType t, P p) {
278        return defaultAction(t, p);
279    }
280
281    /**
282     * Visits a {@link TypeKind#PACKAGE PACKAGE} pseudo-type by calling
283     * {@code defaultAction}.
284     *
285     * @param t the type to visit
286     * @param p a visitor-specified parameter
287     * @return  the result of {@code defaultAction}
288     */
289    public R visitNoTypeAsPackage(NoType t, P p) {
290        return defaultAction(t, p);
291    }
292
293    /**
294     * Visits a {@link TypeKind#NONE NONE} pseudo-type by calling
295     * {@code defaultAction}.
296     *
297     * @param t the type to visit
298     * @param p a visitor-specified parameter
299     * @return  the result of {@code defaultAction}
300     */
301    public R visitNoTypeAsNone(NoType t, P p) {
302        return defaultAction(t, p);
303    }
304}
305