EA-65402 - CME: InspectionToolRegistrar.createTools
authorAlexey Kudravtsev <cdr@intellij.com>
Wed, 25 Feb 2015 10:40:48 +0000 (13:40 +0300)
committerAlexey Kudravtsev <cdr@intellij.com>
Wed, 25 Feb 2015 11:42:55 +0000 (14:42 +0300)
platform/analysis-impl/src/com/intellij/codeInspection/ex/InspectionToolRegistrar.java

index 27d9f4fc61865396087e8f61fb5d4e8b4afcfe6d..b41cd7759c9650dabac98a6c783ed5a5ff049171 100644 (file)
@@ -28,6 +28,7 @@ import gnu.trove.THashSet;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
@@ -37,7 +38,7 @@ import java.util.Set;
 public class InspectionToolRegistrar {
   private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.ex.InspectionToolRegistrar");
 
-  private final List<Factory<InspectionToolWrapper>> myInspectionToolFactories = new ArrayList<Factory<InspectionToolWrapper>>();
+  private final List<Factory<InspectionToolWrapper>> myInspectionToolFactories = ContainerUtil.createLockFreeCopyOnWriteList();
 
   private boolean myInspectionComponentsLoaded = false;
 
@@ -47,9 +48,10 @@ public class InspectionToolRegistrar {
       Set<InspectionToolProvider> providers = new THashSet<InspectionToolProvider>();
       ContainerUtil.addAll(providers, ApplicationManager.getApplication().getComponents(InspectionToolProvider.class));
       ContainerUtil.addAll(providers, Extensions.getExtensions(InspectionToolProvider.EXTENSION_POINT_NAME));
-      registerTools(providers.toArray(new InspectionToolProvider[providers.size()]));
+      List<Factory<InspectionToolWrapper>> factories = new ArrayList<Factory<InspectionToolWrapper>>();
+      registerTools(providers, factories);
       for (final LocalInspectionEP ep : Extensions.getExtensions(LocalInspectionEP.LOCAL_INSPECTION)) {
-        myInspectionToolFactories.add(new Factory<InspectionToolWrapper>() {
+        factories.add(new Factory<InspectionToolWrapper>() {
           @Override
           public InspectionToolWrapper create() {
             return new LocalInspectionToolWrapper(ep);
@@ -57,7 +59,7 @@ public class InspectionToolRegistrar {
         });
       }
       for (final InspectionEP ep : Extensions.getExtensions(InspectionEP.GLOBAL_INSPECTION)) {
-        myInspectionToolFactories.add(new Factory<InspectionToolWrapper>() {
+        factories.add(new Factory<InspectionToolWrapper>() {
           @Override
           public InspectionToolWrapper create() {
             return new GlobalInspectionToolWrapper(ep);
@@ -66,7 +68,7 @@ public class InspectionToolRegistrar {
       }
       for (InspectionToolsFactory factory : Extensions.getExtensions(InspectionToolsFactory.EXTENSION_POINT_NAME)) {
         for (final InspectionProfileEntry profileEntry : factory.createTools()) {
-          myInspectionToolFactories.add(new Factory<InspectionToolWrapper>() {
+          factories.add(new Factory<InspectionToolWrapper>() {
             @Override
             public InspectionToolWrapper create() {
               return wrapTool(profileEntry);
@@ -74,6 +76,7 @@ public class InspectionToolRegistrar {
           });
         }
       }
+      myInspectionToolFactories.addAll(factories);
     }
   }
 
@@ -88,66 +91,31 @@ public class InspectionToolRegistrar {
     throw new RuntimeException("unknown inspection class: " + profileEntry + "; "+profileEntry.getClass());
   }
 
-  private void registerTools(@NotNull InspectionToolProvider[] providers) {
+  private static void registerTools(@NotNull Collection<InspectionToolProvider> providers,
+                                    @NotNull List<Factory<InspectionToolWrapper>> factories) {
     for (InspectionToolProvider provider : providers) {
       Class[] classes = provider.getInspectionClasses();
-      for (Class aClass : classes) {
-        registerInspectionTool(aClass);
+      for (final Class aClass : classes) {
+        Factory<InspectionToolWrapper> factory = new Factory<InspectionToolWrapper>() {
+          @Override
+          public InspectionToolWrapper create() {
+            return wrapTool((InspectionProfileEntry)InspectionToolsRegistrarCore.instantiateTool(aClass));
+          }
+        };
+        factories.add(factory);
       }
     }
   }
 
-  @NotNull
-  private Factory<InspectionToolWrapper> registerInspectionTool(@NotNull final Class aClass) {
-    if (LocalInspectionTool.class.isAssignableFrom(aClass)) {
-      return registerLocalInspection(aClass, true);
-    }
-    if (GlobalInspectionTool.class.isAssignableFrom(aClass)) {
-      return registerGlobalInspection(aClass, true);
-    }
-    throw new RuntimeException("unknown inspection class: " + aClass);
-  }
-
   public static InspectionToolRegistrar getInstance() {
     return ServiceManager.getService(InspectionToolRegistrar.class);
   }
 
-  /**
-   * make sure that it is not too late
-   */
-  @NotNull
-  private Factory<InspectionToolWrapper> registerInspectionToolFactory(@NotNull Factory<InspectionToolWrapper> factory, boolean store) {
-    if (store) {
-      myInspectionToolFactories.add(factory);
-    }
-    return factory;
-  }
-
-  @NotNull
-  private Factory<InspectionToolWrapper> registerLocalInspection(final Class toolClass, boolean store) {
-    return registerInspectionToolFactory(new Factory<InspectionToolWrapper>() {
-      @Override
-      public InspectionToolWrapper create() {
-        return new LocalInspectionToolWrapper((LocalInspectionTool)InspectionToolsRegistrarCore.instantiateTool(toolClass));
-      }
-    }, store);
-  }
-
-  @NotNull
-  private Factory<InspectionToolWrapper> registerGlobalInspection(@NotNull final Class aClass, boolean store) {
-    return registerInspectionToolFactory(new Factory<InspectionToolWrapper>() {
-      @Override
-      public InspectionToolWrapper create() {
-        return new GlobalInspectionToolWrapper((GlobalInspectionTool) InspectionToolsRegistrarCore.instantiateTool(aClass));
-      }
-    }, store);
-  }
-
   @NotNull
   public List<InspectionToolWrapper> createTools() {
     ensureInitialized();
 
-    final List<InspectionToolWrapper> tools = ContainerUtil.newArrayListWithCapacity(myInspectionToolFactories.size());
+    final List<InspectionToolWrapper> tools = new ArrayList<InspectionToolWrapper>(myInspectionToolFactories.size());
     for (final Factory<InspectionToolWrapper> factory : myInspectionToolFactories) {
       ProgressManager.checkCanceled();
       final InspectionToolWrapper toolWrapper = factory.create();