do not crash on invalid lambdas/method refs (IDEA-130240)

This commit is contained in:
Anna Kozlova
2014-09-29 11:42:25 +02:00
parent eb2a575571
commit 7be506a901
3 changed files with 31 additions and 7 deletions

View File

@@ -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;

View File

@@ -0,0 +1,5 @@
class Sample {
void foo() {
System.out.println("hello <caret>world");
}
}

View File

@@ -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();