Skip to content

Commit 026fd94

Browse files
committed
Recognise javac.msg.plugin.uncaught.exception error header
"A plugin threw an uncaught exception. Consult the following stack trace for details."
1 parent ef87d75 commit 026fd94

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,17 @@ protected static class Messages {
197197
"\n\nEin Eingabe-/Ausgabefehler ist aufgetreten.\nDetails finden Sie im folgenden Stacktrace.\n"
198198
};
199199

200+
// javac.properties-> javac.msg.plugin.uncaught.exception
201+
// (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21)
202+
protected static final String[] PLUGIN_ERROR_HEADERS = {
203+
"\n\nA plugin threw an uncaught exception.\nConsult the following stack trace for details.\n",
204+
"\n\nプラグインで捕捉されない例外がスローされました。\n詳細は次のスタック・トレースで調査してください。\n",
205+
"\n\n插件抛出未捕获的异常错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n",
206+
"\n\nA plugin threw an uncaught exception.\nConsult the following stack trace for details.\n",
207+
"\n\nプラグインで捕捉されない例外がスローされました。\n詳細は次のスタック・トレースで調査してください。\n",
208+
"\n\n插件抛出未捕获的异常错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n",
209+
"\n\nEin Plug-in hat eine nicht abgefangene Ausnahme ausgel\u00F6st.\nDetails finden Sie im folgenden Stacktrace.\n"
210+
};
200211
}
201212

202213
private static final Object LOCK = new Object();
@@ -782,7 +793,8 @@ static List<CompilerMessage> parseModernStream(int exitCode, BufferedReader inpu
782793
|| (cleanedUpMessage = getFileABugError(bufferContent)) != null
783794
|| (cleanedUpMessage = getAnnotationProcessingError(bufferContent)) != null
784795
|| (cleanedUpMessage = getSystemOutOfResourcesError(bufferContent)) != null
785-
|| (cleanedUpMessage = getIOError(bufferContent)) != null) {
796+
|| (cleanedUpMessage = getIOError(bufferContent)) != null
797+
|| (cleanedUpMessage = getPluginError(bufferContent)) != null) {
786798
errors.add(new CompilerMessage(cleanedUpMessage, ERROR));
787799
} else if (hasPointer) {
788800
// A compiler message remains in buffer at end of parse stream
@@ -851,6 +863,10 @@ private static String getIOError(String message) {
851863
return getTextStartingWithPrefix(message, IO_ERROR_HEADERS);
852864
}
853865

866+
private static String getPluginError(String message) {
867+
return getTextStartingWithPrefix(message, PLUGIN_ERROR_HEADERS);
868+
}
869+
854870
private static boolean startsWithPrefix(String text, String[] prefixes) {
855871
for (String prefix : prefixes) {
856872
if (text.startsWith(prefix)) {

plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/ErrorMessageParserTest.java

+43-1
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,9 @@ private static Stream<Arguments> testStackTraceWithUnknownHeader_args() {
812812
Arguments.of(
813813
"modified out of resources error header",
814814
SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[0].replaceAll("resources", "memory")),
815-
Arguments.of("modified I/O error header", IO_ERROR_HEADERS[0].replaceAll("input/output", "I/O")));
815+
Arguments.of("modified I/O error header", IO_ERROR_HEADERS[0].replaceAll("input/output", "I/O")),
816+
Arguments.of(
817+
"modified plugin error header", PLUGIN_ERROR_HEADERS[0].replaceAll("uncaught", "unhandled")));
816818
}
817819

818820
@ParameterizedTest(name = "{0}")
@@ -977,6 +979,46 @@ private static Stream<Arguments> testIOError_args() {
977979
Arguments.of("JDK 21 German", IO_ERROR_HEADERS[6]));
978980
}
979981

982+
@ParameterizedTest(name = "{0}")
983+
@MethodSource("testPluginError_args")
984+
public void testPluginError(String jdkAndLocale, String stackTraceHeader) throws Exception {
985+
String stackTraceWithHeader = UNIDENTIFIED_LOG_LINES + stackTraceHeader + stackTracePluginError;
986+
987+
List<CompilerMessage> compilerMessages =
988+
JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader)));
989+
990+
assertThat(compilerMessages, notNullValue());
991+
assertThat(compilerMessages, hasSize(1));
992+
993+
String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
994+
// Parser retains stack trace header
995+
assertThat(message, startsWith(stackTraceHeader));
996+
assertThat(message, endsWith(stackTracePluginError));
997+
}
998+
999+
private static final String stackTracePluginError =
1000+
"A plugin threw an uncaught exception.\n" + "Consult the following stack trace for details.\n"
1001+
+ "java.lang.NoSuchMethodError: com.sun.tools.javac.util.JavacMessages.add(Lcom/sun/tools/javac/util/JavacMessages$ResourceBundleHelper;)V\n"
1002+
+ "\tat com.google.errorprone.BaseErrorProneJavaCompiler.setupMessageBundle(BaseErrorProneJavaCompiler.java:202)\n"
1003+
+ "\tat com.google.errorprone.ErrorProneJavacPlugin.init(ErrorProneJavacPlugin.java:40)\n"
1004+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:470)\n"
1005+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:381)\n"
1006+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:370)\n"
1007+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:361)\n"
1008+
+ "\tat com.sun.tools.javac.Main.compile(Main.java:56)\n"
1009+
+ "\tat com.sun.tools.javac.Main.main(Main.java:42)\n";
1010+
1011+
private static Stream<Arguments> testPluginError_args() {
1012+
return Stream.of(
1013+
Arguments.of("JDK 8 English", PLUGIN_ERROR_HEADERS[0]),
1014+
Arguments.of("JDK 8 Japanese", PLUGIN_ERROR_HEADERS[1]),
1015+
Arguments.of("JDK 8 Chinese", PLUGIN_ERROR_HEADERS[2]),
1016+
Arguments.of("JDK 21 English", PLUGIN_ERROR_HEADERS[3]),
1017+
Arguments.of("JDK 21 Japanese", PLUGIN_ERROR_HEADERS[4]),
1018+
Arguments.of("JDK 21 Chinese", PLUGIN_ERROR_HEADERS[5]),
1019+
Arguments.of("JDK 21 German", PLUGIN_ERROR_HEADERS[6]));
1020+
}
1021+
9801022
@Test
9811023
public void testNonAnchoredWarning() throws IOException {
9821024
final String error = "warning: [options] bootstrap class path not set in conjunction with -source 1.6" + EOL

0 commit comments

Comments
 (0)