< prev index next >

src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java

Print this page
rev 48841 : imported patch 8187950


  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. */


< prev index next >