mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-05-06 05:10:22 +07:00
do not crash on invalid lambdas/method refs (IDEA-130240)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class Sample {
|
||||
void foo() {
|
||||
System.out.println("hello <caret>world");
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user