35 import java.nio.file.Path;
36 import java.util.*;
37 import java.util.Map.Entry;
38 import java.util.regex.*;
39 import java.util.stream.Collectors;
40
41 import javax.annotation.processing.*;
42 import javax.lang.model.SourceVersion;
43 import javax.lang.model.element.*;
44 import javax.lang.model.util.*;
45 import javax.tools.JavaFileManager;
46 import javax.tools.JavaFileObject;
47 import javax.tools.JavaFileObject.Kind;
48 import javax.tools.StandardJavaFileManager;
49
50 import static javax.tools.StandardLocation.*;
51
52 import com.sun.source.util.TaskEvent;
53 import com.sun.tools.javac.api.MultiTaskListener;
54 import com.sun.tools.javac.code.*;
55 import com.sun.tools.javac.code.Scope.WriteableScope;
56 import com.sun.tools.javac.code.Source.Feature;
57 import com.sun.tools.javac.code.Symbol.*;
58 import com.sun.tools.javac.code.Type.ClassType;
59 import com.sun.tools.javac.code.Types;
60 import com.sun.tools.javac.comp.AttrContext;
61 import com.sun.tools.javac.comp.Check;
62 import com.sun.tools.javac.comp.Enter;
63 import com.sun.tools.javac.comp.Env;
64 import com.sun.tools.javac.comp.Modules;
65 import com.sun.tools.javac.file.JavacFileManager;
66 import com.sun.tools.javac.main.JavaCompiler;
67 import com.sun.tools.javac.main.Option;
68 import com.sun.tools.javac.model.JavacElements;
69 import com.sun.tools.javac.model.JavacTypes;
70 import com.sun.tools.javac.platform.PlatformDescription;
71 import com.sun.tools.javac.platform.PlatformDescription.PluginInfo;
72 import com.sun.tools.javac.resources.CompilerProperties.Errors;
73 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
74 import com.sun.tools.javac.tree.*;
160 JCDiagnostic.Factory diags;
161
162 /**
163 * Source level of the compile.
164 */
165 Source source;
166
167 private ClassLoader processorClassLoader;
168 private ServiceLoader<Processor> serviceLoader;
169 private SecurityException processorLoaderException;
170
171 private final JavaFileManager fileManager;
172
173 /**
174 * JavacMessages object used for localization
175 */
176 private JavacMessages messages;
177
178 private MultiTaskListener taskListener;
179 private final Symtab symtab;
180 private final Names names;
181 private final Enter enter;
182 private final Completer initialCompleter;
183 private final Check chk;
184
185 private final Context context;
186
187 /** Get the JavacProcessingEnvironment instance for this context. */
188 public static JavacProcessingEnvironment instance(Context context) {
189 JavacProcessingEnvironment instance = context.get(JavacProcessingEnvironment.class);
190 if (instance == null)
191 instance = new JavacProcessingEnvironment(context);
192 return instance;
193 }
194
195 protected JavacProcessingEnvironment(Context context) {
196 this.context = context;
197 context.put(JavacProcessingEnvironment.class, this);
198 log = Log.instance(context);
199 source = Source.instance(context);
210 fatalErrors = options.isSet("fatalEnterError");
211 showResolveErrors = options.isSet("showResolveErrors");
212 werror = options.isSet(Option.WERROR);
213 fileManager = context.get(JavaFileManager.class);
214 platformAnnotations = initPlatformAnnotations();
215
216 // Initialize services before any processors are initialized
217 // in case processors use them.
218 filer = new JavacFiler(context);
219 messager = new JavacMessager(context, this);
220 elementUtils = JavacElements.instance(context);
221 typeUtils = JavacTypes.instance(context);
222 modules = Modules.instance(context);
223 types = Types.instance(context);
224 annotate = Annotate.instance(context);
225 processorOptions = initProcessorOptions();
226 unmatchedProcessorOptions = initUnmatchedProcessorOptions();
227 messages = JavacMessages.instance(context);
228 taskListener = MultiTaskListener.instance(context);
229 symtab = Symtab.instance(context);
230 names = Names.instance(context);
231 enter = Enter.instance(context);
232 initialCompleter = ClassFinder.instance(context).getCompleter();
233 chk = Check.instance(context);
234 initProcessorLoader();
235 }
236
237 public void setProcessors(Iterable<? extends Processor> processors) {
238 Assert.checkNull(discoveredProcs);
239 initProcessorIterator(processors);
240 }
241
242 private Set<String> initPlatformAnnotations() {
243 Set<String> platformAnnotations = new HashSet<>();
244 platformAnnotations.add("java.lang.Deprecated");
245 platformAnnotations.add("java.lang.Override");
246 platformAnnotations.add("java.lang.SuppressWarnings");
247 platformAnnotations.add("java.lang.annotation.Documented");
248 platformAnnotations.add("java.lang.annotation.Inherited");
249 platformAnnotations.add("java.lang.annotation.Retention");
942 }
943
944 void addAnnotations(Element e, Set<TypeElement> p) {
945 for (AnnotationMirror annotationMirror :
946 elements.getAllAnnotationMirrors(e) ) {
947 Element e2 = annotationMirror.getAnnotationType().asElement();
948 p.add((TypeElement) e2);
949 }
950 }
951
952 @Override @DefinedBy(Api.LANGUAGE_MODEL)
953 public Set<TypeElement> scan(Element e, Set<TypeElement> p) {
954 addAnnotations(e, p);
955 return super.scan(e, p);
956 }
957 }
958
959 private boolean callProcessor(Processor proc,
960 Set<? extends TypeElement> tes,
961 RoundEnvironment renv) {
962 try {
963 return proc.process(tes, renv);
964 } catch (ClassFinder.BadClassFile ex) {
965 log.error(Errors.ProcCantAccess1(ex.sym, ex.getDetailValue()));
966 return false;
967 } catch (CompletionFailure ex) {
968 StringWriter out = new StringWriter();
969 ex.printStackTrace(new PrintWriter(out));
970 log.error(Errors.ProcCantAccess(ex.sym, ex.getDetailValue(), out.toString()));
971 return false;
972 } catch (ClientCodeException e) {
973 throw e;
974 } catch (Throwable t) {
975 throw new AnnotationProcessingError(t);
976 }
977 }
978
979 /**
980 * Helper object for a single round of annotation processing.
981 */
982 class Round {
983 /** The round number. */
984 final int number;
985 /** The diagnostic handler for the round. */
986 final Log.DeferredDiagnosticHandler deferredDiagnosticHandler;
987
988 /** The ASTs to be compiled. */
989 List<JCCompilationUnit> roots;
990 /** The trees that need to be cleaned - includes roots and implicitly parsed trees. */
991 Set<JCCompilationUnit> treesToClean;
992 /** The classes to be compiler that have were generated. */
993 Map<ModuleSymbol, Map<String, JavaFileObject>> genClassFiles;
994
995 /** The set of annotations to be processed this round. */
|
35 import java.nio.file.Path;
36 import java.util.*;
37 import java.util.Map.Entry;
38 import java.util.regex.*;
39 import java.util.stream.Collectors;
40
41 import javax.annotation.processing.*;
42 import javax.lang.model.SourceVersion;
43 import javax.lang.model.element.*;
44 import javax.lang.model.util.*;
45 import javax.tools.JavaFileManager;
46 import javax.tools.JavaFileObject;
47 import javax.tools.JavaFileObject.Kind;
48 import javax.tools.StandardJavaFileManager;
49
50 import static javax.tools.StandardLocation.*;
51
52 import com.sun.source.util.TaskEvent;
53 import com.sun.tools.javac.api.MultiTaskListener;
54 import com.sun.tools.javac.code.*;
55 import com.sun.tools.javac.code.DeferredCompletionFailureHandler.Handler;
56 import com.sun.tools.javac.code.Scope.WriteableScope;
57 import com.sun.tools.javac.code.Source.Feature;
58 import com.sun.tools.javac.code.Symbol.*;
59 import com.sun.tools.javac.code.Type.ClassType;
60 import com.sun.tools.javac.code.Types;
61 import com.sun.tools.javac.comp.AttrContext;
62 import com.sun.tools.javac.comp.Check;
63 import com.sun.tools.javac.comp.Enter;
64 import com.sun.tools.javac.comp.Env;
65 import com.sun.tools.javac.comp.Modules;
66 import com.sun.tools.javac.file.JavacFileManager;
67 import com.sun.tools.javac.main.JavaCompiler;
68 import com.sun.tools.javac.main.Option;
69 import com.sun.tools.javac.model.JavacElements;
70 import com.sun.tools.javac.model.JavacTypes;
71 import com.sun.tools.javac.platform.PlatformDescription;
72 import com.sun.tools.javac.platform.PlatformDescription.PluginInfo;
73 import com.sun.tools.javac.resources.CompilerProperties.Errors;
74 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
75 import com.sun.tools.javac.tree.*;
161 JCDiagnostic.Factory diags;
162
163 /**
164 * Source level of the compile.
165 */
166 Source source;
167
168 private ClassLoader processorClassLoader;
169 private ServiceLoader<Processor> serviceLoader;
170 private SecurityException processorLoaderException;
171
172 private final JavaFileManager fileManager;
173
174 /**
175 * JavacMessages object used for localization
176 */
177 private JavacMessages messages;
178
179 private MultiTaskListener taskListener;
180 private final Symtab symtab;
181 private final DeferredCompletionFailureHandler dcfh;
182 private final Names names;
183 private final Enter enter;
184 private final Completer initialCompleter;
185 private final Check chk;
186
187 private final Context context;
188
189 /** Get the JavacProcessingEnvironment instance for this context. */
190 public static JavacProcessingEnvironment instance(Context context) {
191 JavacProcessingEnvironment instance = context.get(JavacProcessingEnvironment.class);
192 if (instance == null)
193 instance = new JavacProcessingEnvironment(context);
194 return instance;
195 }
196
197 protected JavacProcessingEnvironment(Context context) {
198 this.context = context;
199 context.put(JavacProcessingEnvironment.class, this);
200 log = Log.instance(context);
201 source = Source.instance(context);
212 fatalErrors = options.isSet("fatalEnterError");
213 showResolveErrors = options.isSet("showResolveErrors");
214 werror = options.isSet(Option.WERROR);
215 fileManager = context.get(JavaFileManager.class);
216 platformAnnotations = initPlatformAnnotations();
217
218 // Initialize services before any processors are initialized
219 // in case processors use them.
220 filer = new JavacFiler(context);
221 messager = new JavacMessager(context, this);
222 elementUtils = JavacElements.instance(context);
223 typeUtils = JavacTypes.instance(context);
224 modules = Modules.instance(context);
225 types = Types.instance(context);
226 annotate = Annotate.instance(context);
227 processorOptions = initProcessorOptions();
228 unmatchedProcessorOptions = initUnmatchedProcessorOptions();
229 messages = JavacMessages.instance(context);
230 taskListener = MultiTaskListener.instance(context);
231 symtab = Symtab.instance(context);
232 dcfh = DeferredCompletionFailureHandler.instance(context);
233 names = Names.instance(context);
234 enter = Enter.instance(context);
235 initialCompleter = ClassFinder.instance(context).getCompleter();
236 chk = Check.instance(context);
237 initProcessorLoader();
238 }
239
240 public void setProcessors(Iterable<? extends Processor> processors) {
241 Assert.checkNull(discoveredProcs);
242 initProcessorIterator(processors);
243 }
244
245 private Set<String> initPlatformAnnotations() {
246 Set<String> platformAnnotations = new HashSet<>();
247 platformAnnotations.add("java.lang.Deprecated");
248 platformAnnotations.add("java.lang.Override");
249 platformAnnotations.add("java.lang.SuppressWarnings");
250 platformAnnotations.add("java.lang.annotation.Documented");
251 platformAnnotations.add("java.lang.annotation.Inherited");
252 platformAnnotations.add("java.lang.annotation.Retention");
945 }
946
947 void addAnnotations(Element e, Set<TypeElement> p) {
948 for (AnnotationMirror annotationMirror :
949 elements.getAllAnnotationMirrors(e) ) {
950 Element e2 = annotationMirror.getAnnotationType().asElement();
951 p.add((TypeElement) e2);
952 }
953 }
954
955 @Override @DefinedBy(Api.LANGUAGE_MODEL)
956 public Set<TypeElement> scan(Element e, Set<TypeElement> p) {
957 addAnnotations(e, p);
958 return super.scan(e, p);
959 }
960 }
961
962 private boolean callProcessor(Processor proc,
963 Set<? extends TypeElement> tes,
964 RoundEnvironment renv) {
965 Handler prevDeferredHandler = dcfh.setHandler(dcfh.userCodeHandler);
966 try {
967 return proc.process(tes, renv);
968 } catch (ClassFinder.BadClassFile ex) {
969 log.error(Errors.ProcCantAccess1(ex.sym, ex.getDetailValue()));
970 return false;
971 } catch (CompletionFailure ex) {
972 StringWriter out = new StringWriter();
973 ex.printStackTrace(new PrintWriter(out));
974 log.error(Errors.ProcCantAccess(ex.sym, ex.getDetailValue(), out.toString()));
975 return false;
976 } catch (ClientCodeException e) {
977 throw e;
978 } catch (Throwable t) {
979 throw new AnnotationProcessingError(t);
980 } finally {
981 dcfh.setHandler(prevDeferredHandler);
982 }
983 }
984
985 /**
986 * Helper object for a single round of annotation processing.
987 */
988 class Round {
989 /** The round number. */
990 final int number;
991 /** The diagnostic handler for the round. */
992 final Log.DeferredDiagnosticHandler deferredDiagnosticHandler;
993
994 /** The ASTs to be compiled. */
995 List<JCCompilationUnit> roots;
996 /** The trees that need to be cleaned - includes roots and implicitly parsed trees. */
997 Set<JCCompilationUnit> treesToClean;
998 /** The classes to be compiler that have were generated. */
999 Map<ModuleSymbol, Map<String, JavaFileObject>> genClassFiles;
1000
1001 /** The set of annotations to be processed this round. */
|