diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java b/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java index a1ec2cffbd32..746a89e87d02 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java @@ -23,6 +23,7 @@ import com.intellij.lexer.Lexer; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -238,6 +239,19 @@ public class JavaSpacePropertyProcessor extends JavaElementVisitor { else if (myRole2 == ChildRole.RBRACE && aClass.isEnum()) { createParenthSpace(true, false); } + else if (aClass instanceof PsiAnonymousClass && ElementType.JAVA_PLAIN_COMMENT_BIT_SET.contains(myChild1.getElementType())) { + ASTNode prev = myChild1.getTreePrev(); + if (prev.getElementType() == JavaTokenType.WHITE_SPACE && !StringUtil.containsLineBreak(prev.getChars())) { + prev = prev.getTreePrev(); + } + if (prev.getElementType() == JavaTokenType.LBRACE) { + myResult = Spacing.createSpacing(0, 0, mySettings.BLANK_LINES_AFTER_ANONYMOUS_CLASS_HEADER + 1, + mySettings.KEEP_LINE_BREAKS, mySettings.KEEP_BLANK_LINES_IN_DECLARATIONS); + } + else { + processClassBody(); + } + } else processClassBody(); } diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java index 74f53a7d73a8..bf11a587f2c3 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java @@ -330,6 +330,29 @@ public class JavaFormatterBlankLinesTest extends AbstractJavaFormatterTest { ); } + public void testAfterAnonymousClassWhereCodeBlockStartsWithComment() throws Exception { + // Inspired by IDEA-66583 + getSettings().BLANK_LINES_AFTER_ANONYMOUS_CLASS_HEADER = 0; + + String textWithWhiteSpaceBetweenCommentAndLbrace = + "Object object = new Object() { // comment breaks \"blank line after anonymous class header\"\n" + + " @Override\n" + + " public String toString() {\n" + + " return super.toString();\n" + + " }\n" + + "};"; + doMethodTest(textWithWhiteSpaceBetweenCommentAndLbrace, textWithWhiteSpaceBetweenCommentAndLbrace); + + String textWithoutWhiteSpaceBetweenCommentAndLbrace = + "Object object = new Object() {// comment breaks \"blank line after anonymous class header\"\n" + + " @Override\n" + + " public String toString() {\n" + + " return super.toString();\n" + + " }\n" + + "};"; + doMethodTest(textWithoutWhiteSpaceBetweenCommentAndLbrace, textWithoutWhiteSpaceBetweenCommentAndLbrace); + } + public void testBeforeMethodBody() { // Inspired by IDEA-54747 getSettings().BLANK_LINES_BEFORE_METHOD_BODY = 3;