diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapWithAdapterMethodCallFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapWithAdapterMethodCallFix.java index d201adb66a02..f4cbb518aea2 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapWithAdapterMethodCallFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapWithAdapterMethodCallFix.java @@ -26,7 +26,9 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.infos.CandidateInfo; import com.intellij.psi.util.InheritanceUtil; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.ObjectUtils; import one.util.streamex.StreamEx; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -62,12 +64,20 @@ public class WrapWithAdapterMethodCallFix extends LocalQuickFixAndIntentionActio return false; } PsiType variableType = GenericsUtil.getVariableTypeByExpressionType(inType); - String typeText = variableType.getCanonicalText(); - if(!variableType.equalsToText(typeText)) { - // Probably some incorrect type like PsiLambdaParameterType + if(variableType instanceof PsiLambdaExpressionType || variableType instanceof PsiMethodReferenceType + || variableType instanceof PsiLambdaParameterType) { return false; } - PsiType resultType = createReplacement(context, "((" + typeText + ")null)").getType(); + + String typeText = variableType.getCanonicalText(); + PsiExpression replacement = createReplacement(context, "((" + typeText + ")null)"); + PsiDeclarationStatement declaration = + JavaPsiFacade.getElementFactory(context.getProject()).createVariableDeclarationStatement("x", outType, replacement, context); + PsiVariable var = ObjectUtils.tryCast(ArrayUtil.getFirstElement(declaration.getDeclaredElements()), PsiVariable.class); + if (var == null) return false; + PsiExpression initializer = var.getInitializer(); + if (initializer == null) return false; + PsiType resultType = initializer.getType(); return resultType != null && outType.isAssignableFrom(resultType); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/afterListAnonymousClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/afterListAnonymousClass.java new file mode 100644 index 000000000000..63174b3e3dfd --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/afterListAnonymousClass.java @@ -0,0 +1,11 @@ +// "Wrap using 'Collections.singletonList()'" "true" +import java.util.*; + +class Test { + + void m() { + List list = Collections.singletonList(new Object() { + }); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/afterListCovariant.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/afterListCovariant.java new file mode 100644 index 000000000000..4ddb5735266f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/afterListCovariant.java @@ -0,0 +1,10 @@ +// "Wrap using 'Collections.singletonList()'" "true" +import java.util.*; + +class Test { + + void m(String s) { + List list = Collections.singletonList(s); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListAnonymousClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListAnonymousClass.java new file mode 100644 index 000000000000..3bcfd7f5b312 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListAnonymousClass.java @@ -0,0 +1,10 @@ +// "Wrap using 'Collections.singletonList()'" "true" +import java.util.*; + +class Test { + + void m() { + List list = new Object() {}; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListContravariant.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListContravariant.java new file mode 100644 index 000000000000..bfdf0b11de30 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListContravariant.java @@ -0,0 +1,10 @@ +// "Wrap using 'Collections.singletonList()'" "false" +import java.util.*; + +class Test { + + void m(CharSequence s) { + List list = s; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListCovariant.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListCovariant.java new file mode 100644 index 000000000000..5b841ea97d2e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapAdapterCall/beforeListCovariant.java @@ -0,0 +1,10 @@ +// "Wrap using 'Collections.singletonList()'" "true" +import java.util.*; + +class Test { + + void m(String s) { + List list = s; + } + +} \ No newline at end of file