Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BuildEnv.java')
-rw-r--r--org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BuildEnv.java240
1 files changed, 114 insertions, 126 deletions
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BuildEnv.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BuildEnv.java
index c8c022c482..c4da45e2d8 100644
--- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BuildEnv.java
+++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/env/BuildEnv.java
@@ -18,12 +18,7 @@ import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
@@ -43,52 +38,45 @@ import org.eclipse.jdt.apt.core.internal.util.Visitors.AnnotationVisitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.compiler.BuildContext;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
-import org.eclipse.jdt.core.dom.Annotation;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.IBinding;
-import org.eclipse.jdt.core.dom.ITypeBinding;
-
+import org.eclipse.jdt.core.compiler.BuildContext;
+import org.eclipse.jdt.core.dom.*;
import com.sun.mirror.apt.Filer;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
import com.sun.mirror.declaration.PackageDeclaration;
import com.sun.mirror.declaration.TypeDeclaration;
public class BuildEnv extends AbstractCompilationEnv
-{
+{
private boolean _hasRaisedErrors = false;
- private final BuildFilerImpl _filer;
+ private final BuildFilerImpl _filer;
/**
* Set of strings that indicate new type dependencies introduced on the file
* each string is a fully-qualified type name.
*/
private Set<String> _typeDependencies = new HashSet<>();
-
+
/**
- * Indicates whether we are in batch mode or not. This gets flipped only
- * during build and could be flipped back and forth.
+ * Indicates whether we are in batch mode or not. This gets flipped only
+ * during build and could be flipped back and forth.
*/
private boolean _batchMode = false; // off by default.
- /**
+ /**
* Holds all the files that contains annotation that are to be processed during build.
- * If we are not in batch mode, <code>super._file</code> holds the file
- * being processed at the time.
- */
+ * If we are not in batch mode, <code>super._file</code> holds the file
+ * being processed at the time.
+ */
private BuildContext[] _filesWithAnnotation = null;
-
+
/**
* These are files that are part of a build but does not have annotations on it.
- * During batch mode processing, these files still also need to be included.
+ * During batch mode processing, these files still also need to be included.
*/
private BuildContext[] _additionFiles = null;
- /**
+ /**
* This is intialized when <code>_batchMode</code> is set to be <code>true</code> or
* when batch processing is expected. <p>
* It is also set in build mode for perf reason rather than parsing and resolving
@@ -97,29 +85,29 @@ public class BuildEnv extends AbstractCompilationEnv
*/
private CompilationUnit[] _astRoots = null;
private List<MarkerInfo> _markerInfos = null;
-
+
/**
* Constructor for creating a processor environment used during build.
* @param filesWithAnnotations
* @param additionalFiles
* @param units
* @param javaProj
- * @param isTestCode
+ * @param isTestCode
* @param phase
*/
BuildEnv(
final BuildContext[] filesWithAnnotations,
final BuildContext[] additionalFiles,
final IJavaProject javaProj, boolean isTestCode) {
-
+
super(null, null, javaProj, Phase.BUILD, isTestCode);
_filer = new BuildFilerImpl(this);
_filesWithAnnotation = filesWithAnnotations;
_additionFiles = additionalFiles;
_problems = new ArrayList<>();
_markerInfos = new ArrayList<>();
-
- if (AptPlugin.DEBUG_COMPILATION_ENV) AptPlugin.trace(
+
+ if (AptPlugin.DEBUG_COMPILATION_ENV) AptPlugin.trace(
"constructed " + this + " for " + _filesWithAnnotation.length + " files"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
@@ -139,12 +127,12 @@ public class BuildEnv extends AbstractCompilationEnv
@Override
public TypeDeclaration getTypeDeclaration(String name)
{
- checkValid();
+ checkValid();
TypeDeclaration decl = super.getTypeDeclaration(name);
-
- if (!_batchMode)
+
+ if (!_batchMode)
addTypeDependency(name);
-
+
return decl;
}
@@ -154,7 +142,7 @@ public class BuildEnv extends AbstractCompilationEnv
*/
public boolean hasRaisedErrors(){
return _hasRaisedErrors;
- }
+ }
public static InputStreamReader getFileReader( final IFile file ) throws IOException, CoreException {
return new InputStreamReader(getInputStream(file), file.getCharset());
@@ -179,7 +167,7 @@ public class BuildEnv extends AbstractCompilationEnv
*/
@Override
public void close(){
- if( isClosed() )
+ if( isClosed() )
return;
_markerInfos = null;
_astRoot = null;
@@ -187,13 +175,13 @@ public class BuildEnv extends AbstractCompilationEnv
_astRoots = null;
_filesWithAnnotation = null;
_problems = null;
- _modelCompUnit2astCompUnit.clear();
+ _modelCompUnit2astCompUnit.clear();
_hasRaisedErrors = false;
super.close();
}
-
+
/**
- *
+ *
* @param resource null to indicate current resource
* @param start the starting offset of the marker
* @param end -1 to indicate unknow ending offset.
@@ -202,21 +190,21 @@ public class BuildEnv extends AbstractCompilationEnv
* @param line the line number of where the marker should be
*/
@Override
- void addMessage(IFile resource,
- int start,
+ void addMessage(IFile resource,
+ int start,
int end,
- Severity severity,
- String msg,
+ Severity severity,
+ String msg,
int line,
String[] arguments)
{
checkValid();
-
+
if( resource == null )
resource = getFile();
-
+
_hasRaisedErrors |= severity == MessagerImpl.Severity.ERROR;
-
+
// Eclipse doesn't support INFO-level IProblems, so we send them to the log instead.
if ( severity == Severity.INFO) {
StringBuilder sb = new StringBuilder();
@@ -248,69 +236,69 @@ public class BuildEnv extends AbstractCompilationEnv
AptPlugin.log(status);
return;
}
-
+
if( resource == null ){
assert _batchMode : "not in batch mode but don't know about current resource"; //$NON-NLS-1$
addMarker(start, end, severity, msg, line, arguments);
}
- else
+ else
addProblem(resource, start, end, severity, msg, line, arguments);
}
-
+
private void addProblem(
- IFile resource,
- int start,
+ IFile resource,
+ int start,
int end,
- Severity severity,
- String msg,
+ Severity severity,
+ String msg,
int line,
String[] arguments)
- {
-
+ {
+
APTProblem problem = createProblem(resource, start, end, severity, msg, line, arguments);
_problems.add(problem);
}
-
+
private void addMarker(
- int start,
+ int start,
int end,
- Severity severity,
- String msg,
+ Severity severity,
+ String msg,
int line,
String[] arguments)
- {
-
+ {
+
// Note that the arguments are ignored -- no quick-fix for markers.
_markerInfos.add(new MarkerInfo(start, end, severity, msg, line));
}
-
+
@Override
public Map<String, AnnotationTypeDeclaration> getAnnotationTypes()
{
checkValid();
- assert _astRoot != null && _file != null && !_batchMode :
+ assert _astRoot != null && _file != null && !_batchMode :
"operation not available under batch mode."; //$NON-NLS-1$
return super.getAnnotationTypes();
}
-
+
/**
* Return all annotations at declaration level within all compilation unit(s)
- * associated with this environment. All the files associated with this environment will
+ * associated with this environment. All the files associated with this environment will
* be parsed and resolved for all declaration level elements at the return of this call.
- *
+ *
* @param file2Annotations populated by this method to map files to the annotation types
* if contains. May be null.
* @return the map containing all annotation types found within this environment.
*/
public Map<String, AnnotationTypeDeclaration> getAllAnnotationTypes(
final Map<BuildContext, Set<AnnotationTypeDeclaration>> file2Annotations) {
-
+
checkValid();
- if( _filesWithAnnotation == null )
+ if( _filesWithAnnotation == null )
return getAnnotationTypes();
-
+
final List<Annotation> instances = new ArrayList<>();
- final Map<String, AnnotationTypeDeclaration> decls =
+ final Map<String, AnnotationTypeDeclaration> decls =
new HashMap<>();
final AnnotationVisitor visitor = new AnnotationVisitor(instances);
for( int astIndex=0, len=_astRoots.length; astIndex<len; astIndex++ ){
@@ -318,13 +306,13 @@ public class BuildEnv extends AbstractCompilationEnv
System.err.println();
_astRoots[astIndex].accept(visitor);
final Set<AnnotationTypeDeclaration> perFileAnnos = new HashSet<>();
-
+
for (int instanceIndex=0, size = instances.size(); instanceIndex < size; instanceIndex++) {
final Annotation instance = instances.get(instanceIndex);
final ITypeBinding annoType = instance.resolveTypeBinding();
if (annoType == null)
continue;
- final TypeDeclarationImpl decl =
+ final TypeDeclarationImpl decl =
Factory.createReferenceType(annoType, this);
if (decl != null && decl.kind() == EclipseMirrorObject.MirrorKind.TYPE_ANNOTATION){
final AnnotationTypeDeclaration annoDecl = (AnnotationTypeDeclaration)decl;
@@ -336,37 +324,37 @@ public class BuildEnv extends AbstractCompilationEnv
file2Annotations.put(_filesWithAnnotation[astIndex], perFileAnnos);
visitor.reset();
}
-
+
return decls;
}
/**
* @return - the extra type dependencies for the files under compilation
*/
- public Set<String> getTypeDependencies() { return _typeDependencies; }
-
+ public Set<String> getTypeDependencies() { return _typeDependencies; }
+
/**
- * Switch to batch processing mode.
- * Note: Call to this method will cause all files associated with this environment to be
+ * Switch to batch processing mode.
+ * Note: Call to this method will cause all files associated with this environment to be
* read and parsed.
*/
- public void beginBatchProcessing(){
+ public void beginBatchProcessing(){
if( _phase != Phase.BUILD )
throw new IllegalStateException("No batch processing outside build."); //$NON-NLS-1$
-
+
if( _batchMode ) return;
checkValid();
-
+
_batchMode = true;
_file = null;
_astRoot = null;
}
-
+
public void completedBatchProcessing(){
postMarkers();
completedProcessing();
}
-
+
void createASTs(BuildContext[] cpResults){
final int len = cpResults.length;
final ICompilationUnit[] units = new ICompilationUnit[len];
@@ -378,17 +366,17 @@ public class BuildEnv extends AbstractCompilationEnv
createASTs(_javaProject, units, _requestor = new CallbackRequestor(units));
}
- public void beginFileProcessing(BuildContext result){
+ public void beginFileProcessing(BuildContext result){
if( result == null )
throw new IllegalStateException("missing compilation result"); //$NON-NLS-1$
_batchMode = false;
final IFile file = result.getFile();
if( file.equals(_file) ) // this is a no-op
return;
-
+
_astRoot = null;
_file = null;
-
+
// need to match up the file with the ast.
if( _filesWithAnnotation != null ){
for( int i=0, len=_filesWithAnnotation.length; i<len; i++ ){
@@ -398,37 +386,37 @@ public class BuildEnv extends AbstractCompilationEnv
}
}
}
-
+
if( _file == null || _astRoot == null)
throw new IllegalStateException(
"file " + //$NON-NLS-1$
- file.getName() +
+ file.getName() +
" is not in the list to be processed."); //$NON-NLS-1$
}
-
+
public void completedFileProcessing(){
completedProcessing();
}
-
+
@Override
protected void completedProcessing(){
_problems.clear();
_typeDependencies.clear();
super.completedProcessing();
}
-
+
@Override
public List<? extends CategorizedProblem> getProblems(){
if( !_problems.isEmpty() )
EnvUtil.updateProblemLength(_problems, getAstCompilationUnit());
return _problems;
}
-
+
// Implementation for EclipseAnnotationProcessorEnvironment
@Override
public CompilationUnit getAST()
{
- if( _batchMode )
+ if( _batchMode )
return null;
return _astRoot;
}
@@ -436,12 +424,12 @@ public class BuildEnv extends AbstractCompilationEnv
@Override
public void addTypeDependency(final String fullyQualifiedTypeName )
{
- if(!_batchMode){
+ if(!_batchMode){
_typeDependencies.add( fullyQualifiedTypeName );
}
}
// End of implementation for EclipseAnnotationProcessorEnvironment
-
+
/**
* Include all the types from all files, files with and without annotations on it
* if we are in batch mode. Otherwise, just the types from the file that's currently
@@ -455,15 +443,15 @@ public class BuildEnv extends AbstractCompilationEnv
final List<AbstractTypeDeclaration> typeDecls = new ArrayList<>();
for( int i=0, len=_astRoots.length; i<len; i++ )
typeDecls.addAll( _astRoots[i].types() );
-
+
getTypeDeclarationsFromAdditionFiles(typeDecls);
-
+
return typeDecls;
}
-
+
private void getTypeDeclarationsFromAdditionFiles(List<AbstractTypeDeclaration> typeDecls){
if( _additionFiles == null || _additionFiles.length == 0 ) return;
-
+
final int len = _additionFiles.length;
final ICompilationUnit[] units = new ICompilationUnit[len];
for( int i=0; i<len; i++ ){
@@ -473,7 +461,7 @@ public class BuildEnv extends AbstractCompilationEnv
}
BaseRequestor r = new BaseRequestor(units);
createASTs(_javaProject, units, r);
-
+
CompilationUnit[] asts = r.asts;
for( CompilationUnit ast : asts ){
if( ast != null ){
@@ -481,19 +469,19 @@ public class BuildEnv extends AbstractCompilationEnv
}
}
}
-
+
@Override
protected Map<ASTNode, List<Annotation>> getASTNodesWithAnnotations()
{
if( !_batchMode )
return super.getASTNodesWithAnnotations();
final Map<ASTNode, List<Annotation>> astNode2Anno = new HashMap<>();
- final AnnotatedNodeVisitor visitor = new AnnotatedNodeVisitor(astNode2Anno);
+ final AnnotatedNodeVisitor visitor = new AnnotatedNodeVisitor(astNode2Anno);
for( int i=0, len=_astRoots.length; i<len; i++ )
_astRoots[i].accept( visitor );
return astNode2Anno;
}
-
+
@Override
protected IFile getFileForNode(final ASTNode node)
{
@@ -506,12 +494,12 @@ public class BuildEnv extends AbstractCompilationEnv
}
throw new IllegalStateException();
}
-
+
/**
* Go through the list of compilation unit in this environment and looking for
* the declaration node of the given binding.
- * @param binding
- * @return the compilation unit that defines the given binding or null if no
+ * @param binding
+ * @return the compilation unit that defines the given binding or null if no
* match is found.
*/
@Override
@@ -519,7 +507,7 @@ public class BuildEnv extends AbstractCompilationEnv
{
if( !_batchMode )
return super.searchLocallyForBinding(binding);
-
+
for( int i=0, len=_astRoots.length; i<len; i++ ){
ASTNode node = _astRoots[i].findDeclaringNode(binding);
if( node != null)
@@ -527,12 +515,12 @@ public class BuildEnv extends AbstractCompilationEnv
}
return null;
}
-
+
/**
* Go through the list of compilation unit in this environment and looking for
* the declaration node of the given binding.
- * @param binding
- * @return the compilation unit that defines the given binding or null if no
+ * @param binding
+ * @return the compilation unit that defines the given binding or null if no
* match is found.
*/
@Override
@@ -540,7 +528,7 @@ public class BuildEnv extends AbstractCompilationEnv
{
if( !_batchMode )
return super.searchLocallyForIFile(binding);
-
+
for( int i=0, len=_astRoots.length; i<len; i++ ){
ASTNode node = _astRoots[i].findDeclaringNode(binding);
if( node != null)
@@ -548,7 +536,7 @@ public class BuildEnv extends AbstractCompilationEnv
}
return null;
}
-
+
/**
* @param file
* @return the compilation unit associated with the given file.
@@ -558,7 +546,7 @@ public class BuildEnv extends AbstractCompilationEnv
@Override
public CompilationUnit getASTFrom(final IFile file)
{
- if( file == null )
+ if( file == null )
return null;
else if( file.equals(_file) )
return _astRoot;
@@ -570,15 +558,15 @@ public class BuildEnv extends AbstractCompilationEnv
}
return null;
}
-
+
/**
* @return the current ast being processed if in per-file mode.
* If in batch mode, one of the asts being processed (no guarantee which
- * one will be returned.
+ * one will be returned.
*/
@Override
protected AST getCurrentDietAST(){
-
+
if( _astRoot != null )
return _astRoot.getAST();
else{
@@ -587,7 +575,7 @@ public class BuildEnv extends AbstractCompilationEnv
return _astRoots[0].getAST();
}
}
-
+
void postMarkers()
{
if( _markerInfos == null || _markerInfos.size() == 0 )
@@ -598,8 +586,8 @@ public class BuildEnv extends AbstractCompilationEnv
final IWorkspaceRunnable runnable = new IWorkspaceRunnable(){
@Override
public void run(IProgressMonitor monitor)
- {
- for( MarkerInfo markerInfo : _markerInfos ){
+ {
+ for( MarkerInfo markerInfo : _markerInfos ){
try{
final IMarker marker = _javaProject.getProject().createMarker(AptPlugin.APT_BATCH_PROCESSOR_PROBLEM_MARKER);
markerInfo.copyIntoMarker(marker);
@@ -611,7 +599,7 @@ public class BuildEnv extends AbstractCompilationEnv
}
};
IWorkspace ws = _javaProject.getProject().getWorkspace();
- ws.run(runnable, _javaProject.getProject(), IWorkspace.AVOID_UPDATE, null);
+ ws.run(runnable, null);
}
catch(CoreException e){
AptPlugin.log(e, "Failed to post markers"); //$NON-NLS-1$
@@ -620,17 +608,17 @@ public class BuildEnv extends AbstractCompilationEnv
_markerInfos.clear();
}
}
-
+
public BuildContext[] getFilesWithAnnotation()
{
return _filesWithAnnotation;
}
-
+
public BuildContext[] getFilesWithoutAnnotation()
{
return _additionFiles;
}
-
+
private class CallbackRequestor extends BaseRequestor {
CallbackRequestor(ICompilationUnit[] parseUnits) {
super(parseUnits);
@@ -641,7 +629,7 @@ public class BuildEnv extends AbstractCompilationEnv
// then assign the asts, then begin dispatch
_astRoots = asts;
_callback.run(BuildEnv.this);
- }
+ }
}
-
+
}

Back to the top