show popup with distinct methods for static import
authorAlexey Kudravtsev <cdr@intellij.com>
Fri, 30 Apr 2010 12:01:06 +0000 (16:01 +0400)
committerAlexey Kudravtsev <cdr@intellij.com>
Wed, 5 May 2010 07:10:15 +0000 (11:10 +0400)
java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java
java/java-impl/src/com/intellij/ide/util/MethodCellRenderer.java

index 15216e0a4ccf6d9e471edd0338583008d901d2f2..9449955e8b86f9a844f2a15e0bc33de033a2ecdd 100644 (file)
@@ -27,6 +27,7 @@ import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.progress.ProgressManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.popup.PopupChooserBuilder;
+import com.intellij.openapi.util.Comparing;
 import com.intellij.psi.*;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.psi.search.PsiShortNamesCache;
@@ -46,6 +47,7 @@ public class StaticImportMethodFix implements IntentionAction {
   private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.quickfix.StaticImportMethodFix");
   private final SmartPsiElementPointer<PsiMethodCallExpression> myMethodCall;
   private List<PsiMethod> candidates;
+  private static final int OPTIONS = PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_CONTAINING_CLASS  | PsiFormatUtil.SHOW_FQ_NAME;
 
   public StaticImportMethodFix(@NotNull PsiMethodCallExpression methodCallExpression) {
     myMethodCall = SmartPointerManager.getInstance(methodCallExpression.getProject()).createSmartPsiElementPointer(methodCallExpression);
@@ -55,8 +57,7 @@ public class StaticImportMethodFix implements IntentionAction {
   public String getText() {
     String text = QuickFixBundle.message("static.import.method.text");
     if (candidates.size() == 1) {
-      final int options = PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_CONTAINING_CLASS  | PsiFormatUtil.SHOW_FQ_NAME;
-      text += " '" + PsiFormatUtil.formatMethod(candidates.get(0), PsiSubstitutor.EMPTY, options, 0)+"'";
+      text += " '" + PsiFormatUtil.formatMethod(candidates.get(0), PsiSubstitutor.EMPTY, OPTIONS, 0)+"'";
     }
     else {
       text += "...";
@@ -110,6 +111,20 @@ public class StaticImportMethodFix implements IntentionAction {
       }
     }
     List<PsiMethod> result = applicableList.isEmpty() ? list : applicableList;
+    for (int i = result.size() - 1; i >= 0; i--) {
+      PsiMethod method = result.get(i);
+      PsiClass containingClass = method.getContainingClass();
+      for (int j = i+1; j<result.size() ;j++) {
+        PsiMethod exMethod = result.get(j);
+        if (!Comparing.strEqual(exMethod.getName(), method.getName())) continue;
+        PsiClass exContainingClass = exMethod.getContainingClass();
+        if (containingClass != null && exContainingClass != null
+            && !Comparing.equal(containingClass.getQualifiedName(), exContainingClass.getQualifiedName())) continue;
+        // same named methods, drop one
+        result.remove(i);
+        break;
+      }
+    }
     Collections.sort(result, new PsiProximityComparator(argumentList));
     return result;
   }
@@ -139,7 +154,6 @@ public class StaticImportMethodFix implements IntentionAction {
             catch (IncorrectOperationException e) {
               LOG.error(e);
             }
-            
           }
         });
 
@@ -150,7 +164,7 @@ public class StaticImportMethodFix implements IntentionAction {
 
   private void chooseAndImport(Editor editor) {
     final JList list = new JList(new Vector<PsiMethod>(candidates));
-    list.setCellRenderer(new MethodCellRenderer(true));
+    list.setCellRenderer(new MethodCellRenderer(true, OPTIONS));
     new PopupChooserBuilder(list).
       setTitle(QuickFixBundle.message("static.import.method.choose.method.to.import")).
       setMovable(true).
index cef9714066d0c8e1db21387269e4b4d2cf431210..ad9f5ffda70eb227f0d398ab1b6d6c679e591417 100644 (file)
@@ -23,16 +23,21 @@ import javax.swing.*;
 public class MethodCellRenderer extends PsiElementListCellRenderer<PsiMethod>{
   private final boolean myShowMethodNames;
   private final PsiClassListCellRenderer myClassListCellRenderer = new PsiClassListCellRenderer();
+  private final int myOptions;
+
   public MethodCellRenderer(boolean showMethodNames) {
+    this(showMethodNames, PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_PARAMETERS);
+  }
+  public MethodCellRenderer(boolean showMethodNames, int options) {
     myShowMethodNames = showMethodNames;
+    myOptions = options;
   }
 
   public String getElementText(PsiMethod element) {
     final PsiNamedElement container = fetchContainer(element);
     String text = container instanceof PsiClass ? myClassListCellRenderer.getElementText((PsiClass)container) : container.getName();
     if (myShowMethodNames) {
-      final int options = PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_PARAMETERS;
-      text += "."+PsiFormatUtil.formatMethod(element, PsiSubstitutor.EMPTY, options, PsiFormatUtil.SHOW_TYPE);
+      text += "."+PsiFormatUtil.formatMethod(element, PsiSubstitutor.EMPTY, myOptions, PsiFormatUtil.SHOW_TYPE);
     }
     return text;
   }
@@ -43,16 +48,11 @@ public class MethodCellRenderer extends PsiElementListCellRenderer<PsiMethod>{
 
   private static PsiNamedElement fetchContainer(PsiMethod element){
     PsiClass aClass = element.getContainingClass();
-    if (aClass == null) {
-      return element.getContainingFile();
-    }
-    else {
-      return aClass;
-    }
+    return aClass == null ? element.getContainingFile() : aClass;
   }
 
   public String getContainerText(final PsiMethod element, final String name) {
-    return myClassListCellRenderer.getContainerTextStatic(element);
+    return PsiClassListCellRenderer.getContainerTextStatic(element);
   }
 
   public int getIconFlags() {