diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java index d010e1b33a83..d114a69b3100 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java @@ -19,11 +19,10 @@ import com.google.common.collect.Maps; import com.intellij.openapi.util.Key; import com.intellij.psi.*; import com.intellij.psi.scope.PsiScopeProcessor; -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.util.containers.ConcurrentFactoryMap; +import com.intellij.util.containers.ConcurrentSoftHashMap; import org.jetbrains.plugins.groovy.dsl.CustomMembersGenerator; import org.jetbrains.plugins.groovy.dsl.GroovyClassDescriptor; import org.jetbrains.plugins.groovy.extensions.NamedArgumentDescriptor; @@ -41,23 +40,24 @@ public class NonCodeMembersHolder implements CustomMembersHolder { public static final Key DOCUMENTATION = Key.create("GdslDocumentation"); public static final Key DOCUMENTATION_URL = Key.create("GdslDocumentationUrl"); private final List myMethods = new ArrayList(); - private static final Key, NonCodeMembersHolder>>> CACHED_HOLDERS = Key.create("CACHED_HOLDERS"); public static NonCodeMembersHolder generateMembers(Set methods, final PsiFile place) { - return CachedValuesManager.getManager(place.getProject()).getCachedValue(place, CACHED_HOLDERS, new CachedValueProvider, NonCodeMembersHolder>>() { - public Result, NonCodeMembersHolder>> compute() { - final ConcurrentFactoryMap, NonCodeMembersHolder> map = new ConcurrentFactoryMap, NonCodeMembersHolder>() { - @Override - protected NonCodeMembersHolder create(Set key) { - return new NonCodeMembersHolder(key, place); - } - }; + Map, NonCodeMembersHolder> map = CachedValuesManager.getManager(place.getProject()).getCachedValue( + place, new CachedValueProvider, NonCodeMembersHolder>>() { + public Result, NonCodeMembersHolder>> compute() { + final Map, NonCodeMembersHolder> map = new ConcurrentSoftHashMap, NonCodeMembersHolder>(); return Result.create(map, PsiModificationTracker.MODIFICATION_COUNT); } - }, false).get(methods); + }); + + NonCodeMembersHolder result = map.get(methods); + if (result == null) { + map.put(methods, result = new NonCodeMembersHolder(methods, place)); + } + return result; } - public NonCodeMembersHolder(Set data, PsiElement place) { + private NonCodeMembersHolder(Set data, PsiElement place) { final PsiManager manager = place.getManager(); for (Map prop : data) { String name = String.valueOf(prop.get("name"));