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