IDEA-57833 ask for change return type of method or type of variable
authorMaxim Medvedev <maxim.medvedev@jetbrains.com>
Sun, 12 Sep 2010 11:20:00 +0000 (15:20 +0400)
committerMaxim Medvedev <maxim.medvedev@jetbrains.com>
Sun, 12 Sep 2010 11:20:00 +0000 (15:20 +0400)
plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties
plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMapToClassIntention.java
plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertMapToClassTest.java

index bcc08d2ba648c3a365904bd8c3aa6cda156078d3..913911be88ab61f95ed6d3fa9a0edf0628bfaa45 100644 (file)
@@ -95,4 +95,6 @@ create.parameter.for.fields=Add parameter for field...
 closure.used.as.variable=Closure is passed as argument. Refactoring can break semantic.
 
 convert.map.to.class.intention.name = Convert to class
-convert.map.to.class.intention.family.name = Convert Groovy native map to class instances
\ No newline at end of file
+convert.map.to.class.intention.family.name = Convert Groovy native map to class instances
+do.you.want.to.change.method.return.type=Do you want to change return type of ''{0}'' method
+do.you.want.to.change.variable.type=Do you want to change type of ''{0}''
\ No newline at end of file
index 0afe35cfae2a37a11e55c51f133ccd3a553ff3f0..bc723b4445f612348c6f247c81eac6fef9b7d87f 100644 (file)
@@ -17,11 +17,13 @@ package org.jetbrains.plugins.groovy.intentions.conversions;
 
 import com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind;
 import com.intellij.codeInsight.intention.impl.CreateClassDialog;
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.module.ModuleUtil;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiElement;
@@ -33,6 +35,7 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.plugins.groovy.GroovyBundle;
 import org.jetbrains.plugins.groovy.annotator.intentions.CreateClassActionBase;
 import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils;
+import org.jetbrains.plugins.groovy.intentions.GroovyIntentionsBundle;
 import org.jetbrains.plugins.groovy.intentions.base.Intention;
 import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate;
 import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase;
@@ -46,6 +49,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrReturnStatement;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
@@ -62,7 +66,7 @@ public class ConvertMapToClassIntention extends Intention {
   private static Logger LOG = Logger.getInstance("#org.jetbrains.plugins.groovy.intentions.conversions.ConvertMapToClassIntention");
 
   @Override
-  protected void processIntention(@NotNull PsiElement element, Project project, Editor editor) throws IncorrectOperationException {
+  protected void processIntention(@NotNull PsiElement element, final Project project, Editor editor) throws IncorrectOperationException {
     final GrListOrMap map = (GrListOrMap)element;
     final GrNamedArgument[] namedArguments = map.getNamedArguments();
     LOG.assertTrue(map.getInitializers().length == 0);
@@ -85,9 +89,8 @@ public class ConvertMapToClassIntention extends Intention {
     replaceMapWithClass(project, map, replaced);
   }
 
-  public static void replaceMapWithClass(Project project, GrListOrMap map, PsiClass generatedClass) {
+  public static void replaceMapWithClass(Project project, final GrListOrMap map, PsiClass generatedClass) {
     PsiUtil.shortenReferences((GroovyPsiElement)generatedClass);
-    CreateClassActionBase.putCursor(project, generatedClass.getContainingFile(), generatedClass);
 
     final String text = map.getText();
     int begin = 0;
@@ -100,6 +103,8 @@ public class ConvertMapToClassIntention extends Intention {
     checkForVariableDeclaration(replacedNewExpression);
     checkForReturnFromMethod(replacedNewExpression);
     PsiUtil.shortenReferences(replacedNewExpression);
+
+    CreateClassActionBase.putCursor(project, generatedClass.getContainingFile(), generatedClass);
   }
 
   private static void checkForReturnFromMethod(GrExpression replacedNewExpression) {
@@ -107,14 +112,22 @@ public class ConvertMapToClassIntention extends Intention {
     final GrMethod method = PsiTreeUtil.getParentOfType(replacedNewExpression, GrMethod.class, true, GrClosableBlock.class);
     if (method == null) return;
 
-    final List<GrStatement> returns = ControlFlowUtils.collectReturns(method.getBlock());
-    if (returns.size() > 1 || !returns.contains(parent)) return;
+    if (!(parent instanceof GrReturnStatement)) { //check for return expression
+      final List<GrStatement> returns = ControlFlowUtils.collectReturns(method.getBlock());
+      final PsiElement expr = PsiUtil.skipParentheses(replacedNewExpression, true);
+      if (!(returns.contains(expr))) return;
+    }
+    if (!ApplicationManager.getApplication().isUnitTestMode() && Messages.showYesNoDialog(replacedNewExpression.getProject(),
+                                                                                          GroovyIntentionsBundle.message(
+                                                                                            "do.you.want.to.change.method.return.type",
+                                                                                            method.getName()),
+                                                                                          GroovyIntentionsBundle
+                                                                                            .message("convert.map.to.class.intention.name"),
+                                                                                          Messages.getQuestionIcon()) != 0) {
+      return;
+    }
 
-    if (method.getReturnTypeElementGroovy() == null) return;
-    final PsiType returnType = method.getReturnType();
     final PsiType type = replacedNewExpression.getType();
-    if (TypesUtil.isAssignable(returnType, type, replacedNewExpression.getManager(), replacedNewExpression.getResolveScope())) return;
-
     method.setReturnType(type);
   }
 
@@ -125,7 +138,16 @@ public class ConvertMapToClassIntention extends Intention {
         !(parent instanceof GrParameter) &&
         ((GrVariable)parent).getDeclaredType() != null &&
         replacedNewExpression.getType() != null) {
-      ((GrVariable)parent).setType(replacedNewExpression.getType());
+      if (ApplicationManager.getApplication().isUnitTestMode() || Messages.showYesNoDialog(replacedNewExpression.getProject(),
+                                                                                            GroovyIntentionsBundle.message(
+                                                                                              "do.you.want.to.change.variable.type",
+                                                                                              ((GrVariable)parent).getName()),
+                                                                                            GroovyIntentionsBundle.message(
+                                                                                              "convert.map.to.class.intention.name"),
+                                                                                            Messages.getQuestionIcon()) ==
+                                                                   0) {
+        ((GrVariable)parent).setType(replacedNewExpression.getType());
+      }
     }
   }
 
index e262d1532df451c24d78b47a6104ef5e74a7a359..9fdeb1f08cff66294420ea4a09347ee2452cf6ea 100644 (file)
@@ -51,7 +51,7 @@ public class ConvertMapToClassTest extends GrIntentionTestCase {
     doTest();
   }
 
-  public void testNotChangeReturnType() {
+  public void _testNotChangeReturnType() {
     doTest();
   }