From 0ac2d5e5ba1ca7e2c5091cc8f33c8f4b643a7051 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Fri, 19 Nov 2010 10:48:08 +0300 Subject: [PATCH] IDEA-61275 Editor: the folded class comment should not be auto-expanded on class declaration editing Restricting refinement of PSI element derived from invalid class header --- .../folding/impl/JavaFoldingBuilder.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 85467a36efe5..44a9105ea807 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 @@ -32,6 +32,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.impl.source.PsiClassReferenceType; import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.impl.source.jsp.jspJava.JspHolderMethod; +import com.intellij.psi.impl.source.tree.JavaDocElementType; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiTreeUtil; @@ -79,8 +80,19 @@ public class JavaFoldingBuilder extends FoldingBuilderEx implements DumbAware { if (range != null && range.getLength() > 1 && document.getLineNumber(range.getEndOffset()) > document.getLineNumber(range.getStartOffset())) { PsiElement anchorElementToUse = file; PsiElement candidate = file.getFirstChild(); + + // There 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'); + // 3. Collapsed class-level javadoc automatically expanded. That happened because PSI structure became invalid (because + // class definition line at start looks like 'public aclass Test'); + // So, our point is to preserve fold descriptor referencing javadoc PSI element. if (candidate != null && candidate.getTextRange().equals(range)) { - anchorElementToUse = candidate; + ASTNode node = candidate.getNode(); + if (node != null && node.getElementType() == JavaDocElementType.DOC_COMMENT) { + anchorElementToUse = candidate; + } } result.add(new FoldingDescriptor(anchorElementToUse, range)); }