org.eclipse.jdt.internal.compiler.apt.dispatch
Class BaseAnnotationProcessorManager

java.lang.Object
  extended by org.eclipse.jdt.internal.compiler.AbstractAnnotationProcessorManager
      extended by org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager
All Implemented Interfaces:
IProcessorProvider
Direct Known Subclasses:
BatchAnnotationProcessorManager

public abstract class BaseAnnotationProcessorManager
extends AbstractAnnotationProcessorManager
implements IProcessorProvider

This class is the central dispatch point for Java 6 annotation processing. This is created and configured by the JDT core; specifics depend on how compilation is being performed, ie from the command line, via the Tool interface, or within the IDE. This class manages the discovery of annotation processors and other information spanning multiple rounds of processing; context that is valid only within a single round is managed by RoundDispatcher. There may be multiple instances of this class; there is in general one of these for every Compiler that has annotation processing enabled. Within the IDE there will typically be one for every Java project, because each project potentially has a separate processor path. TODO: do something useful with _supportedOptions and _supportedAnnotationTypes.


Field Summary
protected  PrintWriter _err
           
protected  boolean _isFirstRound
           
protected  PrintWriter _out
           
protected  boolean _printProcessorInfo
           
protected  boolean _printRounds
           
protected  BaseProcessingEnvImpl _processingEnv
           
protected  List<ProcessorInfo> _processors
          The list of processors that have been loaded so far.
protected  int _round
           
 
Constructor Summary
BaseAnnotationProcessorManager()
           
 
Method Summary
 void configure(Object batchCompiler, String[] options)
          Configure the receiver using the given batch compiler and the given options.
 void configureFromPlatform(Compiler compiler, Object compilationUnitLocator, Object javaProject)
          Configure the receiver using the given compiler, the given compilationUnitLocator and the given java project.
 ICompilationUnit[] getDeletedUnits()
          Returns the deleted units.
 List<ProcessorInfo> getDiscoveredProcessors()
           
 ReferenceBinding[] getNewClassFiles()
          Return the new binary bindings created in the last round.
 ICompilationUnit[] getNewUnits()
          Return the new units created in the last round.
 void processAnnotations(CompilationUnitDeclaration[] units, ReferenceBinding[] referenceBindings, boolean isLastRound)
          A single "round" of processing, in the sense implied in javax.lang.annotation.processing.Processor.
 void reset()
          Reinitialize the receiver
 void setErr(PrintWriter err)
          Set the print writer for the standard error.
 void setOut(PrintWriter out)
          Set the print writer for the standard output.
 void setProcessors(Object[] processors)
          Set the processors for annotation processing.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.eclipse.jdt.internal.compiler.apt.dispatch.IProcessorProvider
discoverNextProcessor, reportProcessorException
 

Field Detail

_out

protected PrintWriter _out

_err

protected PrintWriter _err

_processingEnv

protected BaseProcessingEnvImpl _processingEnv

_isFirstRound

protected boolean _isFirstRound

_processors

protected List<ProcessorInfo> _processors
The list of processors that have been loaded so far. A processor on this list has been initialized, but may not yet have been called to process().


_printProcessorInfo

protected boolean _printProcessorInfo

_printRounds

protected boolean _printRounds

_round

protected int _round
Constructor Detail

BaseAnnotationProcessorManager

public BaseAnnotationProcessorManager()
Method Detail

configure

public void configure(Object batchCompiler,
                      String[] options)
Description copied from class: AbstractAnnotationProcessorManager
Configure the receiver using the given batch compiler and the given options. The parameter batchCompiler is expected to be an instance of the batch compiler. This method is only used for the batch mode. For the IDE mode, please see AbstractAnnotationProcessorManager.configureFromPlatform(Compiler, Object, Object).

Specified by:
configure in class AbstractAnnotationProcessorManager
Parameters:
batchCompiler - the given batch compiler object
options - the given options

configureFromPlatform

public void configureFromPlatform(Compiler compiler,
                                  Object compilationUnitLocator,
                                  Object javaProject)
Description copied from class: AbstractAnnotationProcessorManager
Configure the receiver using the given compiler, the given compilationUnitLocator and the given java project.

Specified by:
configureFromPlatform in class AbstractAnnotationProcessorManager
Parameters:
compiler - the given compiler
compilationUnitLocator - the given compilation unit locator
javaProject - the given java project

getDiscoveredProcessors

public List<ProcessorInfo> getDiscoveredProcessors()
Specified by:
getDiscoveredProcessors in interface IProcessorProvider
Returns:
the list of all processors that have been discovered so far. This list will grow when IProcessorProvider.discoverNextProcessor() is called.

getDeletedUnits

public ICompilationUnit[] getDeletedUnits()
Description copied from class: AbstractAnnotationProcessorManager
Returns the deleted units.

Specified by:
getDeletedUnits in class AbstractAnnotationProcessorManager
Returns:
the deleted units

getNewUnits

public ICompilationUnit[] getNewUnits()
Description copied from class: AbstractAnnotationProcessorManager
Return the new units created in the last round.

Specified by:
getNewUnits in class AbstractAnnotationProcessorManager
Returns:
the new units created in the last round

getNewClassFiles

public ReferenceBinding[] getNewClassFiles()
Description copied from class: AbstractAnnotationProcessorManager
Return the new binary bindings created in the last round.

Specified by:
getNewClassFiles in class AbstractAnnotationProcessorManager
Returns:
the new binary bindings created in the last round

reset

public void reset()
Description copied from class: AbstractAnnotationProcessorManager
Reinitialize the receiver

Specified by:
reset in class AbstractAnnotationProcessorManager

setErr

public void setErr(PrintWriter err)
Description copied from class: AbstractAnnotationProcessorManager
Set the print writer for the standard error.

Specified by:
setErr in class AbstractAnnotationProcessorManager
Parameters:
err - the given print writer for error

setOut

public void setOut(PrintWriter out)
Description copied from class: AbstractAnnotationProcessorManager
Set the print writer for the standard output.

Specified by:
setOut in class AbstractAnnotationProcessorManager
Parameters:
out - the given print writer for output

setProcessors

public void setProcessors(Object[] processors)
Description copied from class: AbstractAnnotationProcessorManager
Set the processors for annotation processing.

Specified by:
setProcessors in class AbstractAnnotationProcessorManager
Parameters:
processors - the given processors

processAnnotations

public void processAnnotations(CompilationUnitDeclaration[] units,
                               ReferenceBinding[] referenceBindings,
                               boolean isLastRound)
A single "round" of processing, in the sense implied in javax.lang.annotation.processing.Processor.

The Java 6 Processor spec contains ambiguities about how processors that support "*" are handled. Eclipse tries to match Sun's implementation in javac. What that actually does is analogous to inspecting the set of annotions found in the root units and adding an "imaginary" annotation if the set is empty. Processors are then called in order of discovery; for each processor, the intersection between the set of root annotations and the set of annotations the processor supports is calculated, and if it is non-empty, the processor is called. If the processor returns true then the intersection (including the imaginary annotation if one exists) is removed from the set of root annotations and the loop continues, until the set is empty. Of course, the imaginary annotation is not actually included in the set of annotations passed in to the processor. A processor's process() method is not called until its intersection set is non-empty, but thereafter it is called on every round. Note that even if a processor is not called in the first round, if it is called in subsequent rounds, it will be called in the order in which the processors were discovered, rather than being added to the end of the list.

Specified by:
processAnnotations in class AbstractAnnotationProcessorManager
Parameters:
units - the given source type
referenceBindings - the given binary types
isLastRound - flag to notify the last round


Copyright © 2012. All Rights Reserved.