TypeVisitor.java revision 3884:b6960e2da008
1145256Sjkoshy/* 2145256Sjkoshy * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. 3145256Sjkoshy * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4145256Sjkoshy * 5145256Sjkoshy * This code is free software; you can redistribute it and/or modify it 6145256Sjkoshy * under the terms of the GNU General Public License version 2 only, as 7145256Sjkoshy * published by the Free Software Foundation. Oracle designates this 8145256Sjkoshy * particular file as subject to the "Classpath" exception as provided 9145256Sjkoshy * by Oracle in the LICENSE file that accompanied this code. 10145256Sjkoshy * 11145256Sjkoshy * This code is distributed in the hope that it will be useful, but WITHOUT 12145256Sjkoshy * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13145256Sjkoshy * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14145256Sjkoshy * version 2 for more details (a copy is included in the LICENSE file that 15145256Sjkoshy * accompanied this code). 16145256Sjkoshy * 17145256Sjkoshy * You should have received a copy of the GNU General Public License version 18145256Sjkoshy * 2 along with this work; if not, write to the Free Software Foundation, 19145256Sjkoshy * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20145256Sjkoshy * 21145256Sjkoshy * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22145256Sjkoshy * or visit www.oracle.com if you need additional information or have any 23145256Sjkoshy * questions. 24145256Sjkoshy */ 25145256Sjkoshy 26145256Sjkoshypackage javax.lang.model.type; 27145256Sjkoshy 28145256Sjkoshyimport javax.lang.model.element.*; 29145256Sjkoshy 30145256Sjkoshy/** 31145256Sjkoshy * A visitor of types, in the style of the 32190395Sfabient * visitor design pattern. Classes implementing this 33145256Sjkoshy * interface are used to operate on a type when the kind of 34145256Sjkoshy * type is unknown at compile time. When a visitor is passed to a 35145256Sjkoshy * type's {@link TypeMirror#accept accept} method, the <code>visit<i>Xyz</i></code> 36147191Sjkoshy * method most applicable to that type is invoked. 37147191Sjkoshy * 38147191Sjkoshy * <p> Classes implementing this interface may or may not throw a 39294046Sjtl * {@code NullPointerException} if the additional parameter {@code p} 40294046Sjtl * is {@code null}; see documentation of the implementing class for 41294046Sjtl * details. 42294046Sjtl * 43294046Sjtl * <p> <b>WARNING:</b> It is possible that methods will be added to 44294046Sjtl * this interface to accommodate new, currently unknown, language 45294046Sjtl * structures added to future versions of the Java™ programming 46294046Sjtl * language. Therefore, visitor classes directly implementing this 47294046Sjtl * interface may be source incompatible with future versions of the 48147191Sjkoshy * platform. To avoid this source incompatibility, visitor 49147191Sjkoshy * implementations are encouraged to instead extend the appropriate 50147191Sjkoshy * abstract visitor class that implements this interface. However, an 51147191Sjkoshy * API should generally use this visitor interface as the type for 52147191Sjkoshy * parameters, return type, etc. rather than one of the abstract 53147191Sjkoshy * classes. 54147191Sjkoshy * 55147191Sjkoshy * <p>Note that methods to accommodate new language constructs could 56147191Sjkoshy * be added in a source <em>compatible</em> way if they were added as 57147191Sjkoshy * <em>default methods</em>. However, default methods are only 58147191Sjkoshy * available on Java SE 8 and higher releases and the {@code 59147191Sjkoshy * javax.lang.model.*} packages bundled in Java SE 8 were required to 60147191Sjkoshy * also be runnable on Java SE 7. Therefore, default methods 61147191Sjkoshy * were <em>not</em> used when extending {@code javax.lang.model.*} 62147191Sjkoshy * to cover Java SE 8 language features. However, default methods may 63147191Sjkoshy * be used in subsequent revisions of the {@code javax.lang.model.*} 64147191Sjkoshy * packages that are only required to run on Java SE 8 and higher 65147191Sjkoshy * platform versions. 66147191Sjkoshy * 67147191Sjkoshy * @param <R> the return type of this visitor's methods. Use {@link 68147191Sjkoshy * Void} for visitors that do not need to return results. 69147191Sjkoshy * @param <P> the type of the additional parameter to this visitor's 70145256Sjkoshy * methods. Use {@code Void} for visitors that do not need an 71145256Sjkoshy * additional parameter. 72145256Sjkoshy * 73190395Sfabient * @author Joseph D. Darcy 74145256Sjkoshy * @author Scott Seligman 75145256Sjkoshy * @author Peter von der Ahé 76145256Sjkoshy * @since 1.6 77145774Sjkoshy */ 78145256Sjkoshypublic interface TypeVisitor<R, P> { 79147191Sjkoshy /** 80226514Sfabient * Visits a type. 81145256Sjkoshy * @param t the type to visit 82145256Sjkoshy * @param p a visitor-specified parameter 83145256Sjkoshy * @return a visitor-specified result 84147191Sjkoshy */ 85147191Sjkoshy R visit(TypeMirror t, P p); 86145256Sjkoshy 87145256Sjkoshy /** 88145256Sjkoshy * A convenience method equivalent to {@code v.visit(t, null)}. 89145256Sjkoshy * @param t the element to visit 90145256Sjkoshy * @return a visitor-specified result 91145256Sjkoshy */ 92145256Sjkoshy R visit(TypeMirror t); 93145774Sjkoshy 94145256Sjkoshy /** 95147191Sjkoshy * Visits a primitive type. 96145256Sjkoshy * @param t the type to visit 97145256Sjkoshy * @param p a visitor-specified parameter 98145256Sjkoshy * @return a visitor-specified result 99147191Sjkoshy */ 100147191Sjkoshy R visitPrimitive(PrimitiveType t, P p); 101145256Sjkoshy 102233321Sjkoshy /** 103145256Sjkoshy * Visits the null type. 104145256Sjkoshy * @param t the type to visit 105145256Sjkoshy * @param p a visitor-specified parameter 106145256Sjkoshy * @return a visitor-specified result 107145256Sjkoshy */ 108145256Sjkoshy R visitNull(NullType t, P p); 109145256Sjkoshy 110145256Sjkoshy /** 111145256Sjkoshy * Visits an array type. 112190395Sfabient * @param t the type to visit 113145256Sjkoshy * @param p a visitor-specified parameter 114145256Sjkoshy * @return a visitor-specified result 115 */ 116 R visitArray(ArrayType t, P p); 117 118 /** 119 * Visits a declared type. 120 * @param t the type to visit 121 * @param p a visitor-specified parameter 122 * @return a visitor-specified result 123 */ 124 R visitDeclared(DeclaredType t, P p); 125 126 /** 127 * Visits an error type. 128 * @param t the type to visit 129 * @param p a visitor-specified parameter 130 * @return a visitor-specified result 131 */ 132 R visitError(ErrorType t, P p); 133 134 /** 135 * Visits a type variable. 136 * @param t the type to visit 137 * @param p a visitor-specified parameter 138 * @return a visitor-specified result 139 */ 140 R visitTypeVariable(TypeVariable t, P p); 141 142 /** 143 * Visits a wildcard type. 144 * @param t the type to visit 145 * @param p a visitor-specified parameter 146 * @return a visitor-specified result 147 */ 148 R visitWildcard(WildcardType t, P p); 149 150 /** 151 * Visits an executable type. 152 * @param t the type to visit 153 * @param p a visitor-specified parameter 154 * @return a visitor-specified result 155 */ 156 R visitExecutable(ExecutableType t, P p); 157 158 /** 159 * Visits a {@link NoType} instance. 160 * @param t the type to visit 161 * @param p a visitor-specified parameter 162 * @return a visitor-specified result 163 */ 164 R visitNoType(NoType t, P p); 165 166 /** 167 * Visits an unknown kind of type. 168 * This can occur if the language evolves and new kinds 169 * of types are added to the {@code TypeMirror} hierarchy. 170 * @param t the type to visit 171 * @param p a visitor-specified parameter 172 * @return a visitor-specified result 173 * @throws UnknownTypeException 174 * a visitor implementation may optionally throw this exception 175 */ 176 R visitUnknown(TypeMirror t, P p); 177 178 /** 179 * Visits a union type. 180 * 181 * @param t the type to visit 182 * @param p a visitor-specified parameter 183 * @return a visitor-specified result 184 * @since 1.7 185 */ 186 R visitUnion(UnionType t, P p); 187 188 /** 189 * Visits an intersection type. 190 * 191 * @param t the type to visit 192 * @param p a visitor-specified parameter 193 * @return a visitor-specified result 194 * @since 1.8 195 */ 196 R visitIntersection(IntersectionType t, P p); 197} 198