Search in sources :

Example 6 with TaskListener

use of com.sun.source.util.TaskListener in project ceylon-compiler by ceylon.

the class ModelLoaderTests method verifyCompilerClassLoading.

protected void verifyCompilerClassLoading(String ceylon, final ModelComparison modelCompare) {
    // now compile the ceylon decl file
    CeyloncTaskImpl task = getCompilerTask(ceylon);
    // get the context to grab the phased units
    Context context = task.getContext();
    if (simpleAnnotationModels) {
        CeylonEnter.instance(context);
        ExpressionTransformer.getInstance(context).simpleAnnotationModels = true;
        CeylonTransformer.getInstance(context).simpleAnnotationModels = true;
        StatementTransformer.getInstance(context).simpleAnnotationModels = true;
        ClassTransformer.getInstance(context).simpleAnnotationModels = true;
    }
    Boolean success = task.call();
    Assert.assertTrue(success);
    PhasedUnits phasedUnits = LanguageCompiler.getPhasedUnitsInstance(context);
    // find out what was in that file
    Assert.assertEquals(2, phasedUnits.getPhasedUnits().size());
    PhasedUnit one = phasedUnits.getPhasedUnits().get(0);
    PhasedUnit two = phasedUnits.getPhasedUnits().get(1);
    PhasedUnit phasedUnit = one.getUnitFile().getName().endsWith("module.ceylon") ? two : one;
    final Map<String, Declaration> decls = new HashMap<String, Declaration>();
    for (Declaration decl : phasedUnit.getUnit().getDeclarations()) {
        if (decl.isToplevel()) {
            decls.put(getQualifiedPrefixedName(decl), decl);
        }
    }
    // now compile the ceylon usage file
    // remove the extension, make lowercase and add "test"
    String testfile = ceylon.substring(0, ceylon.length() - 7).toLowerCase() + "test.ceylon";
    JavacTaskImpl task2 = getCompilerTask(testfile);
    // 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) {
                AbstractModelLoader modelLoader = CeylonModelLoader.instance(context2);
                Modules modules = LanguageCompiler.getCeylonContextInstance(context2).getModules();
                // now see if we can find our declarations
                compareDeclarations(modelCompare, decls, modelLoader, modules);
            }
        }
    }
    Listener listener = new Listener();
    task2.setTaskListener(listener);
    success = task2.call();
    Assert.assertTrue("Compilation failed", success);
    // now check with the runtime model loader too
    String module = moduleForJavaModelLoading();
    String version = "1";
    ModuleWithArtifact moduleWithArtifact = new ModuleWithArtifact(module, version);
    synchronized (RUN_LOCK) {
        // this initialises the metamodel, even if we don't use the resulting ClassLoader
        URLClassLoader classLoader;
        try {
            classLoader = getClassLoader("runtime model loader tests", moduleWithArtifact);
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
        try {
            RuntimeModuleManager moduleManager = Metamodel.getModuleManager();
            RuntimeModelLoader modelLoader = moduleManager.getModelLoader();
            Modules modules = moduleManager.getModules();
            // now see if we can find our declarations
            compareDeclarations(modelCompare, decls, modelLoader, modules);
        } finally {
            try {
                classLoader.close();
            } catch (IOException e) {
                // ignore
                e.printStackTrace();
            }
        }
    }
}
Also used : Context(com.sun.tools.javac.util.Context) AbstractModelLoader(com.redhat.ceylon.model.loader.AbstractModelLoader) JavacTaskImpl(com.sun.tools.javac.api.JavacTaskImpl) MalformedURLException(java.net.MalformedURLException) RuntimeModuleManager(com.redhat.ceylon.compiler.java.runtime.model.RuntimeModuleManager) TaskListener(com.sun.source.util.TaskListener) HashMap(java.util.HashMap) Modules(com.redhat.ceylon.model.typechecker.model.Modules) CeyloncTaskImpl(com.redhat.ceylon.compiler.java.tools.CeyloncTaskImpl) IOException(java.io.IOException) PhasedUnit(com.redhat.ceylon.compiler.typechecker.context.PhasedUnit) URLClassLoader(java.net.URLClassLoader) PhasedUnits(com.redhat.ceylon.compiler.typechecker.context.PhasedUnits) TaskEvent(com.sun.source.util.TaskEvent) TaskListener(com.sun.source.util.TaskListener) RuntimeModelLoader(com.redhat.ceylon.compiler.java.runtime.model.RuntimeModelLoader) Declaration(com.redhat.ceylon.model.typechecker.model.Declaration) TypeDeclaration(com.redhat.ceylon.model.typechecker.model.TypeDeclaration)

Example 7 with TaskListener

use of com.sun.source.util.TaskListener in project ceylon-compiler by ceylon.

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(com.sun.tools.javac.util.Context) JavacTaskImpl(com.sun.tools.javac.api.JavacTaskImpl) CeylonModelLoader(com.redhat.ceylon.compiler.java.loader.CeylonModelLoader) TaskListener(com.sun.source.util.TaskListener) TaskEvent(com.sun.source.util.TaskEvent) TaskListener(com.sun.source.util.TaskListener) CompilerError(com.redhat.ceylon.compiler.java.test.CompilerError)

Example 8 with TaskListener

use of com.sun.source.util.TaskListener 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;
}
Also used : JavaFileObject(javax.tools.JavaFileObject) TaskListener(com.sun.source.util.TaskListener) TaskEvent(com.sun.source.util.TaskEvent) JavaCompiler(com.sun.tools.javac.main.JavaCompiler)

Aggregations

TaskListener (com.sun.source.util.TaskListener)8 TaskEvent (com.sun.source.util.TaskEvent)7 CeyloncTaskImpl (com.redhat.ceylon.compiler.java.tools.CeyloncTaskImpl)4 JCCompilationUnit (com.sun.tools.javac.tree.JCTree.JCCompilationUnit)4 File (java.io.File)3 DiagnosticListener (javax.tools.DiagnosticListener)3 JavaPositionsRetriever (com.redhat.ceylon.compiler.java.codegen.JavaPositionsRetriever)2 ExitState (com.redhat.ceylon.compiler.java.launcher.Main.ExitState)2 JavacTask (com.sun.source.util.JavacTask)2 JavacTaskImpl (com.sun.tools.javac.api.JavacTaskImpl)2 Context (com.sun.tools.javac.util.Context)2 CeylonModelLoader (com.redhat.ceylon.compiler.java.loader.CeylonModelLoader)1 RuntimeModelLoader (com.redhat.ceylon.compiler.java.runtime.model.RuntimeModelLoader)1 RuntimeModuleManager (com.redhat.ceylon.compiler.java.runtime.model.RuntimeModuleManager)1 CompilerError (com.redhat.ceylon.compiler.java.test.CompilerError)1 PhasedUnit (com.redhat.ceylon.compiler.typechecker.context.PhasedUnit)1 PhasedUnits (com.redhat.ceylon.compiler.typechecker.context.PhasedUnits)1 AbstractModelLoader (com.redhat.ceylon.model.loader.AbstractModelLoader)1 Declaration (com.redhat.ceylon.model.typechecker.model.Declaration)1 Modules (com.redhat.ceylon.model.typechecker.model.Modules)1