don't remove unresolved imports on renaming groovy class 94.514
authorpeter <peter.gromov@jetbrains.com>
Mon, 8 Mar 2010 23:02:51 +0000 (23:02 +0000)
committerpeter <peter.gromov@jetbrains.com>
Mon, 8 Mar 2010 23:02:51 +0000 (23:02 +0000)
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyImportOptimizer.java
plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyImportOptimizerRefactoringHelper.java
plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy

index 43cf45ff93a5a1dbc2ee2984f59007ac87b93070..3870bbd94cc109625853706c7c652e3bf0052ba6 100644 (file)
@@ -57,7 +57,11 @@ public class GroovyImportOptimizer implements ImportOptimizer {
 
   @NotNull
   public Runnable processFile(PsiFile file) {
-    return new MyProcessor(file);
+    return new MyProcessor((GroovyFile)file, false);
+  }
+
+  public void removeUnusedImports(GroovyFile file) {
+    new MyProcessor(file, true).run();
   }
 
   public boolean supports(PsiFile file) {
@@ -66,9 +70,11 @@ public class GroovyImportOptimizer implements ImportOptimizer {
 
   private class MyProcessor implements Runnable {
     private final GroovyFile myFile;
+    private final boolean myRemoveUnusedOnly;
 
-    public MyProcessor(PsiFile file) {
-      myFile = (GroovyFile) file;
+    private MyProcessor(GroovyFile file, boolean removeUnusedOnly) {
+      myFile = file;
+      myRemoveUnusedOnly = removeUnusedOnly;
     }
 
     public void run() {
@@ -150,8 +156,21 @@ public class GroovyImportOptimizer implements ImportOptimizer {
       });
 
 
-      // remove ALL imports from file
-      final GrImportStatement[] oldImports = myFile.getImportStatements();
+      final List<GrImportStatement> oldImports = new ArrayList<GrImportStatement>();
+      for (GrImportStatement statement : myFile.getImportStatements()) {
+        final GrCodeReferenceElement reference = statement.getImportReference();
+        if (reference != null && reference.getCanonicalText() != null) {
+          oldImports.add(statement);
+        }
+      }
+      if (myRemoveUnusedOnly) {
+        for (GrImportStatement oldImport : oldImports) {
+          if (!usedImports.contains(oldImport)) {
+            myFile.removeImport(oldImport);
+          }
+        }
+        return;
+      }
 
       // Getting aliased imports
       GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(myFile.getProject());
@@ -174,11 +193,6 @@ public class GroovyImportOptimizer implements ImportOptimizer {
       myFile.removeImport(myFile.addImport(factory.createImportStatementFromText("import xxxx"))); //to remove trailing whitespaces
 
       for (GrImportStatement importStatement : oldImports) {
-        final GrCodeReferenceElement reference = importStatement.getImportReference();
-        if (reference == null || reference.getCanonicalText() == null) {
-          continue;
-        }
-
         myFile.removeImport(importStatement);
       }
     }
index d9442591a92eb97b73d536371db08a52477134f6..85be62d35409dd495f4cfd8b7554ae9166e0ab66 100644 (file)
 
 package org.jetbrains.plugins.groovy.refactoring;
 
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
 import com.intellij.refactoring.RefactoringHelper;
 import com.intellij.usageView.UsageInfo;
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.*;
 import com.intellij.util.containers.hash.HashSet;
+import org.jetbrains.plugins.groovy.lang.editor.GroovyImportOptimizer;
 import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
-import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor;
-import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement;
-import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
-import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement;
-import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement;
-import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
-import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult;
 
 import java.util.Set;
-import java.util.Collections;
 
 /**
  * @author Maxim.Medvedev
@@ -52,41 +46,10 @@ public class GroovyImportOptimizerRefactoringHelper implements RefactoringHelper
   }
 
   public void performOperation(Project project, Set<GroovyFile> files) {
+    final GroovyImportOptimizer optimizer = new GroovyImportOptimizer();
     for (GroovyFile file : files) {
-      removeUnusedImports(file);
+      optimizer.removeUnusedImports(file);
     }
   }
 
-  public void removeUnusedImports(GroovyFile file) {
-    final GrImportStatement[] imports = file.getImportStatements();
-    final Set<GrImportStatement> unused = new HashSet<GrImportStatement>(imports.length);
-    Collections.addAll(unused, imports);
-    file.accept(new GroovyRecursiveElementVisitor() {
-      public void visitCodeReferenceElement(GrCodeReferenceElement refElement) {
-        visitRefElement(refElement);
-        super.visitCodeReferenceElement(refElement);
-      }
-
-      public void visitReferenceExpression(GrReferenceExpression referenceExpression) {
-        visitRefElement(referenceExpression);
-        super.visitReferenceExpression(referenceExpression);
-      }
-
-      private void visitRefElement(GrReferenceElement refElement) {
-        final GroovyResolveResult[] resolveResults = refElement.multiResolve(false);
-        for (GroovyResolveResult resolveResult : resolveResults) {
-          final GroovyPsiElement context = resolveResult.getCurrentFileResolveContext();
-          final PsiElement element = resolveResult.getElement();
-          if (element == null) return;
-          if (context instanceof GrImportStatement) {
-            final GrImportStatement importStatement = (GrImportStatement)context;
-            unused.remove(importStatement);
-          }
-        }
-      }
-    });
-    for (GrImportStatement importStatement : unused) {
-      file.removeImport(importStatement);
-    }
-  }
 }
index d6a343d82a241da0f1f2c85be135e2f711edeb4f..bdb2291448865982670ad31c59b014a52330bde9 100644 (file)
@@ -46,6 +46,20 @@ def foo(newName) {
     assertEquals txt, txtFile.text
   }
 
+  public void testPreserveUnknownImports() throws Exception {
+    def someClass = myFixture.addClass("public class SomeClass {}")
+
+    myFixture.configureByText(GroovyFileType.GROOVY_FILE_TYPE, """
+import foo.bar.Zoo
+SomeClass c = new SomeClass()
+""")
+    myFixture.renameElement(someClass, "NewClass")
+    myFixture.checkResult """
+import foo.bar.Zoo
+NewClass c = new NewClass()
+"""
+  }
+
   public void doTest() throws Throwable {
     final String testFile = getTestName(true).replace('$', '/') + ".test";
     final List<String> list = TestUtils.readInput(TestUtils.getAbsoluteTestDataPath() + "groovy/refactoring/rename/" + testFile);