From ea9d514c27e99d6f023f2c6241caa01154d80913 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 24 May 2012 18:03:24 +0200 Subject: [PATCH] don't fold lambda if there's an unresolved type in the throws list --- .../folding/impl/JavaFoldingBuilder.java | 19 ++++++++++++++++--- .../folding/JavaFoldingTest.groovy | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) 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 37dbac58ba57..d5adb200b0cf 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 @@ -564,7 +564,7 @@ public class JavaFoldingBuilder extends CustomFoldingBuilder implements DumbAwar } } - private static boolean hasOnlyOneMethod(@NotNull PsiAnonymousClass anonymousClass) { + private static boolean hasOnlyOneMethod(@NotNull PsiAnonymousClass anonymousClass, boolean checkResolve) { if (anonymousClass.getFields().length != 0) { return false; } @@ -575,7 +575,20 @@ public class JavaFoldingBuilder extends CustomFoldingBuilder implements DumbAwar return false; } - return anonymousClass.getMethods().length == 1; + if (anonymousClass.getMethods().length != 1) { + return false; + } + + if (checkResolve) { + PsiReferenceList throwsList = anonymousClass.getMethods()[0].getThrowsList(); + for (PsiClassType type : throwsList.getReferencedTypes()) { + if (type.resolve() == null) { + return false; + } + } + } + + return true; } private boolean addClosureFolding(final PsiClass aClass, final Document document, final List foldElements, @@ -593,7 +606,7 @@ public class JavaFoldingBuilder extends CustomFoldingBuilder implements DumbAwar final PsiExpressionList argumentList = expression.getArgumentList(); if (argumentList != null && argumentList.getExpressions().length == 0) { final PsiMethod[] methods = anonymousClass.getMethods(); - if (hasOnlyOneMethod(anonymousClass) && (quick || seemsLikeLambda(anonymousClass.getBaseClassType().resolve()))) { + if (hasOnlyOneMethod(anonymousClass, !quick) && (quick || seemsLikeLambda(anonymousClass.getBaseClassType().resolve()))) { final PsiMethod method = methods[0]; final PsiCodeBlock body = method.getBody(); if (body != null) { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy index fe161e00f75c..341073fbf254 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy @@ -195,6 +195,23 @@ class Test { assert closureStartFold } + public void "test no closure folding when the method throws an unresolved exception"() { + def text = """\ +class Test { + void test() { new Runnable() { + public void run() throws Asadfsdafdfasd { + System.out.println(); + } + }; + } +} +""" + + configure text + def foldingModel = myFixture.editor.foldingModel as FoldingModelImpl + assert !foldingModel.getCollapsedRegionAtOffset(text.indexOf("Runnable")) + } + public void testFindInFolding() { def text = """\ class Test {