From 498ac26414f3a35f81f00d4a8c9637a63d65819f Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Wed, 1 Nov 2023 16:05:30 +0800 Subject: [PATCH] Introduce CompilationException::getDiagnosticCode Fix TestCompilerTests with locales other than english See GH-31407 --- .../core/test/tools/CompilationException.java | 24 ++++++++++++++++++- .../core/test/tools/TestCompiler.java | 12 +++++++++- .../core/test/tools/TestCompilerTests.java | 3 ++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/spring-core-test/src/main/java/org/springframework/core/test/tools/CompilationException.java b/spring-core-test/src/main/java/org/springframework/core/test/tools/CompilationException.java index 5e93ef96870c..9cb37a02d785 100644 --- a/spring-core-test/src/main/java/org/springframework/core/test/tools/CompilationException.java +++ b/spring-core-test/src/main/java/org/springframework/core/test/tools/CompilationException.java @@ -16,20 +16,42 @@ package org.springframework.core.test.tools; +import javax.tools.Diagnostic; + +import org.springframework.lang.Nullable; + /** * Exception thrown when code cannot compile. * * @author Phillip Webb + * @author Yanming Zhou * @since 6.0 */ @SuppressWarnings("serial") public class CompilationException extends RuntimeException { + @Nullable + private final String diagnosticCode; - CompilationException(String errors, SourceFiles sourceFiles, ResourceFiles resourceFiles) { + CompilationException(@Nullable String diagnosticCode, String errors, SourceFiles sourceFiles, ResourceFiles resourceFiles) { super(buildMessage(errors, sourceFiles, resourceFiles)); + this.diagnosticCode = diagnosticCode; } + CompilationException(String errors, SourceFiles sourceFiles, ResourceFiles resourceFiles) { + this(null, errors, sourceFiles, resourceFiles); + } + + /** + * Return the diagnostic code reported by compiler. + * @return diagnostic code reported by compiler, might be null. + * @since 6.1 + * @see Diagnostic#getCode() + */ + @Nullable + public String getDiagnosticCode() { + return this.diagnosticCode; + } private static String buildMessage(String errors, SourceFiles sourceFiles, ResourceFiles resourceFiles) { diff --git a/spring-core-test/src/main/java/org/springframework/core/test/tools/TestCompiler.java b/spring-core-test/src/main/java/org/springframework/core/test/tools/TestCompiler.java index 14321abb2559..9110cf768677 100644 --- a/spring-core-test/src/main/java/org/springframework/core/test/tools/TestCompiler.java +++ b/spring-core-test/src/main/java/org/springframework/core/test/tools/TestCompiler.java @@ -43,6 +43,7 @@ * @author Phillip Webb * @author Scott Frederick * @author Stephane Nicoll + * @author Yanming Zhou * @since 6.0 * @see #forSystem() */ @@ -336,7 +337,7 @@ private DynamicClassLoader compile() { } boolean result = task.call(); if (!result || errors.hasReportedErrors()) { - throw new CompilationException(errors.toString(), this.sourceFiles, this.resourceFiles); + throw new CompilationException(errors.getDiagnosticCode(), errors.toString(), this.sourceFiles, this.resourceFiles); } } return new DynamicClassLoader(classLoaderToUse, this.classFiles, this.resourceFiles, @@ -373,6 +374,9 @@ static class Errors implements DiagnosticListener { private final StringBuilder message = new StringBuilder(); + @Nullable + private String diagnosticCode; + Errors(Locale locale) { this.locale = locale; } @@ -380,6 +384,7 @@ static class Errors implements DiagnosticListener { @Override public void report(Diagnostic diagnostic) { if (diagnostic.getKind() == Diagnostic.Kind.ERROR) { + this.diagnosticCode = diagnostic.getCode(); this.message.append('\n'); this.message.append(diagnostic.getMessage(this.locale)); if (diagnostic.getSource() != null) { @@ -396,6 +401,11 @@ boolean hasReportedErrors() { return !this.message.isEmpty(); } + @Nullable + public String getDiagnosticCode() { + return this.diagnosticCode; + } + @Override public String toString() { return this.message.toString(); diff --git a/spring-core-test/src/test/java/org/springframework/core/test/tools/TestCompilerTests.java b/spring-core-test/src/test/java/org/springframework/core/test/tools/TestCompilerTests.java index c91cdcb3271b..eaadbc997f21 100644 --- a/spring-core-test/src/test/java/org/springframework/core/test/tools/TestCompilerTests.java +++ b/spring-core-test/src/test/java/org/springframework/core/test/tools/TestCompilerTests.java @@ -45,6 +45,7 @@ * @author Andy Wilkinson * @author Scott Frederick * @author Stephane Nicoll + * @author Yanming Zhou */ class TestCompilerTests { @@ -173,7 +174,7 @@ public static void main(String[] args) { assertThatExceptionOfType(CompilationException.class).isThrownBy( () -> TestCompiler.forSystem().failOnWarning().withLocale(Locale.ENGLISH) .withSources(SourceFile.of(HELLO_DEPRECATED), main).compile(compiled -> { - })).withMessageContaining("warnings found and -Werror specified"); + })).extracting(CompilationException::getDiagnosticCode).isEqualTo("compiler.err.warnings.and.werror"); } @Test