google / google/google-java-format

Trouble with character ranges

Open
#433 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
6.2k
Forks
937
Avg merge
6m
Merged PRs (30d)
3

Description

Please have a look at the following two unit tests which should both work, but only the second does:

@Test
public void testCharaterRangesFormatWithAnnotation() throws Exception {
final String text = "package foo; public class Bar {\n" +
" @SuppressWarnings(\"unchecked\")\n" +
" // some comment \n" +
" public void doSomething(String arg) { System.out.println(\"Hello World\"); } public boolean doSomethingElse(Object obj) { return false; } }";

final String expected = "package foo;\n" +
"\n" +
"public class Bar {\n" +
// START -- this should not be formatted
" @SuppressWarnings(\"unchecked\")\n" +
" // some comment \n" +
" public void doSomething(String arg) { System.out.println(\"Hello World\"); }\n" +
// END -- this should not be formatted
"\n" +
" public boolean doSomethingElse(Object obj) {\n" +
" return false;\n" +
" }\n" +
"}\n" +
"";

Collection> characterRanges = new ArrayList<>();
characterRanges.add(Range.open(0, 66));
characterRanges.add(Range.open(171, 234));

Formatter formatter = new Formatter(JavaFormatterOptions.builder().style(JavaFormatterOptions.Style.GOOGLE).build());

String actual = formatter.formatSource(text, characterRanges);
Assert.assertEquals("Formatting should change the code", expected, actual);
}

@Test
public void testCharaterRangesFormatWithoutAnnotation() throws Exception {
final String text = "package foo; public class Bar {\n" +
" @SuppressWarnings(\"unchecked\")\n" +
" // some comment \n" +
" public void doSomething(String arg) { System.out.println(\"Hello World\"); } public boolean doSomethingElse(Object obj) { return false; } }";

final String expected = "package foo;\n" +
"\n" +
"public class Bar {\n" +
" @SuppressWarnings(\"unchecked\")\n" +
// START -- this should not be formatted
" // some comment \n" +
" public void doSomething(String arg) { System.out.println(\"Hello World\"); }\n" +
// END -- this should not be formatted
"\n" +
" public boolean doSomethingElse(Object obj) {\n" +
" return false;\n" +
" }\n" +
"}\n" +
"";

Collection> characterRanges = new ArrayList<>();
characterRanges.add(Range.open(0, 31));
characterRanges.add(Range.open(171, 234));

Formatter formatter = new Formatter(JavaFormatterOptions.builder().style(JavaFormatterOptions.Style.GOOGLE).build());

String actual = formatter.formatSource(text, characterRanges);
Assert.assertEquals("Formatting should change the code", expected, actual);
}

When I run those tests I get this as an result:

Failures:
FormatterTest.testCharaterRangesFormatWithAnnotation:58 Formatting should change the code expected:<...ings("unchecked")
[ // some comment
public void doSomething(String arg) {] System.out.println(...> but was:<...ings("unchecked")
[// some comment
public void doSomething(String arg) {
] System.out.println(...>

Tests run: 2, Failures: 1, Errors: 0, Skipped: 0

It seems there is an issue when there is an annotation before a comment or a method, it seems the formatter is formatting code outside of the given character range.

Regards,
Fabian

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.