|
42 | 42 | import com.sun.tools.javac.util.Log.DeferredDiagnosticHandler;
|
43 | 43 | import com.sun.tools.javac.util.Options;
|
44 | 44 | import java.io.IOException;
|
| 45 | +import java.lang.reflect.Constructor; |
45 | 46 | import java.lang.reflect.Method;
|
46 | 47 | import java.net.URI;
|
47 | 48 | import java.util.ArrayList;
|
@@ -365,7 +366,7 @@ public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOExcept
|
365 | 366 | return text;
|
366 | 367 | }
|
367 | 368 | });
|
368 |
| - DeferredDiagnosticHandler diagnostics = new DeferredDiagnosticHandler(log); |
| 369 | + DeferredDiagnosticHandler diagnostics = deferredDiagnosticHandler(log); |
369 | 370 | ImmutableList<RawTok> rawToks = JavacTokens.getTokens(text, context, stopTokens);
|
370 | 371 | Collection<JCDiagnostic> ds;
|
371 | 372 | try {
|
@@ -482,6 +483,29 @@ public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOExcept
|
482 | 483 | return ImmutableList.copyOf(toks);
|
483 | 484 | }
|
484 | 485 |
|
| 486 | + private static final Constructor<DeferredDiagnosticHandler> |
| 487 | + DEFERRED_DIAGNOSTIC_HANDLER_CONSTRUCTOR = getDeferredDiagnosticHandlerConstructor(); |
| 488 | + |
| 489 | + // Depending on the JDK version, we might have a static class whose constructor has an explicit |
| 490 | + // Log parameter, or an inner class whose constructor has an *implicit* Log parameter. They are |
| 491 | + // different at the source level, but look the same to reflection. |
| 492 | + |
| 493 | + private static Constructor<DeferredDiagnosticHandler> getDeferredDiagnosticHandlerConstructor() { |
| 494 | + try { |
| 495 | + return DeferredDiagnosticHandler.class.getConstructor(Log.class); |
| 496 | + } catch (NoSuchMethodException e) { |
| 497 | + throw new LinkageError(e.getMessage(), e); |
| 498 | + } |
| 499 | + } |
| 500 | + |
| 501 | + private static DeferredDiagnosticHandler deferredDiagnosticHandler(Log log) { |
| 502 | + try { |
| 503 | + return DEFERRED_DIAGNOSTIC_HANDLER_CONSTRUCTOR.newInstance(log); |
| 504 | + } catch (ReflectiveOperationException e) { |
| 505 | + throw new LinkageError(e.getMessage(), e); |
| 506 | + } |
| 507 | + } |
| 508 | + |
485 | 509 | private static final Method GET_DIAGNOSTICS = getGetDiagnostics();
|
486 | 510 |
|
487 | 511 | private static @Nullable Method getGetDiagnostics() {
|
|
0 commit comments