From 232b29888ae31eed162dca2a542f0dc5767e9d19 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 23 Mar 2018 15:03:27 +0100 Subject: [PATCH] add type cast intention for poly expressions (IDEA-188731) inference errors on poly expressions are not propagated to the expected type (variable declaration, return statement, etc) like for standalone expressions: dedicated intentions should be registered --- .../daemon/impl/analysis/HighlightMethodUtil.java | 8 ++++++++ .../afterReturnTypeCaseInferenceError.java | 13 +++++++++++++ .../beforeReturnTypeCaseInferenceError.java | 13 +++++++++++++ ...turnTypeCaseInferenceErrorIncompatibleTypes.java | 13 +++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterReturnTypeCaseInferenceError.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeReturnTypeCaseInferenceError.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeReturnTypeCaseInferenceErrorIncompatibleTypes.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index 4d1156a80361..e5ad6746aa3d 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -889,6 +889,14 @@ public class HighlightMethodUtil { QuickFixAction.registerQuickFixAction(highlightInfo, fixRange, QUICK_FIX_FACTORY.createSurroundWithArrayFix(methodCall, null)); QualifyThisArgumentFix.registerQuickFixAction(methodCandidates, methodCall, highlightInfo, fixRange); + PsiType expectedTypeByParent = PsiTypesUtil.getExpectedTypeByParent(methodCall); + if (expectedTypeByParent != null) { + PsiType methodCallType = methodCall.getType(); + if (methodCallType != null && TypeConversionUtil.areTypesConvertible(methodCallType, expectedTypeByParent)) { + QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createAddTypeCastFix(expectedTypeByParent, methodCall)); + } + } + CandidateInfo[] candidates = resolveHelper.getReferencedMethodCandidates(methodCall, true); ChangeStringLiteralToCharInMethodCallFix.registerFixes(candidates, methodCall, highlightInfo); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterReturnTypeCaseInferenceError.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterReturnTypeCaseInferenceError.java new file mode 100644 index 000000000000..b6d26363f10d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterReturnTypeCaseInferenceError.java @@ -0,0 +1,13 @@ +// "Cast to 'B'" "true" +import java.util.*; + +class A { } + +class B extends A { + public B getStrings() { + return (B) getFirstItem(new ArrayList()); + } + + public static T getFirstItem(Set items) { return null; } + public static T getFirstItem(List items) { return null; } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeReturnTypeCaseInferenceError.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeReturnTypeCaseInferenceError.java new file mode 100644 index 000000000000..ff6458248d1a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeReturnTypeCaseInferenceError.java @@ -0,0 +1,13 @@ +// "Cast to 'B'" "true" +import java.util.*; + +class A { } + +class B extends A { + public B getStrings() { + return getFirstItem(new ArrayList()); + } + + public static T getFirstItem(Set items) { return null; } + public static T getFirstItem(List items) { return null; } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeReturnTypeCaseInferenceErrorIncompatibleTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeReturnTypeCaseInferenceErrorIncompatibleTypes.java new file mode 100644 index 000000000000..d2661b611b93 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeReturnTypeCaseInferenceErrorIncompatibleTypes.java @@ -0,0 +1,13 @@ +// "Cast to 'B'" "false" +import java.util.*; + +class A { } + +class B extends A { + public B getStrings() { + return getFirstItem(new ArrayList()); + } + + public static T getFirstItem(Set items) { return null; } + public static ArrayList getFirstItem(List items) { return null; } +} \ No newline at end of file