Search in sources :

Example 16 with TaskEvent

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;
    }
}
Also used : CompilationUnitTree(com.sun.source.tree.CompilationUnitTree) TaskEvent(com.sun.source.util.TaskEvent)

Example 17 with TaskEvent

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();
}
Also used : JavaFileObject(javax.tools.JavaFileObject) TaskEvent(com.sun.source.util.TaskEvent) Test(org.junit.Test)

Example 18 with TaskEvent

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;
}
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)

Example 19 with TaskEvent

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;
}
Also used : TaskEvent(com.sun.source.util.TaskEvent) JCTree(com.sun.tools.javac.tree.JCTree)

Example 20 with TaskEvent

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;
}
Also used : JavaFileObject(javax.tools.JavaFileObject) TaskEvent(com.sun.source.util.TaskEvent) JCTree(com.sun.tools.javac.tree.JCTree)

Aggregations

TaskEvent (com.sun.source.util.TaskEvent)20 TaskListener (com.sun.source.util.TaskListener)7 JavaFileObject (javax.tools.JavaFileObject)7 JCCompilationUnit (com.sun.tools.javac.tree.JCTree.JCCompilationUnit)5 Test (org.junit.Test)5 CeyloncTaskImpl (com.redhat.ceylon.compiler.java.tools.CeyloncTaskImpl)4 JCTree (com.sun.tools.javac.tree.JCTree)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 CompilationUnitTree (com.sun.source.tree.CompilationUnitTree)2 JavacTaskImpl (com.sun.tools.javac.api.JavacTaskImpl)2 Context (com.sun.tools.javac.util.Context)2 CeylonCompilationUnit (com.redhat.ceylon.compiler.java.codegen.CeylonCompilationUnit)1 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 CeylonPhasedUnit (com.redhat.ceylon.compiler.java.tools.CeylonPhasedUnit)1