use of com.sun.source.util.TaskEvent in project buck by facebook.
the class ValidatingTaskListener method finished.
@Override
public void finished(TaskEvent e) {
final TaskEvent.Kind kind = e.getKind();
if (kind == TaskEvent.Kind.PARSE) {
final CompilationUnitTree compilationUnit = e.getCompilationUnit();
compilationUnits.add(compilationUnit);
} else if (kind == TaskEvent.Kind.ENTER) {
enterDepth -= 1;
// processing so we catch all the types.
if (!annotationProcessing && enterDepth == 0) {
getValidator().validate(compilationUnits);
}
} else if (kind == TaskEvent.Kind.ANNOTATION_PROCESSING) {
annotationProcessing = false;
}
}
use of com.sun.source.util.TaskEvent in project buck by facebook.
the class TracingTaskListenerTest method testTracesAfterChainingOnStart.
/**
* In order for TracingTaskListener to record the most accurate timings for time spent in javac,
* it needs to trace start events after chaining to the next listener.
*/
@Test
public void testTracesAfterChainingOnStart() {
TaskEvent enterEvent = new TaskEvent(TaskEvent.Kind.ENTER, createMock(JavaFileObject.class));
mockControl.checkOrder(true);
mockNextListener.started(enterEvent);
mockTracer.beginEnter();
mockControl.replay();
tracingTaskListener.started(enterEvent);
mockControl.verify();
}
use of com.sun.source.util.TaskEvent in project ceylon-compiler by ceylon.
the class JavacProcessingEnvironment method doProcessing.
// TODO: internal catch clauses?; catch and rethrow an annotation
// processing error
public JavaCompiler doProcessing(Context context, List<JCCompilationUnit> roots, List<ClassSymbol> classSymbols, Iterable<? extends PackageSymbol> pckSymbols) {
TaskListener taskListener = context.get(TaskListener.class);
log = Log.instance(context);
Set<PackageSymbol> specifiedPackages = new LinkedHashSet<PackageSymbol>();
for (PackageSymbol psym : pckSymbols) specifiedPackages.add(psym);
this.specifiedPackages = Collections.unmodifiableSet(specifiedPackages);
Round round = new Round(context, roots, classSymbols);
boolean errorStatus;
boolean moreToDo;
do {
// Run processors for round n
round.run(false, false);
// Processors for round n have run to completion.
// Check for errors and whether there is more work to do.
errorStatus = round.unrecoverableError();
moreToDo = moreToDo();
round.showDiagnostics(errorStatus || showResolveErrors);
// Set up next round.
// Copy mutable collections returned from filer.
round = round.next(new LinkedHashSet<JavaFileObject>(filer.getGeneratedSourceFileObjects()), new LinkedHashMap<String, JavaFileObject>(filer.getGeneratedClasses()));
// Check for errors during setup.
if (round.unrecoverableError())
errorStatus = true;
} while (moreToDo && !errorStatus);
// run last round
round.run(true, errorStatus);
round.showDiagnostics(true);
filer.warnIfUnclosedFiles();
warnIfUnmatchedOptions();
/*
* If an annotation processor raises an error in a round,
* that round runs to completion and one last round occurs.
* The last round may also occur because no more source or
* class files have been generated. Therefore, if an error
* was raised on either of the last *two* rounds, the compile
* should exit with a nonzero exit code. The current value of
* errorStatus holds whether or not an error was raised on the
* second to last round; errorRaised() gives the error status
* of the last round.
*/
if (messager.errorRaised() || werror && round.warningCount() > 0 && round.errorCount() > 0)
errorStatus = true;
Set<JavaFileObject> newSourceFiles = new LinkedHashSet<JavaFileObject>(filer.getGeneratedSourceFileObjects());
roots = cleanTrees(round.roots);
JavaCompiler compiler = round.finalCompiler(errorStatus);
if (newSourceFiles.size() > 0)
roots = roots.appendList(compiler.parseFiles(newSourceFiles));
errorStatus = errorStatus || (compiler.errorCount() > 0);
// Free resources
this.close();
if (taskListener != null)
taskListener.finished(new TaskEvent(TaskEvent.Kind.ANNOTATION_PROCESSING));
if (errorStatus) {
if (compiler.errorCount() == 0)
compiler.log.nerrors++;
return compiler;
}
if (procOnly && !foundTypeProcessors) {
compiler.todo.clear();
} else {
if (procOnly && foundTypeProcessors)
compiler.shouldStopPolicy = CompileState.FLOW;
compiler.enterTrees(roots);
}
return compiler;
}
use of com.sun.source.util.TaskEvent in project ceylon-compiler by ceylon.
the class JavaCompiler method enterTrees.
/**
* Enter the symbols found in a list of parse trees.
* As a side-effect, this puts elements on the "todo" list.
* Also stores a list of all top level classes in rootClasses.
*/
public List<JCCompilationUnit> enterTrees(List<JCCompilationUnit> roots) {
//enter symbols for all files
if (taskListener != null) {
for (JCCompilationUnit unit : roots) {
TaskEvent e = new TaskEvent(TaskEvent.Kind.ENTER, unit);
taskListener.started(e);
}
}
enter.main(roots);
if (taskListener != null) {
for (JCCompilationUnit unit : roots) {
TaskEvent e = new TaskEvent(TaskEvent.Kind.ENTER, unit);
taskListener.finished(e);
}
}
//the original compilation units listed on the command line.
if (sourceOutput || stubOutput) {
ListBuffer<JCClassDecl> cdefs = lb();
for (JCCompilationUnit unit : roots) {
for (List<JCTree> defs = unit.defs; defs.nonEmpty(); defs = defs.tail) {
if (defs.head instanceof JCClassDecl)
cdefs.append((JCClassDecl) defs.head);
}
}
rootClasses = cdefs.toList();
}
// cleaned and are being reused.
for (JCCompilationUnit unit : roots) {
inputFiles.add(unit.sourcefile);
}
return roots;
}
use of com.sun.source.util.TaskEvent in project ceylon-compiler by ceylon.
the class JavaCompiler method complete.
/** Complete compiling a source file that has been accessed
* by the class file reader.
* @param c The class the source file of which needs to be compiled.
* @param filename The name of the source file.
* @param f An input stream that reads the source file.
*/
public void complete(ClassSymbol c) throws CompletionFailure {
// System.err.println("completing " + c);//DEBUG
if (completionFailureName == c.fullname) {
throw new CompletionFailure(c, "user-selected completion failure by class name");
}
JCCompilationUnit tree;
JavaFileObject filename = c.classfile;
JavaFileObject prev = log.useSource(filename);
try {
tree = parse(filename, filename.getCharContent(false));
} catch (IOException e) {
log.error("error.reading.file", filename, JavacFileManager.getMessage(e));
tree = make.TopLevel(List.<JCTree.JCAnnotation>nil(), null, List.<JCTree>nil());
} finally {
log.useSource(prev);
}
if (taskListener != null) {
TaskEvent e = new TaskEvent(TaskEvent.Kind.ENTER, tree);
taskListener.started(e);
}
enter.complete(List.of(tree), c);
if (taskListener != null) {
TaskEvent e = new TaskEvent(TaskEvent.Kind.ENTER, tree);
taskListener.finished(e);
}
if (enter.getEnv(c) == null) {
boolean isPkgInfo = tree.sourcefile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE);
if (isPkgInfo) {
if (enter.getEnv(tree.packge) == null) {
JCDiagnostic diag = diagFactory.fragment("file.does.not.contain.package", c.location());
throw reader.new BadClassFile(c, filename, diag);
}
} else {
JCDiagnostic diag = diagFactory.fragment("file.doesnt.contain.class", c.getQualifiedName());
throw reader.new BadClassFile(c, filename, diag);
}
}
implicitSourceFilesRead = true;
}
Aggregations