don't load inspection profile manager on dom initialization

This commit is contained in:
peter
2010-07-31 12:32:29 +01:00
parent 1464df4c43
commit 8aa563ce23
4 changed files with 64 additions and 79 deletions
@@ -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<CachedValue<Boolean>> CACHED_VALUE_KEY = Key.create("DomProblemHolderCachedValue");
private final EventDispatcher<DomHighlightingListener> myDispatcher = EventDispatcher.create(DomHighlightingListener.class);
private final Map<Class, List<DomElementsAnnotator>> myClass2Annotator = new THashMap<Class, List<DomElementsAnnotator>>();
private static final DomElementsProblemsHolder EMPTY_PROBLEMS_HOLDER = new DomElementsProblemsHolder() {
@NotNull
public List<DomElementProblemDescriptor> 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<Boolean> cachedValue = myCachedValuesManager.createCachedValue(new CachedValueProvider<Boolean>() {
final CachedValue<Boolean> cachedValue = CachedValuesManager.getManager(myProject).createCachedValue(new CachedValueProvider<Boolean>() {
public Result<Boolean> compute() {
return new Result<Boolean>(Boolean.FALSE, element, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, myModificationTracker, myProjectRootManager);
return new Result<Boolean>(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<DomElementsAnnotator> 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<? extends DomElement> aClass) {
getOrCreateAnnotators(aClass).add(annotator);
}
private List<DomElementsAnnotator> getOrCreateAnnotators(final Class aClass) {
List<DomElementsAnnotator> annotators = getAnnotators(aClass);
if (annotators == null) {
myClass2Annotator.put(aClass, annotators = new ArrayList<DomElementsAnnotator>());
}
return annotators;
}
@Nullable
private List<DomElementsAnnotator> getAnnotators(final Class aClass) {
return myClass2Annotator.get(aClass);
}
public List<ProblemDescriptor> 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
@@ -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<? extends DomElement> rootClass) {
myAnnotationsManager.annotate(element, holder, rootClass);
final DomElementsAnnotator annotator = myDomApplicationComponent.getAnnotator(rootClass);
if (annotator != null) {
annotator.annotate(element, holder);
}
}
@NotNull
@@ -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<Class, DomElementsAnnotator> myClass2Annotator = new ConcurrentFactoryMap<Class, DomElementsAnnotator>() {
@Override
protected DomElementsAnnotator create(Class key) {
final DomFileDescription desc = findFileDescription(key);
return desc == null ? null : desc.createAnnotator();
}
};
private final ConcurrentFactoryMap<Type, StaticGenericInfo> myGenericInfos = new ConcurrentFactoryMap<Type, StaticGenericInfo>() {
@NotNull
@@ -101,6 +110,28 @@ public class DomApplicationComponent {
myTypeChooserManager.copyFrom(description.getTypeChooserManager());
}
@Nullable
private synchronized DomFileDescription findFileDescription(Class rootElementClass) {
for (Set<DomFileDescription> 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<? extends DomElement> getImplementation(final Class concreteInterface) {
//noinspection unchecked
@@ -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