From 7be506a901bc84b073ecc22ff4d1a08810404e03 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 29 Sep 2014 11:42:25 +0200 Subject: [PATCH] do not crash on invalid lambdas/method refs (IDEA-130240) --- .../ExtractLightMethodObjectHandler.java | 15 +++++++++++++-- .../HangingFunctionalExpressions.java | 5 +++++ .../ExtractMethodObject4DebuggerTest.java | 18 +++++++++++++----- 3 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethodObject4Debugger/HangingFunctionalExpressions.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java index bb465b9848bb..0e191f52b876 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java @@ -105,8 +105,11 @@ public class ExtractLightMethodObjectHandler { if (elementsCopy[elementsCopy.length - 1] instanceof PsiExpressionStatement) { final PsiExpression expr = ((PsiExpressionStatement)elementsCopy[elementsCopy.length - 1]).getExpression(); if (!(expr instanceof PsiAssignmentExpression)) { - final PsiType expressionType = expr.getType(); - if (expressionType != null && expressionType != PsiType.VOID) { + PsiType expressionType = GenericsUtil.getVariableTypeByExpressionType(expr.getType()); + if (expressionType instanceof PsiDisjunctionType) { + expressionType = ((PsiDisjunctionType)expressionType).getLeastUpperBound(); + } + if (isValidVariableType(expressionType)) { final String uniqueResultName = JavaCodeStyleManager.getInstance(project).suggestUniqueVariableName("result", elementsCopy[0], true); final String statementText = expressionType.getCanonicalText() + " " + uniqueResultName + " = " + expr.getText() + ";"; elementsCopy[elementsCopy.length - 1] = elementsCopy[elementsCopy.length - 1] @@ -207,6 +210,14 @@ public class ExtractLightMethodObjectHandler { originalAnchor); } + private static boolean isValidVariableType(PsiType type) { + if (type instanceof PsiClassType || + type instanceof PsiArrayType || + type instanceof PsiPrimitiveType && type != PsiType.VOID) { + return true; + } + return false; + } private static class LightExtractMethodObjectDialog implements AbstractExtractDialog { private final ExtractMethodObjectProcessor myProcessor; diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/HangingFunctionalExpressions.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/HangingFunctionalExpressions.java new file mode 100644 index 000000000000..873f2205e1af --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/HangingFunctionalExpressions.java @@ -0,0 +1,5 @@ +class Sample { + void foo() { + System.out.println("hello world"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java index 9321cf9a6695..9a9a176721a2 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java @@ -21,16 +21,15 @@ package com.intellij.refactoring; import com.intellij.JavaTestUtil; -import com.intellij.idea.Bombed; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.psi.*; +import com.intellij.psi.JavaCodeFragment; +import com.intellij.psi.JavaCodeFragmentFactory; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; import com.intellij.refactoring.extractMethodObject.ExtractLightMethodObjectHandler; import com.intellij.testFramework.IdeaTestUtil; import org.jetbrains.annotations.NotNull; -import java.util.Calendar; - public class ExtractMethodObject4DebuggerTest extends LightRefactoringTestCase { @NotNull @Override @@ -172,6 +171,15 @@ public class ExtractMethodObject4DebuggerTest extends LightRefactoringTestCase { " }"); } + public void testHangingFunctionalExpressions() throws Exception { + doTest("() -> {}", "new Test().invoke();", "public class Test {\n" + + " public void invoke() {\n" + + " () -> {\n" + + " };\n" + + " }\n" + + " }"); + } + @Override protected Sdk getProjectJDK() { return IdeaTestUtil.getMockJdk18();