diff --git a/xml/impl/src/com/intellij/xml/util/AnchorReference.java b/xml/impl/src/com/intellij/xml/util/AnchorReference.java index 0b7d24be0a11..a68fd43bfb45 100644 --- a/xml/impl/src/com/intellij/xml/util/AnchorReference.java +++ b/xml/impl/src/com/intellij/xml/util/AnchorReference.java @@ -122,29 +122,7 @@ class AnchorReference implements PsiReference, EmptyResolveMessageProvider { if (file != null) { CachedValue> value = file.getUserData(ourCachedIdsKey); if (value == null) { - value = CachedValuesManager.getManager(file.getProject()).createCachedValue(new CachedValueProvider>() { - public Result> compute() { - final Map resultMap = new HashMap(); - XmlDocument document = HtmlUtil.getRealXmlDocument(file.getDocument()); - final XmlTag rootTag = document != null ? document.getRootTag():null; - - if (rootTag != null) { - processXmlElements(rootTag, - new PsiElementProcessor() { - public boolean execute(final PsiElement element) { - final String anchorValue = element instanceof XmlTag ? getAnchorValue((XmlTag)element):null; - - if (anchorValue!=null) { - resultMap.put(anchorValue, (XmlTag)element); - } - return true; - } - } - ); - } - return new Result>(resultMap, file); - } - }, false); + value = CachedValuesManager.getManager(file.getProject()).createCachedValue(new MapCachedValueProvider(file), false); file.putUserData(ourCachedIdsKey, value); } @@ -239,4 +217,35 @@ class AnchorReference implements PsiReference, EmptyResolveMessageProvider { XmlBundle.message("cannot.resolve.anchor", myAnchor) : XmlBundle.message("cannot.resolve.anchor.in.file", myAnchor, xmlFile.getName()); } + + // separate static class to avoid memory leak via this$0 + private static class MapCachedValueProvider implements CachedValueProvider> { + private final XmlFile myFile; + + public MapCachedValueProvider(XmlFile file) { + myFile = file; + } + + public Result> compute() { + final Map resultMap = new HashMap(); + XmlDocument document = HtmlUtil.getRealXmlDocument(myFile.getDocument()); + final XmlTag rootTag = document != null ? document.getRootTag():null; + + if (rootTag != null) { + processXmlElements(rootTag, + new PsiElementProcessor() { + public boolean execute(final PsiElement element) { + final String anchorValue = element instanceof XmlTag ? getAnchorValue((XmlTag)element):null; + + if (anchorValue!=null) { + resultMap.put(anchorValue, (XmlTag)element); + } + return true; + } + } + ); + } + return new Result>(resultMap, myFile); + } + } }