From 555157456ae535bab0f9beb92145a0579c78e710 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Sun, 29 Jan 2012 17:30:36 +0400 Subject: [PATCH] use smart pointers instead of hard links --- .../SystemResourceManager.java | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/SystemResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/SystemResourceManager.java index ca635ac257f3..44097526c0f6 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/SystemResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/SystemResourceManager.java @@ -20,8 +20,7 @@ import com.android.sdklib.SdkConstants; import com.intellij.openapi.module.Module; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; +import com.intellij.psi.*; import com.intellij.psi.xml.*; import com.intellij.util.xml.ConvertContext; import org.jetbrains.android.AndroidIdIndex; @@ -39,7 +38,7 @@ import java.util.*; * @author coyote */ public class SystemResourceManager extends ResourceManager { - private volatile Map> myIdMap; + private volatile Map>> myIdMap; private final AndroidPlatform myPlatform; @@ -76,8 +75,31 @@ public class SystemResourceManager extends ResourceManager { public List findIdDeclarations(@NotNull String id) { if (myIdMap == null) { myIdMap = createIdMap(); + return doFindIdDeclarations(id, false); } - return myIdMap.get(id); + return doFindIdDeclarations(id, true); + } + + private List doFindIdDeclarations(@NotNull String id, boolean recreateMapIfCannotResolve) { + final List> pointers = myIdMap.get(id); + + if (pointers == null || pointers.size() == 0) { + return Collections.emptyList(); + } + final List result = new ArrayList(); + + for (SmartPsiElementPointer pointer : pointers) { + final PsiElement element = pointer.getElement(); + + if (element != null) { + result.add(element); + } + else if (recreateMapIfCannotResolve) { + myIdMap = createIdMap(); + return doFindIdDeclarations(id, false); + } + } + return result; } @NotNull @@ -89,13 +111,13 @@ public class SystemResourceManager extends ResourceManager { } @NotNull - public Map> createIdMap() { - Map> result = new HashMap>(); + public Map>> createIdMap() { + Map>> result = new HashMap>>(); fillIdMap(result); return result; } - protected void fillIdMap(@NotNull Map> result) { + protected void fillIdMap(@NotNull Map>> result) { for (String resType : AndroidIdIndex.RES_TYPES_CONTAINING_ID_DECLARATIONS) { List resFiles = findResourceFiles(resType); for (PsiFile resFile : resFiles) { @@ -104,7 +126,7 @@ public class SystemResourceManager extends ResourceManager { } } - protected static void collectIdDeclarations(PsiFile psiFile, Map> result) { + protected static void collectIdDeclarations(PsiFile psiFile, Map>> result) { if (psiFile instanceof XmlFile) { XmlDocument document = ((XmlFile)psiFile).getDocument(); if (document != null) { @@ -116,7 +138,7 @@ public class SystemResourceManager extends ResourceManager { } } - private static void fillMapRecursively(@NotNull XmlTag tag, Map> result) { + private static void fillMapRecursively(@NotNull XmlTag tag, @NotNull Map>> result) { XmlAttribute idAttr = tag.getAttribute("id", SdkConstants.NS_RESOURCES); if (idAttr != null) { XmlAttributeValue idAttrValue = idAttr.getValueElement(); @@ -124,12 +146,14 @@ public class SystemResourceManager extends ResourceManager { if (AndroidResourceUtil.isIdDeclaration(idAttrValue)) { String id = AndroidResourceUtil.getResourceNameByReferenceText(idAttrValue.getValue()); if (id != null) { - List list = result.get(id); + List> list = result.get(id); + if (list == null) { - list = new ArrayList(); + list = new ArrayList>(); result.put(id, list); } - list.add(idAttrValue); + final SmartPointerManager manager = SmartPointerManager.getInstance(tag.getProject()); + list.add(manager.createSmartPsiElementPointer(idAttr)); } } }