diff --git a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java index ef99dd9ca491..3768872a5c30 100644 --- a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java @@ -128,7 +128,7 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements return component; } - protected void disposeComponents() { + protected synchronized void disposeComponents() { assert !myDisposeCompleted : "Already disposed!"; final List components = myComponentsRegistry.getRegisteredImplementations(); diff --git a/platform/util/src/com/intellij/util/lang/JarMemoryLoader.java b/platform/util/src/com/intellij/util/lang/JarMemoryLoader.java index 44628c743e82..742959cb1ae8 100644 --- a/platform/util/src/com/intellij/util/lang/JarMemoryLoader.java +++ b/platform/util/src/com/intellij/util/lang/JarMemoryLoader.java @@ -56,6 +56,7 @@ public class JarMemoryLoader { JarMemoryLoader loader = new JarMemoryLoader(); for (int i = 0; i < size; i++) { ZipEntry entry = zipStream.getNextEntry(); + if (entry == null) return loader; byte[] content = FileUtil.loadBytes(zipStream, (int)entry.getSize()); MyResource resource = new MyResource(entry.getName(), new URL(baseUrl, entry.getName()), content); loader.myResources.put(entry.getName(), resource); diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java index c648003b4bea..fe558eeb8b39 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java @@ -92,6 +92,22 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag { private final int myHC = ourHC++; private static final RecursionGuard ourGuard = RecursionManager.createGuard("xmlTag"); + private static final Key> SUBTAGS_KEY = Key.create("subtags"); + private static final ParameterizedCachedValueProvider CACHED_VALUE_PROVIDER = + new ParameterizedCachedValueProvider() { + @Override + public CachedValueProvider.Result compute(XmlTagImpl tag) { + final List result = new ArrayList(); + + tag.fillSubTags(result); + + final int s = result.size(); + XmlTag[] tags = s > 0 ? ContainerUtil.toArray(result, new XmlTag[s]) : EMPTY; + return CachedValueProvider.Result + .create(tags, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, tag.getContainingFile()); + } + }; + @Override public final int hashCode() { return myHC; @@ -606,19 +622,7 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag { @NotNull public XmlTag[] getSubTags() { - return CachedValuesManager.getManager(getProject()).getCachedValue(this, new CachedValueProvider() { - @Override - public Result compute() { - final List result = new ArrayList(); - - fillSubTags(result); - - final int s = result.size(); - XmlTag[] tags = s > 0 ? ContainerUtil.toArray(result, new XmlTag[s]) : EMPTY; - return Result.create(tags, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, getContainingFile()); - - } - }); + return CachedValuesManager.getManager(getProject()).getParameterizedCachedValue(this, SUBTAGS_KEY, CACHED_VALUE_PROVIDER, false, this); } protected void fillSubTags(final List result) {