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 6d9c9810020..47855764857 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 @@ -29,6 +29,7 @@ import org.eclipse.jdt.core.formatter.CodeFormatter; import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; import org.eclipse.jdt.core.formatter.IndentManipulation; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.formatter.DefaultCodeFormatter; import org.eclipse.jdt.internal.formatter.DefaultCodeFormatterOptions; import org.eclipse.jdt.internal.formatter.DefaultCodeFormatterOptions.Alignment; @@ -13305,4 +13306,24 @@ public void testBug576954() { " }\n" + "}"); } +/** + * https://github.com/eclipse-jdt/eclipse.jdt.core/issues/443 + */ +public void testIssue443a() { + setComplianceLevel(CompilerOptions.VERSION_17); + this.formatterPrefs.insert_space_after_closing_angle_bracket_in_type_parameters = true; + formatSource( + "record MyRecord() {\n" + + "}"); +} +public void testIssue443b() { + setComplianceLevel(CompilerOptions.VERSION_17); + this.formatterPrefs.insert_space_after_closing_angle_bracket_in_type_parameters = false; + formatSource( + "class MyClass extends AnotherClass {\n" + + "}\n" + + "\n" + + "sealed interface Expr permits MathExpr {\n" + + "}"); +} } diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java index c77b78821e5..0551e860ead 100644 --- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java +++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java @@ -182,10 +182,12 @@ public boolean visit(TypeDeclaration node) { List typeParameters = node.typeParameters(); handleTypeParameters(typeParameters); - if (!node.isInterface() && !node.superInterfaceTypes().isEmpty()) { - // fix for: class A extends ArrayListimplements Callable - handleToken(node.getName(), TokenNameimplements, true, false); - } + if (!node.superInterfaceTypes().isEmpty()) + handleTokenAfter(node.getName(), node.isInterface() ? TokenNameextends : TokenNameimplements, true, true); + if (node.getSuperclassType() != null) + handleTokenAfter(node.getName(), TokenNameextends, true, true); + if (!node.permittedTypes().isEmpty()) + handleTokenAfter(node.getName(), TokenNameRestrictedIdentifierpermits, true, true); handleToken(node.getName(), TokenNameLBRACE, this.options.insert_space_before_opening_brace_in_type_declaration, false); @@ -366,7 +368,8 @@ private void handleTypeParameters(List typeParameters) { this.options.insert_space_after_opening_angle_bracket_in_type_parameters); handleTokenAfter(typeParameters.get(typeParameters.size() - 1), TokenNameGREATER, this.options.insert_space_before_closing_angle_bracket_in_type_parameters, - this.options.insert_space_after_closing_angle_bracket_in_type_parameters); + typeParameters.get(0).getParent() instanceof RecordDeclaration ? false + : this.options.insert_space_after_closing_angle_bracket_in_type_parameters); handleCommas(typeParameters, this.options.insert_space_before_comma_in_type_parameters, this.options.insert_space_after_comma_in_type_parameters); }