diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java index dd3df7ca8a7..7a465ea59e6 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java @@ -709,7 +709,9 @@ public class Flow { if (exhaustivenessResult.notExhaustiveDetails().isEmpty()) { log.error(tree, Errors.NotExhaustiveStatement); } else { - log.error(tree, Errors.NotExhaustiveStatementDetails(exhaustivenessResult.notExhaustiveDetails().stream().collect(Collectors.joining("\n")))); + List details = + convertNotExhaustiveDetails(exhaustivenessResult); + log.error(tree, Errors.NotExhaustiveStatementDetails(details)); } } } @@ -756,7 +758,9 @@ public class Flow { if (exhaustivenessResult.notExhaustiveDetails().isEmpty()) { log.error(tree, Errors.NotExhaustive); } else { - log.error(tree, Errors.NotExhaustiveDetails(exhaustivenessResult.notExhaustiveDetails().stream().collect(Collectors.joining("\n")))); + List details = + convertNotExhaustiveDetails(exhaustivenessResult); + log.error(tree, Errors.NotExhaustiveDetails(details)); } } } @@ -765,6 +769,14 @@ public class Flow { alive = alive.or(resolveYields(tree, prevPendingExits)); } + private List convertNotExhaustiveDetails(ExhaustivenessResult exhaustivenessResult) { + return exhaustivenessResult.notExhaustiveDetails() + .stream() + .sorted() + .map(detail -> diags.fragment(Fragments.NotExhaustiveDetail(detail))) + .collect(List.collector()); + } + public void visitTry(JCTry tree) { ListBuffer prevPendingExits = pendingExits; pendingExits = new ListBuffer<>(); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 56f67bda300..64f77e44756 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -1473,16 +1473,20 @@ compiler.err.not.exhaustive=\ compiler.err.not.exhaustive.statement=\ the switch statement does not cover all possible input values -# 0: string +# 0: list of diagnostic compiler.err.not.exhaustive.details=\ the switch expression does not cover all possible input values\n\ missing patterns: {0} -# 0: string +# 0: list of diagnostic compiler.err.not.exhaustive.statement.details=\ the switch statement does not cover all possible input values\n\ missing patterns: {0} +# 0: string +compiler.misc.not.exhaustive.detail=\ + \n{0} + compiler.err.initializer.must.be.able.to.complete.normally=\ initializer must be able to complete normally diff --git a/test/langtools/tools/javac/patterns/ExhaustivenessConvenientErrors.java b/test/langtools/tools/javac/patterns/ExhaustivenessConvenientErrors.java index 0eadf122ee3..81b1af2bfd2 100644 --- a/test/langtools/tools/javac/patterns/ExhaustivenessConvenientErrors.java +++ b/test/langtools/tools/javac/patterns/ExhaustivenessConvenientErrors.java @@ -35,10 +35,12 @@ import com.sun.tools.javac.api.ClientCodeWrapper.DiagnosticSourceUnwrapper; import com.sun.tools.javac.util.JCDiagnostic; +import com.sun.tools.javac.util.JCDiagnostic.Fragment; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -365,13 +367,13 @@ public class ExhaustivenessConvenientErrors extends TestRunner { case Triple(B _, _, _) -> 0; case Triple(_, A _, _) -> 0; case Triple(_, _, A _) -> 0; -// case Triple(A p, C(Nested _, NestedBaseA _), _) -> 0; - case Triple(A p, C(Nested _, NestedBaseB _), C(Nested _, NestedBaseA _)) -> 0; - case Triple(A p, C(Nested _, NestedBaseB _), C(Nested _, NestedBaseB _)) -> 0; - case Triple(A p, C(Nested _, NestedBaseB _), C(Nested _, NestedBaseC _)) -> 0; - case Triple(A p, C(Nested _, NestedBaseC _), C(Nested _, NestedBaseA _)) -> 0; - case Triple(A p, C(Nested _, NestedBaseC _), C(Nested _, NestedBaseB _)) -> 0; -// case Path(A p, C(Nested _, NestedBaseC _), C(Nested _, NestedBaseC _)) -> 0; +// case Triple(A _, C(Nested _, NestedBaseA _), _) -> 0; + case Triple(A _, C(Nested _, NestedBaseB _), C(Nested _, NestedBaseA _)) -> 0; + case Triple(A _, C(Nested _, NestedBaseB _), C(Nested _, NestedBaseB _)) -> 0; + case Triple(A _, C(Nested _, NestedBaseB _), C(Nested _, NestedBaseC _)) -> 0; + case Triple(A _, C(Nested _, NestedBaseC _), C(Nested _, NestedBaseA _)) -> 0; + case Triple(A _, C(Nested _, NestedBaseC _), C(Nested _, NestedBaseB _)) -> 0; +// case Path(A _, C(Nested _, NestedBaseC _), C(Nested _, NestedBaseC _)) -> 0; }; } record Triple(Base c1, Base c2, Base c3) {} @@ -517,7 +519,10 @@ public class ExhaustivenessConvenientErrors extends TestRunner { d = uw.d; } if (d instanceof JCDiagnostic diag) { - missingPatterns.addAll(List.of(((String) diag.getArgs()[0]).split("\n"))); + ((Collection) diag.getArgs()[0]) + .stream() + .map(fragment -> (String) fragment.getArgs()[0]) + .forEach(missingPatterns::add); } } })