lambda folding (IDEA-168014)

This commit is contained in:
Anna.Kozlova
2017-02-15 20:25:07 +01:00
parent 8f948b7dc2
commit df07c18ae0
2 changed files with 37 additions and 1 deletions
@@ -60,7 +60,8 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
if (element instanceof PsiImportList) {
return "...";
}
if (element instanceof PsiMethod || element instanceof PsiClassInitializer || element instanceof PsiClass) {
if (element instanceof PsiMethod || element instanceof PsiClassInitializer || element instanceof PsiClass ||
element instanceof PsiLambdaExpression) {
return "{...}";
}
if (element instanceof PsiDocComment) {
@@ -168,6 +169,13 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
return new TextRange(startOffset, last.getTextRange().getEndOffset());
}
if (element instanceof PsiLambdaExpression) {
PsiElement body = ((PsiLambdaExpression)element).getBody();
if (body instanceof PsiCodeBlock) {
return body.getTextRange();
}
}
return null;
}
@@ -675,6 +683,9 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
else if (element instanceof PsiComment) {
return settings.isCollapseEndOfLineComments();
}
else if (element instanceof PsiLambdaExpression) {
return settings.isCollapseLambdas();
}
else {
LOG.error("Unknown element:" + element);
return false;
@@ -714,6 +725,15 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
super.visitNewExpression(expression);
}
@Override
public void visitLambdaExpression(PsiLambdaExpression expression) {
PsiElement body = expression.getBody();
if (body instanceof PsiCodeBlock) {
addToFold(foldElements, expression, document, true);
}
super.visitLambdaExpression(expression);
}
@Override
public void visitComment(PsiComment comment) {
addCommentFolds(comment, processedComments, foldElements);
@@ -97,6 +97,22 @@ class Test {
assert foldingModel.getCollapsedRegionAtOffset(text.indexOf("MyAction("))?.placeholderText == '() ' + JavaFoldingBuilder.rightArrow + ' { '
}
void "test folding lambda with block body"() {
def text = """\
class Test {
void test() {
Runnable action = () -> {
System.out.println();
};
}
}
"""
configure text
def foldingModel = myFixture.editor.foldingModel as FoldingModelImpl
assert foldingModel.getCollapsedRegionAtOffset(text.indexOf("System.out.println"))?.placeholderText == '{...}'
}
private def configure(String text) {
myFixture.configureByText("a.java", text)
CodeFoldingManagerImpl.getInstance(getProject()).buildInitialFoldings(myFixture.editor)