import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
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;
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);
});
}
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);
}
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);
});
}
}
+ myInspectionToolFactories.addAll(factories);
}
}
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();