1 /*
2 * Copyright (c) 2010, 2025, 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_26)
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_26)
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_26)
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_26)
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_26)
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_26)
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_26)
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_26)
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_26)
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 }
--- EOF ---