src/share/classes/javax/lang/model/util/ElementKindVisitor6.java

Wed, 23 Jan 2013 20:11:07 -0800

author
darcy
date
Wed, 23 Jan 2013 20:11:07 -0800
changeset 1522
09f65aad4759
parent 1054
111bbf1ad913
child 2525
2eb010b6cb22
permissions
-rw-r--r--

8006264: Add explanation of why default methods cannot be used in JDK 8 javax.lang.model
Reviewed-by: jjg

duke@1 1 /*
darcy@1522 2 * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
ohair@554 7 * published by the Free Software Foundation. Oracle designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
ohair@554 9 * by Oracle in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
ohair@554 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@554 22 * or visit www.oracle.com if you need additional information or have any
ohair@554 23 * questions.
duke@1 24 */
duke@1 25
duke@1 26 package javax.lang.model.util;
duke@1 27
duke@1 28 import javax.lang.model.element.*;
duke@1 29 import static javax.lang.model.element.ElementKind.*;
duke@1 30 import javax.annotation.processing.SupportedSourceVersion;
duke@1 31 import static javax.lang.model.SourceVersion.*;
duke@1 32 import javax.lang.model.SourceVersion;
duke@1 33
duke@1 34
duke@1 35 /**
duke@1 36 * A visitor of program elements based on their {@linkplain
duke@1 37 * ElementKind kind} with default behavior appropriate for the {@link
duke@1 38 * SourceVersion#RELEASE_6 RELEASE_6} source version. For {@linkplain
duke@1 39 * Element elements} <tt><i>XYZ</i></tt> that may have more than one
duke@1 40 * kind, the <tt>visit<i>XYZ</i></tt> methods in this class delegate
duke@1 41 * to the <tt>visit<i>XYZKind</i></tt> method corresponding to the
duke@1 42 * first argument's kind. The <tt>visit<i>XYZKind</i></tt> methods
duke@1 43 * call {@link #defaultAction defaultAction}, passing their arguments
duke@1 44 * to {@code defaultAction}'s corresponding parameters.
duke@1 45 *
duke@1 46 * <p> Methods in this class may be overridden subject to their
duke@1 47 * general contract. Note that annotating methods in concrete
duke@1 48 * subclasses with {@link java.lang.Override @Override} will help
duke@1 49 * ensure that methods are overridden as intended.
duke@1 50 *
duke@1 51 * <p> <b>WARNING:</b> The {@code ElementVisitor} interface
duke@1 52 * implemented by this class may have methods added to it or the
duke@1 53 * {@code ElementKind} {@code enum} used in this case may have
duke@1 54 * constants added to it in the future to accommodate new, currently
duke@1 55 * unknown, language structures added to future versions of the
duke@1 56 * Java&trade; programming language. Therefore, methods whose names
duke@1 57 * begin with {@code "visit"} may be added to this class in the
duke@1 58 * future; to avoid incompatibilities, classes which extend this class
duke@1 59 * should not declare any instance methods with names beginning with
duke@1 60 * {@code "visit"}.
duke@1 61 *
duke@1 62 * <p>When such a new visit method is added, the default
duke@1 63 * implementation in this class will be to call the {@link
duke@1 64 * #visitUnknown visitUnknown} method. A new abstract element kind
duke@1 65 * visitor class will also be introduced to correspond to the new
duke@1 66 * language level; this visitor will have different default behavior
duke@1 67 * for the visit method in question. When the new visitor is
duke@1 68 * introduced, all or portions of this visitor may be deprecated.
duke@1 69 *
darcy@1522 70 * <p>Note that adding a default implementation of a new visit method
darcy@1522 71 * in a visitor class will occur instead of adding a <em>default
darcy@1522 72 * method</em> directly in the visitor interface since a Java SE 8
darcy@1522 73 * language feature cannot be used to this version of the API since
darcy@1522 74 * this version is required to be runnable on Java SE 7
darcy@1522 75 * implementations. Future versions of the API that are only required
darcy@1522 76 * to run on Java SE 8 and later may take advantage of default methods
darcy@1522 77 * in this situation.
darcy@1522 78 *
duke@1 79 * @param <R> the return type of this visitor's methods. Use {@link
duke@1 80 * Void} for visitors that do not need to return results.
duke@1 81 * @param <P> the type of the additional parameter to this visitor's
duke@1 82 * methods. Use {@code Void} for visitors that do not need an
duke@1 83 * additional parameter.
duke@1 84 *
duke@1 85 * @author Joseph D. Darcy
duke@1 86 * @author Scott Seligman
duke@1 87 * @author Peter von der Ah&eacute;
darcy@575 88 *
darcy@575 89 * @see ElementKindVisitor7
darcy@1054 90 * @see ElementKindVisitor8
duke@1 91 * @since 1.6
duke@1 92 */
duke@1 93 @SupportedSourceVersion(RELEASE_6)
duke@1 94 public class ElementKindVisitor6<R, P>
duke@1 95 extends SimpleElementVisitor6<R, P> {
duke@1 96 /**
duke@1 97 * Constructor for concrete subclasses; uses {@code null} for the
duke@1 98 * default value.
duke@1 99 */
duke@1 100 protected ElementKindVisitor6() {
duke@1 101 super(null);
duke@1 102 }
duke@1 103
duke@1 104 /**
duke@1 105 * Constructor for concrete subclasses; uses the argument for the
duke@1 106 * default value.
duke@1 107 *
duke@1 108 * @param defaultValue the value to assign to {@link #DEFAULT_VALUE}
duke@1 109 */
duke@1 110 protected ElementKindVisitor6(R defaultValue) {
duke@1 111 super(defaultValue);
duke@1 112 }
duke@1 113
duke@1 114 /**
duke@1 115 * {@inheritDoc}
duke@1 116 *
duke@1 117 * The element argument has kind {@code PACKAGE}.
duke@1 118 *
duke@1 119 * @param e {@inheritDoc}
duke@1 120 * @param p {@inheritDoc}
duke@1 121 * @return {@inheritDoc}
duke@1 122 */
duke@1 123 @Override
duke@1 124 public R visitPackage(PackageElement e, P p) {
duke@1 125 assert e.getKind() == PACKAGE: "Bad kind on PackageElement";
duke@1 126 return defaultAction(e, p);
duke@1 127 }
duke@1 128
duke@1 129 /**
duke@1 130 * Visits a type element, dispatching to the visit method for the
duke@1 131 * specific {@linkplain ElementKind kind} of type, {@code
duke@1 132 * ANNOTATION_TYPE}, {@code CLASS}, {@code ENUM}, or {@code
duke@1 133 * INTERFACE}.
duke@1 134 *
duke@1 135 * @param e {@inheritDoc}
duke@1 136 * @param p {@inheritDoc}
duke@1 137 * @return the result of the kind-specific visit method
duke@1 138 */
duke@1 139 @Override
duke@1 140 public R visitType(TypeElement e, P p) {
duke@1 141 ElementKind k = e.getKind();
duke@1 142 switch(k) {
duke@1 143 case ANNOTATION_TYPE:
duke@1 144 return visitTypeAsAnnotationType(e, p);
duke@1 145
duke@1 146 case CLASS:
duke@1 147 return visitTypeAsClass(e, p);
duke@1 148
duke@1 149 case ENUM:
duke@1 150 return visitTypeAsEnum(e, p);
duke@1 151
duke@1 152 case INTERFACE:
duke@1 153 return visitTypeAsInterface(e, p);
duke@1 154
duke@1 155 default:
duke@1 156 throw new AssertionError("Bad kind " + k + " for TypeElement" + e);
duke@1 157 }
duke@1 158 }
duke@1 159
duke@1 160 /**
duke@1 161 * Visits an {@code ANNOTATION_TYPE} type element by calling
duke@1 162 * {@code defaultAction}.
duke@1 163 *
duke@1 164 * @param e the element to visit
duke@1 165 * @param p a visitor-specified parameter
duke@1 166 * @return the result of {@code defaultAction}
duke@1 167 */
duke@1 168 public R visitTypeAsAnnotationType(TypeElement e, P p) {
duke@1 169 return defaultAction(e, p);
duke@1 170 }
duke@1 171
duke@1 172 /**
duke@1 173 * Visits a {@code CLASS} type element by calling {@code
duke@1 174 * defaultAction}.
duke@1 175 *
duke@1 176 * @param e the element to visit
duke@1 177 * @param p a visitor-specified parameter
duke@1 178 * @return the result of {@code defaultAction}
duke@1 179 */
duke@1 180 public R visitTypeAsClass(TypeElement e, P p) {
duke@1 181 return defaultAction(e, p);
duke@1 182 }
duke@1 183
duke@1 184 /**
duke@1 185 * Visits an {@code ENUM} type element by calling {@code
duke@1 186 * defaultAction}.
duke@1 187 *
duke@1 188 * @param e the element to visit
duke@1 189 * @param p a visitor-specified parameter
duke@1 190 * @return the result of {@code defaultAction}
duke@1 191 */
duke@1 192 public R visitTypeAsEnum(TypeElement e, P p) {
duke@1 193 return defaultAction(e, p);
duke@1 194 }
duke@1 195
duke@1 196 /**
duke@1 197 * Visits an {@code INTERFACE} type element by calling {@code
duke@1 198 * defaultAction}.
duke@1 199 *.
duke@1 200 * @param e the element to visit
duke@1 201 * @param p a visitor-specified parameter
duke@1 202 * @return the result of {@code defaultAction}
duke@1 203 */
duke@1 204 public R visitTypeAsInterface(TypeElement e, P p) {
duke@1 205 return defaultAction(e, p);
duke@1 206 }
duke@1 207
duke@1 208 /**
duke@1 209 * Visits a variable element, dispatching to the visit method for
duke@1 210 * the specific {@linkplain ElementKind kind} of variable, {@code
duke@1 211 * ENUM_CONSTANT}, {@code EXCEPTION_PARAMETER}, {@code FIELD},
darcy@851 212 * {@code LOCAL_VARIABLE}, {@code PARAMETER}, or {@code RESOURCE_VARIABLE}.
darcy@851 213 *
duke@1 214 * @param e {@inheritDoc}
duke@1 215 * @param p {@inheritDoc}
duke@1 216 * @return the result of the kind-specific visit method
duke@1 217 */
duke@1 218 @Override
duke@1 219 public R visitVariable(VariableElement e, P p) {
duke@1 220 ElementKind k = e.getKind();
duke@1 221 switch(k) {
duke@1 222 case ENUM_CONSTANT:
duke@1 223 return visitVariableAsEnumConstant(e, p);
duke@1 224
duke@1 225 case EXCEPTION_PARAMETER:
duke@1 226 return visitVariableAsExceptionParameter(e, p);
duke@1 227
duke@1 228 case FIELD:
duke@1 229 return visitVariableAsField(e, p);
duke@1 230
duke@1 231 case LOCAL_VARIABLE:
duke@1 232 return visitVariableAsLocalVariable(e, p);
duke@1 233
duke@1 234 case PARAMETER:
duke@1 235 return visitVariableAsParameter(e, p);
duke@1 236
darcy@851 237 case RESOURCE_VARIABLE:
darcy@851 238 return visitVariableAsResourceVariable(e, p);
darcy@851 239
duke@1 240 default:
duke@1 241 throw new AssertionError("Bad kind " + k + " for VariableElement" + e);
duke@1 242 }
duke@1 243 }
duke@1 244
duke@1 245 /**
duke@1 246 * Visits an {@code ENUM_CONSTANT} variable element by calling
duke@1 247 * {@code defaultAction}.
duke@1 248 *
duke@1 249 * @param e the element to visit
duke@1 250 * @param p a visitor-specified parameter
duke@1 251 * @return the result of {@code defaultAction}
duke@1 252 */
duke@1 253 public R visitVariableAsEnumConstant(VariableElement e, P p) {
duke@1 254 return defaultAction(e, p);
duke@1 255 }
duke@1 256
duke@1 257 /**
duke@1 258 * Visits an {@code EXCEPTION_PARAMETER} variable element by calling
duke@1 259 * {@code defaultAction}.
duke@1 260 *
duke@1 261 * @param e the element to visit
duke@1 262 * @param p a visitor-specified parameter
duke@1 263 * @return the result of {@code defaultAction}
duke@1 264 */
duke@1 265 public R visitVariableAsExceptionParameter(VariableElement e, P p) {
duke@1 266 return defaultAction(e, p);
duke@1 267 }
duke@1 268
duke@1 269 /**
duke@1 270 * Visits a {@code FIELD} variable element by calling
duke@1 271 * {@code defaultAction}.
duke@1 272 *
duke@1 273 * @param e the element to visit
duke@1 274 * @param p a visitor-specified parameter
duke@1 275 * @return the result of {@code defaultAction}
duke@1 276 */
duke@1 277 public R visitVariableAsField(VariableElement e, P p) {
duke@1 278 return defaultAction(e, p);
duke@1 279 }
duke@1 280
duke@1 281 /**
duke@1 282 * Visits a {@code LOCAL_VARIABLE} variable element by calling
duke@1 283 * {@code defaultAction}.
duke@1 284 *
duke@1 285 * @param e the element to visit
duke@1 286 * @param p a visitor-specified parameter
duke@1 287 * @return the result of {@code defaultAction}
duke@1 288 */
duke@1 289 public R visitVariableAsLocalVariable(VariableElement e, P p) {
duke@1 290 return defaultAction(e, p);
duke@1 291 }
duke@1 292
duke@1 293 /**
duke@1 294 * Visits a {@code PARAMETER} variable element by calling
duke@1 295 * {@code defaultAction}.
duke@1 296 *
duke@1 297 * @param e the element to visit
duke@1 298 * @param p a visitor-specified parameter
duke@1 299 * @return the result of {@code defaultAction}
duke@1 300 */
duke@1 301 public R visitVariableAsParameter(VariableElement e, P p) {
duke@1 302 return defaultAction(e, p);
duke@1 303 }
duke@1 304
duke@1 305 /**
darcy@851 306 * Visits a {@code RESOURCE_VARIABLE} variable element by calling
darcy@851 307 * {@code visitUnknown}.
darcy@851 308 *
darcy@851 309 * @param e the element to visit
darcy@851 310 * @param p a visitor-specified parameter
darcy@851 311 * @return the result of {@code visitUnknown}
darcy@851 312 *
darcy@851 313 * @since 1.7
darcy@851 314 */
darcy@851 315 public R visitVariableAsResourceVariable(VariableElement e, P p) {
darcy@851 316 return visitUnknown(e, p);
darcy@851 317 }
darcy@851 318
darcy@851 319 /**
duke@1 320 * Visits an executable element, dispatching to the visit method
duke@1 321 * for the specific {@linkplain ElementKind kind} of executable,
duke@1 322 * {@code CONSTRUCTOR}, {@code INSTANCE_INIT}, {@code METHOD}, or
duke@1 323 * {@code STATIC_INIT}.
duke@1 324 *
duke@1 325 * @param e {@inheritDoc}
duke@1 326 * @param p {@inheritDoc}
duke@1 327 * @return the result of the kind-specific visit method
duke@1 328 */
duke@1 329 @Override
duke@1 330 public R visitExecutable(ExecutableElement e, P p) {
duke@1 331 ElementKind k = e.getKind();
duke@1 332 switch(k) {
duke@1 333 case CONSTRUCTOR:
duke@1 334 return visitExecutableAsConstructor(e, p);
duke@1 335
duke@1 336 case INSTANCE_INIT:
duke@1 337 return visitExecutableAsInstanceInit(e, p);
duke@1 338
duke@1 339 case METHOD:
duke@1 340 return visitExecutableAsMethod(e, p);
duke@1 341
duke@1 342 case STATIC_INIT:
duke@1 343 return visitExecutableAsStaticInit(e, p);
duke@1 344
duke@1 345 default:
duke@1 346 throw new AssertionError("Bad kind " + k + " for ExecutableElement" + e);
duke@1 347 }
duke@1 348 }
duke@1 349
duke@1 350 /**
duke@1 351 * Visits a {@code CONSTRUCTOR} executable element by calling
duke@1 352 * {@code defaultAction}.
duke@1 353 *
duke@1 354 * @param e the element to visit
duke@1 355 * @param p a visitor-specified parameter
duke@1 356 * @return the result of {@code defaultAction}
duke@1 357 */
duke@1 358 public R visitExecutableAsConstructor(ExecutableElement e, P p) {
duke@1 359 return defaultAction(e, p);
duke@1 360 }
duke@1 361
duke@1 362 /**
duke@1 363 * Visits an {@code INSTANCE_INIT} executable element by calling
duke@1 364 * {@code defaultAction}.
duke@1 365 *
duke@1 366 * @param e the element to visit
duke@1 367 * @param p a visitor-specified parameter
duke@1 368 * @return the result of {@code defaultAction}
duke@1 369 */
duke@1 370 public R visitExecutableAsInstanceInit(ExecutableElement e, P p) {
duke@1 371 return defaultAction(e, p);
duke@1 372 }
duke@1 373
duke@1 374 /**
duke@1 375 * Visits a {@code METHOD} executable element by calling
duke@1 376 * {@code defaultAction}.
duke@1 377 *
duke@1 378 * @param e the element to visit
duke@1 379 * @param p a visitor-specified parameter
duke@1 380 * @return the result of {@code defaultAction}
duke@1 381 */
duke@1 382 public R visitExecutableAsMethod(ExecutableElement e, P p) {
duke@1 383 return defaultAction(e, p);
duke@1 384 }
duke@1 385
duke@1 386 /**
duke@1 387 * Visits a {@code STATIC_INIT} executable element by calling
duke@1 388 * {@code defaultAction}.
duke@1 389 *
duke@1 390 * @param e the element to visit
duke@1 391 * @param p a visitor-specified parameter
duke@1 392 * @return the result of {@code defaultAction}
duke@1 393 */
duke@1 394 public R visitExecutableAsStaticInit(ExecutableElement e, P p) {
duke@1 395 return defaultAction(e, p);
duke@1 396 }
duke@1 397
duke@1 398
duke@1 399 /**
duke@1 400 * {@inheritDoc}
duke@1 401 *
duke@1 402 * The element argument has kind {@code TYPE_PARAMETER}.
duke@1 403 *
duke@1 404 * @param e {@inheritDoc}
duke@1 405 * @param p {@inheritDoc}
duke@1 406 * @return {@inheritDoc}
duke@1 407 */
duke@1 408 @Override
duke@1 409 public R visitTypeParameter(TypeParameterElement e, P p) {
duke@1 410 assert e.getKind() == TYPE_PARAMETER: "Bad kind on TypeParameterElement";
duke@1 411 return defaultAction(e, p);
duke@1 412 }
duke@1 413 }

mercurial