diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java index b957e79c670f..5bd62c2e9faa 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java @@ -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); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFolding8Test.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFolding8Test.groovy index 132e836a7bb3..ba9494b5d55d 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFolding8Test.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFolding8Test.groovy @@ -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)