diff options
author | Mateusz Matela | 2015-08-25 21:54:38 +0000 |
---|---|---|
committer | Mateusz Matela | 2015-08-25 22:02:07 +0000 |
commit | 80f1e7c4e4b868f26698d3e483443bcf19375a87 (patch) | |
tree | cad90b9dffe2a105ab61799614bb20f43f57e1ac | |
parent | 15931130cc3603cc40cf03dc17251cf7622502d5 (diff) | |
download | eclipse.jdt.core-80f1e7c4e4b868f26698d3e483443bcf19375a87.tar.gz eclipse.jdt.core-80f1e7c4e4b868f26698d3e483443bcf19375a87.tar.xz eclipse.jdt.core-80f1e7c4e4b868f26698d3e483443bcf19375a87.zip |
Bug 474918 - [formatter] doesn't align fields in declarations of annotations, enums and anonymous classes
Change-Id: I4f9634b7ac31c6c0097388724cb3caee17fe5fc5
Signed-off-by: Mateusz Matela <mateusz.matela@gmail.com>
4 files changed, 231 insertions, 26 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java index 8dad4abde5..0dbd152015 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java @@ -11229,4 +11229,198 @@ public void testBug473727() { "}"
);
}
+/**
+ * https://bugs.eclipse.org/474918 - [formatter] doesn't align fields in declarations of annotations, enums and anonymous classes
+ */
+public void testBug474918() {
+ this.formatterPrefs.align_type_members_on_columns = true;
+ String source =
+ "import java.util.function.Function;\r\n" +
+ "\r\n" +
+ "public class A {\r\n" +
+ " private Function mapper = (Object a) -> {\r\n" +
+ " return a.toString().equals(\"test\");\r\n" +
+ " };\r\n" +
+ " String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\"; //$NON-NLS-1$ // B // A\r\n" +
+ "\r\n" +
+ " int bb = 4;\r\n" +
+ "\r\n" +
+ " Object c = new Object() {\r\n" +
+ " int a = 55;\r\n" +
+ " Object cdddddddddddd = null;\r\n" +
+ " };\r\n" +
+ "\r\n" +
+ " private enum E {\r\n" +
+ " AAA, BBB;\r\n" +
+ " int a = 55;\r\n" +
+ " String sssss = \"ssssss\";\r\n" +
+ " }\r\n" +
+ "\r\n" +
+ " private @interface II {\r\n" +
+ " int aaaaaa = 1;\r\n" +
+ " String bbbbbbbbb = \"default\";\r\n" +
+ " }\r\n" +
+ "}";
+ formatSource(source,
+ "import java.util.function.Function;\r\n" +
+ "\r\n" +
+ "public class A {\r\n" +
+ " private Function mapper = (Object a) -> {\r\n" +
+ " return a.toString().equals(\"test\");\r\n" +
+ " };\r\n" +
+ " String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\"; //$NON-NLS-1$ //\r\n" +
+ " // B\r\n" +
+ " // //\r\n" +
+ " // A\r\n" +
+ "\r\n" +
+ " int bb = 4;\r\n" +
+ "\r\n" +
+ " Object c = new Object() {\r\n" +
+ " int a = 55;\r\n" +
+ " Object cdddddddddddd = null;\r\n" +
+ " };\r\n" +
+ "\r\n" +
+ " private enum E {\r\n" +
+ " AAA, BBB;\r\n" +
+ " int a = 55;\r\n" +
+ " String sssss = \"ssssss\";\r\n" +
+ " }\r\n" +
+ "\r\n" +
+ " private @interface II {\r\n" +
+ " int aaaaaa = 1;\r\n" +
+ " String bbbbbbbbb = \"default\";\r\n" +
+ " }\r\n" +
+ "}"
+ );
+}
+/**
+ * https://bugs.eclipse.org/474918 - [formatter] doesn't align fields in declarations of annotations, enums and anonymous classes
+ */
+public void testBug474918b() {
+ this.formatterPrefs.align_type_members_on_columns = true;
+ this.formatterPrefs.tab_char = DefaultCodeFormatterOptions.SPACE;
+ String source =
+ "import java.util.function.Function;\r\n" +
+ "\r\n" +
+ "public class A {\r\n" +
+ " private Function mapper = (Object a) -> {\r\n" +
+ " return a.toString().equals(\"test\");\r\n" +
+ " };\r\n" +
+ " String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\"; //$NON-NLS-1$ // B // A\r\n" +
+ "\r\n" +
+ " int bb = 4;\r\n" +
+ "\r\n" +
+ " Object c = new Object() {\r\n" +
+ " int a = 55;\r\n" +
+ " Object cdddddddddddd = null;\r\n" +
+ " };\r\n" +
+ "\r\n" +
+ " private enum E {\r\n" +
+ " AAA, BBB;\r\n" +
+ " int a = 55;\r\n" +
+ " String sssss = \"ssssss\";\r\n" +
+ " }\r\n" +
+ "\r\n" +
+ " private @interface II {\r\n" +
+ " int aaaaaa = 1;\r\n" +
+ " String bbbbbbbbb = \"default\";\r\n" +
+ " }\r\n" +
+ "}";
+ formatSource(source,
+ "import java.util.function.Function;\r\n" +
+ "\r\n" +
+ "public class A {\r\n" +
+ " private Function mapper = (Object a) -> {\r\n" +
+ " return a.toString().equals(\"test\");\r\n" +
+ " };\r\n" +
+ " String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\"; //$NON-NLS-1$ //\r\n" +
+ " // B\r\n" +
+ " // //\r\n" +
+ " // A\r\n" +
+ "\r\n" +
+ " int bb = 4;\r\n" +
+ "\r\n" +
+ " Object c = new Object() {\r\n" +
+ " int a = 55;\r\n" +
+ " Object cdddddddddddd = null;\r\n" +
+ " };\r\n" +
+ "\r\n" +
+ " private enum E {\r\n" +
+ " AAA, BBB;\r\n" +
+ " int a = 55;\r\n" +
+ " String sssss = \"ssssss\";\r\n" +
+ " }\r\n" +
+ "\r\n" +
+ " private @interface II {\r\n" +
+ " int aaaaaa = 1;\r\n" +
+ " String bbbbbbbbb = \"default\";\r\n" +
+ " }\r\n" +
+ "}"
+ );
+}
+/**
+ * https://bugs.eclipse.org/474918 - [formatter] doesn't align fields in declarations of annotations, enums and anonymous classes
+ */
+public void testBug474918c() {
+ this.formatterPrefs.align_type_members_on_columns = true;
+ this.formatterPrefs.use_tabs_only_for_leading_indentations = true;
+ String source =
+ "import java.util.function.Function;\r\n" +
+ "\r\n" +
+ "public class A {\r\n" +
+ " private Function mapper = (Object a) -> {\r\n" +
+ " return a.toString().equals(\"test\");\r\n" +
+ " };\r\n" +
+ " String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\"; //$NON-NLS-1$ // B // A\r\n" +
+ "\r\n" +
+ " int bb = 4;\r\n" +
+ "\r\n" +
+ " Object c = new Object() {\r\n" +
+ " int a = 55;\r\n" +
+ " Object cdddddddddddd = null;\r\n" +
+ " };\r\n" +
+ "\r\n" +
+ " private enum E {\r\n" +
+ " AAA, BBB;\r\n" +
+ " int a = 55;\r\n" +
+ " String sssss = \"ssssss\";\r\n" +
+ " }\r\n" +
+ "\r\n" +
+ " private @interface II {\r\n" +
+ " int aaaaaa = 1;\r\n" +
+ " String bbbbbbbbb = \"default\";\r\n" +
+ " }\r\n" +
+ "}";
+ formatSource(source,
+ "import java.util.function.Function;\r\n" +
+ "\r\n" +
+ "public class A {\r\n" +
+ " private Function mapper = (Object a) -> {\r\n" +
+ " return a.toString().equals(\"test\");\r\n" +
+ " };\r\n" +
+ " String ssssssssssssssss = \"dsadaaaaaaaaaaaaaaaaaaaaaaaaa\"; //$NON-NLS-1$ //\r\n" +
+ " // B\r\n" +
+ " // //\r\n" +
+ " // A\r\n" +
+ "\r\n" +
+ " int bb = 4;\r\n" +
+ "\r\n" +
+ " Object c = new Object() {\r\n" +
+ " int a = 55;\r\n" +
+ " Object cdddddddddddd = null;\r\n" +
+ " };\r\n" +
+ "\r\n" +
+ " private enum E {\r\n" +
+ " AAA, BBB;\r\n" +
+ " int a = 55;\r\n" +
+ " String sssss = \"ssssss\";\r\n" +
+ " }\r\n" +
+ "\r\n" +
+ " private @interface II {\r\n" +
+ " int aaaaaa = 1;\r\n" +
+ " String bbbbbbbbb = \"default\";\r\n" +
+ " }\r\n" +
+ "}"
+ );
+}
}
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/FieldAligner.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/FieldAligner.java index a548f48de5..9c15869491 100644 --- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/FieldAligner.java +++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/FieldAligner.java @@ -23,7 +23,6 @@ import java.util.List; import org.eclipse.jdt.core.dom.BodyDeclaration; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.internal.formatter.Token; import org.eclipse.jdt.internal.formatter.TokenManager; @@ -71,21 +70,14 @@ public class FieldAligner { this.tm = tokenManager; } - public void prepareAlign(TypeDeclaration node) { - List<FieldDeclaration> bodyDeclarations = node.bodyDeclarations(); + public void prepareAlign(List<FieldDeclaration> bodyDeclarations) { ArrayList<FieldDeclaration> alignGroup = new ArrayList<>(); for (BodyDeclaration declaration : bodyDeclarations) { - if (!alignGroup.isEmpty()) { - if ((declaration instanceof FieldDeclaration)) { - alignGroup.add((FieldDeclaration) declaration); - } else { - alignFields(alignGroup); - alignGroup = new ArrayList<>(); - } - } - if (alignGroup.isEmpty()) { - if (declaration instanceof FieldDeclaration) - alignGroup.add((FieldDeclaration) declaration); + if ((declaration instanceof FieldDeclaration)) { + alignGroup.add((FieldDeclaration) declaration); + } else { + alignFields(alignGroup); + alignGroup = new ArrayList<>(); } } alignFields(alignGroup); @@ -104,7 +96,7 @@ public class FieldAligner { int positionInLine = this.tm.getPositionInLine(nameIndex); maxNameAlign = Math.max(maxNameAlign, positionInLine); } - maxNameAlign = this.tm.toIndent(maxNameAlign, true); + maxNameAlign = this.tm.toIndent(maxNameAlign, false); int maxAssignAlign = 0; for (FieldDeclaration declaration : alignGroup) { @@ -121,7 +113,7 @@ public class FieldAligner { maxAssignAlign = Math.max(maxAssignAlign, positionInLine); } } - maxAssignAlign = this.tm.toIndent(maxAssignAlign, true); + maxAssignAlign = this.tm.toIndent(maxAssignAlign, false); for (FieldDeclaration declaration : alignGroup) { List<VariableDeclarationFragment> fragments = declaration.fragments(); @@ -155,7 +147,7 @@ public class FieldAligner { maxCommentAlign = Math.max(maxCommentAlign, positionCounter.findMaxPosition(firstIndexInLine, lastIndex)); } - maxCommentAlign = this.tm.toIndent(maxCommentAlign, true); + maxCommentAlign = this.tm.toIndent(maxCommentAlign, false); for (FieldDeclaration declaration : alignGroup) { int typeIndex = this.tm.firstIndexIn(declaration.getType(), -1); diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java index 51fdd26f28..a25a29b6db 100644 --- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java +++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java @@ -320,6 +320,7 @@ public class WrapExecutor { findWrapsCached(index, currentIndent); break; } + currentIndent = Math.max(currentIndent, token.getAlign()); token.setIndent(currentIndent); } token = this.tm.get(index); @@ -346,6 +347,7 @@ public class WrapExecutor { break; if (shouldForceWrap(token, currentIndent)) currentIndent = token.getIndent(); + currentIndent = Math.max(currentIndent, token.getAlign()); token.setIndent(currentIndent); } } diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java index 98ab8a7a24..4d70102684 100644 --- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java +++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java @@ -38,6 +38,7 @@ import java.util.Map; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; +import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; import org.eclipse.jdt.core.dom.ArrayInitializer; import org.eclipse.jdt.core.dom.Assignment; @@ -106,7 +107,7 @@ public class WrapPreparator extends ASTVisitor { final DefaultCodeFormatterOptions options; final int kind; - FieldAligner fieldAligner; + final FieldAligner fieldAligner; int importsStart = -1, importsEnd = -1; @@ -125,6 +126,8 @@ public class WrapPreparator extends ASTVisitor { this.tm = tokenManager; this.options = options; this.kind = kind; + + this.fieldAligner = new FieldAligner(this.tm); } @Override @@ -180,12 +183,23 @@ public class WrapPreparator extends ASTVisitor { handleWrap(this.options.alignment_for_superinterfaces_in_type_declaration, PREFERRED); } - if (this.options.align_type_members_on_columns) { - if (this.fieldAligner == null) { - this.fieldAligner = new FieldAligner(this.tm); - } - this.fieldAligner.prepareAlign(node); - } + if (this.options.align_type_members_on_columns) + this.fieldAligner.prepareAlign(node.bodyDeclarations()); + + return true; + } + + @Override + public boolean visit(AnnotationTypeDeclaration node) { + if (this.options.align_type_members_on_columns) + this.fieldAligner.prepareAlign(node.bodyDeclarations()); + return true; + } + + @Override + public boolean visit(AnonymousClassDeclaration node) { + if (this.options.align_type_members_on_columns) + this.fieldAligner.prepareAlign(node.bodyDeclarations()); return true; } @@ -252,6 +266,10 @@ public class WrapPreparator extends ASTVisitor { this.wrapPenalties.add(PREFERRED); handleWrap(this.options.alignment_for_superinterfaces_in_enum_declaration, node); } + + if (this.options.align_type_members_on_columns) + this.fieldAligner.prepareAlign(node.bodyDeclarations()); + return true; } @@ -705,8 +723,7 @@ public class WrapPreparator extends ASTVisitor { public void finishUp(ASTNode astRoot) { preserveExistingLineBreaks(); new WrapExecutor(this.tm, this.options).executeWraps(); - if (this.fieldAligner != null) - this.fieldAligner.alignComments(); + this.fieldAligner.alignComments(); wrapComments(); fixEnumConstantIndents(astRoot); } |