Search in sources :

Example 11 with TaskEvent

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);
    }
}
Also used : Context(org.eclipse.ceylon.langtools.tools.javac.util.Context) JavacTaskImpl(org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl) CeylonModelLoader(org.eclipse.ceylon.compiler.java.loader.CeylonModelLoader) TaskListener(org.eclipse.ceylon.langtools.source.util.TaskListener) TaskEvent(org.eclipse.ceylon.langtools.source.util.TaskEvent) TaskListener(org.eclipse.ceylon.langtools.source.util.TaskListener) CompilerError(org.eclipse.ceylon.compiler.java.test.CompilerError)

Example 12 with TaskEvent

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;
}
Also used : JavaFileObject(org.eclipse.ceylon.javax.tools.JavaFileObject) TaskEvent(org.eclipse.ceylon.langtools.source.util.TaskEvent) JavaCompiler(org.eclipse.ceylon.langtools.tools.javac.main.JavaCompiler)

Example 13 with TaskEvent

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;
}
Also used : JCCompilationUnit(org.eclipse.ceylon.langtools.tools.javac.tree.JCTree.JCCompilationUnit) CeylonCompilationUnit(org.eclipse.ceylon.compiler.java.codegen.CeylonCompilationUnit) Timer(org.eclipse.ceylon.model.loader.Timer) CeylonPhasedUnit(org.eclipse.ceylon.compiler.java.tools.CeylonPhasedUnit) TaskEvent(org.eclipse.ceylon.langtools.source.util.TaskEvent)

Aggregations

TaskEvent (org.eclipse.ceylon.langtools.source.util.TaskEvent)13 JavaFileObject (org.eclipse.ceylon.javax.tools.JavaFileObject)5 TaskListener (org.eclipse.ceylon.langtools.source.util.TaskListener)5 CeyloncTaskImpl (org.eclipse.ceylon.compiler.java.tools.CeyloncTaskImpl)4 JCCompilationUnit (org.eclipse.ceylon.langtools.tools.javac.tree.JCTree.JCCompilationUnit)4 File (java.io.File)3 ZipFile (java.util.zip.ZipFile)3 DiagnosticListener (org.eclipse.ceylon.javax.tools.DiagnosticListener)3 JCTree (org.eclipse.ceylon.langtools.tools.javac.tree.JCTree)3 JavaPositionsRetriever (org.eclipse.ceylon.compiler.java.codegen.JavaPositionsRetriever)2 ExitState (org.eclipse.ceylon.compiler.java.launcher.Main.ExitState)2 JavacTaskImpl (org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl)2 Context (org.eclipse.ceylon.langtools.tools.javac.util.Context)2 IOException (java.io.IOException)1 MalformedURLException (java.net.MalformedURLException)1 URLClassLoader (java.net.URLClassLoader)1 HashMap (java.util.HashMap)1 CeylonCompilationUnit (org.eclipse.ceylon.compiler.java.codegen.CeylonCompilationUnit)1 CeylonModelLoader (org.eclipse.ceylon.compiler.java.loader.CeylonModelLoader)1 RuntimeModelLoader (org.eclipse.ceylon.compiler.java.runtime.model.RuntimeModelLoader)1