8250217: com.sun.tools.javac.api.JavacTaskImpl swallows compiler exceptions potentially producing false positive test results

Reviewed-by: jlahoda
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java
index bd0ed14..943337b 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java
@@ -97,13 +97,18 @@
     /* Internal version of call exposing Main.Result. */
     public Main.Result doCall() {
         try {
-            return handleExceptions(() -> {
+            Pair<Main.Result, Throwable> result = invocationHelper(() -> {
                 prepareCompiler(false);
                 if (compiler.errorCount() > 0)
                     return Main.Result.ERROR;
                 compiler.compile(args.getFileObjects(), args.getClassNames(), processors, addModules);
                 return (compiler.errorCount() > 0) ? Main.Result.ERROR : Main.Result.OK; // FIXME?
-            }, Main.Result.SYSERR, Main.Result.ABNORMAL);
+            });
+            if (result.snd == null) {
+                return result.fst;
+            } else {
+                return (result.snd instanceof FatalError) ? Main.Result.SYSERR : Main.Result.ABNORMAL;
+            }
         } finally {
             try {
                 cleanup();
@@ -141,10 +146,10 @@
         this.locale = locale;
     }
 
-    private <T> T handleExceptions(Callable<T> c, T sysErrorResult, T abnormalErrorResult) {
+    private <T> Pair<T, Throwable> invocationHelper(Callable<T> c) {
         Handler prevDeferredHandler = dcfh.setHandler(dcfh.javacCodeHandler);
         try {
-            return c.call();
+            return new Pair<>(c.call(), null);
         } catch (FatalError ex) {
             Log log = Log.instance(context);
             Options options = Options.instance(context);
@@ -152,7 +157,7 @@
             if (ex.getCause() != null && options.isSet("dev")) {
                 ex.getCause().printStackTrace(log.getWriter(WriterKind.NOTICE));
             }
-            return sysErrorResult;
+            return new Pair<>(null, ex);
         } catch (AnnotationProcessingError | ClientCodeException e) {
             // AnnotationProcessingError is thrown from JavacProcessingEnvironment,
             // to forward errors thrown from an annotation processor
@@ -175,7 +180,7 @@
                 log.printLines(PrefixKind.JAVAC, "msg.bug", JavaCompiler.version());
                 ex.printStackTrace(log.getWriter(WriterKind.NOTICE));
             }
-            return abnormalErrorResult;
+            return new Pair<>(null, ex);
         } finally {
             dcfh.setHandler(prevDeferredHandler);
         }
@@ -240,7 +245,11 @@
 
     @Override @DefinedBy(Api.COMPILER_TREE)
     public Iterable<? extends CompilationUnitTree> parse() {
-        return handleExceptions(this::parseInternal, List.nil(), List.nil());
+        Pair<Iterable<? extends CompilationUnitTree>, Throwable> result =  invocationHelper(this::parseInternal);
+        if (result.snd == null) {
+            return result.fst;
+        }
+        throw new IllegalStateException(result.snd);
     }
 
     private Iterable<? extends CompilationUnitTree> parseInternal() {
@@ -367,7 +376,11 @@
 
     @Override @DefinedBy(Api.COMPILER_TREE)
     public Iterable<? extends Element> analyze() {
-        return handleExceptions(() -> analyze(null), List.nil(), List.nil());
+        Pair<Iterable<? extends Element>, Throwable> result =  invocationHelper(() -> analyze(null));
+        if (result.snd == null) {
+            return result.fst;
+        }
+        throw new IllegalStateException(result.snd);
     }
 
     /**
@@ -429,7 +442,11 @@
 
     @Override @DefinedBy(Api.COMPILER_TREE)
     public Iterable<? extends JavaFileObject> generate() {
-        return handleExceptions(() -> generate(null), List.nil(), List.nil());
+        Pair<Iterable<? extends JavaFileObject>, Throwable> result =  invocationHelper(() -> generate(null));
+        if (result.snd == null) {
+            return result.fst;
+        }
+        throw new IllegalStateException(result.snd);
     }
 
     /**
diff --git a/test/langtools/tools/javac/processing/errors/CrashOnNonExistingAnnotation/Processor.java b/test/langtools/tools/javac/processing/errors/CrashOnNonExistingAnnotation/Processor.java
index 7c24612..26a6c75 100644
--- a/test/langtools/tools/javac/processing/errors/CrashOnNonExistingAnnotation/Processor.java
+++ b/test/langtools/tools/javac/processing/errors/CrashOnNonExistingAnnotation/Processor.java
@@ -189,7 +189,7 @@
         }
 
         @Override public boolean isNameCompatible(String simpleName, Kind kind) {
-            return true;
+            return simpleName.equals("Source") && kind == Kind.SOURCE;
         }
     }