use of org.eclipse.ceylon.langtools.source.util.TaskEvent in project ceylon by eclipse.
the class ModelLoaderTests method verifyCompilerClassLoading.
protected void verifyCompilerClassLoading(String ceylon, final RunnableTest test, List<String> options) {
// now compile the ceylon usage file
JavacTaskImpl task2 = getCompilerTask(options, ceylon);
// get the context to grab the declarations
final Context context2 = task2.getContext();
// declarations from the jar anymore because we've overridden the jar and the javac jar index is corrupted
class Listener implements TaskListener {
@Override
public void started(TaskEvent e) {
}
@Override
public void finished(TaskEvent e) {
if (e.getKind() == Kind.ENTER) {
CeylonModelLoader modelLoader = (CeylonModelLoader) CeylonModelLoader.instance(context2);
test.test(modelLoader);
}
}
}
Listener listener = new Listener();
task2.setTaskListener(listener);
try {
Boolean success = task2.call();
Assert.assertTrue("Compilation failed", success);
} catch (AssertionError x) {
throw x;
} catch (Throwable x) {
// make sure we unwrap it
while (x.getCause() != null) x = x.getCause();
if (x instanceof Error)
throw (Error) x;
if (x instanceof RuntimeException)
throw (RuntimeException) x;
throw new RuntimeException(x);
}
}
use of org.eclipse.ceylon.langtools.source.util.TaskEvent in project ceylon by eclipse.
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, Log.DeferredDiagnosticHandler deferredDiagnosticHandler) {
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, deferredDiagnosticHandler);
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();
// Ceylon: we need to call parseFiles even if we did not add anything, to reset
// module stuff
// if (newSourceFiles.size() > 0)
roots = roots.appendList(compiler.parseFiles(newSourceFiles));
errorStatus = errorStatus || (compiler.errorCount() > 0);
// Free resources
this.close();
if (!taskListener.isEmpty())
taskListener.finished(new TaskEvent(TaskEvent.Kind.ANNOTATION_PROCESSING));
if (errorStatus) {
if (compiler.errorCount() == 0)
compiler.log.nerrors++;
return compiler;
}
compiler.enterTreesIfNeeded(roots);
return compiler;
}
use of org.eclipse.ceylon.langtools.source.util.TaskEvent in project ceylon by eclipse.
the class CeylonEnter method completeCeylonTrees.
public List<JCCompilationUnit> completeCeylonTrees(List<JCCompilationUnit> trees) {
// run the type checker
timer.startTask("Ceylon type checking");
typeCheck();
// some debugging
// printModules();
timer.startTask("Ceylon code generation");
/*
* Here we convert the ceylon tree to its javac AST, after the typechecker has run
*/
Timer nested = timer.nestedTimer();
if (sp != null) {
sp.clearLine();
sp.log("Generating AST");
}
int i = 1;
int size = countCeylonFiles(trees);
List<JCCompilationUnit> packageInfos = List.<JCCompilationUnit>nil();
for (JCCompilationUnit tree : trees) {
if (tree instanceof CeylonCompilationUnit) {
CeylonCompilationUnit ceylonTree = (CeylonCompilationUnit) tree;
gen.setMap(ceylonTree.lineMap);
CeylonPhasedUnit phasedUnit = (CeylonPhasedUnit) ceylonTree.phasedUnit;
if (sp != null) {
sp.clearLine();
sp.log("Generating [" + (i++) + "/" + size + "] ");
sp.log(phasedUnit.getPathRelativeToSrcDir());
}
gen.setFileObject(phasedUnit.getFileObject());
nested.startTask("Ceylon code generation for " + phasedUnit.getUnitFile().getName());
TaskEvent event = new TaskEvent(TaskEvent.Kind.PARSE, tree);
if (taskListener != null) {
taskListener.started(event);
}
ceylonTree.defs = gen.transformAfterTypeChecking(ceylonTree.ceylonTree).toList();
if (taskListener != null) {
taskListener.finished(event);
}
packageInfos = packageInfos.prependList(gen.transformPackageInfo(ceylonTree));
nested.endTask();
if (isVerbose("ast")) {
log.printRawLines(WriterKind.ERROR, "Model tree for " + tree.getSourceFile());
log.printRawLines(WriterKind.ERROR, ceylonTree.ceylonTree.toString());
}
if (isVerbose("code")) {
log.printRawLines(WriterKind.ERROR, "Java code generated for " + tree.getSourceFile());
log.printRawLines(WriterKind.ERROR, ceylonTree.toString());
}
}
}
if (isVerbose("code")) {
for (JCCompilationUnit packageInfo : packageInfos) {
log.printRawLines(WriterKind.ERROR, packageInfo.toString());
}
}
if (sp != null) {
sp.clearLine();
}
timer.startTask("Ceylon error generation");
printGeneratorErrors();
timer.endTask();
// write some stats
if (verbose)
modelLoader.printStats();
return packageInfos;
}
Aggregations