From 8d2b706f599aacb48eeee3bcf0a73d218943cdbe Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 16 May 2014 19:47:18 +0400 Subject: [PATCH] change method return type on call site (IDEA-125166) --- .../impl/analysis/GenericsHighlightUtil.java | 4 ++-- .../daemon/impl/analysis/HighlightUtil.java | 20 ++++++++++++++----- .../methodReturn/afterAssignment.java | 11 ++++++++++ .../quickFix/methodReturn/afterVariable.java | 10 ++++++++++ .../methodReturn/beforeAssignment.java | 10 ++++++++++ .../quickFix/methodReturn/beforeVariable.java | 9 +++++++++ 6 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterAssignment.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterVariable.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeAssignment.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeVariable.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index c388cb9b9a10..af640803b771 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -688,7 +688,7 @@ public class GenericsHighlightUtil { final PsiType parameterType = parameter.getType(); HighlightInfo highlightInfo = HighlightUtil.checkAssignability(parameterType, itemType, null, new TextRange(start, end), 0); if (highlightInfo != null) { - HighlightUtil.registerChangeVariableTypeFixes(parameter, itemType, highlightInfo); + HighlightUtil.registerChangeVariableTypeFixes(parameter, itemType, expression, highlightInfo); } return highlightInfo; } @@ -1297,7 +1297,7 @@ public class GenericsHighlightUtil { } PsiSubstitutor substitutor = factory.createSubstitutor(map); PsiType suggestedType = factory.createType(aClass, substitutor); - HighlightUtil.registerChangeVariableTypeFixes(variable, suggestedType, highlightInfo); + HighlightUtil.registerChangeVariableTypeFixes(variable, suggestedType, variable.getInitializer(), highlightInfo); } } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index db56e8be3dc8..51cc8f00ad81 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -434,22 +434,23 @@ public class HighlightUtil extends HighlightUtilBase { if (highlightInfo == null) { return null; } - registerChangeVariableTypeFixes(lExpr, rType, highlightInfo); + registerChangeVariableTypeFixes(lExpr, rType, rExpr, highlightInfo); if (lType != null) { - registerChangeVariableTypeFixes(rExpr, lType, highlightInfo); + registerChangeVariableTypeFixes(rExpr, lType, lExpr, highlightInfo); } return highlightInfo; } private static void registerChangeVariableTypeFixes(@NotNull PsiExpression expression, @NotNull PsiType type, + @Nullable PsiExpression lExpr, @Nullable HighlightInfo highlightInfo) { if (highlightInfo == null || !(expression instanceof PsiReferenceExpression)) return; final PsiElement element = ((PsiReferenceExpression)expression).resolve(); if (element == null || !(element instanceof PsiVariable)) return; - registerChangeVariableTypeFixes((PsiVariable)element, type, highlightInfo); + registerChangeVariableTypeFixes((PsiVariable)element, type, lExpr, highlightInfo); } private static boolean isCastIntentionApplicable(@NotNull PsiExpression expression, @Nullable PsiType toType) { @@ -478,7 +479,7 @@ public class HighlightUtil extends HighlightUtilBase { int end = variable.getTextRange().getEndOffset(); HighlightInfo highlightInfo = checkAssignability(lType, rType, initializer, new TextRange(start, end), 0); if (highlightInfo != null) { - registerChangeVariableTypeFixes(variable, rType, highlightInfo); + registerChangeVariableTypeFixes(variable, rType, variable.getInitializer(), highlightInfo); } return highlightInfo; } @@ -2660,10 +2661,19 @@ public class HighlightUtil extends HighlightUtilBase { return info; } - public static void registerChangeVariableTypeFixes(@NotNull PsiVariable parameter, PsiType itemType, @NotNull HighlightInfo highlightInfo) { + public static void registerChangeVariableTypeFixes(@NotNull PsiVariable parameter, + PsiType itemType, + @Nullable PsiExpression expr, + @NotNull HighlightInfo highlightInfo) { for (IntentionAction action : getChangeVariableTypeFixes(parameter, itemType)) { QuickFixAction.registerQuickFixAction(highlightInfo, action); } + if (expr instanceof PsiMethodCallExpression) { + final PsiMethod method = ((PsiMethodCallExpression)expr).resolveMethod(); + if (method != null) { + QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createMethodReturnFix(method, parameter.getType(), true)); + } + } } @NotNull diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterAssignment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterAssignment.java new file mode 100644 index 000000000000..823a2d12b17a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterAssignment.java @@ -0,0 +1,11 @@ +// "Make 'bar' return 'java.lang.String'" "true" +public class Foo { + void foo() { + String s; + s = bar(); + } + + String bar() { + return null; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterVariable.java new file mode 100644 index 000000000000..6d811bf5c1eb --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterVariable.java @@ -0,0 +1,10 @@ +// "Make 'bar' return 'java.lang.String'" "true" +public class Foo { + void foo() { + String s = bar(); + } + + String bar() { + return null; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeAssignment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeAssignment.java new file mode 100644 index 000000000000..6b8476bdc475 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeAssignment.java @@ -0,0 +1,10 @@ +// "Make 'bar' return 'java.lang.String'" "true" +public class Foo { + void foo() { + String s; + s = bar(); + } + + void bar() { + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeVariable.java new file mode 100644 index 000000000000..f651a2f680a9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeVariable.java @@ -0,0 +1,9 @@ +// "Make 'bar' return 'java.lang.String'" "true" +public class Foo { + void foo() { + String s = bar(); + } + + void bar() { + } +}