Skip to content

Commit 8c652ed

Browse files
cushongoogle-java-format Team
authored and
google-java-format Team
committedSep 16, 2024·
Print the problem line as context in error messages
PiperOrigin-RevId: 675207795
1 parent 40ac75f commit 8c652ed

File tree

3 files changed

+48
-7
lines changed

3 files changed

+48
-7
lines changed
 

‎core/src/main/java/com/google/googlejavaformat/java/FormatterException.java

+21
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616

1717
import static java.util.Locale.ENGLISH;
1818

19+
import com.google.common.base.CharMatcher;
20+
import com.google.common.base.Splitter;
1921
import com.google.common.collect.ImmutableList;
2022
import com.google.common.collect.Iterables;
2123
import com.google.googlejavaformat.FormatterDiagnostic;
2224
import java.util.List;
25+
import java.util.regex.Pattern;
2326
import javax.tools.Diagnostic;
2427
import javax.tools.JavaFileObject;
2528

@@ -55,4 +58,22 @@ private static FormatterDiagnostic toFormatterDiagnostic(Diagnostic<?> input) {
5558
return FormatterDiagnostic.create(
5659
(int) input.getLineNumber(), (int) input.getColumnNumber(), input.getMessage(ENGLISH));
5760
}
61+
62+
public String formatDiagnostics(String path, String input) {
63+
List<String> lines = Splitter.on(NEWLINE_PATTERN).splitToList(input);
64+
StringBuilder sb = new StringBuilder();
65+
for (FormatterDiagnostic diagnostic : diagnostics()) {
66+
sb.append(path).append(":").append(diagnostic).append(System.lineSeparator());
67+
int line = diagnostic.line();
68+
int column = diagnostic.column();
69+
if (line != -1 && column != -1) {
70+
sb.append(CharMatcher.breakingWhitespace().trimTrailingFrom(lines.get(line - 1)))
71+
.append(System.lineSeparator());
72+
sb.append(" ".repeat(column)).append('^').append(System.lineSeparator());
73+
}
74+
}
75+
return sb.toString();
76+
}
77+
78+
private static final Pattern NEWLINE_PATTERN = Pattern.compile("\\R");
5879
}

‎core/src/main/java/com/google/googlejavaformat/java/Main.java

+2-7
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import com.google.common.io.ByteStreams;
2222
import com.google.common.util.concurrent.MoreExecutors;
23-
import com.google.googlejavaformat.FormatterDiagnostic;
2423
import com.google.googlejavaformat.java.JavaFormatterOptions.Style;
2524
import java.io.IOError;
2625
import java.io.IOException;
@@ -175,9 +174,7 @@ private int formatFiles(CommandLineOptions parameters, JavaFormatterOptions opti
175174
for (FormatFileCallable.Result result : results) {
176175
Path path = result.path();
177176
if (result.exception() != null) {
178-
for (FormatterDiagnostic diagnostic : result.exception().diagnostics()) {
179-
errWriter.println(path + ":" + diagnostic);
180-
}
177+
errWriter.print(result.exception().formatDiagnostics(path.toString(), result.input()));
181178
allOk = false;
182179
continue;
183180
}
@@ -224,9 +221,7 @@ private int formatStdin(CommandLineOptions parameters, JavaFormatterOptions opti
224221
FormatFileCallable.Result result =
225222
new FormatFileCallable(parameters, null, input, options).call();
226223
if (result.exception() != null) {
227-
for (FormatterDiagnostic diagnostic : result.exception().diagnostics()) {
228-
errWriter.println(stdinFilename + ":" + diagnostic);
229-
}
224+
errWriter.print(result.exception().formatDiagnostics(stdinFilename, input));
230225
ok = false;
231226
} else {
232227
String output = result.output();

‎core/src/test/java/com/google/googlejavaformat/java/MainTest.java

+25
Original file line numberDiff line numberDiff line change
@@ -635,4 +635,29 @@ public void reorderModifiersOptionTest() throws Exception {
635635
.formatSource(source))
636636
.isEqualTo(source);
637637
}
638+
639+
@Test
640+
public void badIdentifier() throws Exception {
641+
Path path = testFolder.newFile("Test.java").toPath();
642+
String[] input = {
643+
"class Test {", //
644+
" void f(int package) {}",
645+
"}",
646+
"",
647+
};
648+
String source = joiner.join(input);
649+
Files.writeString(path, source, UTF_8);
650+
StringWriter out = new StringWriter();
651+
StringWriter err = new StringWriter();
652+
Main main = new Main(new PrintWriter(out, true), new PrintWriter(err, true), System.in);
653+
int errorCode = main.format(path.toAbsolutePath().toString());
654+
assertWithMessage("Error Code").that(errorCode).isEqualTo(1);
655+
String[] expected = {
656+
path + ":2:14: error: <identifier> expected", //
657+
" void f(int package) {}",
658+
" ^",
659+
"",
660+
};
661+
assertThat(err.toString()).isEqualTo(joiner.join(expected));
662+
}
638663
}

0 commit comments

Comments
 (0)
Please sign in to comment.