From 2ecf91d46ea7adf888d62ee3830728600ad4f8b4 Mon Sep 17 00:00:00 2001 From: UNV Date: Sun, 29 Mar 2026 01:21:26 +0300 Subject: [PATCH] Fixing UserDataCache. --- .../javascript/flex/XmlBackedJSClassImpl.java | 26 +++++++------------ .../lang/javascript/psi/impl/JSClassBase.java | 18 ++++++++----- .../psi/resolve/JSImportHandlingUtil.java | 23 ++++++++-------- .../javascript/psi/resolve/JSResolveUtil.java | 24 ++++++++--------- 4 files changed, 44 insertions(+), 47 deletions(-) diff --git a/base-impl/src/main/java/com/intellij/lang/javascript/flex/XmlBackedJSClassImpl.java b/base-impl/src/main/java/com/intellij/lang/javascript/flex/XmlBackedJSClassImpl.java index d866f4e5..5c84db14 100644 --- a/base-impl/src/main/java/com/intellij/lang/javascript/flex/XmlBackedJSClassImpl.java +++ b/base-impl/src/main/java/com/intellij/lang/javascript/flex/XmlBackedJSClassImpl.java @@ -41,7 +41,6 @@ import consulo.language.psi.resolve.ResolveState; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; -import consulo.util.dataholder.Key; import consulo.virtualFileSystem.VirtualFile; import consulo.xml.psi.XmlRecursiveElementVisitor; import consulo.xml.psi.xml.*; @@ -193,7 +192,7 @@ protected boolean processMembers( PsiElement lastParent, PsiElement place ) { - for (JSFile file : CACHED_SCRIPTS.get(CACHED_SCRIPTS_KEY, getParent(), null).getValue()) { + for (JSFile file : CACHED_SCRIPTS.get(getParent(), null).getValue()) { if (!file.processDeclarations(processor, ResolveState.initial(), null, place)) { return false; } @@ -241,7 +240,7 @@ public boolean doImportFromScripts(PsiScopeProcessor processor, PsiElement place boolean adequatePlace = false; XmlTag parent = getParent(); - JSFile[] files = CACHED_SCRIPTS.get(CACHED_SCRIPTS_KEY, parent, null).getValue(); + JSFile[] files = CACHED_SCRIPTS.get(parent, null).getValue(); for (JSFile file : files) { if (JSImportHandlingUtil.isAdequatePlaceForImport(file, place)) { if (useImports && JSImportHandlingUtil.importClass(processor, file)) { @@ -263,8 +262,7 @@ public boolean doImportFromScripts(PsiScopeProcessor processor, PsiElement place @RequiredReadAction public boolean processComponentNames(ResolveProcessor processor) { String s = processor.getName(); - Map value = - CACHED_COMPONENT_IMPORTS_CACHE.get(CACHED_SHORT_COMPONENTS_REF_KEY, (XmlFile)getContainingFile(), null).getValue(); + Map value = CACHED_COMPONENT_IMPORTS_CACHE.get((XmlFile)getContainingFile(), null).getValue(); if (s != null) { String qName = value.get(s); @@ -286,12 +284,10 @@ public boolean processComponentNames(ResolveProcessor processor) { return true; } - private static final Key> CACHED_SCRIPTS_KEY = Key.create("cached.scripts"); - private static final Key>> CACHED_SHORT_COMPONENTS_REF_KEY = Key.create("cached.component.refs"); - private static final String SCRIPT_TAG_NAME = "Script"; - private static final UserDataCache, XmlTag, Object> CACHED_SCRIPTS = new UserDataCache<>() { + private static final UserDataCache, XmlTag, Object> CACHED_SCRIPTS = + new UserDataCache, XmlTag, Object>("cached.scripts") { @Override protected CachedValue compute(XmlTag tag, Object p) { return CachedValuesManager.getManager(tag.getProject()).createCachedValue( @@ -320,7 +316,7 @@ protected CachedValue compute(XmlTag tag, Object p) { }; private static final UserDataCache>, XmlFile, Object> CACHED_COMPONENT_IMPORTS_CACHE = - new UserDataCache<>() { + new UserDataCache>, XmlFile, Object>("cached.component.refs") { @Override protected CachedValue> compute(final XmlFile file, Object p) { return CachedValuesManager.getManager(file.getProject()).createCachedValue( @@ -371,8 +367,6 @@ public boolean isValid() { return getNode().getPsi().isValid(); } - private static Key> ourArtificialPsiKey = Key.create("xml.backed.class"); - @Nullable public static JSClass getXmlBackedClass(XmlFile xmlFile) { XmlTag rootTag = getRootTag(xmlFile); @@ -386,7 +380,7 @@ private static XmlTag getRootTag(XmlFile xmlFile) { } public static XmlBackedJSClassImpl getXmlBackedClass(XmlTag tag) { - return myCachedClassCache.get(ourArtificialPsiKey, tag, null).getValue(tag); + return CACHED_CLASS_CACHE.get(tag, null).getValue(tag); } public static Collection getClasses(XmlFile file) { @@ -415,8 +409,8 @@ public static XmlBackedJSClassImpl getContainingComponent(XmlElement element) { return getXmlBackedClass((XmlTag)element); } - private static final UserDataCache, XmlTag, Object> myCachedClassCache = - new UserDataCache<>() { + private static final UserDataCache, XmlTag, Object> CACHED_CLASS_CACHE = + new UserDataCache, XmlTag, Object>("xml.backed.class") { @Override protected ParameterizedCachedValue compute(XmlTag tag, Object p) { return CachedValuesManager.getManager(tag.getProject()).createParameterizedCachedValue( @@ -518,7 +512,7 @@ public PsiElement addBefore(PsiElement element, PsiElement anchor) throws Incorr @Nullable @RequiredReadAction public JSFile findFirstScriptTag() { - JSFile[] value = CACHED_SCRIPTS.get(CACHED_SCRIPTS_KEY, getParent(), null).getValue(); + JSFile[] value = CACHED_SCRIPTS.get(getParent(), null).getValue(); if (value.length > 0) { return value[0]; } diff --git a/base-impl/src/main/java/com/intellij/lang/javascript/psi/impl/JSClassBase.java b/base-impl/src/main/java/com/intellij/lang/javascript/psi/impl/JSClassBase.java index efe2ecfe..9578f9d1 100644 --- a/base-impl/src/main/java/com/intellij/lang/javascript/psi/impl/JSClassBase.java +++ b/base-impl/src/main/java/com/intellij/lang/javascript/psi/impl/JSClassBase.java @@ -47,12 +47,10 @@ * @author Maxim.Mossienko */ public abstract class JSClassBase extends JSStubElementImpl implements JSClass { - private static final Key, Object>> IMPLEMENTS_LIST_CACHE_KEY = Key.create("implements.list.cache"); - private static final Key, Object>> EXTENDS_LIST_CACHE_KEY = Key.create("implements.list.cache"); private static final UserDataCache, Object>, JSClassBase, Object> IMPLEMENTS_LIST_CACHE = - new ClassesUserDataCache(); + new ClassesUserDataCache("implements.list.cache"); private static final UserDataCache, Object>, JSClassBase, Object> EXTENDS_LIST_CACHE = - new ExtendsClassesUserDataCache(); + new ExtendsClassesUserDataCache("extends.list.cache"); private volatile Map myName2FunctionMap; private volatile Map myName2FieldsMap; @@ -281,10 +279,10 @@ private List getClassesFromReferenceList(@Nullable JSReferenceList exte PsiElement element = extendsList != null ? extendsList : this; if (type == JSElementTypes.EXTENDS_LIST) { - return EXTENDS_LIST_CACHE.get(EXTENDS_LIST_CACHE_KEY, this, extendsList).getValue(element); + return EXTENDS_LIST_CACHE.get(this, extendsList).getValue(element); } else { - return IMPLEMENTS_LIST_CACHE.get(IMPLEMENTS_LIST_CACHE_KEY, this, extendsList).getValue(element); + return IMPLEMENTS_LIST_CACHE.get(this, extendsList).getValue(element); } } @@ -366,6 +364,10 @@ public JSClass[] getImplementedInterfaces() { } private static class ExtendsClassesUserDataCache extends ClassesUserDataCache { + private ExtendsClassesUserDataCache(String keyName) { + super(keyName); + } + @Override @RequiredReadAction protected List doCompute(Object extendsList) { @@ -385,6 +387,10 @@ protected List doCompute(Object extendsList) { } private static class ClassesUserDataCache extends UserDataCache, Object>, JSClassBase, Object> { + private ClassesUserDataCache(String keyName) { + super(keyName); + } + @Override protected ParameterizedCachedValue, Object> compute(JSClassBase jsClassBase, Object p) { return CachedValuesManager.getManager(jsClassBase.getProject()).createParameterizedCachedValue( diff --git a/base-impl/src/main/java/com/intellij/lang/javascript/psi/resolve/JSImportHandlingUtil.java b/base-impl/src/main/java/com/intellij/lang/javascript/psi/resolve/JSImportHandlingUtil.java index e0d8e2cc..5e7924b3 100644 --- a/base-impl/src/main/java/com/intellij/lang/javascript/psi/resolve/JSImportHandlingUtil.java +++ b/base-impl/src/main/java/com/intellij/lang/javascript/psi/resolve/JSImportHandlingUtil.java @@ -57,13 +57,9 @@ * @since 2008-07-29 */ public class JSImportHandlingUtil { - public static final Key>> IMPORT_LIST_CACHE_KEY = Key.create("js.import.list.cache"); - public static final UserDataCache>, PsiElement, Object> IMPORT_LIST_CACHE = new ImportListDataCache(); - public static final Key>> IMPORT_RESOLVE_CACHE_KEY = - Key.create("js.import.resolve"); - public static final UserDataCache>, PsiElement, Object> - IMPORT_RESOLVE_CACHE = - new UserDataCache<>() { + public static final UserDataCache>, PsiElement, Object> IMPORT_LIST_CACHE = new ImportListDataCache("js.import.list.cache"); + public static final UserDataCache>, PsiElement, Object> IMPORT_RESOLVE_CACHE = + new UserDataCache>, PsiElement, Object>("js.import.resolve") { @Override protected CachedValue> compute(PsiElement psiElement, Object p) { return CachedValuesManager.getManager(psiElement.getProject()).createCachedValue( @@ -237,7 +233,7 @@ JSImportedElementResolveResult resolveTypeNameUsingImports(String referencedName } } - Map map = IMPORT_RESOLVE_CACHE.get(IMPORT_RESOLVE_CACHE_KEY, parent, null).getValue(); + Map map = IMPORT_RESOLVE_CACHE.get(parent, null).getValue(); JSImportedElementResolveResult result = map.get(referencedName); if (result == null) { @@ -252,7 +248,7 @@ private static JSImportedElementResolveResult resolveTypeNameUsingImportsInner( String referencedName, PsiNamedElement parent ) { - Map value = IMPORT_LIST_CACHE.get(IMPORT_LIST_CACHE_KEY, parent, null).getValue(); + Map value = IMPORT_LIST_CACHE.get(parent, null).getValue(); JSImportedElementResolveResult expression = FlexImportSupport.tryFindInMap(referencedName, parent, value); if (expression != null) { return expression; @@ -358,7 +354,7 @@ public static boolean importClass(PsiScopeProcessor processor, PsiNamedElement p if (s != null) { if (resolveProcessor.specificallyAskingToResolveQualifiedNames()) { - Map value = IMPORT_LIST_CACHE.get(IMPORT_LIST_CACHE_KEY, parent, null).getValue(); + Map value = IMPORT_LIST_CACHE.get(parent, null).getValue(); JSImportedElementResolveResult resolveResult = FlexImportSupport.tryFindInMap(s, parent, value, resolveProcessor.getQualifiedNameToImport()); if (dispatchResult(resolveResult, processor)) { @@ -441,6 +437,10 @@ else if (!(place instanceof JSFile)) { } private static class ImportListDataCache extends UserDataCache>, PsiElement, Object> { + private ImportListDataCache(String keyName) { + super(keyName); + } + @Override protected final CachedValue> compute(PsiElement owner, Object o) { return CachedValuesManager.getManager(owner.getProject()).createCachedValue( @@ -474,8 +474,7 @@ else if (owner instanceof JSFile || owner instanceof JSStubElementImpl) { } for (PsiElement c : children) { - if (c instanceof JSImportStatement) { - JSImportStatement s = ((JSImportStatement)c); + if (c instanceof JSImportStatement s) { if (s.getImportText() != null) { FlexImportSupport.appendToMap(result, s); diff --git a/base-impl/src/main/java/com/intellij/lang/javascript/psi/resolve/JSResolveUtil.java b/base-impl/src/main/java/com/intellij/lang/javascript/psi/resolve/JSResolveUtil.java index a4062d8e..97b4f892 100644 --- a/base-impl/src/main/java/com/intellij/lang/javascript/psi/resolve/JSResolveUtil.java +++ b/base-impl/src/main/java/com/intellij/lang/javascript/psi/resolve/JSResolveUtil.java @@ -90,9 +90,8 @@ * @author max, maxim.mossienko */ public class JSResolveUtil { - private static final Key>> CACHED_STATEMENTS = Key.create("JS.RelevantStatements"); private static final UserDataCache>, JSElement, Object> CACHED_DEFS_CACHE = - new RelevantDefsUserDataCache(); + new RelevantDefsUserDataCache("JS.RelevantStatements"); public static final String PROTOTYPE_FIELD_NAME = "prototype"; private static final String ARRAY_TYPE_NAME = "Array"; @@ -679,10 +678,8 @@ static boolean walkOverStructure(PsiElement context, Processor return true; } - private static final Key, JSElement>> ourCachedOpenedNsesKey = Key.create("opened.nses"); - - private static final UserDataCache, JSElement>, JSElement, Object> ourCachedOpenedNsesCache = - new UserDataCache<>() { + private static final UserDataCache, JSElement>, JSElement, Object> CACHED_OPENED_NSES_CACHE = + new UserDataCache, JSElement>, JSElement, Object>("opened.nses") { @Override protected ParameterizedCachedValue, JSElement> compute(JSElement jsElement, Object p) { return CachedValuesManager.getManager(jsElement.getProject()).createParameterizedCachedValue( @@ -737,7 +734,7 @@ public static Set calculateOpenNses(PsiElement place) { place, psiNamedElement -> { if (psiNamedElement instanceof JSElement element) { - result.set(ourCachedOpenedNsesCache.get(ourCachedOpenedNsesKey, element, null).getValue(element)); + result.set(CACHED_OPENED_NSES_CACHE.get(element, null).getValue(element)); } return false; } @@ -944,7 +941,7 @@ else if (elt instanceof JSFile jsFile) { while (tag != null) { if (XmlBackedJSClassImpl.isInlineComponentTag(tag)) { - for (JSVariable var : ourCachedPredefinedVars.get(ourCachedPredefinedVarsKey, (XmlFile)containingFile, null) + for (JSVariable var : CACHED_PREDEFINED_VARS.get((XmlFile)containingFile, null) .getValue()) { if (!processor.execute(var, ResolveState.initial())) { return; @@ -974,8 +971,8 @@ else if (elt instanceof JSFile jsFile) { treeWalkUp(processor, parentElement, elt, place, terminatingParent, currentScope); } - private static UserDataCache>, XmlFile, Object> ourCachedPredefinedVars = - new UserDataCache<>() { + private static final UserDataCache>, XmlFile, Object> CACHED_PREDEFINED_VARS = + new UserDataCache>, XmlFile, Object>("ourCachedPredefinedVarsKey") { @Override @RequiredReadAction protected CachedValue> compute(final XmlFile xmlFile, Object p) { @@ -992,8 +989,6 @@ protected CachedValue> compute(final XmlFile xmlFile, Object p) } }; - private static Key>> ourCachedPredefinedVarsKey = Key.create("ourCachedPredefinedVarsKey"); - public static boolean processXmlFile(PsiScopeProcessor processor, XmlFile xmlFile, PsiElement place) { JSClass clazz = XmlBackedJSClassImpl.getXmlBackedClass(xmlFile); return clazz.processDeclarations(processor, ResolveState.initial(), clazz, place); @@ -1809,7 +1804,7 @@ public static boolean processDeclarationsInScope( } boolean result = true; - IntObjectMap defsMap = CACHED_DEFS_CACHE.get(CACHED_STATEMENTS, scope, null).getValue(); + IntObjectMap defsMap = CACHED_DEFS_CACHE.get(scope, null).getValue(); if (requiredName == null) { for (Object value : defsMap.values()) { @@ -1907,6 +1902,9 @@ public JavaScriptImportStatementBase getImportUsed() { public static Key contextKey = Key.create("context.key"); // JSElement or XmlElement public static class RelevantDefsUserDataCache extends UserDataCache>, JSElement, Object> { + public RelevantDefsUserDataCache(String keyName) { + super(keyName); + } @Override protected CachedValue> compute(final JSElement jsElement, final Object o) {