diff --git a/java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java b/java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java index 8ead1a078f06..e357ca01f8c9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java +++ b/java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java @@ -80,7 +80,7 @@ public class JavaFoldingBuilder extends FoldingBuilderEx implements DumbAware { PsiElement anchorElementToUse = file; PsiElement candidate = file.getFirstChild(); - // There experienced the following problem situation: + // We experienced the following problem situation: // 1. There is a collapsed class-level javadoc; // 2. User starts typing at class definition line (e.g. we had definition like 'public class Test' and user starts // typing 'abstract' between 'public' and 'class'); @@ -224,6 +224,16 @@ public class JavaFoldingBuilder extends FoldingBuilderEx implements DumbAware { return !(element.getParent() instanceof PsiFile) && settings.isCollapseInnerClasses(); } else if (element instanceof PsiDocComment) { + PsiElement parent = element.getParent(); + if (parent instanceof PsiJavaFile) { + PsiElement firstChild = parent.getFirstChild(); + if (firstChild instanceof PsiWhiteSpace) { + firstChild = firstChild.getNextSibling(); + } + if (element.equals(firstChild)) { + return settings.isCollapseFileHeader(); + } + } return settings.isCollapseJavadocs(); } else if (element instanceof PsiJavaFile) { @@ -421,7 +431,7 @@ public class JavaFoldingBuilder extends FoldingBuilderEx implements DumbAware { processedComments.add(current); continue; } - if (elementType == JavaTokenType.WHITE_SPACE) { + if (elementType == TokenType.WHITE_SPACE) { continue; } break; @@ -592,7 +602,9 @@ public class JavaFoldingBuilder extends FoldingBuilderEx implements DumbAware { if (lastLineEnd > 0 && seq.charAt(lastLineEnd) == '\n') lastLineEnd--; if (lastLineEnd < firstLineStart) return false; - final String baseClassName = quick ? anonymousClass.getBaseClassReference().getReferenceName() : anonymousClass.getBaseClassType().resolve().getName(); + PsiClass resolve = anonymousClass.getBaseClassType().resolve(); + assert resolve != null; + final String baseClassName = quick ? anonymousClass.getBaseClassReference().getReferenceName() : resolve.getName(); if (lastLineEnd >= seq.length() || firstLineStart >= seq.length() || firstLineStart < 0) { LOG.error("llE=" + lastLineEnd + "; fLS=" + firstLineStart + "; len=" + seq.length() + "rE=" + rangeEnd + "; class=" + baseClassName); @@ -602,7 +614,9 @@ public class JavaFoldingBuilder extends FoldingBuilderEx implements DumbAware { public String fun(final PsiParameter psiParameter) { String typeName; if (quick) { - typeName = psiParameter.getTypeElement().getText(); + PsiTypeElement typeElement = psiParameter.getTypeElement(); + assert typeElement != null; + typeName = typeElement.getText(); } else { typeName = psiParameter.getType().getPresentableText(); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy index b878c640cebe..d1f635da2d34 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy @@ -31,16 +31,14 @@ public class JavaFoldingTest extends LightCodeInsightFixtureTestCase { } public void testEditingImports() { - myFixture.configureByText "a.java", """\ + configure """\ import java.util.List; import java.util.Map; class Foo { List a; Map b; } """ - - CodeFoldingManagerImpl.getInstance(getProject()).buildInitialFoldings(myFixture.editor); - myFixture.doHighlighting() + assert myFixture.editor.foldingModel.getCollapsedRegionAtOffset(10) myFixture.type 'import ' @@ -48,5 +46,24 @@ class Foo { List a; Map b; } assert !myFixture.editor.foldingModel.getCollapsedRegionAtOffset(10) } - + public void testJavadocLikeClassHeader() { + def text = """\ +/** + * This is a header to collapse + */ +import java.util.*; +class Foo { List a; Map b; } +""" + configure text + def foldRegion = myFixture.editor.foldingModel.getCollapsedRegionAtOffset(0) + assert foldRegion + assertEquals 0, foldRegion.startOffset + assertEquals text.indexOf("import") - 1, foldRegion.endOffset + } + + private def configure(String text) { + myFixture.configureByText("a.java", text) + CodeFoldingManagerImpl.getInstance(getProject()).buildInitialFoldings(myFixture.editor); + myFixture.doHighlighting() + } }