From f0175340e72676f99116ec7020e82a3a0c16a1b0 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 19 Nov 2012 20:27:52 +0100 Subject: [PATCH] change variable type should be suggested on calls [roma] --- .../quickfix/VariableTypeFromCallFix.java | 40 +++++++++++-------- .../quickFix/variableType/afterInCall.java | 8 ++++ .../quickFix/variableType/beforeInCall.java | 8 ++++ 3 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/variableType/afterInCall.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/variableType/beforeInCall.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableTypeFromCallFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableTypeFromCallFix.java index cd6946fbcc48..7c51198e9cb8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableTypeFromCallFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableTypeFromCallFix.java @@ -22,6 +22,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -99,24 +100,29 @@ public class VariableTypeFromCallFix implements IntentionAction { if (parameterType.isAssignableFrom(expressionType)) continue; final PsiExpression qualifierExpression = methodCall.getMethodExpression().getQualifierExpression(); - if (!(qualifierExpression instanceof PsiReferenceExpression)) { - continue; - } - final PsiElement resolved = ((PsiReferenceExpression)qualifierExpression).resolve(); - if (resolved instanceof PsiVariable) { - final PsiType varType = ((PsiVariable)resolved).getType(); - final PsiClass varClass = PsiUtil.resolveClassInType(varType); - final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(expression.getProject()).getResolveHelper(); - if (varClass != null) { - final PsiSubstitutor psiSubstitutor = resolveHelper.inferTypeArguments(varClass.getTypeParameters(), - parameters, - expressions, PsiSubstitutor.EMPTY, resolved, - DefaultParameterTypeInferencePolicy.INSTANCE); - final PsiClassType appropriateVarType = JavaPsiFacade.getElementFactory(expression.getProject()).createType(varClass, psiSubstitutor); - if (!varType.equals(appropriateVarType)) { - QuickFixAction.registerQuickFixAction(highlightInfo, new VariableTypeFromCallFix(appropriateVarType, (PsiVariable) resolved)); + if (qualifierExpression instanceof PsiReferenceExpression) { + final PsiElement resolved = ((PsiReferenceExpression)qualifierExpression).resolve(); + if (resolved instanceof PsiVariable) { + final PsiType varType = ((PsiVariable)resolved).getType(); + final PsiClass varClass = PsiUtil.resolveClassInType(varType); + final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(expression.getProject()).getResolveHelper(); + if (varClass != null) { + final PsiSubstitutor psiSubstitutor = resolveHelper.inferTypeArguments(varClass.getTypeParameters(), + parameters, + expressions, PsiSubstitutor.EMPTY, resolved, + DefaultParameterTypeInferencePolicy.INSTANCE); + final PsiClassType appropriateVarType = JavaPsiFacade.getElementFactory(expression.getProject()).createType(varClass, psiSubstitutor); + if (!varType.equals(appropriateVarType)) { + QuickFixAction.registerQuickFixAction(highlightInfo, new VariableTypeFromCallFix(appropriateVarType, (PsiVariable) resolved)); + } + break; } - break; + } + } + if (expression instanceof PsiReferenceExpression) { + final PsiElement resolve = ((PsiReferenceExpression)expression).resolve(); + if (resolve instanceof PsiVariable) { + HighlightUtil.registerChangeVariableTypeFixes((PsiVariable)resolve, parameterType, highlightInfo); } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/variableType/afterInCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/variableType/afterInCall.java new file mode 100644 index 000000000000..35b290412756 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/variableType/afterInCall.java @@ -0,0 +1,8 @@ +// "Change 'i' type to 'java.lang.String'" "true" + +class Ex{ + void foo(String i) { + bar(i); + } + void bar(String s) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/variableType/beforeInCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/variableType/beforeInCall.java new file mode 100644 index 000000000000..92a32c9c2ab3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/variableType/beforeInCall.java @@ -0,0 +1,8 @@ +// "Change 'i' type to 'java.lang.String'" "true" + +class Ex{ + void foo(int i) { + bar(i); + } + void bar(String s) {} +} \ No newline at end of file