optimize imports for template languages (JSP, JSPX, Facelets)
authorDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Mon, 19 Dec 2011 12:22:15 +0000 (16:22 +0400)
committerDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Mon, 19 Dec 2011 12:26:12 +0000 (16:26 +0400)
platform/lang-api/src/com/intellij/lang/LanguageImportStatements.java
platform/lang-impl/src/com/intellij/codeInsight/actions/OptimizeImportsAction.java
xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnusedNamespaceInspection.java

index 5fe4acefa9ce8dbfc4de54cf7dac1d856d8014b9..cf7ae42ea17a1b1947b76b9a960f23d544a38174 100644 (file)
 package com.intellij.lang;
 
 import com.intellij.psi.PsiFile;
-import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 public class LanguageImportStatements extends LanguageExtension<ImportOptimizer> {
   public static final LanguageImportStatements INSTANCE = new LanguageImportStatements();
@@ -29,9 +33,15 @@ public class LanguageImportStatements extends LanguageExtension<ImportOptimizer>
     super("com.intellij.lang.importOptimizer");
   }
 
-  @Nullable
-  public ImportOptimizer forFile(PsiFile file) {
-    ImportOptimizer optimizer = forLanguage(file.getLanguage());
-    return optimizer != null && optimizer.supports(file) ? optimizer : null;
+  public List<Runnable> forFile(PsiFile file) {
+    List<Runnable> runnables = new ArrayList<Runnable>();
+    Set<ImportOptimizer> optimizers = new HashSet<ImportOptimizer>();
+    for (PsiFile psiFile : file.getViewProvider().getAllFiles()) {
+      ImportOptimizer optimizer = forLanguage(psiFile.getLanguage());
+      if (optimizer != null && optimizer.supports(psiFile) && optimizers.add(optimizer)) {
+        runnables.add(optimizer.processFile(psiFile));
+      }
+    }
+    return runnables;
   }
 }
\ No newline at end of file
index 951dbecd7c3c76704d6a0dd73a207d6da79a579a..416e2e4bc09b57e9f3ce00d3e5f800da3c54e3e7 100644 (file)
@@ -193,6 +193,6 @@ public class OptimizeImportsAction extends AnAction {
   }
 
   private static boolean isOptimizeImportsAvailable(final PsiFile file) {
-    return LanguageImportStatements.INSTANCE.forFile(file) != null;
+    return !LanguageImportStatements.INSTANCE.forFile(file).isEmpty();
   }
 }
index e1acc34b9356f9de963ae4c9a78465f15e97f07b..009a89b175cd5578e081aa7b2600c8318371bd13 100644 (file)
@@ -73,21 +73,21 @@ public class XmlUnusedNamespaceInspection extends XmlSuppressableInspectionTool
           XmlAttributeValue value = attribute.getValueElement();
           assert value != null;
           holder.registerProblem(attribute, "Namespace declaration is never used", ProblemHighlightType.LIKE_UNUSED_SYMBOL,
-                                 new RemoveNamespaceDeclarationFix(declaredPrefix));
+                                 new RemoveNamespaceDeclarationFix(declaredPrefix, false));
 
           XmlTag parent = attribute.getParent();
           if (declaredPrefix.length() == 0) {
             XmlAttribute location = getDefaultLocation(parent);
             if (location != null) {
               holder.registerProblem(location, NAMESPACE_LOCATION_IS_NEVER_USED, ProblemHighlightType.LIKE_UNUSED_SYMBOL,
-                                     new RemoveNamespaceDeclarationFix(declaredPrefix));
+                                     new RemoveNamespaceDeclarationFix(declaredPrefix, true));
             }
           }
           else {
             for (PsiReference reference : getLocationReferences(namespace, parent)) {
               if (!XmlHighlightVisitor.hasBadResolve(reference, false))
               holder.registerProblemForReference(reference, ProblemHighlightType.LIKE_UNUSED_SYMBOL, NAMESPACE_LOCATION_IS_NEVER_USED,
-                                                 new RemoveNamespaceDeclarationFix(declaredPrefix));
+                                                 new RemoveNamespaceDeclarationFix(declaredPrefix, true));
             }
           }
         }
@@ -234,9 +234,11 @@ public class XmlUnusedNamespaceInspection extends XmlSuppressableInspectionTool
     public static final String NAME = "Remove unused namespace declaration";
 
     protected final String myPrefix;
+    private final boolean myLocationFix;
 
-    private RemoveNamespaceDeclarationFix(@Nullable String prefix) {
+    private RemoveNamespaceDeclarationFix(@Nullable String prefix, boolean locationFix) {
       myPrefix = prefix;
+      myLocationFix = locationFix;
     }
 
     @NotNull
@@ -328,7 +330,9 @@ public class XmlUnusedNamespaceInspection extends XmlSuppressableInspectionTool
 
     @Override
     public boolean equals(Object obj) {
-      return obj instanceof RemoveNamespaceDeclarationFix && Comparing.equal(myPrefix, ((RemoveNamespaceDeclarationFix)obj).myPrefix);
+      return obj instanceof RemoveNamespaceDeclarationFix &&
+             Comparing.equal(myPrefix, ((RemoveNamespaceDeclarationFix)obj).myPrefix) &&
+             (myLocationFix || ((RemoveNamespaceDeclarationFix)obj).myLocationFix);
     }
 
     @Override
@@ -342,7 +346,7 @@ public class XmlUnusedNamespaceInspection extends XmlSuppressableInspectionTool
     public static final String NAME = "Remove unused namespace location";
 
     private RemoveNamespaceLocationFix(String namespace) {
-      super(namespace);
+      super(namespace, true);
     }
 
     @NotNull