Skip to content

Commit f2bcccf

Browse files
Fix spaces around type parameters in class/interface/record declarations #443
1 parent 5fd2839 commit f2bcccf

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.eclipse.jdt.core.formatter.CodeFormatter;
3030
import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
3131
import org.eclipse.jdt.core.formatter.IndentManipulation;
32+
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
3233
import org.eclipse.jdt.internal.formatter.DefaultCodeFormatter;
3334
import org.eclipse.jdt.internal.formatter.DefaultCodeFormatterOptions;
3435
import org.eclipse.jdt.internal.formatter.DefaultCodeFormatterOptions.Alignment;
@@ -13305,4 +13306,24 @@ public void testBug576954() {
1330513306
" }\n" +
1330613307
"}");
1330713308
}
13309+
/**
13310+
* https://github.com/eclipse-jdt/eclipse.jdt.core/issues/443
13311+
*/
13312+
public void testIssue443a() {
13313+
setComplianceLevel(CompilerOptions.VERSION_17);
13314+
this.formatterPrefs.insert_space_after_closing_angle_bracket_in_type_parameters = true;
13315+
formatSource(
13316+
"record MyRecord<A>() {\n" +
13317+
"}");
13318+
}
13319+
public void testIssue443b() {
13320+
setComplianceLevel(CompilerOptions.VERSION_17);
13321+
this.formatterPrefs.insert_space_after_closing_angle_bracket_in_type_parameters = false;
13322+
formatSource(
13323+
"class MyClass<A> extends AnotherClass {\n" +
13324+
"}\n" +
13325+
"\n" +
13326+
"sealed interface Expr<A> permits MathExpr {\n" +
13327+
"}");
13328+
}
1330813329
}

org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,12 @@ public boolean visit(TypeDeclaration node) {
182182
List<TypeParameter> typeParameters = node.typeParameters();
183183
handleTypeParameters(typeParameters);
184184

185-
if (!node.isInterface() && !node.superInterfaceTypes().isEmpty()) {
186-
// fix for: class A<E> extends ArrayList<String>implements Callable<String>
187-
handleToken(node.getName(), TokenNameimplements, true, false);
188-
}
185+
if (!node.superInterfaceTypes().isEmpty())
186+
handleTokenAfter(node.getName(), node.isInterface() ? TokenNameextends : TokenNameimplements, true, true);
187+
if (node.getSuperclassType() != null)
188+
handleTokenAfter(node.getName(), TokenNameextends, true, true);
189+
if (!node.permittedTypes().isEmpty())
190+
handleTokenAfter(node.getName(), TokenNameRestrictedIdentifierpermits, true, true);
189191

190192
handleToken(node.getName(), TokenNameLBRACE,
191193
this.options.insert_space_before_opening_brace_in_type_declaration, false);
@@ -366,7 +368,8 @@ private void handleTypeParameters(List<TypeParameter> typeParameters) {
366368
this.options.insert_space_after_opening_angle_bracket_in_type_parameters);
367369
handleTokenAfter(typeParameters.get(typeParameters.size() - 1), TokenNameGREATER,
368370
this.options.insert_space_before_closing_angle_bracket_in_type_parameters,
369-
this.options.insert_space_after_closing_angle_bracket_in_type_parameters);
371+
typeParameters.get(0).getParent() instanceof RecordDeclaration ? false
372+
: this.options.insert_space_after_closing_angle_bracket_in_type_parameters);
370373
handleCommas(typeParameters, this.options.insert_space_before_comma_in_type_parameters,
371374
this.options.insert_space_after_comma_in_type_parameters);
372375
}

0 commit comments

Comments
 (0)