Skip to content

Commit 037a7fd

Browse files
authored
Merge pull request #72 from openjavaformat/diagnostic-column
Report the column of a syntax error where javac puts it
2 parents 1eb4e5b + da047d7 commit 037a7fd

3 files changed

Lines changed: 12 additions & 13 deletions

File tree

‎open-java-format-spi/src/main/java/com/palantir/javaformat/java/FormatterDiagnostic.java‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public int line() {
4848
}
4949

5050
/**
51-
* Returns the 0-indexed column number on which the error occurred, or {@code -1} if the error does not have a
51+
* Returns the 1-indexed column number on which the error occurred, or {@code -1} if the error does not have a
5252
* column.
5353
*/
5454
public int column() {
@@ -67,8 +67,7 @@ public String toString() {
6767
sb.append(lineNumber).append(':');
6868
}
6969
if (column >= 0) {
70-
// internal column numbers are 0-based, but diagnostics use 1-based indexing by convention
71-
sb.append(column + 1).append(':');
70+
sb.append(column).append(':');
7271
}
7372
if (lineNumber >= 0 || column >= 0) {
7473
sb.append(' ');

‎open-java-format/src/test/java/com/palantir/javaformat/java/DiagnosticTest.java‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void parseError() throws Exception {
7878

7979
int result = main.format(path.toString());
8080
assertThat(stdout.toString()).isEmpty();
81-
assertThat(stderr.toString()).contains("InvalidSyntax.java:2:29: error: <identifier> expected");
81+
assertThat(stderr.toString()).contains("InvalidSyntax.java:2:28: error: <identifier> expected");
8282
assertThat(result).isEqualTo(2);
8383
}
8484

@@ -116,7 +116,7 @@ public void oneFileParseError() throws Exception {
116116

117117
int result = main.format(pathOne.toString(), pathTwo.toString());
118118
assertThat(stdout.toString()).isEqualTo(two);
119-
assertThat(stderr.toString()).contains("One.java:1:13: error: reached end of file");
119+
assertThat(stderr.toString()).contains("One.java:1:12: error: reached end of file");
120120
assertThat(result).isEqualTo(2);
121121
}
122122

@@ -137,7 +137,7 @@ public void oneFileParseErrorReplace() throws Exception {
137137

138138
int result = main.format("-i", pathOne.toString(), pathTwo.toString());
139139
assertThat(stdout.toString()).isEmpty();
140-
assertThat(stderr.toString()).contains("One.java:1:14: error: class, interface");
140+
assertThat(stderr.toString()).contains("One.java:1:13: error: class, interface");
141141
assertThat(result).isEqualTo(2);
142142
// don't edit files with parse errors
143143
assertThat(Files.readAllLines(pathOne, UTF_8)).containsExactly("class One {}}");
@@ -159,7 +159,7 @@ public void parseError2() throws FormatterException, IOException, UsageException
159159
int exitCode = main.format(args);
160160

161161
assertThat(exitCode).isEqualTo(2);
162-
assertThat(err.toString()).contains("A.java:2:6: error: ';' expected");
162+
assertThat(err.toString()).contains("A.java:2:5: error: ';' expected");
163163
}
164164

165165
@Test
@@ -174,7 +174,7 @@ public void parseErrorStdin() throws FormatterException, IOException, UsageExcep
174174
int exitCode = main.format(args);
175175

176176
assertThat(exitCode).isEqualTo(2);
177-
assertThat(err.toString()).contains("<stdin>:2:6: error: ';' expected");
177+
assertThat(err.toString()).contains("<stdin>:2:5: error: ';' expected");
178178
}
179179

180180
@Test
@@ -192,7 +192,7 @@ public void lexError2() throws FormatterException, IOException, UsageException {
192192
int exitCode = main.format(args);
193193

194194
assertThat(exitCode).isEqualTo(2);
195-
assertThat(err.toString()).contains("A.java:2:5: error: unclosed character literal");
195+
assertThat(err.toString()).contains("A.java:2:4: error: unclosed character literal");
196196
}
197197

198198
@Test
@@ -206,6 +206,6 @@ public void lexErrorStdin() throws FormatterException, IOException, UsageExcepti
206206
int exitCode = main.format(args);
207207

208208
assertThat(exitCode).isEqualTo(2);
209-
assertThat(err.toString()).contains("<stdin>:2:5: error: unclosed character literal");
209+
assertThat(err.toString()).contains("<stdin>:2:4: error: unclosed character literal");
210210
}
211211
}

‎open-java-format/src/test/java/com/palantir/javaformat/java/MainTest.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ public void importRemoveErrorParseError() throws Exception {
351351
new PrintWriter(err, true),
352352
new ByteArrayInputStream(joiner.join(input).getBytes(UTF_8)));
353353
assertThat(main.format("-")).isEqualTo(2);
354-
assertThat(err.toString()).contains("<stdin>:4:3: error: class, interface");
354+
assertThat(err.toString()).contains("<stdin>:4:2: error: class, interface");
355355

356356
} finally {
357357
Locale.setDefault(backupLocale);
@@ -584,7 +584,7 @@ public void exitIfChangedLosesToParseError() throws Exception {
584584
.isEqualTo(1);
585585
assertThat(main.format("-n", "--set-exit-if-changed", unformatted.toString(), broken.toString()))
586586
.isEqualTo(2);
587-
assertThat(err.toString()).contains("Broken.java:1:16: error: reached end of file");
587+
assertThat(err.toString()).contains("Broken.java:1:15: error: reached end of file");
588588
}
589589

590590
@Test
@@ -599,7 +599,7 @@ public void assumeFilename_error() throws Exception {
599599
new PrintWriter(err, true),
600600
new ByteArrayInputStream(joiner.join(input).getBytes(UTF_8)));
601601
assertThat(main.format("--assume-filename=Foo.java", "-")).isEqualTo(2);
602-
assertThat(err.toString()).contains("Foo.java:1:15: error: class, interface");
602+
assertThat(err.toString()).contains("Foo.java:1:14: error: class, interface");
603603
}
604604

605605
@Test

0 commit comments

Comments
 (0)