From 8aa563ce23c1f479b5237fcfa123a808ce6ed257 Mon Sep 17 00:00:00 2001 From: peter Date: Sat, 31 Jul 2010 12:32:29 +0100 Subject: [PATCH] don't load inspection profile manager on dom initialization --- .../DomElementAnnotationsManagerImpl.java | 52 +++++-------------- .../DomHighlightingHelperImpl.java | 12 ++--- .../xml/impl/DomApplicationComponent.java | 31 +++++++++++ .../util/xml/impl/DomManagerImpl.java | 48 +++++------------ 4 files changed, 64 insertions(+), 79 deletions(-) diff --git a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManagerImpl.java b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManagerImpl.java index 38363c0cc833..963afc1d2bec 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManagerImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManagerImpl.java @@ -46,14 +46,12 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomFileElement; import com.intellij.util.xml.DomUtil; -import gnu.trove.THashMap; +import com.intellij.util.xml.impl.DomApplicationComponent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManager { public static final Object LOCK = new Object(); @@ -63,8 +61,6 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag private static final Key> CACHED_VALUE_KEY = Key.create("DomProblemHolderCachedValue"); private final EventDispatcher myDispatcher = EventDispatcher.create(DomHighlightingListener.class); - private final Map> myClass2Annotator = new THashMap>(); - private static final DomElementsProblemsHolder EMPTY_PROBLEMS_HOLDER = new DomElementsProblemsHolder() { @NotNull public List getProblems(DomElement domElement) { @@ -105,16 +101,12 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag } }; - private final DomHighlightingHelperImpl myHighlightingHelper = new DomHighlightingHelperImpl(this); private final ModificationTracker myModificationTracker; - private final ProjectRootManager myProjectRootManager; - private final CachedValuesManager myCachedValuesManager; + private final Project myProject; private long myModificationCount; - public DomElementAnnotationsManagerImpl(Project project, final InspectionProfileManager inspectionProfileManager, ProjectRootManager projectRootManager, - final CachedValuesManager cachedValuesManager) { - myCachedValuesManager = cachedValuesManager; - myProjectRootManager = projectRootManager; + public DomElementAnnotationsManagerImpl(Project project) { + myProject = project; myModificationTracker = new ModificationTracker() { public long getModificationCount() { return myModificationCount; @@ -129,6 +121,8 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag dropAnnotationsCache(); } }; + + final InspectionProfileManager inspectionProfileManager = InspectionProfileManager.getInstance(); inspectionProfileManager.addProfileChangeListener(profileChangeAdapter, project); Disposer.register(project, new Disposable() { public void dispose() { @@ -161,9 +155,9 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag if (isHolderOutdated(element.getFile()) || holder == null) { holder = new DomElementsProblemsHolderImpl(element); rootTag.putUserData(DOM_PROBLEM_HOLDER_KEY, holder); - final CachedValue cachedValue = myCachedValuesManager.createCachedValue(new CachedValueProvider() { + final CachedValue cachedValue = CachedValuesManager.getManager(myProject).createCachedValue(new CachedValueProvider() { public Result compute() { - return new Result(Boolean.FALSE, element, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, myModificationTracker, myProjectRootManager); + return new Result(Boolean.FALSE, element, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, myModificationTracker, ProjectRootManager.getInstance(myProject)); } }, false); cachedValue.getValue(); @@ -211,33 +205,13 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag return getProblemHolder(element); } - public void annotate(final DomElement element, final DomElementAnnotationHolder holder, final Class rootClass) { - final List list = getAnnotators(rootClass); - if (list != null) { - for (DomElementsAnnotator annotator : list) { - annotator.annotate(element, holder); - } + public static void annotate(final DomElement element, final DomElementAnnotationHolder holder, final Class rootClass) { + final DomElementsAnnotator annotator = DomApplicationComponent.getInstance().getAnnotator(rootClass); + if (annotator != null) { + annotator.annotate(element, holder); } } - - public final void registerDomElementsAnnotator(DomElementsAnnotator annotator, Class aClass) { - getOrCreateAnnotators(aClass).add(annotator); - } - - private List getOrCreateAnnotators(final Class aClass) { - List annotators = getAnnotators(aClass); - if (annotators == null) { - myClass2Annotator.put(aClass, annotators = new ArrayList()); - } - return annotators; - } - - @Nullable - private List getAnnotators(final Class aClass) { - return myClass2Annotator.get(aClass); - } - public List createProblemDescriptors(final InspectionManager manager, DomElementProblemDescriptor problemDescriptor) { return ContainerUtil.createMaybeSingletonList(DomElementsHighlightingUtil.createProblemDescriptors(manager, problemDescriptor)); } @@ -256,7 +230,7 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag } public DomHighlightingHelper getHighlightingHelper() { - return myHighlightingHelper; + return DomHighlightingHelperImpl.INSTANCE; } @NotNull diff --git a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomHighlightingHelperImpl.java b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomHighlightingHelperImpl.java index 8f94a1e4ff21..91293ccf588c 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomHighlightingHelperImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomHighlightingHelperImpl.java @@ -51,15 +51,15 @@ import java.util.List; * @author peter */ public class DomHighlightingHelperImpl extends DomHighlightingHelper { + public static final DomHighlightingHelperImpl INSTANCE = new DomHighlightingHelperImpl(); private final GenericValueReferenceProvider myProvider = new GenericValueReferenceProvider(); - private final DomElementAnnotationsManagerImpl myAnnotationsManager; - - public DomHighlightingHelperImpl(final DomElementAnnotationsManagerImpl annotationsManager) { - myAnnotationsManager = annotationsManager; - } + private final DomApplicationComponent myDomApplicationComponent = DomApplicationComponent.getInstance(); public void runAnnotators(DomElement element, DomElementAnnotationHolder holder, Class rootClass) { - myAnnotationsManager.annotate(element, holder, rootClass); + final DomElementsAnnotator annotator = myDomApplicationComponent.getAnnotator(rootClass); + if (annotator != null) { + annotator.annotate(element, holder); + } } @NotNull diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomApplicationComponent.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomApplicationComponent.java index 838b9ff04279..fe624c3b66ee 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomApplicationComponent.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomApplicationComponent.java @@ -25,6 +25,7 @@ import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomElementVisitor; import com.intellij.util.xml.DomFileDescription; import com.intellij.util.xml.TypeChooserManager; +import com.intellij.util.xml.highlighting.DomElementsAnnotator; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -46,6 +47,14 @@ public class DomApplicationComponent { private final ImplementationClassCache myCachedImplementationClasses = new ImplementationClassCache(); private final TypeChooserManager myTypeChooserManager = new TypeChooserManager(); final ReflectionAssignabilityCache assignabilityCache = new ReflectionAssignabilityCache(); + private final FactoryMap myClass2Annotator = new ConcurrentFactoryMap() { + + @Override + protected DomElementsAnnotator create(Class key) { + final DomFileDescription desc = findFileDescription(key); + return desc == null ? null : desc.createAnnotator(); + } + }; private final ConcurrentFactoryMap myGenericInfos = new ConcurrentFactoryMap() { @NotNull @@ -101,6 +110,28 @@ public class DomApplicationComponent { myTypeChooserManager.copyFrom(description.getTypeChooserManager()); } + @Nullable + private synchronized DomFileDescription findFileDescription(Class rootElementClass) { + for (Set descriptions : myRootTagName2FileDescription.values()) { + for (DomFileDescription description : descriptions) { + if (description.getRootElementClass() == rootElementClass) { + return description; + } + } + } + + for (DomFileDescription description : myAcceptingOtherRootTagNamesDescriptions) { + if (description.getRootElementClass() == rootElementClass) { + return description; + } + } + return null; + } + + public DomElementsAnnotator getAnnotator(Class rootElementClass) { + return myClass2Annotator.get(rootElementClass); + } + @Nullable final Class getImplementation(final Class concreteInterface) { //noinspection unchecked diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java index 15b3ef344dc7..d5ce03964b02 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java @@ -5,7 +5,7 @@ package com.intellij.util.xml.impl; import com.intellij.ide.startup.StartupManagerEx; import com.intellij.openapi.Disposable; -import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -18,6 +18,7 @@ import com.intellij.openapi.util.Factory; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; +import com.intellij.pom.PomManager; import com.intellij.pom.PomModel; import com.intellij.pom.PomModelAspect; import com.intellij.pom.event.PomModelEvent; @@ -39,9 +40,6 @@ import com.intellij.util.xml.events.DomEvent; import com.intellij.util.xml.events.ElementChangedEvent; import com.intellij.util.xml.events.ElementDefinedEvent; import com.intellij.util.xml.events.ElementUndefinedEvent; -import com.intellij.util.xml.highlighting.DomElementAnnotationsManager; -import com.intellij.util.xml.highlighting.DomElementAnnotationsManagerImpl; -import com.intellij.util.xml.highlighting.DomElementsAnnotator; import com.intellij.util.xml.reflect.AbstractDomChildrenDescription; import com.intellij.util.xml.reflect.DomGenericInfo; import net.sf.cglib.proxy.AdvancedProxy; @@ -78,7 +76,6 @@ public final class DomManagerImpl extends DomManager { private final Project myProject; private final DomApplicationComponent myApplicationComponent; - private final DomElementAnnotationsManagerImpl myAnnotationsManager; private final PsiFileFactory myFileFactory; private long myModificationCount; @@ -86,19 +83,12 @@ public final class DomManagerImpl extends DomManager { private final ProjectFileIndex myFileIndex; private final SemService mySemService; - public DomManagerImpl(final PomModel pomModel, - final Project project, final PsiManager psiManager, - final XmlAspect xmlAspect, final DomElementAnnotationsManager annotationsManager, - final VirtualFileManager virtualFileManager, - final StartupManager startupManager, - final ProjectRootManager projectRootManager, - final DomApplicationComponent applicationComponent, - final ConverterManager converterManager, SemService semService) { + public DomManagerImpl(final Project project, final XmlAspect xmlAspect) { myProject = project; - mySemService = semService; - myConverterManager = (ConverterManagerImpl)converterManager; - myApplicationComponent = applicationComponent; - myAnnotationsManager = (DomElementAnnotationsManagerImpl)annotationsManager; + mySemService = SemService.getSemService(project); + myConverterManager = (ConverterManagerImpl)ServiceManager.getService(ConverterManager.class); + myApplicationComponent = DomApplicationComponent.getInstance(); + final PomModel pomModel = PomManager.getModel(project); pomModel.addModelListener(new PomModelListener() { public void modelChanged(PomModelEvent event) { final XmlChangeSet changeSet = (XmlChangeSet)event.getChangeSet(xmlAspect); @@ -116,6 +106,8 @@ public final class DomManagerImpl extends DomManager { myFileFactory = PsiFileFactory.getInstance(project); + final PsiManager psiManager = PsiManager.getInstance(project); + final Runnable setupVfsListeners = new Runnable() { public void run() { final VirtualFileAdapter listener = new VirtualFileAdapter() { @@ -171,20 +163,18 @@ public final class DomManagerImpl extends DomManager { } } }; - virtualFileManager.addVirtualFileListener(listener, project); + VirtualFileManager.getInstance().addVirtualFileListener(listener, project); } }; + + final StartupManager startupManager = StartupManager.getInstance(project); if (!((StartupManagerEx)startupManager).startupActivityPassed()) { startupManager.registerStartupActivity(setupVfsListeners); } else { setupVfsListeners.run(); } - myFileIndex = projectRootManager.getFileIndex(); - - for (final DomFileDescription description : Extensions.getExtensions(DomFileDescription.EP_NAME)) { - _registerFileDescription(description); - } + myFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); } private void processVfsChange(final VirtualFile file) { @@ -478,19 +468,9 @@ public final class DomManagerImpl extends DomManager { } public final void registerFileDescription(final DomFileDescription description) { - _registerFileDescription(description); - - myApplicationComponent.registerFileDescription(description); - } - - private void _registerFileDescription(final DomFileDescription description) { mySemService.clearCache(); - final DomElementsAnnotator annotator = description.createAnnotator(); - if (annotator != null) { - //noinspection unchecked - myAnnotationsManager.registerDomElementsAnnotator(annotator, description.getRootElementClass()); - } + myApplicationComponent.registerFileDescription(description); } @NotNull