This commit is contained in:
Alexey Kudravtsev
2018-05-16 17:15:22 +03:00
parent 46f6b33e98
commit d945f6dde2
2 changed files with 30 additions and 32 deletions
@@ -16,11 +16,13 @@
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;
import com.intellij.openapi.editor.FoldingGroup;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
@@ -30,6 +32,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
@@ -45,12 +48,12 @@ class ClosureFolding {
private final boolean myQuick;
private ClosureFolding(@NotNull PsiAnonymousClass anonymousClass,
@NotNull PsiNewExpression newExpression,
boolean quick,
@Nullable PsiClass baseClass,
@NotNull JavaFoldingBuilderBase builder,
@NotNull PsiMethod method,
@NotNull PsiCodeBlock methodBody) {
@NotNull PsiNewExpression newExpression,
boolean quick,
@Nullable PsiClass baseClass,
@NotNull JavaFoldingBuilderBase builder,
@NotNull PsiMethod method,
@NotNull PsiCodeBlock methodBody) {
myAnonymousClass = anonymousClass;
myNewExpression = newExpression;
myQuick = quick;
@@ -61,7 +64,7 @@ class ClosureFolding {
}
@Nullable
List<NamedFoldingDescriptor> process(Document document) {
List<NamedFoldingDescriptor> process(@NotNull Document document) {
PsiJavaToken lbrace = methodBody.getLBrace();
PsiJavaToken rbrace = methodBody.getRBrace();
PsiElement classRBrace = myAnonymousClass.getRBrace();
@@ -82,15 +85,15 @@ class ClosureFolding {
return createDescriptors(classRBrace, rangeStart, rangeEnd, header, "}");
}
private static int trimStartSpaces(CharSequence seq, int rangeStart) {
private static int trimStartSpaces(@NotNull CharSequence seq, int rangeStart) {
return CharArrayUtil.shiftForward(seq, rangeStart, " \n\t");
}
private static int trimTailSpaces(CharSequence seq, int rangeEnd) {
private static int trimTailSpaces(@NotNull CharSequence seq, int rangeEnd) {
return CharArrayUtil.shiftBackward(seq, rangeEnd - 1, " \n\t") + 1;
}
private static int getContentRangeEnd(Document document, PsiJavaToken rbrace, PsiElement classRBrace) {
private static int getContentRangeEnd(@NotNull Document document, @NotNull PsiJavaToken rbrace, @NotNull PsiElement classRBrace) {
CharSequence seq = document.getCharsSequence();
int rangeEnd = rbrace.getTextRange().getStartOffset();
@@ -104,7 +107,7 @@ class ClosureFolding {
return rangeEnd;
}
private boolean showSingleLineFolding(Document document, String contents, String header) {
private boolean showSingleLineFolding(@NotNull Document document, @NotNull String contents, @NotNull String header) {
return contents.indexOf('\n') < 0 &&
myBuilder.fitsRightMargin(myAnonymousClass, document, getClosureStartOffset(), getClosureEndOffset(), header.length() + contents.length() + 5);
}
@@ -118,24 +121,25 @@ class ClosureFolding {
}
@Nullable
private List<NamedFoldingDescriptor> createDescriptors(PsiElement classRBrace,
private List<NamedFoldingDescriptor> createDescriptors(@NotNull PsiElement classRBrace,
int rangeStart,
int rangeEnd,
String header,
String footer) {
@NotNull String header,
@NotNull String footer) {
if (rangeStart >= rangeEnd) return null;
FoldingGroup group = FoldingGroup.newGroup("lambda");
List<NamedFoldingDescriptor> foldElements = new ArrayList<>();
foldElements.add(new NamedFoldingDescriptor(myNewExpression, getClosureStartOffset(), rangeStart, group, header));
foldElements.add(new NamedFoldingDescriptor(myNewExpression.getNode(), new TextRange(getClosureStartOffset(), rangeStart), group, header, JavaCodeFoldingSettings.getInstance().isCollapseLambdas(), Collections
.emptySet()));
if (rangeEnd + 1 < getClosureEndOffset()) {
foldElements.add(new NamedFoldingDescriptor(classRBrace, rangeEnd, getClosureEndOffset(), group, footer));
foldElements.add(new NamedFoldingDescriptor(classRBrace.getNode(), new TextRange(rangeEnd, getClosureEndOffset()), group, footer, JavaCodeFoldingSettings.getInstance().isCollapseLambdas(), Collections.emptySet()));
}
return foldElements;
}
@Nullable
private static String getClosureContents(int rangeStart, int rangeEnd, CharSequence seq) {
private static String getClosureContents(int rangeStart, int rangeEnd, @NotNull CharSequence seq) {
int firstLineStart = CharArrayUtil.shiftForward(seq, rangeStart, " \t");
if (firstLineStart < seq.length() - 1 && seq.charAt(firstLineStart) == '\n') firstLineStart++;
@@ -145,6 +149,7 @@ class ClosureFolding {
return seq.subSequence(firstLineStart, lastLineEnd).toString();
}
@NotNull
private String getFoldingHeader() {
String methodName = shouldShowMethodName() ? myMethod.getName() : "";
String type = myQuick ? "" : getOptionalLambdaType();
@@ -153,7 +158,7 @@ class ClosureFolding {
}
@Nullable
static ClosureFolding prepare(PsiAnonymousClass anonymousClass, boolean quick, JavaFoldingBuilderBase builder) {
static ClosureFolding prepare(@NotNull PsiAnonymousClass anonymousClass, boolean quick, @NotNull JavaFoldingBuilderBase builder) {
PsiElement parent = anonymousClass.getParent();
if (parent instanceof PsiNewExpression && hasNoArguments((PsiNewExpression)parent)) {
PsiClass baseClass = quick ? null : anonymousClass.getBaseClassType().resolve();
@@ -168,20 +173,16 @@ class ClosureFolding {
return null;
}
private static boolean hasNoArguments(PsiNewExpression expression) {
private static boolean hasNoArguments(@NotNull PsiNewExpression expression) {
PsiExpressionList argumentList = expression.getArgumentList();
return argumentList != null && argumentList.isEmpty();
}
private static boolean hasOnlyOneLambdaMethod(@NotNull PsiAnonymousClass anonymousClass, boolean checkResolve) {
PsiField[] fields = anonymousClass.getFields();
if (fields.length != 0) {
if (fields.length == 1 && HighlightUtilBase.SERIAL_VERSION_UID_FIELD_NAME.equals(fields[0].getName()) &&
fields[0].hasModifierProperty(PsiModifier.STATIC)) {
//ok
} else {
return false;
}
if (fields.length != 0 && (fields.length != 1 || !HighlightUtilBase.SERIAL_VERSION_UID_FIELD_NAME.equals(fields[0].getName()) ||
!fields[0].hasModifierProperty(PsiModifier.STATIC))) {
return false;
}
if (anonymousClass.getInitializers().length != 0 ||
anonymousClass.getInnerClasses().length != 0 ||
@@ -208,13 +209,10 @@ class ClosureFolding {
static boolean seemsLikeLambda(@Nullable PsiClass baseClass, @NotNull PsiElement context) {
if (baseClass == null || !PsiUtil.hasDefaultConstructor(baseClass, true)) return false;
if (PsiUtil.isLanguageLevel8OrHigher(context) && LambdaUtil.isFunctionalClass(baseClass)) {
return false;
}
return true;
return !PsiUtil.isLanguageLevel8OrHigher(context) || !LambdaUtil.isFunctionalClass(baseClass);
}
@NotNull
private String getOptionalLambdaType() {
if (myBuilder.shouldShowExplicitLambdaType(myAnonymousClass, myNewExpression)) {
String baseClassName = ObjectUtils.assertNotNull(myAnonymousClass.getBaseClassType().resolve()).getName();
@@ -241,5 +239,4 @@ class ClosureFolding {
return true;
}
}
}
@@ -97,6 +97,7 @@ public class XsltStuffProvider implements UsageGroupingRuleProvider {
return "Template (" + sb.toString() + ")";
}
@Override
@Nullable
public FileStatus getFileStatus() {
return null;