Skip to content

Commit 2305357

Browse files
kriegaexslachiewicz
authored andcommitted
Recognise javac.msg.plugin.uncaught.exception error header
"A plugin threw an uncaught exception. Consult the following stack trace for details."
1 parent 39263c0 commit 2305357

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,17 @@ protected static class Messages {
200200
"\n\nEin Eingabe-/Ausgabefehler ist aufgetreten.\nDetails finden Sie im folgenden Stacktrace.\n"
201201
};
202202

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

205216
private static final Object LOCK = new Object();
@@ -769,7 +780,8 @@ static List<CompilerMessage> parseModernStream(int exitCode, BufferedReader inpu
769780
|| (cleanedUpMessage = getFileABugError(bufferContent)) != null
770781
|| (cleanedUpMessage = getAnnotationProcessingError(bufferContent)) != null
771782
|| (cleanedUpMessage = getSystemOutOfResourcesError(bufferContent)) != null
772-
|| (cleanedUpMessage = getIOError(bufferContent)) != null) {
783+
|| (cleanedUpMessage = getIOError(bufferContent)) != null
784+
|| (cleanedUpMessage = getPluginError(bufferContent)) != null) {
773785
errors.add(new CompilerMessage(cleanedUpMessage, ERROR));
774786
} else if (hasPointer) {
775787
// A compiler message remains in buffer at end of parse stream
@@ -838,6 +850,10 @@ private static String getIOError(String message) {
838850
return getTextStartingWithPrefix(message, IO_ERROR_HEADERS);
839851
}
840852

853+
private static String getPluginError(String message) {
854+
return getTextStartingWithPrefix(message, PLUGIN_ERROR_HEADERS);
855+
}
856+
841857
private static boolean startsWithPrefix(String text, String[] prefixes) {
842858
for (String prefix : prefixes) {
843859
if (text.startsWith(prefix)) {

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

Lines changed: 43 additions & 1 deletion
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)