IDEA-170039 Honor new foldings 'collapse by default' state - revert previous fix

This commit is contained in:
Dmitry Batrak
2017-04-13 10:34:09 +03:00
parent 5e55050a49
commit ad07a7ec04
20 changed files with 135 additions and 555 deletions

View File

@@ -49,8 +49,7 @@ public class SuppressWarningsFoldingBuilder extends FoldingBuilderEx {
@Override
public void visitAnnotation(PsiAnnotation annotation) {
if (Comparing.strEqual(annotation.getQualifiedName(), SuppressWarnings.class.getName())) {
result.add(new FoldingDescriptor(annotation, annotation.getTextRange(),
JavaCodeFoldingSettings.getInstance().getCollapseSuppressWarningsProperty()));
result.add(new FoldingDescriptor(annotation, annotation.getTextRange()));
}
super.visitAnnotation(annotation);
}

View File

@@ -17,7 +17,6 @@
package com.intellij.codeInsight.folding;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.util.BooleanTrackableProperty;
public abstract class JavaCodeFoldingSettings {
@@ -27,57 +26,43 @@ public abstract class JavaCodeFoldingSettings {
public abstract boolean isCollapseImports();
public abstract void setCollapseImports(boolean value);
public abstract BooleanTrackableProperty getCollapseImportsProperty();
public abstract boolean isCollapseLambdas();
public abstract void setCollapseLambdas(boolean value);
public abstract BooleanTrackableProperty getCollapseLambdasProperty();
public abstract boolean isCollapseMethods();
public abstract void setCollapseMethods(boolean value);
public abstract BooleanTrackableProperty getCollapseMethodsProperty();
public abstract boolean isCollapseConstructorGenericParameters();
public abstract void setCollapseConstructorGenericParameters(boolean value);
public abstract BooleanTrackableProperty getCollapseConstructorGenericParametersProperty();
public abstract boolean isCollapseAccessors();
public abstract void setCollapseAccessors(boolean value);
public abstract BooleanTrackableProperty getCollapseAccessorsProperty();
public abstract boolean isCollapseOneLineMethods();
public abstract void setCollapseOneLineMethods(boolean value);
public abstract BooleanTrackableProperty getCollapseOneLineMethodsProperty();
public abstract boolean isCollapseInnerClasses();
public abstract void setCollapseInnerClasses(boolean value);
public abstract BooleanTrackableProperty getCollapseInnerClassesProperty();
public abstract boolean isCollapseJavadocs();
public abstract void setCollapseJavadocs(boolean value);
public abstract BooleanTrackableProperty getCollapseJavadocsProperty();
public abstract boolean isCollapseFileHeader();
public abstract void setCollapseFileHeader(boolean value);
public abstract BooleanTrackableProperty getCollapseFileHeaderProperty();
public abstract boolean isCollapseAnonymousClasses();
public abstract void setCollapseAnonymousClasses(boolean value);
public abstract BooleanTrackableProperty getCollapseAnonymousClassesProperty();
public abstract boolean isCollapseAnnotations();
public abstract void setCollapseAnnotations(boolean value);
public abstract BooleanTrackableProperty getCollapseAnnotationsProperty();
public abstract boolean isCollapseI18nMessages();
public abstract void setCollapseI18nMessages(boolean value);
public abstract BooleanTrackableProperty getCollapseI18nMessagesProperty();
public abstract boolean isCollapseSuppressWarnings();
public abstract void setCollapseSuppressWarnings(boolean value);
public abstract BooleanTrackableProperty getCollapseSuppressWarningsProperty();
public abstract boolean isCollapseEndOfLineComments();
public abstract void setCollapseEndOfLineComments(boolean value);
public abstract BooleanTrackableProperty getCollapseEndOfLineCommentsProperty();
}

View File

@@ -16,7 +16,6 @@
package com.intellij.codeInsight.folding.impl;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtilBase;
import com.intellij.codeInsight.folding.JavaCodeFoldingSettings;
import com.intellij.codeInsight.generation.OverrideImplementExploreUtil;
import com.intellij.lang.folding.NamedFoldingDescriptor;
import com.intellij.openapi.editor.Document;
@@ -25,7 +24,6 @@ import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.BooleanTrackableProperty;
import com.intellij.util.ObjectUtils;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
@@ -128,11 +126,10 @@ class ClosureFolding {
if (rangeStart >= rangeEnd) return null;
FoldingGroup group = FoldingGroup.newGroup("lambda");
BooleanTrackableProperty collapseSetting = JavaCodeFoldingSettings.getInstance().getCollapseLambdasProperty();
List<NamedFoldingDescriptor> foldElements = new ArrayList<>();
foldElements.add(new NamedFoldingDescriptor(myNewExpression, getClosureStartOffset(), rangeStart, group, header, collapseSetting));
foldElements.add(new NamedFoldingDescriptor(myNewExpression, getClosureStartOffset(), rangeStart, group, header));
if (rangeEnd + 1 < getClosureEndOffset()) {
foldElements.add(new NamedFoldingDescriptor(classRBrace, rangeEnd, getClosureEndOffset(), group, footer, collapseSetting));
foldElements.add(new NamedFoldingDescriptor(classRBrace, rangeEnd, getClosureEndOffset(), group, footer));
}
return foldElements;
}

View File

@@ -17,227 +17,155 @@ package com.intellij.codeInsight.folding.impl;
import com.intellij.codeInsight.folding.CodeFoldingSettings;
import com.intellij.codeInsight.folding.JavaCodeFoldingSettings;
import com.intellij.util.BooleanTrackableProperty;
public class JavaCodeFoldingSettingsBase extends JavaCodeFoldingSettings {
private BooleanTrackableProperty COLLAPSE_ACCESSORS = new BooleanTrackableProperty();
private BooleanTrackableProperty COLLAPSE_ONE_LINE_METHODS = new BooleanTrackableProperty(true);
private BooleanTrackableProperty COLLAPSE_INNER_CLASSES = new BooleanTrackableProperty();
private BooleanTrackableProperty COLLAPSE_ANONYMOUS_CLASSES = new BooleanTrackableProperty();
private BooleanTrackableProperty COLLAPSE_ANNOTATIONS = new BooleanTrackableProperty();
private BooleanTrackableProperty COLLAPSE_CLOSURES = new BooleanTrackableProperty(true);
private BooleanTrackableProperty COLLAPSE_CONSTRUCTOR_GENERIC_PARAMETERS = new BooleanTrackableProperty(true);
private BooleanTrackableProperty COLLAPSE_I18N_MESSAGES = new BooleanTrackableProperty(true);
private BooleanTrackableProperty COLLAPSE_SUPPRESS_WARNINGS = new BooleanTrackableProperty(true);
private BooleanTrackableProperty COLLAPSE_END_OF_LINE_COMMENTS = new BooleanTrackableProperty();
private boolean COLLAPSE_ACCESSORS;
private boolean COLLAPSE_ONE_LINE_METHODS = true;
private boolean COLLAPSE_INNER_CLASSES;
private boolean COLLAPSE_ANONYMOUS_CLASSES;
private boolean COLLAPSE_ANNOTATIONS;
private boolean COLLAPSE_CLOSURES = true;
private boolean COLLAPSE_CONSTRUCTOR_GENERIC_PARAMETERS = true;
private boolean COLLAPSE_I18N_MESSAGES = true;
private boolean COLLAPSE_SUPPRESS_WARNINGS = true;
private boolean COLLAPSE_END_OF_LINE_COMMENTS;
@Override
public boolean isCollapseImports() {
return CodeFoldingSettings.getInstance().isCollapseImports();
return CodeFoldingSettings.getInstance().COLLAPSE_IMPORTS;
}
@Override
public void setCollapseImports(boolean value) {
CodeFoldingSettings.getInstance().setCollapseImports(value);
}
@Override
public BooleanTrackableProperty getCollapseImportsProperty() {
return CodeFoldingSettings.getInstance().getCollapseImportsProperty();
CodeFoldingSettings.getInstance().COLLAPSE_IMPORTS = value;
}
@Override
public boolean isCollapseLambdas() {
return COLLAPSE_CLOSURES.getValue();
}
@Override
public void setCollapseLambdas(boolean value) {
COLLAPSE_CLOSURES.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseLambdasProperty() {
return COLLAPSE_CLOSURES;
}
@Override
public void setCollapseLambdas(boolean value) {
COLLAPSE_CLOSURES = value;
}
@Override
public boolean isCollapseConstructorGenericParameters() {
return COLLAPSE_CONSTRUCTOR_GENERIC_PARAMETERS.getValue();
}
@Override
public void setCollapseConstructorGenericParameters(boolean value) {
COLLAPSE_CONSTRUCTOR_GENERIC_PARAMETERS.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseConstructorGenericParametersProperty() {
return COLLAPSE_CONSTRUCTOR_GENERIC_PARAMETERS;
}
@Override
public void setCollapseConstructorGenericParameters(boolean value) {
COLLAPSE_CONSTRUCTOR_GENERIC_PARAMETERS = value;
}
@Override
public boolean isCollapseMethods() {
return CodeFoldingSettings.getInstance().isCollapseMethods();
return CodeFoldingSettings.getInstance().COLLAPSE_METHODS;
}
@Override
public void setCollapseMethods(boolean value) {
CodeFoldingSettings.getInstance().setCollapseMethods(value);
}
@Override
public BooleanTrackableProperty getCollapseMethodsProperty() {
return CodeFoldingSettings.getInstance().getCollapseMethodsProperty();
CodeFoldingSettings.getInstance().COLLAPSE_METHODS = value;
}
@Override
public boolean isCollapseAccessors() {
return COLLAPSE_ACCESSORS.getValue();
}
@Override
public void setCollapseAccessors(boolean value) {
COLLAPSE_ACCESSORS.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseAccessorsProperty() {
return COLLAPSE_ACCESSORS;
}
@Override
public void setCollapseAccessors(boolean value) {
COLLAPSE_ACCESSORS = value;
}
@Override
public boolean isCollapseOneLineMethods() {
return COLLAPSE_ONE_LINE_METHODS.getValue();
}
@Override
public void setCollapseOneLineMethods(boolean value) {
COLLAPSE_ONE_LINE_METHODS.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseOneLineMethodsProperty() {
return COLLAPSE_ONE_LINE_METHODS;
}
@Override
public void setCollapseOneLineMethods(boolean value) {
COLLAPSE_ONE_LINE_METHODS = value;
}
@Override
public boolean isCollapseInnerClasses() {
return COLLAPSE_INNER_CLASSES.getValue();
}
@Override
public void setCollapseInnerClasses(boolean value) {
COLLAPSE_INNER_CLASSES.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseInnerClassesProperty() {
return COLLAPSE_INNER_CLASSES;
}
@Override
public void setCollapseInnerClasses(boolean value) {
COLLAPSE_INNER_CLASSES = value;
}
@Override
public boolean isCollapseJavadocs() {
return CodeFoldingSettings.getInstance().isCollapseDocComments();
return CodeFoldingSettings.getInstance().COLLAPSE_DOC_COMMENTS;
}
@Override
public void setCollapseJavadocs(boolean value) {
CodeFoldingSettings.getInstance().setCollapseDocComments(value);
}
@Override
public BooleanTrackableProperty getCollapseJavadocsProperty() {
return CodeFoldingSettings.getInstance().getCollapseDocCommentsProperty();
CodeFoldingSettings.getInstance().COLLAPSE_DOC_COMMENTS = value;
}
@Override
public boolean isCollapseFileHeader() {
return CodeFoldingSettings.getInstance().isCollapseFileHeader();
return CodeFoldingSettings.getInstance().COLLAPSE_FILE_HEADER;
}
@Override
public void setCollapseFileHeader(boolean value) {
CodeFoldingSettings.getInstance().setCollapseFileHeader(value);
}
@Override
public BooleanTrackableProperty getCollapseFileHeaderProperty() {
return CodeFoldingSettings.getInstance().getCollapseFileHeaderProperty();
CodeFoldingSettings.getInstance().COLLAPSE_FILE_HEADER = value;
}
@Override
public boolean isCollapseAnonymousClasses() {
return COLLAPSE_ANONYMOUS_CLASSES.getValue();
}
@Override
public void setCollapseAnonymousClasses(boolean value) {
COLLAPSE_ANONYMOUS_CLASSES.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseAnonymousClassesProperty() {
return COLLAPSE_ANONYMOUS_CLASSES;
}
@Override
public void setCollapseAnonymousClasses(boolean value) {
COLLAPSE_ANONYMOUS_CLASSES = value;
}
@Override
public boolean isCollapseAnnotations() {
return COLLAPSE_ANNOTATIONS.getValue();
}
@Override
public void setCollapseAnnotations(boolean value) {
COLLAPSE_ANNOTATIONS.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseAnnotationsProperty() {
return COLLAPSE_ANNOTATIONS;
}
@Override
public void setCollapseAnnotations(boolean value) {
COLLAPSE_ANNOTATIONS = value;
}
@Override
public boolean isCollapseI18nMessages() {
return COLLAPSE_I18N_MESSAGES.getValue();
}
@Override
public void setCollapseI18nMessages(boolean value) {
COLLAPSE_I18N_MESSAGES.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseI18nMessagesProperty() {
return COLLAPSE_I18N_MESSAGES;
}
@Override
public void setCollapseI18nMessages(boolean value) {
COLLAPSE_I18N_MESSAGES = value;
}
@Override
public boolean isCollapseSuppressWarnings() {
return COLLAPSE_SUPPRESS_WARNINGS.getValue();
}
@Override
public void setCollapseSuppressWarnings(boolean value) {
COLLAPSE_SUPPRESS_WARNINGS.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseSuppressWarningsProperty() {
return COLLAPSE_SUPPRESS_WARNINGS;
}
@Override
public void setCollapseSuppressWarnings(boolean value) {
COLLAPSE_SUPPRESS_WARNINGS = value;
}
@Override
public boolean isCollapseEndOfLineComments() {
return COLLAPSE_END_OF_LINE_COMMENTS.getValue();
return COLLAPSE_END_OF_LINE_COMMENTS;
}
@Override
public void setCollapseEndOfLineComments(boolean value) {
COLLAPSE_END_OF_LINE_COMMENTS.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseEndOfLineCommentsProperty() {
return COLLAPSE_END_OF_LINE_COMMENTS;
COLLAPSE_END_OF_LINE_COMMENTS = value;
}
}

View File

@@ -43,7 +43,6 @@ import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.BooleanTrackableProperty;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -231,8 +230,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
for (int i = 0; i < children.length; i++) {
PsiElement child = children[i];
if (child instanceof PsiAnnotation) {
addToFold(foldElements, child, document, false,
JavaCodeFoldingSettings.getInstance().getCollapseAnnotationsProperty());
addToFold(foldElements, child, document, false);
int j;
for (j = i + 1; j < children.length; j++) {
PsiElement nextChild = children[j];
@@ -291,8 +289,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
if (end != null && !containsCustomRegionMarker) {
foldElements.add(
new FoldingDescriptor(comment, new TextRange(comment.getTextRange().getStartOffset(), end.getTextRange().getEndOffset()),
JavaCodeFoldingSettings.getInstance().getCollapseEndOfLineCommentsProperty())
new FoldingDescriptor(comment, new TextRange(comment.getTextRange().getStartOffset(), end.getTextRange().getEndOffset()))
);
}
}
@@ -399,8 +396,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
final String text = list.getText();
if (text.startsWith("<") && text.endsWith(">") && text.length() > ifLongerThan) {
final TextRange range = list.getTextRange();
addFoldRegion(foldElements, list, document, true, range,
JavaCodeFoldingSettings.getInstance().getCollapseConstructorGenericParametersProperty());
addFoldRegion(foldElements, list, document, true, range);
}
}
@@ -409,19 +405,17 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
private static boolean addToFold(@NotNull List<FoldingDescriptor> list,
@NotNull PsiElement elementToFold,
@NotNull Document document,
boolean allowOneLiners,
@Nullable BooleanTrackableProperty dependency) {
boolean allowOneLiners) {
PsiUtilCore.ensureValid(elementToFold);
TextRange range = getRangeToFold(elementToFold);
return range != null && addFoldRegion(list, elementToFold, document, allowOneLiners, range, dependency);
return range != null && addFoldRegion(list, elementToFold, document, allowOneLiners, range);
}
private static boolean addFoldRegion(@NotNull List<FoldingDescriptor> list,
@NotNull PsiElement elementToFold,
@NotNull Document document,
boolean allowOneLiners,
@NotNull TextRange range,
@Nullable BooleanTrackableProperty dependency) {
@NotNull TextRange range) {
final TextRange fileRange = elementToFold.getContainingFile().getTextRange();
if (range.equals(fileRange)) return false;
@@ -434,14 +428,14 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
int startLine = document.getLineNumber(range.getStartOffset());
int endLine = document.getLineNumber(range.getEndOffset() - 1);
if (startLine < endLine && range.getLength() > 1) {
list.add(new FoldingDescriptor(elementToFold, range, dependency));
list.add(new FoldingDescriptor(elementToFold, range));
return true;
}
return false;
}
else {
if (range.getLength() > getPlaceholderText(elementToFold).length()) {
list.add(new FoldingDescriptor(elementToFold, range, dependency));
list.add(new FoldingDescriptor(elementToFold, range));
return true;
}
return false;
@@ -457,7 +451,6 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
return;
}
PsiJavaFile file = (PsiJavaFile) root;
JavaCodeFoldingSettings settings = JavaCodeFoldingSettings.getInstance();
PsiImportList importList = file.getImportList();
if (importList != null) {
@@ -465,7 +458,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
if (statements.length > 1) {
final TextRange rangeToFold = getRangeToFold(importList);
if (rangeToFold != null && rangeToFold.getLength() > 1) {
FoldingDescriptor descriptor = new FoldingDescriptor(importList, rangeToFold, settings.getCollapseImportsProperty());
FoldingDescriptor descriptor = new FoldingDescriptor(importList, rangeToFold);
// imports are often added/removed automatically, so we enable autoupdate of folded region for foldings even if it's collapsed
descriptor.setCanBeRemovedWhenCollapsed(true);
descriptors.add(descriptor);
@@ -498,7 +491,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
anchorElementToUse = candidate;
}
}
descriptors.add(new FoldingDescriptor(anchorElementToUse, range, settings.getCollapseFileHeaderProperty()));
descriptors.add(new FoldingDescriptor(anchorElementToUse, range));
}
}
@@ -507,21 +500,15 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
@NotNull Document document,
boolean foldJavaDocs,
boolean quick) {
JavaCodeFoldingSettings settings = JavaCodeFoldingSettings.getInstance();
if (!(aClass.getParent() instanceof PsiJavaFile) || ((PsiJavaFile)aClass.getParent()).getClasses().length > 1) {
addToFold(list, aClass, document, true,
aClass.getParent() instanceof PsiFile ? null
: aClass instanceof PsiAnonymousClass
? settings.getCollapseAnonymousClassesProperty()
: settings.getCollapseInnerClassesProperty());
addToFold(list, aClass, document, true);
}
PsiDocComment docComment;
if (foldJavaDocs) {
docComment = aClass.getDocComment();
if (docComment != null) {
addToFold(list, docComment, document, true, settings.getCollapseJavadocsProperty());
addToFold(list, docComment, document, true);
}
}
addAnnotationsToFold(aClass.getModifierList(), list, document);
@@ -535,16 +522,14 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
PsiMethod method = (PsiMethod)child;
boolean oneLiner = addOneLineMethodFolding(list, method);
if (!oneLiner) {
addToFold(list, method, document, true, isSimplePropertyAccessor(method)
? settings.getCollapseAccessorsProperty()
: settings.getCollapseMethodsProperty());
addToFold(list, method, document, true);
}
addAnnotationsToFold(method.getModifierList(), list, document);
if (foldJavaDocs) {
docComment = method.getDocComment();
if (docComment != null) {
addToFold(list, docComment, document, true, settings.getCollapseJavadocsProperty());
addToFold(list, docComment, document, true);
}
}
@@ -558,7 +543,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
if (foldJavaDocs) {
docComment = field.getDocComment();
if (docComment != null) {
addToFold(list, docComment, document, true, settings.getCollapseJavadocsProperty());
addToFold(list, docComment, document, true);
}
}
addAnnotationsToFold(field.getModifierList(), list, document);
@@ -571,7 +556,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
}
else if (child instanceof PsiClassInitializer) {
PsiClassInitializer initializer = (PsiClassInitializer)child;
addToFold(list, initializer, document, true, settings.getCollapseMethodsProperty());
addToFold(list, initializer, document, true);
addCodeBlockFolds(initializer, list, processedComments, document, quick);
}
else if (child instanceof PsiClass) {
@@ -584,8 +569,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
}
private boolean addOneLineMethodFolding(@NotNull List<FoldingDescriptor> descriptorList, @NotNull PsiMethod method) {
JavaCodeFoldingSettings settings = JavaCodeFoldingSettings.getInstance();
if (!settings.isCollapseOneLineMethods()) {
if (!JavaCodeFoldingSettings.getInstance().isCollapseOneLineMethods()) {
return false;
}
@@ -637,9 +621,8 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
}
FoldingGroup group = FoldingGroup.newGroup("one-liner");
BooleanTrackableProperty collapseSetting = settings.getCollapseOneLineMethodsProperty();
descriptorList.add(new NamedFoldingDescriptor(lBrace, leftStart, leftEnd, group, leftText, collapseSetting));
descriptorList.add(new NamedFoldingDescriptor(rBrace, rightStart, rightEnd, group, rightText, collapseSetting));
descriptorList.add(new NamedFoldingDescriptor(lBrace, leftStart, leftEnd, group, leftText));
descriptorList.add(new NamedFoldingDescriptor(rBrace, rightStart, rightEnd, group, rightText));
return true;
}
@@ -731,8 +714,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
@Override
public void visitClass(PsiClass aClass) {
if (dumb || !addClosureFolding(aClass, document, foldElements, processedComments, quick)) {
addToFold(foldElements, aClass, document, true,
JavaCodeFoldingSettings.getInstance().getCollapseAnonymousClassesProperty());
addToFold(foldElements, aClass, document, true);
addElementsToFold(foldElements, aClass, document, false, quick);
}
}
@@ -759,8 +741,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
public void visitLambdaExpression(PsiLambdaExpression expression) {
PsiElement body = expression.getBody();
if (body instanceof PsiCodeBlock) {
addToFold(foldElements, expression, document, true,
JavaCodeFoldingSettings.getInstance().getCollapseAnonymousClassesProperty());
addToFold(foldElements, expression, document, true);
}
super.visitLambdaExpression(expression);
}

View File

@@ -487,15 +487,15 @@ class Test {
};
}
"""
boolean oldValue = CodeFoldingSettings.instance.isCollapseCustomFoldingRegions();
boolean oldValue = CodeFoldingSettings.instance.COLLAPSE_CUSTOM_FOLDING_REGIONS;
try {
CodeFoldingSettings.instance.setCollapseCustomFoldingRegions(true);
CodeFoldingSettings.instance.COLLAPSE_CUSTOM_FOLDING_REGIONS = true;
configure text
def foldingModel = myFixture.editor.foldingModel as FoldingModelImpl
assert foldingModel.getCollapsedRegionAtOffset(text.indexOf("//<editor-fold"))
}
finally {
CodeFoldingSettings.instance.setCollapseCustomFoldingRegions(oldValue);
CodeFoldingSettings.instance.COLLAPSE_CUSTOM_FOLDING_REGIONS = oldValue;
}
}

View File

@@ -16,110 +16,15 @@
package com.intellij.codeInsight.folding;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.util.BooleanTrackableProperty;
import com.intellij.util.xmlb.annotations.OptionTag;
import com.intellij.util.xmlb.annotations.Transient;
@SuppressWarnings({"deprecation", "DeprecatedIsStillUsed"})
public class CodeFoldingSettings {
/** @deprecated Use corresponding getters/setters or property */
@Transient
public boolean COLLAPSE_IMPORTS = true;
/** @deprecated Use corresponding getters/setters or property */
@Transient
public boolean COLLAPSE_METHODS;
/** @deprecated Use corresponding getters/setters or property */
@Transient
public boolean COLLAPSE_FILE_HEADER = true;
/** @deprecated Use corresponding getters/setters or property */
@Transient
public boolean COLLAPSE_DOC_COMMENTS;
/** @deprecated Use corresponding getters/setters or property */
@Transient
public boolean COLLAPSE_CUSTOM_FOLDING_REGIONS;
private BooleanTrackableProperty myCollapseImports = new BooleanTrackableProperty(true);
private BooleanTrackableProperty myCollapseMethods = new BooleanTrackableProperty();
private BooleanTrackableProperty myCollapseFileHeader = new BooleanTrackableProperty(true);
private BooleanTrackableProperty myCollapseDocComments = new BooleanTrackableProperty();
private BooleanTrackableProperty myCollapseCustomFoldingRegions = new BooleanTrackableProperty();
public static CodeFoldingSettings getInstance() {
return ServiceManager.getService(CodeFoldingSettings.class);
}
@OptionTag("COLLAPSE_IMPORTS")
public boolean isCollapseImports() {
return COLLAPSE_IMPORTS;
}
public void setCollapseImports(boolean value) {
COLLAPSE_IMPORTS = value;
myCollapseImports.setValue(value);
}
public BooleanTrackableProperty getCollapseImportsProperty() {
return myCollapseImports;
}
@OptionTag("COLLAPSE_METHODS")
public boolean isCollapseMethods() {
return COLLAPSE_METHODS;
}
public void setCollapseMethods(boolean value) {
COLLAPSE_METHODS = value;
myCollapseMethods.setValue(value);
}
public BooleanTrackableProperty getCollapseMethodsProperty() {
return myCollapseMethods;
}
@OptionTag("COLLAPSE_FILE_HEADER")
public boolean isCollapseFileHeader() {
return COLLAPSE_FILE_HEADER;
}
public void setCollapseFileHeader(boolean value) {
COLLAPSE_FILE_HEADER = value;
myCollapseFileHeader.setValue(value);
}
public BooleanTrackableProperty getCollapseFileHeaderProperty() {
return myCollapseFileHeader;
}
@OptionTag("COLLAPSE_DOC_COMMENTS")
public boolean isCollapseDocComments() {
return COLLAPSE_DOC_COMMENTS;
}
public void setCollapseDocComments(boolean value) {
COLLAPSE_DOC_COMMENTS = value;
myCollapseDocComments.setValue(value);
}
public BooleanTrackableProperty getCollapseDocCommentsProperty() {
return myCollapseDocComments;
}
@OptionTag("COLLAPSE_CUSTOM_FOLDING_REGIONS")
public boolean isCollapseCustomFoldingRegions() {
return COLLAPSE_CUSTOM_FOLDING_REGIONS;
}
public void setCollapseCustomFoldingRegions(boolean value) {
COLLAPSE_CUSTOM_FOLDING_REGIONS = value;
myCollapseCustomFoldingRegions.setValue(value);
}
public BooleanTrackableProperty getCollapseCustomFoldingRegionsProperty() {
return myCollapseCustomFoldingRegions;
}
}

View File

@@ -44,6 +44,6 @@ public abstract class CustomFoldingProvider {
public abstract String getEndString();
public boolean isCollapsedByDefault(String text) {
return CodeFoldingSettings.getInstance().isCollapseCustomFoldingRegions();
return CodeFoldingSettings.getInstance().COLLAPSE_CUSTOM_FOLDING_REGIONS;
}
}

View File

@@ -31,10 +31,9 @@ import java.util.Set;
* Defines a single folding region in the code.
*
* <p><a name="Dependencies"><b>Dependencies</b></a></p>
* Dependencies are objects (in particular, instances of {@link com.intellij.openapi.util.ModificationTracker}),
* Dependencies are objects (in particular, instances of {@link com.intellij.openapi.util.ModificationTracker},
* more info - {@link com.intellij.psi.util.CachedValueProvider.Result#getDependencyItems here}),
* which can be tracked for changes, that should trigger folding regions recalculation for an editor (initiating code folding pass).
* Changed dependency for a specific region causes its regeneration according to potentially updated folding rules,
* e.g. with regard to 'collapsed by default' state.
*
* @author max
* @see FoldingBuilder
@@ -61,25 +60,10 @@ public class FoldingDescriptor {
this(node, range, null);
}
/**
* @param dependency see <a href="#Dependencies">Dependencies</a>
*/
public FoldingDescriptor(@NotNull ASTNode node, @NotNull TextRange range, @Nullable Object dependency) {
this(node, range, null, dependency);
}
public FoldingDescriptor(@NotNull PsiElement element, @NotNull TextRange range) {
this(ObjectUtils.assertNotNull(element.getNode()), range, null);
}
/**
* @param dependency see <a href="#Dependencies">Dependencies</a>
*/
public FoldingDescriptor(@NotNull PsiElement element, @NotNull TextRange range, @Nullable Object dependency) {
this(ObjectUtils.assertNotNull(element.getNode()), range, null,
dependency == null ? Collections.emptySet() : Collections.singleton(dependency));
}
/**
* Creates a folding region related to the specified AST node and covering the specified
* text range.
@@ -93,13 +77,6 @@ public class FoldingDescriptor {
this(node, range, group, Collections.emptySet());
}
/**
* @param dependency see <a href="#Dependencies">Dependencies</a>
*/
public FoldingDescriptor(@NotNull ASTNode node, @NotNull TextRange range, @Nullable FoldingGroup group, @Nullable Object dependency) {
this(node, range, group, dependency == null ? Collections.emptySet() : Collections.singleton(dependency));
}
/**
* Creates a folding region related to the specified AST node and covering the specified
* text range.

View File

@@ -1,50 +0,0 @@
/*
* Copyright 2000-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.util;
import com.intellij.openapi.util.ModificationTracker;
/**
* Boolean property that implements {@link ModificationTracker}.
* Not thread safe (external synchronization is required).
*/
public class BooleanTrackableProperty implements ModificationTracker {
private boolean myValue;
private long myModificationCount;
public BooleanTrackableProperty() {
this(false);
}
public BooleanTrackableProperty(boolean value) {
myValue = value;
}
public boolean getValue() {
return myValue;
}
public void setValue(boolean value) {
boolean oldValue = myValue;
myValue = value;
if (value != oldValue) myModificationCount++;
}
@Override
public long getModificationCount() {
return myModificationCount;
}
}

View File

@@ -33,11 +33,6 @@ public class NamedFoldingDescriptor extends FoldingDescriptor {
this(e.getNode(), new TextRange(start, end), group, placeholderText);
}
public NamedFoldingDescriptor(@NotNull PsiElement e, int start, int end, @Nullable FoldingGroup group, @NotNull String placeholderText,
@Nullable Object dependency) {
this(e.getNode(), new TextRange(start, end), group, placeholderText, dependency);
}
public NamedFoldingDescriptor(@NotNull ASTNode node, int start, int end, @Nullable FoldingGroup group, @NotNull String placeholderText) {
this(node, new TextRange(start, end), group, placeholderText);
}
@@ -46,15 +41,7 @@ public class NamedFoldingDescriptor extends FoldingDescriptor {
@NotNull final TextRange range,
@Nullable FoldingGroup group,
@NotNull String placeholderText) {
this(node, range, group, placeholderText, null);
}
public NamedFoldingDescriptor(@NotNull ASTNode node,
@NotNull final TextRange range,
@Nullable FoldingGroup group,
@NotNull String placeholderText,
@Nullable Object dependency) {
super(node, range, group, dependency);
super(node, range, group);
myPlaceholderText = placeholderText;
}

View File

@@ -27,10 +27,10 @@ public class BaseCodeFoldingOptionsProvider extends BeanConfigurable<CodeFolding
public BaseCodeFoldingOptionsProvider() {
super(CodeFoldingSettings.getInstance());
CodeFoldingSettings settings = getInstance();
checkBox(ApplicationBundle.message("checkbox.collapse.file.header"), settings::isCollapseFileHeader, settings::setCollapseFileHeader);
checkBox(ApplicationBundle.message("checkbox.collapse.title.imports"), settings::isCollapseImports, settings::setCollapseImports);
checkBox(ApplicationBundle.message("checkbox.collapse.javadoc.comments"), settings::isCollapseDocComments, settings::setCollapseDocComments);
checkBox(ApplicationBundle.message("checkbox.collapse.method.bodies"), settings::isCollapseMethods, settings::setCollapseMethods);
checkBox(ApplicationBundle.message("checkbox.collapse.custom.folding.regions"), settings::isCollapseCustomFoldingRegions, settings::setCollapseCustomFoldingRegions);
checkBox(ApplicationBundle.message("checkbox.collapse.file.header"), ()->settings.COLLAPSE_FILE_HEADER, v->settings.COLLAPSE_FILE_HEADER=v);
checkBox(ApplicationBundle.message("checkbox.collapse.title.imports"), ()->settings.COLLAPSE_IMPORTS, v->settings.COLLAPSE_IMPORTS=v);
checkBox(ApplicationBundle.message("checkbox.collapse.javadoc.comments"), ()->settings.COLLAPSE_DOC_COMMENTS, v->settings.COLLAPSE_DOC_COMMENTS=v);
checkBox(ApplicationBundle.message("checkbox.collapse.method.bodies"), ()->settings.COLLAPSE_METHODS, v->settings.COLLAPSE_METHODS=v);
checkBox(ApplicationBundle.message("checkbox.collapse.custom.folding.regions"), ()->settings.COLLAPSE_CUSTOM_FOLDING_REGIONS, v->settings.COLLAPSE_CUSTOM_FOLDING_REGIONS=v);
}
}

View File

@@ -29,15 +29,12 @@ import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.SmartPointerManager;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashMap;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import java.util.*;
@@ -50,8 +47,6 @@ class UpdateFoldRegionsOperation implements Runnable {
private static final Logger LOG = Logger.getInstance("#" + UpdateFoldRegionsOperation.class.getName());
private static final Key<Boolean> CAN_BE_REMOVED_WHEN_COLLAPSED = Key.create("canBeRemovedWhenCollapsed");
private static final Key<ModificationTracker[]> DEPENDENCIES = Key.create("dependencies");
private static final Key<Map<ModificationTracker, Long>> MODIFICATION_STAMPS = Key.create("modificationStamps");
private final Project myProject;
private final Editor myEditor;
@@ -84,17 +79,15 @@ class UpdateFoldRegionsOperation implements Runnable {
EditorFoldingInfo info = EditorFoldingInfo.get(myEditor);
FoldingModelEx foldingModel = (FoldingModelEx)myEditor.getFoldingModel();
Map<TextRange,Boolean> rangeToExpandStatusMap = new THashMap<>();
Set<TextRange> rangesToResetToDefault = new THashSet<>();
// FoldingUpdate caches instances of our object, so they must be immutable.
FoldingUpdate.FoldingMap elementsToFold = new FoldingUpdate.FoldingMap(myElementsToFoldMap);
removeInvalidRegions(info, foldingModel, elementsToFold, rangeToExpandStatusMap, rangesToResetToDefault);
removeInvalidRegions(info, foldingModel, elementsToFold, rangeToExpandStatusMap);
Map<FoldRegion, Boolean> shouldExpand = new THashMap<>();
Map<FoldingGroup, Boolean> groupExpand = new THashMap<>();
List<FoldRegion> newRegions = addNewRegions(info, foldingModel, elementsToFold, rangeToExpandStatusMap, shouldExpand, groupExpand,
rangesToResetToDefault);
List<FoldRegion> newRegions = addNewRegions(info, foldingModel, elementsToFold, rangeToExpandStatusMap, shouldExpand, groupExpand);
applyExpandStatus(newRegions, shouldExpand, groupExpand);
@@ -116,11 +109,9 @@ class UpdateFoldRegionsOperation implements Runnable {
private List<FoldRegion> addNewRegions(@NotNull EditorFoldingInfo info,
@NotNull FoldingModelEx foldingModel,
FoldingUpdate.FoldingMap elementsToFold,
@NotNull Map<TextRange, Boolean> rangeToExpandStatusMap,
FoldingUpdate.FoldingMap elementsToFold, @NotNull Map<TextRange, Boolean> rangeToExpandStatusMap,
@NotNull Map<FoldRegion, Boolean> shouldExpand,
@NotNull Map<FoldingGroup, Boolean> groupExpand,
@NotNull Set<TextRange> rangesToResetToDefault) {
@NotNull Map<FoldingGroup, Boolean> groupExpand) {
List<FoldRegion> newRegions = new ArrayList<>();
SmartPointerManager smartPointerManager = SmartPointerManager.getInstance(myProject);
for (PsiElement element : elementsToFold.keySet()) {
@@ -154,13 +145,11 @@ class UpdateFoldRegionsOperation implements Runnable {
}
if (descriptor.canBeRemovedWhenCollapsed()) region.putUserData(CAN_BE_REMOVED_WHEN_COLLAPSED, Boolean.TRUE);
storeAssociatedDependencies(region, descriptor.getDependencies());
info.addRegion(region, smartPointerManager.createSmartPsiElementPointer(psi));
newRegions.add(region);
boolean expandStatus = !descriptor.isNonExpandable() &&
shouldExpandNewRegion(element, range, rangeToExpandStatusMap, rangesToResetToDefault.contains(range));
boolean expandStatus = !descriptor.isNonExpandable() && shouldExpandNewRegion(element, range, rangeToExpandStatusMap);
if (group == null) {
shouldExpand.put(region, expandStatus);
}
@@ -174,39 +163,10 @@ class UpdateFoldRegionsOperation implements Runnable {
return newRegions;
}
private static void storeAssociatedDependencies(@NotNull FoldRegion region, @NotNull Set<Object> dependencies) {
if (dependencies.isEmpty()) return;
ModificationTracker[] modificationTrackers = ContainerUtil.findAllAsArray(dependencies, ModificationTracker.class);
if (modificationTrackers.length == 0) return;
region.putUserData(DEPENDENCIES, modificationTrackers);
Map<ModificationTracker, Long> stamps = region.getEditor().getUserData(MODIFICATION_STAMPS);
if (stamps == null) {
region.getEditor().putUserData(MODIFICATION_STAMPS, stamps = new WeakHashMap<>());
}
for (ModificationTracker tracker : modificationTrackers) {
stamps.put(tracker, tracker.getModificationCount());
}
}
private static boolean hasExpiredDependencies(@NotNull FoldRegion region) {
ModificationTracker[] dependencies = region.getUserData(DEPENDENCIES);
if (dependencies == null) return false;
Map<ModificationTracker, Long> stamps = region.getEditor().getUserData(MODIFICATION_STAMPS);
if (stamps == null) return false;
for (ModificationTracker tracker : dependencies) {
Long initialValue = stamps.get(tracker);
if (initialValue != null && initialValue != tracker.getModificationCount()) return true;
}
return false;
}
private boolean shouldExpandNewRegion(PsiElement element,
TextRange range,
Map<TextRange, Boolean> rangeToExpandStatusMap,
boolean forceReset) {
if (myApplyDefaultState != ApplyDefaultStateMode.NO || forceReset) {
private boolean shouldExpandNewRegion(PsiElement element, TextRange range, Map<TextRange, Boolean> rangeToExpandStatusMap) {
if (myApplyDefaultState != ApplyDefaultStateMode.NO) {
// Considering that this code is executed only on initial fold regions construction on editor opening.
if (myApplyDefaultState == ApplyDefaultStateMode.EXCEPT_CARET_REGION || forceReset) {
if (myApplyDefaultState == ApplyDefaultStateMode.EXCEPT_CARET_REGION) {
TextRange lineRange = OpenFileDescriptor.getRangeToUnfoldOnNavigation(myEditor);
if (lineRange.intersects(range)) {
return true;
@@ -221,18 +181,10 @@ class UpdateFoldRegionsOperation implements Runnable {
private void removeInvalidRegions(@NotNull EditorFoldingInfo info,
@NotNull FoldingModelEx foldingModel,
FoldingUpdate.FoldingMap elementsToFold,
@NotNull Map<TextRange, Boolean> rangeToExpandStatusMap,
@NotNull Set<TextRange> rangesToResetToDefault) {
FoldingUpdate.FoldingMap elementsToFold, @NotNull Map<TextRange, Boolean> rangeToExpandStatusMap) {
List<FoldRegion> toRemove = new ArrayList<>();
InjectedLanguageManager injectedManager = InjectedLanguageManager.getInstance(myProject);
for (FoldRegion region : foldingModel.getAllFoldRegions()) {
if (hasExpiredDependencies(region)) {
toRemove.add(region);
rangesToResetToDefault.add(new TextRange(region.getStartOffset(), region.getEndOffset()));
continue;
}
if (myKeepCollapsedRegions && !region.isExpanded() && !regionOrGroupCanBeRemovedWhenCollapsed(region)) continue;
PsiElement element = info.getPsiElement(region);

View File

@@ -81,7 +81,6 @@ public class PropertyFoldingBuilder extends FoldingBuilderEx {
if (isI18nProperty(expression)) {
final IProperty property = getI18nProperty(expression);
final HashSet<Object> set = new HashSet<>();
set.add(JavaCodeFoldingSettings.getInstance().getCollapseI18nMessagesProperty());
set.add(property != null ? property : PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT);
final String msg = formatI18nProperty(expression, property);

View File

@@ -233,15 +233,15 @@ public class PythonFoldingBuilder extends CustomFoldingBuilder implements DumbAw
@Override
protected boolean isRegionCollapsedByDefault(@NotNull ASTNode node) {
if (isImport(node)) {
return CodeFoldingSettings.getInstance().isCollapseImports();
return CodeFoldingSettings.getInstance().COLLAPSE_IMPORTS;
}
if (node.getElementType() == PyElementTypes.STRING_LITERAL_EXPRESSION) {
if (getDocStringOwnerType(node) == PyElementTypes.FUNCTION_DECLARATION && CodeFoldingSettings.getInstance().isCollapseMethods()) {
if (getDocStringOwnerType(node) == PyElementTypes.FUNCTION_DECLARATION && CodeFoldingSettings.getInstance().COLLAPSE_METHODS) {
// method will be collapsed, no need to also collapse docstring
return false;
}
if (getDocStringOwnerType(node) != null) {
return CodeFoldingSettings.getInstance().isCollapseDocComments();
return CodeFoldingSettings.getInstance().COLLAPSE_DOC_COMMENTS;
}
return PythonFoldingSettings.getInstance().isCollapseLongStrings();
}
@@ -249,7 +249,7 @@ public class PythonFoldingBuilder extends CustomFoldingBuilder implements DumbAw
return PythonFoldingSettings.getInstance().isCollapseSequentialComments();
}
if (node.getElementType() == PyElementTypes.STATEMENT_LIST && node.getTreeParent().getElementType() == PyElementTypes.FUNCTION_DECLARATION) {
return CodeFoldingSettings.getInstance().isCollapseMethods();
return CodeFoldingSettings.getInstance().COLLAPSE_METHODS;
}
if (FOLDABLE_COLLECTIONS_LITERALS.contains(node.getElementType())) {
return PythonFoldingSettings.getInstance().isCollapseLongCollections();

View File

@@ -27,9 +27,9 @@ public class XmlCodeFoldingOptionsProvider extends BeanConfigurable<XmlFoldingSe
public XmlCodeFoldingOptionsProvider() {
super(XmlFoldingSettings.getInstance().getState());
XmlFoldingSettings settings = XmlFoldingSettings.getInstance();
checkBox(ApplicationBundle.message("checkbox.collapse.xml.tags"), settings::isCollapseXmlTags, settings::setCollapseXmlTags);
checkBox(ApplicationBundle.message("checkbox.collapse.html.style.attribute"),settings::isCollapseHtmlStyleAttribute, settings::setCollapseHtmlStyleAttribute);
checkBox(ApplicationBundle.message("checkbox.collapse.entities"),settings::isCollapseEntities, settings::setCollapseEntities);
checkBox(ApplicationBundle.message("checkbox.collapse.data.uri"),settings::isCollapseDataUri, settings::setCollapseDataUri);
checkBox(ApplicationBundle.message("checkbox.collapse.xml.tags"), settings::isCollapseXmlTags, value->settings.getState().COLLAPSE_XML_TAGS=value);
checkBox(ApplicationBundle.message("checkbox.collapse.html.style.attribute"),settings::isCollapseHtmlStyleAttribute, value->settings.getState().COLLAPSE_HTML_STYLE_ATTRIBUTE=value);
checkBox(ApplicationBundle.message("checkbox.collapse.entities"),settings::isCollapseEntities, value->settings.getState().COLLAPSE_ENTITIES=value);
checkBox(ApplicationBundle.message("checkbox.collapse.data.uri"),settings::isCollapseDataUri, value->settings.getState().COLLAPSE_DATA_URI=value);
}
}

View File

@@ -83,7 +83,7 @@ public class RncFoldingBuilder implements FoldingBuilder {
@Override
public boolean isCollapsedByDefault(@NotNull ASTNode node) {
return isCommentLike(node.getElementType()) && CodeFoldingSettings.getInstance().isCollapseDocComments();
return isCommentLike(node.getElementType()) && CodeFoldingSettings.getInstance().COLLAPSE_DOC_COMMENTS;
}
private static void process(@Nullable ASTNode node, Document document, ArrayList<FoldingDescriptor> regions) {

View File

@@ -15,19 +15,9 @@
*/
package com.intellij.lang;
import com.intellij.util.BooleanTrackableProperty;
public interface XmlCodeFoldingSettings {
boolean isCollapseXmlTags();
void setCollapseXmlTags(boolean value);
BooleanTrackableProperty getCollapseXmlTagsProperty();
boolean isCollapseHtmlStyleAttribute();
void setCollapseHtmlStyleAttribute(boolean value);
BooleanTrackableProperty getCollapseHtmlStyleAttributeProperty();
boolean isCollapseEntities();
void setCollapseEntities(boolean value);
BooleanTrackableProperty getCollapseEntitiesProperty();
boolean isCollapseDataUri();
void setCollapseDataUri(boolean value);
BooleanTrackableProperty getCollapseDataUriProperty();
}

View File

@@ -20,9 +20,7 @@ import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.util.BooleanTrackableProperty;
import com.intellij.util.xmlb.XmlSerializerUtil;
import com.intellij.util.xmlb.annotations.OptionTag;
import org.jetbrains.annotations.NotNull;
@State(name = "XmlFoldingSettings", storages = @Storage("editor.codeinsight.xml"))
@@ -37,68 +35,28 @@ public class XmlFoldingSettings implements XmlCodeFoldingSettings, PersistentSta
// todo: remove after 2017.1 release
CssFoldingSettings cssFoldingSettings = CssFoldingSettings.getInstance();
if (cssFoldingSettings != null) {
myState.myCollapseDataUri.setValue(cssFoldingSettings.isCollapseDataUri());
myState.COLLAPSE_DATA_URI = cssFoldingSettings.isCollapseDataUri();
}
}
@Override
public boolean isCollapseXmlTags() {
return myState.isCollapseXmlTags();
}
@Override
public void setCollapseXmlTags(boolean value) {
myState.myCollapseXmlTags.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseXmlTagsProperty() {
return myState.myCollapseXmlTags;
return myState.COLLAPSE_XML_TAGS;
}
@Override
public boolean isCollapseHtmlStyleAttribute() {
return myState.isCollapseHtmlStyleAttribute();
}
@Override
public void setCollapseHtmlStyleAttribute(boolean value) {
myState.myCollapseHtmlStyleAttributes.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseHtmlStyleAttributeProperty() {
return myState.myCollapseHtmlStyleAttributes;
return myState.COLLAPSE_HTML_STYLE_ATTRIBUTE;
}
@Override
public boolean isCollapseEntities() {
return myState.isCollapseEntities();
}
@Override
public void setCollapseEntities(boolean value) {
myState.myCollapseEntities.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseEntitiesProperty() {
return myState.myCollapseEntities;
return myState.COLLAPSE_ENTITIES;
}
@Override
public boolean isCollapseDataUri() {
return myState.isCollapseDataUri();
}
@Override
public void setCollapseDataUri(boolean value) {
myState.myCollapseDataUri.setValue(value);
}
@Override
public BooleanTrackableProperty getCollapseDataUriProperty() {
return myState.myCollapseDataUri;
return myState.COLLAPSE_DATA_URI;
}
@Override
@@ -113,29 +71,9 @@ public class XmlFoldingSettings implements XmlCodeFoldingSettings, PersistentSta
}
public static final class State {
private BooleanTrackableProperty myCollapseXmlTags = new BooleanTrackableProperty();
private BooleanTrackableProperty myCollapseHtmlStyleAttributes = new BooleanTrackableProperty(true);
private BooleanTrackableProperty myCollapseEntities = new BooleanTrackableProperty(true);
private BooleanTrackableProperty myCollapseDataUri = new BooleanTrackableProperty(true);
@OptionTag("COLLAPSE_XML_TAGS")
public boolean isCollapseXmlTags() {
return myCollapseXmlTags.getValue();
}
@OptionTag("COLLAPSE_HTML_STYLE_ATTRIBUTE")
public boolean isCollapseHtmlStyleAttribute() {
return myCollapseHtmlStyleAttributes.getValue();
}
@OptionTag("COLLAPSE_ENTITIES")
public boolean isCollapseEntities() {
return myCollapseEntities.getValue();
}
@OptionTag("COLLAPSE_DATA_URI")
public boolean isCollapseDataUri() {
return myCollapseDataUri.getValue();
}
public boolean COLLAPSE_XML_TAGS;
public boolean COLLAPSE_HTML_STYLE_ATTRIBUTE = true;
public boolean COLLAPSE_ENTITIES = true;
public boolean COLLAPSE_DATA_URI = true;
}
}

View File

@@ -34,7 +34,6 @@ import com.intellij.psi.impl.source.xml.XmlTokenImpl;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.psi.xml.*;
import com.intellij.util.BooleanTrackableProperty;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.URLUtil;
import com.intellij.xml.util.HtmlUtil;
@@ -213,14 +212,7 @@ public abstract class XmlCodeFoldingBuilder extends CustomFoldingBuilder impleme
final boolean entity = isEntity(elementToFold);
if (startLine < endLine || elementToFold instanceof XmlAttribute || entity) {
if (range.getStartOffset() + MIN_TEXT_RANGE_LENGTH < range.getEndOffset() || entity) {
XmlCodeFoldingSettings settings = getFoldingSettings();
BooleanTrackableProperty dependency =
elementToFold instanceof XmlTag ? settings.getCollapseXmlTagsProperty() :
elementToFold instanceof XmlAttribute ?
(isSrcAttribute((XmlAttribute)elementToFold) ? settings.getCollapseDataUriProperty()
: isStyleAttribute((XmlAttribute)elementToFold) ? settings.getCollapseHtmlStyleAttributeProperty() : null) :
isEntity(elementToFold) ? settings.getCollapseEntitiesProperty() : null;
foldings.add(new FoldingDescriptor(elementToFold.getNode(), range, dependency));
foldings.add(new FoldingDescriptor(elementToFold.getNode(), range));
return true;
}
}
@@ -277,17 +269,16 @@ public abstract class XmlCodeFoldingBuilder extends CustomFoldingBuilder impleme
final PsiElement psi = node.getPsi();
final XmlCodeFoldingSettings foldingSettings = getFoldingSettings();
return (psi instanceof XmlTag && foldingSettings.isCollapseXmlTags())
|| (psi instanceof XmlAttribute && (foldingSettings.isCollapseHtmlStyleAttribute() && isStyleAttribute((XmlAttribute)psi) ||
foldingSettings.isCollapseDataUri() && isSrcAttribute((XmlAttribute)psi)))
|| (psi instanceof XmlAttribute && (foldStyle((XmlAttribute)psi, foldingSettings) || foldSrc((XmlAttribute)psi, foldingSettings)))
|| isEntity(psi) && foldingSettings.isCollapseEntities() && getEntityPlaceholder(psi) != null;
}
private static boolean isSrcAttribute(XmlAttribute psi) {
return "src".equals(psi.getName());
private static boolean foldSrc(XmlAttribute psi, XmlCodeFoldingSettings settings) {
return settings.isCollapseDataUri() && "src".equals(psi.getName());
}
private static boolean isStyleAttribute(XmlAttribute psi) {
return HtmlUtil.STYLE_ATTRIBUTE_NAME.equalsIgnoreCase(psi.getName());
private static boolean foldStyle(XmlAttribute psi, XmlCodeFoldingSettings settings) {
return settings.isCollapseHtmlStyleAttribute() && HtmlUtil.STYLE_ATTRIBUTE_NAME.equalsIgnoreCase(psi.getName());
}
protected boolean isEntity(PsiElement psi) {
@@ -297,7 +288,8 @@ public abstract class XmlCodeFoldingBuilder extends CustomFoldingBuilder impleme
private static boolean isAttributeShouldBeFolded(XmlAttribute child) {
return HtmlUtil.isHtmlFile(child.getContainingFile()) &&
(isStyleAttribute(child) || isSrcAttribute(child) && child.getValue() != null && URLUtil.isDataUri(child.getValue()));
(HtmlUtil.STYLE_ATTRIBUTE_NAME.equalsIgnoreCase(child.getName()) ||
"src".equals(child.getName()) && child.getValue() != null && URLUtil.isDataUri(child.getValue()));
}
protected abstract XmlCodeFoldingSettings getFoldingSettings();