immutable CompositeDocumentationProvider
authorDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Fri, 16 Jul 2010 10:08:51 +0000 (14:08 +0400)
committerDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Mon, 19 Jul 2010 08:17:42 +0000 (12:17 +0400)
platform/lang-api/src/com/intellij/lang/LanguageDocumentation.java
platform/lang-api/src/com/intellij/lang/documentation/CompositeDocumentationProvider.java
platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java

index 6b3c81872974e8fae8881ba52d80f9a58a400630..4430789920670ecc029266a562552042f5fe3dee 100644 (file)
@@ -22,8 +22,6 @@ package com.intellij.lang;
 import com.intellij.lang.documentation.CompositeDocumentationProvider;
 import com.intellij.lang.documentation.DocumentationProvider;
 
-import java.util.List;
-
 public class LanguageDocumentation extends LanguageExtension<DocumentationProvider> {
   public static final LanguageDocumentation INSTANCE = new LanguageDocumentation();
 
@@ -32,11 +30,6 @@ public class LanguageDocumentation extends LanguageExtension<DocumentationProvid
   }
 
   public DocumentationProvider forLanguage(final Language l) {
-    final List<DocumentationProvider> providers = allForLanguage(l);
-    if (providers.size() < 2) {
-      return super.forLanguage(l);
-    }
-
-    return new CompositeDocumentationProvider(providers);
+    return CompositeDocumentationProvider.wrapProviders(allForLanguage(l));
   }
 }
\ No newline at end of file
index 98aa3ac92463f904fbf8215d9c67335c4372b435..0cdf910f30daa9679d4eec3de9d9602defb3e288 100644 (file)
@@ -28,24 +28,25 @@ public class CompositeDocumentationProvider implements DocumentationProvider, Ex
 
   private final List<DocumentationProvider> myProviders;
 
-  public CompositeDocumentationProvider (DocumentationProvider ... documentationProviders) {
-    this(Arrays.asList(documentationProviders));
-  }
-
-  public CompositeDocumentationProvider(Collection<DocumentationProvider> providers) {
-    myProviders = new ArrayList<DocumentationProvider>(providers);
-  }
-
-  public void inject (DocumentationProvider provider) {
-    myProviders.add ( provider );
+  public static DocumentationProvider wrapProviders(Collection<DocumentationProvider> providers) {
+    ArrayList<DocumentationProvider> list = new ArrayList<DocumentationProvider>();
+    for (DocumentationProvider provider : providers) {
+      if (provider instanceof CompositeDocumentationProvider) {
+        list.addAll(((CompositeDocumentationProvider)provider).getProviders());
+      }
+      else if (provider != null) {
+        list.add(provider);
+      }
+    }
+    return list.size() == 1 ? list.get(0) : new CompositeDocumentationProvider(Collections.unmodifiableList(list));
   }
 
-  public void remove (DocumentationProvider provider) {
-    myProviders.remove ( provider );
+  private CompositeDocumentationProvider(List<DocumentationProvider> providers) {
+    myProviders = providers;
   }
 
   public List<DocumentationProvider> getProviders() {
-    return Collections.unmodifiableList(myProviders);
+    return myProviders;
   }
 
   public String getQuickNavigateInfo(PsiElement element) {
index 9f1ddcece42c5e1f6884644f650d9a7bab825256..0f6dcfa194490c5fdb034b324220e5309780a1cf 100644 (file)
@@ -64,7 +64,6 @@ import com.intellij.ui.popup.NotLookupOrSearchCondition;
 import com.intellij.ui.popup.PopupUpdateProcessor;
 import com.intellij.util.Alarm;
 import com.intellij.util.Processor;
-import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.ui.update.Activatable;
 import com.intellij.util.ui.update.UiNotifyConnector;
 import org.jetbrains.annotations.NonNls;
@@ -777,22 +776,16 @@ public class DocumentationManager {
     DocumentationProvider elementProvider =
       element == null || elementLanguage.is(containingFileLanguage) ? null : LanguageDocumentation.INSTANCE.forLanguage(elementLanguage);
 
-    addProviderToResult(result, elementProvider);
-    addProviderToResult(result, originalProvider);
+    result.add(elementProvider);
+    result.add(originalProvider);
 
     if (containingFile != null) {
       final Language baseLanguage = containingFile.getViewProvider().getBaseLanguage();
       if (!baseLanguage.is(containingFileLanguage)) {
-        addProviderToResult(result, LanguageDocumentation.INSTANCE.forLanguage(baseLanguage));
+        result.add(LanguageDocumentation.INSTANCE.forLanguage(baseLanguage));
       }
     }
-    // return extensible documentation provider even if the list is empty
-    return new CompositeDocumentationProvider(result);
-  }
-
-  private static void addProviderToResult(final Set<DocumentationProvider> result, final DocumentationProvider t) {
-    if (t instanceof CompositeDocumentationProvider) result.addAll(((CompositeDocumentationProvider)t).getProviders());
-    else ContainerUtil.addIfNotNull(t, result);
+    return CompositeDocumentationProvider.wrapProviders(result);
   }
 
   @Nullable