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                 // removing dependency on java.util.Optional, valhalla only, to avoid VM warnings
102                 Module m = layer.findModule(moduleName).get();
103                 if (m == null)
104                     throw new Error("module not found: " + moduleName);
105                 m.addExports(packageName, getClass().getModule());
106             } catch (Exception e) {
107                 throw new Error("failed to add exports for " + moduleName + "/" + packageName);
108             }
109         }
110     }
111 
112     /*
113      * The set of visitors below will directly extend the most recent
114      * corresponding platform visitor type.
115      */
116 
117     @SupportedSourceVersion(RELEASE_24)
118     @SuppressWarnings("preview")
119     public static abstract class AbstractAnnotationValueVisitor<R, P> extends AbstractAnnotationValueVisitorPreview<R, P> {
120 
121         /**
122          * Constructor for concrete subclasses to call.
123          */
124         protected AbstractAnnotationValueVisitor() {
125             super();
126         }
127     }
128 
129     @SupportedSourceVersion(RELEASE_24)
130     @SuppressWarnings("preview")
131     public static abstract class AbstractElementVisitor<R, P> extends AbstractElementVisitorPreview<R, P> {
132         /**
133          * Constructor for concrete subclasses to call.
134          */
135         protected AbstractElementVisitor(){
136             super();
137         }
138     }
139 
140     @SupportedSourceVersion(RELEASE_24)
141     @SuppressWarnings("preview")
142     public static abstract class AbstractTypeVisitor<R, P> extends AbstractTypeVisitorPreview<R, P> {
143         /**
144          * Constructor for concrete subclasses to call.
145          */
146         protected AbstractTypeVisitor() {
147             super();
148         }
149     }
150 
151     @SupportedSourceVersion(RELEASE_24)
152     @SuppressWarnings("preview")
153     public static class ElementKindVisitor<R, P> extends ElementKindVisitorPreview<R, P> {
154         /**
155          * Constructor for concrete subclasses; uses {@code null} for the
156          * default value.
157          */
158         protected ElementKindVisitor() {
159             super(null);
160         }
161 
162         /**
163          * Constructor for concrete subclasses; uses the argument for the
164          * default value.
165          *
166          * @param defaultValue the value to assign to {@link #DEFAULT_VALUE}
167          */
168         protected ElementKindVisitor(R defaultValue) {
169             super(defaultValue);
170         }
171     }
172 
173     @SupportedSourceVersion(RELEASE_24)
174     @SuppressWarnings("preview")
175     public static class ElementScanner<R, P> extends ElementScannerPreview<R, P> {
176         /**
177          * Constructor for concrete subclasses; uses {@code null} for the
178          * default value.
179          */
180         protected ElementScanner(){
181             super(null);
182         }
183 
184         /**
185          * Constructor for concrete subclasses; uses the argument for the
186          * default value.
187          */
188         protected ElementScanner(R defaultValue){
189             super(defaultValue);
190         }
191     }
192 
193     @SupportedSourceVersion(RELEASE_24)
194     @SuppressWarnings("preview")
195     public static class SimpleAnnotationValueVisitor<R, P> extends SimpleAnnotationValueVisitorPreview<R, P> {
196         /**
197          * Constructor for concrete subclasses; uses {@code null} for the
198          * default value.
199          */
200         protected SimpleAnnotationValueVisitor() {
201             super(null);
202         }
203 
204         /**
205          * Constructor for concrete subclasses; uses the argument for the
206          * default value.
207          *
208          * @param defaultValue the value to assign to {@link #DEFAULT_VALUE}
209          */
210         protected SimpleAnnotationValueVisitor(R defaultValue) {
211             super(defaultValue);
212         }
213     }
214 
215     @SupportedSourceVersion(RELEASE_24)
216     @SuppressWarnings("preview")
217     public static class SimpleElementVisitor<R, P> extends SimpleElementVisitorPreview<R, P> {
218         /**
219          * Constructor for concrete subclasses; uses {@code null} for the
220          * default value.
221          */
222         protected SimpleElementVisitor(){
223             super(null);
224         }
225 
226         /**
227          * Constructor for concrete subclasses; uses the argument for the
228          * default value.
229          *
230          * @param defaultValue the value to assign to {@link #DEFAULT_VALUE}
231          */
232         protected SimpleElementVisitor(R defaultValue){
233             super(defaultValue);
234         }
235     }
236 
237     @SupportedSourceVersion(RELEASE_24)
238     @SuppressWarnings("preview")
239     public static class SimpleTypeVisitor<R, P> extends SimpleTypeVisitorPreview<R, P> {
240         /**
241          * Constructor for concrete subclasses; uses {@code null} for the
242          * default value.
243          */
244         protected SimpleTypeVisitor(){
245             super(null);
246         }
247 
248         /**
249          * Constructor for concrete subclasses; uses the argument for the
250          * default value.
251          *
252          * @param defaultValue the value to assign to {@link #DEFAULT_VALUE}
253          */
254         protected SimpleTypeVisitor(R defaultValue){
255             super(defaultValue);
256         }
257     }
258 
259     @SupportedSourceVersion(RELEASE_24)
260     @SuppressWarnings("preview")
261     public static class TypeKindVisitor<R, P> extends TypeKindVisitorPreview<R, P> {
262         /**
263          * Constructor for concrete subclasses to call; uses {@code null}
264          * for the default value.
265          */
266         protected TypeKindVisitor() {
267             super(null);
268         }
269 
270         /**
271          * Constructor for concrete subclasses to call; uses the argument
272          * for the default value.
273          *
274          * @param defaultValue the value to assign to {@link #DEFAULT_VALUE}
275          */
276         protected TypeKindVisitor(R defaultValue) {
277             super(defaultValue);
278         }
279     }
280 
281     /**
282      * Vacuous implementation of javax.lang.model.util.Elements to aid
283      * in test development. Methods with defaults in the interface are
284      * *not* overridden to allow them to be tested.
285      */
286     public static class VacuousElements implements Elements {
287         public VacuousElements() {}
288 
289         @Override
290         public PackageElement getPackageElement(CharSequence name) {return null;}
291 
292         @Override
293         public TypeElement getTypeElement(CharSequence name) {return null;}
294 
295         @Override
296         public Map<? extends ExecutableElement, ? extends AnnotationValue>
297                                                           getElementValuesWithDefaults(AnnotationMirror a) {return null;}
298         @Override
299         public String getDocComment(Element e) {return null;}
300 
301         @Override
302         public boolean isDeprecated(Element e) {return false;}
303 
304         @Override
305         public  Name getBinaryName(TypeElement type) {return null;}
306 
307         @Override
308         public PackageElement getPackageOf(Element e) {return null;}
309 
310         @Override
311         public List<? extends Element> getAllMembers(TypeElement type) {return null;}
312 
313         @Override
314         public List<? extends AnnotationMirror> getAllAnnotationMirrors(Element e) {return null;}
315 
316         @Override
317         public boolean hides(Element hider, Element hidden) {return false;}
318 
319         @Override
320         public boolean overrides(ExecutableElement overrider,
321                              ExecutableElement overridden,
322                              TypeElement type) {return false;}
323 
324         @Override
325         public String getConstantExpression(Object value) {return null;}
326 
327         @Override
328         public void printElements(Writer w, Element... elements) {}
329 
330         @Override
331         public Name getName(CharSequence cs)  {return null;}
332 
333         @Override
334         public boolean isFunctionalInterface(TypeElement type) {return false;}
335     }
336 
337     /**
338      * Vacuous implementation of javax.lang.model.util.Types to aid
339      * in test development. Methods with defaults in the interface are
340      * *not* overridden to allow them to be tested.
341      */
342     public static class VacuousTypes implements Types {
343         public VacuousTypes() {}
344 
345         @Override
346         public Element asElement(TypeMirror t) {return null;}
347 
348         @Override
349         public boolean isSameType(TypeMirror t1, TypeMirror t2) {return false;}
350 
351         @Override
352         public boolean isSubtype(TypeMirror t1, TypeMirror t2) {return false;};
353 
354         @Override
355         public boolean isAssignable(TypeMirror t1, TypeMirror t2) {return false;};
356 
357         @Override
358         public boolean contains(TypeMirror t1, TypeMirror t2) {return false;};
359 
360         @Override
361         public boolean isSubsignature(ExecutableType m1, ExecutableType m2) {return false;}
362 
363         @Override
364         public List<? extends TypeMirror> directSupertypes(TypeMirror t) {return null;}
365 
366         @Override
367         public TypeMirror erasure(TypeMirror t) {return null;}
368 
369         @Override
370         public TypeElement boxedClass(PrimitiveType p) {return null;}
371 
372         @Override
373         public PrimitiveType unboxedType(TypeMirror t) {return null;}
374 
375         @Override
376         public TypeMirror capture(TypeMirror t) {return null;}
377 
378         @Override
379         public PrimitiveType getPrimitiveType(TypeKind kind) {return null;}
380 
381         @Override
382         public NullType getNullType() {return null;}
383 
384         @Override
385         public NoType getNoType(TypeKind kind) {return null;}
386 
387         @Override
388         public ArrayType getArrayType(TypeMirror componentType) {return null;}
389 
390         @Override
391         public WildcardType getWildcardType(TypeMirror extendsBound,
392                                  TypeMirror superBound) {return null;}
393 
394         @Override
395         public DeclaredType getDeclaredType(TypeElement typeElem, TypeMirror... typeArgs) {return null;}
396 
397 
398         @Override
399         public DeclaredType getDeclaredType(DeclaredType containing,
400                                  TypeElement typeElem, TypeMirror... typeArgs) {return null;}
401 
402         @Override
403         public TypeMirror asMemberOf(DeclaredType containing, Element element) {return null;}
404     }
405 }