Search in sources :

Example 1 with LineOutputWriter

use of org.jetbrains.jps.incremental.LineOutputWriter in project intellij-community by JetBrains.

the class JavacMain method compile.

public static boolean compile(Collection<String> options, final Collection<File> sources, Collection<File> classpath, Collection<File> platformClasspath, Collection<File> modulePath, Collection<File> sourcePath, Map<File, Set<File>> outputDirToRoots, final DiagnosticOutputConsumer diagnosticConsumer, final OutputFileConsumer outputSink, CanceledStatus canceledStatus, @NotNull JavaCompilingTool compilingTool) {
    JavaCompiler compiler;
    try {
        compiler = compilingTool.createCompiler();
    } catch (CannotCreateJavaCompilerException e) {
        diagnosticConsumer.report(new PlainMessageDiagnostic(Diagnostic.Kind.ERROR, e.getMessage()));
        return false;
    }
    for (File outputDir : outputDirToRoots.keySet()) {
        outputDir.mkdirs();
    }
    final boolean usingJavac = compilingTool instanceof JavacCompilerTool;
    final JavacFileManager fileManager = new JavacFileManager(new ContextImpl(compiler, diagnosticConsumer, outputSink, canceledStatus, canUseOptimizedFileManager(compilingTool)), JavaSourceTransformer.getTransformers());
    if (!platformClasspath.isEmpty()) {
        // for javac6 this will prevent lazy initialization of Paths.bootClassPathRtJar 
        // and thus usage of symbol file for resolution, when this file is not expected to be used
        fileManager.handleOption("-bootclasspath", Collections.singleton("").iterator());
    }
    // this will clear cached stuff
    fileManager.handleOption("-extdirs", Collections.singleton("").iterator());
    // this will clear cached stuff
    fileManager.handleOption("-endorseddirs", Collections.singleton("").iterator());
    final Collection<String> _options = prepareOptions(options, compilingTool);
    try {
        // Note that due to lazy initialization in various components inside javac, handleOption() should be called before setLocation() and others
        for (Iterator<String> iterator = _options.iterator(); iterator.hasNext(); ) {
            fileManager.handleOption(iterator.next(), iterator);
        }
        try {
            fileManager.setOutputDirectories(outputDirToRoots);
        } catch (IOException e) {
            fileManager.getContext().reportMessage(Diagnostic.Kind.ERROR, e.getMessage());
            return false;
        }
        if (!classpath.isEmpty()) {
            try {
                fileManager.setLocation(StandardLocation.CLASS_PATH, classpath);
                if (!usingJavac && !isOptionSet(options, "-processorpath")) {
                    // for non-javac file manager ensure annotation processor path defaults to classpath
                    fileManager.setLocation(StandardLocation.ANNOTATION_PROCESSOR_PATH, classpath);
                }
            } catch (IOException e) {
                fileManager.getContext().reportMessage(Diagnostic.Kind.ERROR, e.getMessage());
                return false;
            }
        }
        if (!platformClasspath.isEmpty()) {
            try {
                // this will clear cached stuff
                fileManager.handleOption("-bootclasspath", Collections.singleton("").iterator());
                fileManager.setLocation(StandardLocation.PLATFORM_CLASS_PATH, buildPlatformClasspath(platformClasspath, _options));
            } catch (IOException e) {
                fileManager.getContext().reportMessage(Diagnostic.Kind.ERROR, e.getMessage());
                return false;
            }
        }
        if (!modulePath.isEmpty()) {
            final JavaFileManager.Location modulePathLocation = StandardLocation.locationFor("MODULE_PATH");
            if (modulePathLocation != null) {
                // if this option is supported
                try {
                    fileManager.setLocation(modulePathLocation, modulePath);
                } catch (IOException e) {
                    fileManager.getContext().reportMessage(Diagnostic.Kind.ERROR, e.getMessage());
                    return false;
                }
            }
        }
        try {
            // ensure the source path is set;
            // otherwise, if not set, javac attempts to search both classes and sources in classpath;
            // so if some classpath jars contain sources, it will attempt to compile them
            fileManager.setLocation(StandardLocation.SOURCE_PATH, sourcePath);
        } catch (IOException e) {
            fileManager.getContext().reportMessage(Diagnostic.Kind.ERROR, e.getMessage());
            return false;
        }
        //noinspection IOResourceOpenedButNotSafelyClosed
        final LineOutputWriter out = new LineOutputWriter() {

            protected void lineAvailable(String line) {
                if (usingJavac) {
                    diagnosticConsumer.outputLineAvailable(line);
                } else {
                // todo: filter too verbose eclipse output?
                }
            }
        };
        final JavaCompiler.CompilationTask task = compiler.getTask(out, wrapWithCallDispatcher(fileManager), diagnosticConsumer, _options, null, fileManager.getJavaFileObjectsFromFiles(sources));
        for (JavaCompilerToolExtension extension : JavaCompilerToolExtension.getExtensions()) {
            try {
                extension.beforeCompileTaskExecution(compilingTool, task, _options, diagnosticConsumer);
            } catch (Throwable e) {
                fileManager.getContext().reportMessage(Diagnostic.Kind.MANDATORY_WARNING, extension.getClass() + " : " + e.getMessage());
                e.printStackTrace(System.err);
            }
        }
        //}
        return task.call();
    } catch (IllegalArgumentException e) {
        diagnosticConsumer.report(new PlainMessageDiagnostic(Diagnostic.Kind.ERROR, e.getMessage()));
    } catch (CompilationCanceledException ignored) {
        handleCancelException(diagnosticConsumer);
    } catch (RuntimeException e) {
        final Throwable cause = e.getCause();
        if (cause instanceof CompilationCanceledException) {
            handleCancelException(diagnosticConsumer);
        } else {
            throw e;
        }
    } finally {
        fileManager.close();
        if (usingJavac) {
            cleanupJavacNameTable();
        }
    }
    return false;
}
Also used : JavacCompilerTool(org.jetbrains.jps.builders.impl.java.JavacCompilerTool) IOException(java.io.IOException) LineOutputWriter(org.jetbrains.jps.incremental.LineOutputWriter) CannotCreateJavaCompilerException(org.jetbrains.jps.builders.java.CannotCreateJavaCompilerException) File(java.io.File)

Aggregations

File (java.io.File)1 IOException (java.io.IOException)1 JavacCompilerTool (org.jetbrains.jps.builders.impl.java.JavacCompilerTool)1 CannotCreateJavaCompilerException (org.jetbrains.jps.builders.java.CannotCreateJavaCompilerException)1 LineOutputWriter (org.jetbrains.jps.incremental.LineOutputWriter)1