8187950: javax.lang.model APIs throws CompletionFailure or a subtype of CompletionFailure

Catching CompletionFailures that would be thrown to API clients, and re-completing the symbols again when javac itself needs it.

Reviewed-by: cushon, jjg
This commit is contained in:
Jan Lahoda 2018-03-09 09:42:10 +01:00
parent 798b830ad8
commit b0b8a51be1
22 changed files with 1010 additions and 80 deletions

View file

@ -34,6 +34,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.tools.JavaCompiler;
@ -58,6 +59,7 @@ public class JavacTask extends AbstractTask<JavacTask> {
private List<String> files;
private List<JavaFileObject> fileObjects;
private JavaFileManager fileManager;
private Consumer<com.sun.source.util.JavacTask> callback;
private JavaCompiler compiler;
private StandardJavaFileManager internalFileManager;
@ -253,6 +255,16 @@ public class JavacTask extends AbstractTask<JavacTask> {
return this;
}
/**
* Set a callback to be used by this task.
* @param callback the callback
* @return this task object
*/
public JavacTask callback(Consumer<com.sun.source.util.JavacTask> callback) {
this.callback = callback;
return this;
}
/**
* {@inheritDoc}
* @return the name "javac"
@ -290,6 +302,9 @@ public class JavacTask extends AbstractTask<JavacTask> {
if (fileManager != null) {
throw new IllegalStateException("file manager set in CMDLINE mode");
}
if (callback != null) {
throw new IllegalStateException("callback set in CMDLINE mode");
}
rc = runCommand(direct.pw);
break;
default:
@ -333,7 +348,11 @@ public class JavacTask extends AbstractTask<JavacTask> {
allOpts,
classes,
allFiles);
return ((JavacTaskImpl) task).doCall().exitCode;
JavacTaskImpl taskImpl = (JavacTaskImpl) task;
if (callback != null) {
callback.accept(taskImpl);
}
return taskImpl.doCall().exitCode;
} finally {
if (internalFileManager != null)
internalFileManager.close();