1 /* 2 * Copyright (c) 2010, 2024, 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. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 import java.io.Writer; 25 import java.util.*; 26 import javax.annotation.processing.*; 27 import javax.lang.model.SourceVersion; 28 import javax.lang.model.element.*; 29 import javax.lang.model.type.*; 30 import javax.lang.model.util.*; 31 import static javax.lang.model.SourceVersion.*; 32 33 /** 34 * An abstract annotation processor tailored to {@code javac} regression testing. 35 */ 36 public abstract class JavacTestingAbstractProcessor extends AbstractProcessor { 37 private static final Set<String> allAnnotations = Set.of("*"); 38 39 protected Elements eltUtils; 40 protected Elements elements; 41 protected Types typeUtils; 42 protected Types types; 43 protected Filer filer; 44 protected Messager messager; 45 protected Map<String, String> options; 46 47 /** 48 * Constructor for subclasses to call. 49 */ 50 protected JavacTestingAbstractProcessor() { 51 super(); 52 } 53 54 /** 55 * Return the latest source version. Unless this method is 56 * overridden, an {@code IllegalStateException} will be thrown if a 57 * subclass has a {@code SupportedSourceVersion} annotation. 58 */ 59 @Override 60 public SourceVersion getSupportedSourceVersion() { 61 SupportedSourceVersion ssv = this.getClass().getAnnotation(SupportedSourceVersion.class); 62 if (ssv != null) 63 throw new IllegalStateException("SupportedSourceVersion annotation not supported here."); 64 65 return SourceVersion.latest(); 66 } 67 68 /** 69 * If the processor class is annotated with {@link 70 * SupportedAnnotationTypes}, return an unmodifiable set with the 71 * same set of strings as the annotation. If the class is not so 72 * annotated, a one-element set containing {@code "*"} is returned 73 * to indicate all annotations are processed. 74 * 75 * @return the names of the annotation types supported by this 76 * processor, or an empty set if none 77 */ 78 @Override 79 public Set<String> getSupportedAnnotationTypes() { 80 SupportedAnnotationTypes sat = this.getClass().getAnnotation(SupportedAnnotationTypes.class); 81 if (sat != null) 82 return super.getSupportedAnnotationTypes(); 83 else 84 return allAnnotations; 85 } 86 87 @Override 88 public void init(ProcessingEnvironment processingEnv) { 89 super.init(processingEnv); 90 elements = eltUtils = processingEnv.getElementUtils(); 91 types = typeUtils = processingEnv.getTypeUtils(); 92 filer = processingEnv.getFiler(); 93 messager = processingEnv.getMessager(); 94 options = processingEnv.getOptions(); 95 } 96 97 protected void addExports(String moduleName, String... packageNames) { 98 for (String packageName : packageNames) { 99 try { 100 ModuleLayer layer = ModuleLayer.boot(); 101 Optional<Module> m = layer.findModule(moduleName); 102 if (!m.isPresent()) 103 throw new Error("module not found: " + moduleName); 104 m.get().addExports(packageName, getClass().getModule()); 105 } catch (Exception e) { 106 throw new Error("failed to add exports for " + moduleName + "/" + packageName); 107 } 108 } 109 } 110 111 /* 112 * The set of visitors below will directly extend the most recent 113 * corresponding platform visitor type. 114 */ 115 116 @SupportedSourceVersion(RELEASE_24) 117 @SuppressWarnings("preview") 118 public static abstract class AbstractAnnotationValueVisitor<R, P> extends AbstractAnnotationValueVisitorPreview<R, P> { 119 120 /** 121 * Constructor for concrete subclasses to call. 122 */ 123 protected AbstractAnnotationValueVisitor() { 124 super(); 125 } 126 } 127 128 @SupportedSourceVersion(RELEASE_24) 129 @SuppressWarnings("preview") 130 public static abstract class AbstractElementVisitor<R, P> extends AbstractElementVisitorPreview<R, P> { 131 /** 132 * Constructor for concrete subclasses to call. 133 */ 134 protected AbstractElementVisitor(){ 135 super(); 136 } 137 } 138 139 @SupportedSourceVersion(RELEASE_24) 140 @SuppressWarnings("preview") 141 public static abstract class AbstractTypeVisitor<R, P> extends AbstractTypeVisitorPreview<R, P> { 142 /** 143 * Constructor for concrete subclasses to call. 144 */ 145 protected AbstractTypeVisitor() { 146 super(); 147 } 148 } 149 150 @SupportedSourceVersion(RELEASE_24) 151 @SuppressWarnings("preview") 152 public static class ElementKindVisitor<R, P> extends ElementKindVisitorPreview<R, P> { 153 /** 154 * Constructor for concrete subclasses; uses {@code null} for the 155 * default value. 156 */ 157 protected ElementKindVisitor() { 158 super(null); 159 } 160 161 /** 162 * Constructor for concrete subclasses; uses the argument for the 163 * default value. 164 * 165 * @param defaultValue the value to assign to {@link #DEFAULT_VALUE} 166 */ 167 protected ElementKindVisitor(R defaultValue) { 168 super(defaultValue); 169 } 170 } 171 172 @SupportedSourceVersion(RELEASE_24) 173 @SuppressWarnings("preview") 174 public static class ElementScanner<R, P> extends ElementScannerPreview<R, P> { 175 /** 176 * Constructor for concrete subclasses; uses {@code null} for the 177 * default value. 178 */ 179 protected ElementScanner(){ 180 super(null); 181 } 182 183 /** 184 * Constructor for concrete subclasses; uses the argument for the 185 * default value. 186 */ 187 protected ElementScanner(R defaultValue){ 188 super(defaultValue); 189 } 190 } 191 192 @SupportedSourceVersion(RELEASE_24) 193 @SuppressWarnings("preview") 194 public static class SimpleAnnotationValueVisitor<R, P> extends SimpleAnnotationValueVisitorPreview<R, P> { 195 /** 196 * Constructor for concrete subclasses; uses {@code null} for the 197 * default value. 198 */ 199 protected SimpleAnnotationValueVisitor() { 200 super(null); 201 } 202 203 /** 204 * Constructor for concrete subclasses; uses the argument for the 205 * default value. 206 * 207 * @param defaultValue the value to assign to {@link #DEFAULT_VALUE} 208 */ 209 protected SimpleAnnotationValueVisitor(R defaultValue) { 210 super(defaultValue); 211 } 212 } 213 214 @SupportedSourceVersion(RELEASE_24) 215 @SuppressWarnings("preview") 216 public static class SimpleElementVisitor<R, P> extends SimpleElementVisitorPreview<R, P> { 217 /** 218 * Constructor for concrete subclasses; uses {@code null} for the 219 * default value. 220 */ 221 protected SimpleElementVisitor(){ 222 super(null); 223 } 224 225 /** 226 * Constructor for concrete subclasses; uses the argument for the 227 * default value. 228 * 229 * @param defaultValue the value to assign to {@link #DEFAULT_VALUE} 230 */ 231 protected SimpleElementVisitor(R defaultValue){ 232 super(defaultValue); 233 } 234 } 235 236 @SupportedSourceVersion(RELEASE_24) 237 @SuppressWarnings("preview") 238 public static class SimpleTypeVisitor<R, P> extends SimpleTypeVisitorPreview<R, P> { 239 /** 240 * Constructor for concrete subclasses; uses {@code null} for the 241 * default value. 242 */ 243 protected SimpleTypeVisitor(){ 244 super(null); 245 } 246 247 /** 248 * Constructor for concrete subclasses; uses the argument for the 249 * default value. 250 * 251 * @param defaultValue the value to assign to {@link #DEFAULT_VALUE} 252 */ 253 protected SimpleTypeVisitor(R defaultValue){ 254 super(defaultValue); 255 } 256 } 257 258 @SupportedSourceVersion(RELEASE_24) 259 @SuppressWarnings("preview") 260 public static class TypeKindVisitor<R, P> extends TypeKindVisitorPreview<R, P> { 261 /** 262 * Constructor for concrete subclasses to call; uses {@code null} 263 * for the default value. 264 */ 265 protected TypeKindVisitor() { 266 super(null); 267 } 268 269 /** 270 * Constructor for concrete subclasses to call; uses the argument 271 * for the default value. 272 * 273 * @param defaultValue the value to assign to {@link #DEFAULT_VALUE} 274 */ 275 protected TypeKindVisitor(R defaultValue) { 276 super(defaultValue); 277 } 278 } 279 280 /** 281 * Vacuous implementation of javax.lang.model.util.Elements to aid 282 * in test development. Methods with defaults in the interface are 283 * *not* overridden to allow them to be tested. 284 */ 285 public static class VacuousElements implements Elements { 286 public VacuousElements() {} 287 288 @Override 289 public PackageElement getPackageElement(CharSequence name) {return null;} 290 291 @Override 292 public TypeElement getTypeElement(CharSequence name) {return null;} 293 294 @Override 295 public Map<? extends ExecutableElement, ? extends AnnotationValue> 296 getElementValuesWithDefaults(AnnotationMirror a) {return null;} 297 @Override 298 public String getDocComment(Element e) {return null;} 299 300 @Override 301 public boolean isDeprecated(Element e) {return false;} 302 303 @Override 304 public Name getBinaryName(TypeElement type) {return null;} 305 306 @Override 307 public PackageElement getPackageOf(Element e) {return null;} 308 309 @Override 310 public List<? extends Element> getAllMembers(TypeElement type) {return null;} 311 312 @Override 313 public List<? extends AnnotationMirror> getAllAnnotationMirrors(Element e) {return null;} 314 315 @Override 316 public boolean hides(Element hider, Element hidden) {return false;} 317 318 @Override 319 public boolean overrides(ExecutableElement overrider, 320 ExecutableElement overridden, 321 TypeElement type) {return false;} 322 323 @Override 324 public String getConstantExpression(Object value) {return null;} 325 326 @Override 327 public void printElements(Writer w, Element... elements) {} 328 329 @Override 330 public Name getName(CharSequence cs) {return null;} 331 332 @Override 333 public boolean isFunctionalInterface(TypeElement type) {return false;} 334 } 335 336 /** 337 * Vacuous implementation of javax.lang.model.util.Types to aid 338 * in test development. Methods with defaults in the interface are 339 * *not* overridden to allow them to be tested. 340 */ 341 public static class VacuousTypes implements Types { 342 public VacuousTypes() {} 343 344 @Override 345 public Element asElement(TypeMirror t) {return null;} 346 347 @Override 348 public boolean isSameType(TypeMirror t1, TypeMirror t2) {return false;} 349 350 @Override 351 public boolean isSubtype(TypeMirror t1, TypeMirror t2) {return false;}; 352 353 @Override 354 public boolean isAssignable(TypeMirror t1, TypeMirror t2) {return false;}; 355 356 @Override 357 public boolean contains(TypeMirror t1, TypeMirror t2) {return false;}; 358 359 @Override 360 public boolean isSubsignature(ExecutableType m1, ExecutableType m2) {return false;} 361 362 @Override 363 public List<? extends TypeMirror> directSupertypes(TypeMirror t) {return null;} 364 365 @Override 366 public TypeMirror erasure(TypeMirror t) {return null;} 367 368 @Override 369 public TypeElement boxedClass(PrimitiveType p) {return null;} 370 371 @Override 372 public PrimitiveType unboxedType(TypeMirror t) {return null;} 373 374 @Override 375 public TypeMirror capture(TypeMirror t) {return null;} 376 377 @Override 378 public PrimitiveType getPrimitiveType(TypeKind kind) {return null;} 379 380 @Override 381 public NullType getNullType() {return null;} 382 383 @Override 384 public NoType getNoType(TypeKind kind) {return null;} 385 386 @Override 387 public ArrayType getArrayType(TypeMirror componentType) {return null;} 388 389 @Override 390 public WildcardType getWildcardType(TypeMirror extendsBound, 391 TypeMirror superBound) {return null;} 392 393 @Override 394 public DeclaredType getDeclaredType(TypeElement typeElem, TypeMirror... typeArgs) {return null;} 395 396 397 @Override 398 public DeclaredType getDeclaredType(DeclaredType containing, 399 TypeElement typeElem, TypeMirror... typeArgs) {return null;} 400 401 @Override 402 public TypeMirror asMemberOf(DeclaredType containing, Element element) {return null;} 403 } 404 }