decoupling CachedValueManager from PSI

This commit is contained in:
Dmitry Avdeev
2009-09-02 09:56:09 +04:00
parent 76e6e21570
commit 92799f2136
24 changed files with 67 additions and 59 deletions
@@ -10,8 +10,8 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.psi.*;
import com.intellij.psi.impl.ParameterizedCachedValueImpl;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiParameterizedCachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.ParameterizedCachedValue;
import com.intellij.psi.util.ParameterizedCachedValueProvider;
@@ -123,7 +123,7 @@ public class JavaConcatenationInjectorManager implements ProjectComponent, Modif
if (registrar.result != null) {
// store this everywhere
ParameterizedCachedValue<Places, PsiElement> cachedValue = context.getManager().getCachedValuesManager().createParameterizedCachedValue(this, false);
((ParameterizedCachedValueImpl<Places, PsiElement>)cachedValue).setValue(result);
((PsiParameterizedCachedValue<Places, PsiElement>)cachedValue).setValue(result);
for (PsiElement operand : operands) {
operand.putUserData(INJECTED_PSI_IN_CONCATENATION, cachedValue);
@@ -150,6 +150,8 @@ public abstract class PsiManager extends UserDataHolderBase {
* which are automatically recalculated based on changes of the elements on which they depend.
*
* @return the cached values manager instance.
* @deprecated
* @see CachedValuesManager#getManager(com.intellij.openapi.project.Project)
*/
@NotNull
public abstract CachedValuesManager getCachedValuesManager();
@@ -17,7 +17,6 @@ package com.intellij.psi.meta;
import com.intellij.psi.PsiElement;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.util.CachedValue;
import org.jetbrains.annotations.NonNls;
/**
@@ -39,7 +38,7 @@ public interface PsiMetaData {
/**
* @return objects this meta data depends on.
* @see CachedValue
* @see com.intellij.psi.util.CachedValue
*/
Object[] getDependences();
}
@@ -14,9 +14,9 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.Module;
import com.intellij.psi.PsiManager;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
@@ -9,10 +9,7 @@ import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.CachedValuesManagerImpl;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.impl.PsiTreeChangeEventImpl;
import com.intellij.psi.impl.*;
import com.intellij.psi.impl.cache.CacheManager;
import com.intellij.psi.impl.cache.impl.CompositeCacheManager;
import com.intellij.psi.impl.file.impl.FileManager;
@@ -24,6 +21,7 @@ import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ThrowableRunnable;
import com.intellij.util.CachedValuesManagerImpl;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -112,7 +110,7 @@ public class MockPsiManager extends PsiManagerEx {
@NotNull
public CachedValuesManager getCachedValuesManager() {
if (myCachedValuesManager == null) {
myCachedValuesManager = new CachedValuesManagerImpl(this);
myCachedValuesManager = new CachedValuesManagerImpl(myProject, new PsiCachedValuesFactory(this));
}
return myCachedValuesManager;
}
@@ -234,4 +232,4 @@ public class MockPsiManager extends PsiManagerEx {
public CacheManager getCacheManager() {
return myCompositeCacheManager;
}
}
}
@@ -51,4 +51,4 @@ public class PsiCachedValuesFactory implements CachedValuesFactory {
}
};
}
}
}
@@ -22,6 +22,7 @@ import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.NotNullLazyValue;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileFilter;
import com.intellij.psi.*;
@@ -64,7 +65,13 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent {
private final CacheManager myCacheManager;
private final PsiModificationTrackerImpl myModificationTracker;
private final ResolveCache myResolveCache;
private final CachedValuesManager myCachedValuesManager;
private final NotNullLazyValue<CachedValuesManager> myCachedValuesManager = new NotNullLazyValue<CachedValuesManager>() {
@NotNull
@Override
protected CachedValuesManager compute() {
return CachedValuesManager.getManager(myProject);
}
};
private final List<PsiTreeChangePreprocessor> myTreeChangePreprocessors = ContainerUtil.createEmptyCOWList();
private final List<PsiTreeChangeListener> myTreeChangeListeners = ContainerUtil.createEmptyCOWList();
@@ -119,7 +126,6 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent {
myModificationTracker = new PsiModificationTrackerImpl(myProject);
myTreeChangePreprocessors.add(myModificationTracker);
myResolveCache = new ResolveCache(this);
myCachedValuesManager = new CachedValuesManagerImpl(this);
if (startupManager != null) {
((StartupManagerEx)startupManager).registerPreStartupActivity(
@@ -695,7 +701,7 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent {
@NotNull
public CachedValuesManager getCachedValuesManager() {
return myCachedValuesManager;
return myCachedValuesManager.getValue();
}
public void moveDirectory(@NotNull final PsiDirectory dir, @NotNull PsiDirectory newParent) throws IncorrectOperationException {
@@ -61,4 +61,4 @@ public abstract class PsiParameterizedCachedValue<T,P> extends PsiCachedValue<T>
public ParameterizedCachedValueProvider<T,P> getValueProvider() {
return myProvider;
}
}
}
@@ -33,7 +33,7 @@ import com.intellij.psi.util.ParameterizedCachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.ArrayUtil;
import com.intellij.util.*;
import java.util.ArrayList;
import java.util.List;
@@ -8,13 +8,13 @@ import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataCache;
import com.intellij.patterns.ElementPattern;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.filters.position.PatternFilter;
import com.intellij.psi.meta.MetaDataContributor;
import com.intellij.psi.meta.MetaDataRegistrar;
import com.intellij.psi.meta.PsiMetaData;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -9,10 +9,10 @@ import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.*;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -16,9 +16,9 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.ParameterizedCachedValueImpl;
import com.intellij.psi.impl.PsiDocumentManagerImpl;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiParameterizedCachedValue;
import com.intellij.psi.impl.source.DummyHolder;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.CachedValueProvider;
@@ -196,7 +196,7 @@ public class InjectedLanguageUtil {
ParameterizedCachedValue<Places, PsiElement> cachedValue = psiManager.getCachedValuesManager().createParameterizedCachedValue(INJECTED_PSI_PROVIDER, false);
Document hostDocument = hostPsiFile.getViewProvider().getDocument();
CachedValueProvider.Result<Places> result = new CachedValueProvider.Result<Places>(places, PsiModificationTracker.MODIFICATION_COUNT, hostDocument);
((ParameterizedCachedValueImpl<Places, PsiElement>)cachedValue).setValue(result);
((PsiParameterizedCachedValue<Places, PsiElement>)cachedValue).setValue(result);
current.putUserData(INJECTED_PSI_KEY, cachedValue);
}
}
@@ -1,17 +1,17 @@
/*
* Copyright 2000-2007 JetBrains s.r.o.
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.util;
@@ -1,17 +1,17 @@
/*
* Copyright 2000-2007 JetBrains s.r.o.
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.util;
@@ -25,4 +25,4 @@ public interface ParameterizedCachedValue<T, P> {
ParameterizedCachedValueProvider<T,P> getValueProvider();
boolean hasUpToDateValue();
}
}
@@ -20,4 +20,4 @@ import org.jetbrains.annotations.Nullable;
public interface ParameterizedCachedValueProvider<T, P> {
@Nullable
CachedValueProvider.Result<T> compute(P param);
}
}
@@ -1,15 +1,14 @@
package com.intellij.util;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.reference.SoftReference;
import com.intellij.util.ArrayUtil;
import com.intellij.util.TimedReference;
import com.intellij.util.concurrency.JBLock;
import com.intellij.util.concurrency.JBReentrantReadWriteLock;
import com.intellij.util.concurrency.LockFactory;
@@ -158,6 +157,9 @@ public abstract class CachedValueBase<T> {
if (dependency instanceof ModificationTracker) {
return ((ModificationTracker)dependency).getModificationCount();
}
if (dependency instanceof Document) {
return ((Document)dependency).getModificationStamp();
}
else {
LOG.error("Wrong dependency type: " + dependency.getClass());
return -1;
@@ -10,7 +10,6 @@ package com.intellij.util;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.util.CachedValueBase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -11,7 +11,6 @@ package com.intellij.util;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.ParameterizedCachedValue;
import com.intellij.psi.util.ParameterizedCachedValueProvider;
import com.intellij.util.CachedValueBase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -140,6 +140,9 @@
serviceImplementation="com.intellij.pom.core.impl.PomModelImpl"/>
<projectService serviceInterface="com.intellij.psi.impl.include.FileIncludeManager"
serviceImplementation="com.intellij.psi.impl.include.FileIncludeManagerImpl"/>
<projectService serviceInterface="com.intellij.util.CachedValuesFactory"
serviceImplementation="com.intellij.psi.impl.PsiCachedValuesFactory"/>
<projectService serviceInterface="com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable"
serviceImplementation="com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable"/>
@@ -48,6 +48,8 @@
<extensionPoint name="projectUndoProvider" interface="com.intellij.openapi.command.impl.UndoProvider"
area="IDEA_PROJECT"/>
<extensionPoint name="cachedValuesFactory" interface="com.intellij.util.CachedValuesFactory" area="IDEA_PROJECT"/>
<extensionPoint name="syntaxHighlighter"
beanClass="com.intellij.openapi.extensions.KeyedFactoryEPBean"/>
@@ -114,6 +114,9 @@
<projectService serviceInterface="com.intellij.openapi.project.DumbService" serviceImplementation="com.intellij.openapi.project.DumbServiceImpl"/>
<projectService serviceInterface="com.intellij.psi.util.CachedValuesManager"
serviceImplementation="com.intellij.util.CachedValuesManagerImpl"/>
<projectService serviceInterface="com.intellij.openapi.vcs.impl.projectlevelman.AllVcsesI"
serviceImplementation="com.intellij.openapi.vcs.impl.projectlevelman.AllVcses"/>
@@ -22,7 +22,6 @@ import com.intellij.profile.Profile;
import com.intellij.profile.ProfileChangeAdapter;
import com.intellij.profile.codeInspection.InspectionProfileManager;
import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
import com.intellij.psi.PsiManager;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
@@ -99,11 +98,7 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag
private final ProjectRootManager myProjectRootManager;
private final CachedValuesManager myCachedValuesManager;
private long myModificationCount;
public DomElementAnnotationsManagerImpl(Project project, InspectionProfileManager manager, ProjectRootManager projectRootManager,
PsiManager psiManager) {
this(project, manager, projectRootManager, psiManager.getCachedValuesManager());
}
public DomElementAnnotationsManagerImpl(Project project, final InspectionProfileManager inspectionProfileManager, ProjectRootManager projectRootManager,
final CachedValuesManager cachedValuesManager) {
myCachedValuesManager = cachedValuesManager;
@@ -11,7 +11,7 @@ import com.intellij.pom.impl.PomTransactionBase;
import com.intellij.pom.xml.XmlAspect;
import com.intellij.pom.xml.impl.events.XmlDocumentChangedImpl;
import com.intellij.psi.*;
import com.intellij.psi.impl.CachedValueImpl;
import com.intellij.psi.impl.PsiCachedValueImpl;
import com.intellij.psi.impl.meta.MetaRegistry;
import com.intellij.psi.impl.source.html.dtd.HtmlNSDescriptorImpl;
import com.intellij.psi.impl.source.tree.TreeElement;
@@ -133,7 +133,7 @@ public class XmlDocumentImpl extends XmlElementImpl implements XmlDocument {
CachedValue<XmlNSDescriptor> cachedValue = defaultDescriptorsCache.get(namespace);
if (cachedValue == null) {
defaultDescriptorsCache.put(namespace, cachedValue = new CachedValueImpl<XmlNSDescriptor>(getManager(), new CachedValueProvider<XmlNSDescriptor>() {
defaultDescriptorsCache.put(namespace, cachedValue = new PsiCachedValueImpl<XmlNSDescriptor>(getManager(), new CachedValueProvider<XmlNSDescriptor>() {
public Result<XmlNSDescriptor> compute() {
final XmlNSDescriptor defaultNSDescriptorInner = getDefaultNSDescriptorInner(namespace, strict);
@@ -145,7 +145,7 @@ public class XmlDocumentImpl extends XmlElementImpl implements XmlDocument {
? defaultNSDescriptorInner.getDependences()
: ExternalResourceManager.getInstance());
}
}, false));
}));
}
return cachedValue.getValue();
}