android: use index also to find local value resources and ids
authorEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Tue, 31 Jan 2012 12:19:16 +0000 (16:19 +0400)
committerEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Tue, 31 Jan 2012 13:01:04 +0000 (17:01 +0400)
plugins/android/src/org/jetbrains/android/AndroidResourcesLineMarkerProvider.java
plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java
plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java
plugins/android/src/org/jetbrains/android/resourceManagers/SystemResourceManager.java
plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java

index 0a29088483b38d11e71d26f9f338ee0b29c9b006..f2df753a43929d20930e8c2650e3fcca9200bcf5 100644 (file)
@@ -264,7 +264,7 @@ public class AndroidResourcesLineMarkerProvider implements LineMarkerProvider {
             if (resourceMap != null) {
               targets = new ArrayList<PsiElement>();
               if (resType.equals("id")) {
-                AndroidResourceUtil.collectIdDeclarations(fieldName, manager.getModule(), targets);
+                manager.collectIdDeclarations(fieldName, targets);
               }
               List<PsiElement> resources = resourceMap.get(new MyResourceEntry(fieldName, resType));
               if (resources != null) {
index 91ae8a93420cebe63363db38410bb8bf9a113956..5a7a1f8d265f4f8ce88fdb2e6ea528e47c3537b2 100644 (file)
@@ -27,14 +27,10 @@ import com.intellij.openapi.vfs.VfsUtil;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiFile;
-import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.psi.xml.XmlFile;
 import com.intellij.util.IncorrectOperationException;
 import com.intellij.util.containers.HashSet;
-import com.intellij.util.indexing.FileBasedIndex;
-import com.intellij.util.xml.GenericAttributeValue;
 import org.jetbrains.android.AndroidFileTemplateProvider;
-import org.jetbrains.android.AndroidIdIndex;
 import org.jetbrains.android.actions.CreateResourceFileAction;
 import org.jetbrains.android.dom.attrs.AttributeDefinitions;
 import org.jetbrains.android.dom.resources.Attr;
@@ -51,7 +47,6 @@ import org.jetbrains.annotations.Nullable;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
@@ -109,21 +104,6 @@ public class LocalResourceManager extends ResourceManager {
     return AndroidRootUtil.getResourceOverlayDirs(getModule());
   }
 
-  @NotNull
-  @Override
-  public Collection<String> getValueResourceNames(@NotNull String resourceType) {
-    final List<String> result = new ArrayList<String>();
-    
-    for (ResourceElement element : getValueResources(resourceType)) {
-      final String name = element.getName().getValue();
-      
-      if (name != null) {
-        result.add(name);
-      }
-    }
-    return result;
-  }
-
   @NotNull
   public List<ResourceElement> getValueResources(@NotNull final String resourceType) {
     return getValueResources(resourceType, null);
@@ -178,43 +158,6 @@ public class LocalResourceManager extends ResourceManager {
     myAttrDefs = null;
   }
 
-  @Nullable
-  public List<PsiElement> findIdDeclarations(@NotNull String id) {
-    List<PsiElement> declarations = new ArrayList<PsiElement>();
-    AndroidResourceUtil.collectIdDeclarations(id, myModule, declarations);
-    return declarations;
-  }
-
-  @NotNull
-  public Collection<String> getIds() {
-    List<String> result = new ArrayList<String>();
-    Project project = myModule.getProject();
-    GlobalSearchScope scope = GlobalSearchScope.projectScope(myModule.getProject());
-    for (String key : FileBasedIndex.getInstance().getAllKeys(AndroidIdIndex.INDEX_ID, project)) {
-      if (!AndroidIdIndex.MARKER.equals(key)) {
-        if (FileBasedIndex.getInstance().getValues(AndroidIdIndex.INDEX_ID, key, scope).size() > 0) {
-          result.add(key);
-        }
-      }
-    }
-    return result;
-  }
-
-  @NotNull
-  @Override
-  public List<ResourceElement> findValueResources(@NotNull String resourceType,
-                                                  @NotNull String resourceName,
-                                                  boolean distinguishDelimetersInName) {
-    List<ResourceElement> elements = new ArrayList<ResourceElement>();
-    for (ResourceElement element : getValueResources(resourceType)) {
-      GenericAttributeValue<String> name = element.getName();
-      if (name != null && equal(resourceName, name.getValue(), distinguishDelimetersInName)) {
-        elements.add(element);
-      }
-    }
-    return elements;
-  }
-
   @NotNull
   public List<Attr> findAttrs(@NotNull String name) {
     List<Attr> list = new ArrayList<Attr>();
index 1d65b487c475071f13fdb51c0ba047a2d5404285..0c69c063e21c511a4dd4da6716809dc87608968e 100644 (file)
  */
 package org.jetbrains.android.resourceManagers;
 
+import com.android.resources.ResourceType;
 import com.android.sdklib.SdkConstants;
 import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.fileTypes.StdFileTypes;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleUtil;
@@ -24,14 +26,18 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Computable;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiDirectory;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiManager;
+import com.intellij.psi.*;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.xml.XmlAttributeValue;
+import com.intellij.psi.xml.XmlFile;
 import com.intellij.psi.xml.XmlTag;
 import com.intellij.util.ArrayUtil;
+import com.intellij.util.containers.HashMap;
 import com.intellij.util.containers.HashSet;
+import com.intellij.util.indexing.FileBasedIndex;
 import com.intellij.util.xml.DomElement;
+import org.jetbrains.android.AndroidIdIndex;
+import org.jetbrains.android.AndroidValueResourcesIndex;
 import org.jetbrains.android.dom.attrs.AttributeDefinitions;
 import org.jetbrains.android.dom.resources.Item;
 import org.jetbrains.android.dom.resources.ResourceElement;
@@ -39,6 +45,7 @@ import org.jetbrains.android.dom.resources.Resources;
 import org.jetbrains.android.facet.AndroidFacet;
 import org.jetbrains.android.util.AndroidResourceUtil;
 import org.jetbrains.android.util.AndroidUtils;
+import org.jetbrains.android.util.ResourceEntry;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -50,6 +57,8 @@ import static java.util.Collections.addAll;
  * @author coyote
  */
 public abstract class ResourceManager {
+  private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.resourceManagers.LocalResourceManager");
+
   public static final Set<String> REFERABLE_RESOURCE_TYPES = new HashSet<String>();
   public static final String[] FILE_RESOURCE_TYPES = new String[]{"drawable", "anim", "layout", "values", "menu", "xml", "raw", "color"};
   public static final String[] VALUE_RESOURCE_TYPES =
@@ -178,7 +187,7 @@ public abstract class ResourceManager {
   private <T extends DomElement> List<T> getRootDomElements(@NotNull Class<T> elementType,
                                                             @Nullable Set<VirtualFile> files) {
     final List<T> result = new ArrayList<T>();
-    for (VirtualFile file : getAllResourceFiles()) {
+    for (VirtualFile file : getAllValueResourceFiles()) {
       if ((files == null || files.contains(file)) && file.isValid()) {
         T element = AndroidUtils.loadDomElement(myModule, file, elementType);
         if (element != null) result.add(element);
@@ -188,7 +197,7 @@ public abstract class ResourceManager {
   }
 
   @NotNull
-  protected Set<VirtualFile> getAllResourceFiles() {
+  protected Set<VirtualFile> getAllValueResourceFiles() {
     final Set<VirtualFile> files = new HashSet<VirtualFile>();
 
     for (VirtualFile valueResourceDir : getResourceSubdirs("values")) {
@@ -261,7 +270,48 @@ public abstract class ResourceManager {
   }
 
   @NotNull
-  public abstract Collection<String> getValueResourceNames(@NotNull final String resourceType);
+  public Collection<String> getValueResourceNames(@NotNull final String resourceType) {
+    final ResourceType type = ResourceType.getEnum(resourceType);
+
+    if (type == null) {
+      LOG.error("Unknown resource type " + resourceType);
+      return Collections.emptyList();
+    }
+
+    final FileBasedIndex index = FileBasedIndex.getInstance();
+    final ResourceEntry typeMarkerEntry = AndroidValueResourcesIndex.createTypeMarkerEntry(resourceType);
+    final GlobalSearchScope scope = GlobalSearchScope.allScope(myModule.getProject());
+
+    final Map<VirtualFile, Set<ResourceEntry>> file2resourceSet = new HashMap<VirtualFile, Set<ResourceEntry>>();
+
+    for (Set<ResourceEntry> entrySet : index.getValues(AndroidValueResourcesIndex.INDEX_ID, typeMarkerEntry, scope)) {
+      for (ResourceEntry entry : entrySet) {
+        final Collection<VirtualFile> files = index.getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, entry, scope);
+
+        for (VirtualFile file : files) {
+          Set<ResourceEntry> resourcesInFile = file2resourceSet.get(file);
+
+          if (resourcesInFile == null) {
+            resourcesInFile = new HashSet<ResourceEntry>();
+            file2resourceSet.put(file, resourcesInFile);
+          }
+          resourcesInFile.add(entry);
+        }
+      }
+    }
+    final Set<String> result = new HashSet<String>();
+
+    for (VirtualFile file : getAllValueResourceFiles()) {
+      final Set<ResourceEntry> entries = file2resourceSet.get(file);
+
+      if (entries != null) {
+        for (ResourceEntry entry : entries) {
+          result.add(entry.getName());
+        }
+      }
+    }
+    return result;
+  }
 
   @NotNull
   public static List<ResourceElement> getValueResourcesFromElement(@NotNull String resourceType, Resources resources) {
@@ -306,19 +356,91 @@ public abstract class ResourceManager {
 
   // searches only declarations such as "@+id/..."
   @Nullable
-  public abstract List<PsiElement> findIdDeclarations(@NotNull String id);
+  public List<PsiElement> findIdDeclarations(@NotNull String id) {
+    List<PsiElement> declarations = new ArrayList<PsiElement>();
+    collectIdDeclarations(id, declarations);
+    return declarations;
+  }
+
+  @NotNull
+  public Collection<String> getIds() {
+    final Project project = myModule.getProject();
+    final GlobalSearchScope scope = GlobalSearchScope.allScope(myModule.getProject());
+
+    final FileBasedIndex index = FileBasedIndex.getInstance();
+    final Map<VirtualFile, Set<String>> file2ids = new HashMap<VirtualFile, Set<String>>();
+
+    for (String key : index.getAllKeys(AndroidIdIndex.INDEX_ID, project)) {
+      if (!AndroidIdIndex.MARKER.equals(key)) {
+        if (index.getValues(AndroidIdIndex.INDEX_ID, key, scope).size() > 0) {
+
+          for (VirtualFile file : index.getContainingFiles(AndroidIdIndex.INDEX_ID, key, scope)) {
+            Set<String> ids = file2ids.get(file);
+
+            if (ids == null) {
+              ids = new HashSet<String>();
+              file2ids.put(file, ids);
+            }
+            ids.add(key);
+          }
+        }
+      }
+    }
+    final Set<String> result = new HashSet<String>();
+
+    for (VirtualFile resSubdir : getResourceSubdirsToSearchIds()) {
+      for (VirtualFile resFile : resSubdir.getChildren()) {
+        final Set<String> ids = file2ids.get(resFile);
+        
+        if (ids != null) {
+          result.addAll(ids);
+        }
+      }
+    }
+    return result;
+  }
 
   @NotNull
-  public abstract Collection<String> getIds();
+  protected List<VirtualFile> getResourceSubdirsToSearchIds() {
+    final List<VirtualFile> resSubdirs = new ArrayList<VirtualFile>();
+    resSubdirs.addAll(getResourceSubdirs(ResourceType.LAYOUT.getName()));
+    resSubdirs.addAll(getResourceSubdirs(ResourceType.MENU.getName()));
+    return resSubdirs;
+  }
 
   public List<ResourceElement> findValueResources(@NotNull String resType, @NotNull String resName) {
     return findValueResources(resType, resName, true);
   }
 
   @NotNull
-  public abstract List<ResourceElement> findValueResources(@NotNull String resourceType,
-                                                           @NotNull String resourceName,
-                                                           boolean distinguishDelimetersInName);
+  public List<ResourceElement> findValueResources(@NotNull String resourceType,
+                                                  @NotNull String resourceName,
+                                                  boolean distinguishDelimetersInName) {
+    final ResourceType type = ResourceType.getEnum(resourceType);
+    if (type == null) {
+      LOG.error("Unknown resource type " + resourceType);
+      return Collections.emptyList();
+    }
+
+    final Collection<VirtualFile> files = FileBasedIndex.getInstance()
+      .getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, new ResourceEntry(resourceType, resourceName),
+                          GlobalSearchScope.allScope(myModule.getProject()));
+
+    if (files.size() == 0) {
+      return Collections.emptyList();
+    }
+    final Set<VirtualFile> fileSet = new HashSet<VirtualFile>(files);
+    final List<ResourceElement> result = new ArrayList<ResourceElement>();
+
+    for (ResourceElement element : getValueResources(resourceType, fileSet)) {
+      final String name = element.getName().getValue();
+
+      if (equal(resourceName, name, distinguishDelimetersInName)) {
+        result.add(element);
+      }
+    }
+    return result;
+  }
 
   public static boolean isInResourceSubdirectory(@NotNull PsiFile file, @Nullable String resourceType) {
     file = file.getOriginalFile();
@@ -376,4 +498,34 @@ public abstract class ResourceManager {
   private static boolean containsAndroidJar(@NotNull PsiDirectory psiDirectory) {
     return psiDirectory.findFile(SdkConstants.FN_FRAMEWORK_LIBRARY) != null;
   }
+
+  public void collectIdDeclarations(@NotNull final String id, final List<PsiElement> targets) {
+    final Collection<VirtualFile> files =
+      FileBasedIndex.getInstance().getContainingFiles(AndroidIdIndex.INDEX_ID, id, GlobalSearchScope.allScope(myModule.getProject()));
+    final Set<VirtualFile> fileSet = new HashSet<VirtualFile>(files);
+    final PsiManager psiManager = PsiManager.getInstance(myModule.getProject());
+
+    for (VirtualFile subdir : getResourceSubdirsToSearchIds()) {
+      for (VirtualFile file : subdir.getChildren()) {
+        if (fileSet.contains(file)) {
+          final PsiFile psiFile = psiManager.findFile(file);
+
+          if (psiFile instanceof XmlFile) {
+            psiFile.accept(new XmlRecursiveElementVisitor() {
+              @Override
+              public void visitXmlAttributeValue(XmlAttributeValue attributeValue) {
+                if (AndroidResourceUtil.isIdDeclaration(attributeValue)) {
+                  final String idInAttr = AndroidResourceUtil.getResourceNameByReferenceText(attributeValue.getValue());
+
+                  if (id.equals(idInAttr)) {
+                    targets.add(attributeValue);
+                  }
+                }
+              }
+            });
+          }
+        }
+      }
+    }
+  }
 }
index a0aa3d098be882e5da918f893dc2c916c6674b39..ac61347c3c8d49b70b13bc7a6d12402ddd43855b 100644 (file)
  */
 package org.jetbrains.android.resourceManagers;
 
-import com.android.resources.ResourceType;
 import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.SdkConstants;
-import com.intellij.openapi.diagnostic.Logger;
 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.SmartPointerManager;
-import com.intellij.psi.SmartPsiElementPointer;
-import com.intellij.psi.search.GlobalSearchScope;
-import com.intellij.psi.xml.*;
-import com.intellij.util.containers.HashMap;
-import com.intellij.util.containers.HashSet;
-import com.intellij.util.indexing.FileBasedIndex;
 import com.intellij.util.xml.ConvertContext;
-import org.jetbrains.android.AndroidIdIndex;
-import org.jetbrains.android.AndroidValueResourcesIndex;
 import org.jetbrains.android.dom.attrs.AttributeDefinitions;
-import org.jetbrains.android.dom.resources.ResourceElement;
 import org.jetbrains.android.facet.AndroidFacet;
 import org.jetbrains.android.sdk.AndroidPlatform;
 import org.jetbrains.android.sdk.AndroidTargetData;
-import org.jetbrains.android.util.AndroidResourceUtil;
-import org.jetbrains.android.util.ResourceEntry;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.*;
-
 /**
  * @author coyote
  */
 public class SystemResourceManager extends ResourceManager {
-  private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.resourceManagers.SystemResourceManager");
-  
-  private volatile Map<String, List<SmartPsiElementPointer<? extends PsiElement>>> myIdMap;
-  
   private final AndroidPlatform myPlatform;
 
   public SystemResourceManager(@NotNull Module module, @NotNull AndroidPlatform androidPlatform) {
@@ -73,50 +50,6 @@ public class SystemResourceManager extends ResourceManager {
     return LocalFileSystem.getInstance().findFileByPath(resPath);
   }
 
-  @NotNull
-  @Override
-  public Collection<String> getValueResourceNames(@NotNull String resourceType) {
-    final ResourceType type = ResourceType.getEnum(resourceType);
-    
-    if (type == null) {
-      LOG.error("Unknown resource type " + resourceType);
-      return Collections.emptyList();
-    }
-
-    final FileBasedIndex index = FileBasedIndex.getInstance();
-    final ResourceEntry typeMarkerEntry = AndroidValueResourcesIndex.createTypeMarkerEntry(resourceType);
-    final GlobalSearchScope scope = GlobalSearchScope.allScope(myModule.getProject());
-    
-    final Map<VirtualFile, Set<ResourceEntry>> file2resourceSet = new HashMap<VirtualFile, Set<ResourceEntry>>();
-
-    for (Set<ResourceEntry> entrySet : index.getValues(AndroidValueResourcesIndex.INDEX_ID, typeMarkerEntry, scope)) {
-      for (ResourceEntry entry : entrySet) {
-        final Collection<VirtualFile> files = index.getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, entry, scope);
-
-        for (VirtualFile file : files) {
-          Set<ResourceEntry> resourcesInFile = file2resourceSet.get(file);
-          
-          if (resourcesInFile == null) {
-            resourcesInFile = new HashSet<ResourceEntry>();
-            file2resourceSet.put(file, resourcesInFile);
-          }
-          resourcesInFile.add(entry);
-        }
-      }
-    }
-    final Set<String> result = new HashSet<String>();
-    final Set<VirtualFile> resourceFiles = getAllResourceFiles();
-
-    for (Map.Entry<VirtualFile, Set<ResourceEntry>> entry : file2resourceSet.entrySet()) {
-      if (resourceFiles.contains(entry.getKey())) {
-        for (ResourceEntry resourceEntry : entry.getValue()) {
-          result.add(resourceEntry.getName());
-        }
-      }
-    }
-    return result;
-  }
-
   @Nullable
   public static SystemResourceManager getInstance(@NotNull ConvertContext context) {
     AndroidFacet facet = AndroidFacet.getInstance(context);
@@ -128,127 +61,4 @@ public class SystemResourceManager extends ResourceManager {
     final AndroidTargetData targetData = myPlatform.getSdk().getTargetData(myPlatform.getTarget());
     return targetData != null ? targetData.getAttrDefs(myModule.getProject()) : null;
   }
-
-  @Nullable
-  public List<PsiElement> findIdDeclarations(@NotNull String id) {
-    if (myIdMap == null) {
-      myIdMap = createIdMap();
-      return doFindIdDeclarations(id, false);
-    }
-    return doFindIdDeclarations(id, true);
-  }
-
-  private List<PsiElement> doFindIdDeclarations(@NotNull String id, boolean recreateMapIfCannotResolve) {
-    final List<SmartPsiElementPointer<? extends PsiElement>> pointers = myIdMap.get(id);
-
-    if (pointers == null || pointers.size() == 0) {
-      return Collections.emptyList();
-    }
-    final List<PsiElement> result = new ArrayList<PsiElement>();
-
-    for (SmartPsiElementPointer<? extends PsiElement> 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
-  public Collection<String> getIds() {
-    if (myIdMap == null) {
-      myIdMap = createIdMap();
-    }
-    return myIdMap.keySet();
-  }
-
-  @NotNull
-  @Override
-  public List<ResourceElement> findValueResources(@NotNull String resourceType,
-                                                  @NotNull String resourceName,
-                                                  boolean distinguishDelimetersInName) {
-    final ResourceType type = ResourceType.getEnum(resourceType);
-    if (type == null) {
-      LOG.error("Unknown resource type " + resourceType);
-      return Collections.emptyList();
-    }
-
-    final Collection<VirtualFile> files = FileBasedIndex.getInstance()
-      .getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, new ResourceEntry(resourceType, resourceName),
-                          GlobalSearchScope.allScope(myModule.getProject()));
-
-    if (files.size() == 0) {
-      return Collections.emptyList();
-    }
-    final Set<VirtualFile> fileSet = new HashSet<VirtualFile>(files);
-    final List<ResourceElement> result = new ArrayList<ResourceElement>();
-    
-    for (ResourceElement element : getValueResources(resourceType, fileSet)) {
-      final String name = element.getName().getValue();
-
-      if (equal(resourceName, name, distinguishDelimetersInName)) {
-        result.add(element);
-      }
-    }
-    return result;
-  }
-
-  @NotNull
-  public Map<String, List<SmartPsiElementPointer<? extends PsiElement>>> createIdMap() {
-    Map<String, List<SmartPsiElementPointer<? extends PsiElement>>> result = new HashMap<String, List<SmartPsiElementPointer<? extends PsiElement>>>();
-    fillIdMap(result);
-    return result;
-  }
-
-  protected void fillIdMap(@NotNull Map<String, List<SmartPsiElementPointer<? extends PsiElement>>> result) {
-    for (String resType : AndroidIdIndex.RES_TYPES_CONTAINING_ID_DECLARATIONS) {
-      List<PsiFile> resFiles = findResourceFiles(resType);
-      for (PsiFile resFile : resFiles) {
-        collectIdDeclarations(resFile, result);
-      }
-    }
-  }
-
-  protected static void collectIdDeclarations(PsiFile psiFile, Map<String, List<SmartPsiElementPointer<? extends PsiElement>>> result) {
-    if (psiFile instanceof XmlFile) {
-      XmlDocument document = ((XmlFile)psiFile).getDocument();
-      if (document != null) {
-        XmlTag rootTag = document.getRootTag();
-        if (rootTag != null) {
-          fillMapRecursively(rootTag, result);
-        }
-      }
-    }
-  }
-
-  private static void fillMapRecursively(@NotNull XmlTag tag, @NotNull Map<String, List<SmartPsiElementPointer<? extends PsiElement>>> result) {
-    XmlAttribute idAttr = tag.getAttribute("id", SdkConstants.NS_RESOURCES);
-    if (idAttr != null) {
-      XmlAttributeValue idAttrValue = idAttr.getValueElement();
-      if (idAttrValue != null) {
-        if (AndroidResourceUtil.isIdDeclaration(idAttrValue)) {
-          String id = AndroidResourceUtil.getResourceNameByReferenceText(idAttrValue.getValue());
-          if (id != null) {
-            List<SmartPsiElementPointer<? extends PsiElement>> list = result.get(id);
-            
-            if (list == null) {
-              list = new ArrayList<SmartPsiElementPointer<? extends PsiElement>>();
-              result.put(id, list);
-            }
-            final SmartPointerManager manager = SmartPointerManager.getInstance(tag.getProject());
-            list.add(manager.createSmartPsiElementPointer(idAttr));
-          }
-        }
-      }
-    }
-    for (XmlTag subtag : tag.getSubTags()) {
-      fillMapRecursively(subtag, result);
-    }
-  }
 }
index 8fe65fbb034b5664475b95d1bdd8bcbd544a6590..553fb41e9c4ab9bab2b4db8d5003c5964174bd86 100644 (file)
@@ -24,18 +24,14 @@ import com.intellij.openapi.roots.ModuleRootManager;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.*;
-import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.psi.util.PsiUtilBase;
 import com.intellij.psi.xml.XmlAttribute;
 import com.intellij.psi.xml.XmlAttributeValue;
-import com.intellij.psi.xml.XmlFile;
 import com.intellij.psi.xml.XmlTag;
 import com.intellij.util.ArrayUtil;
 import com.intellij.util.Processor;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.HashSet;
-import com.intellij.util.indexing.FileBasedIndex;
-import org.jetbrains.android.AndroidIdIndex;
 import org.jetbrains.android.dom.manifest.Manifest;
 import org.jetbrains.android.dom.resources.*;
 import org.jetbrains.android.facet.AndroidFacet;
@@ -280,7 +276,7 @@ public class AndroidResourceUtil {
     if (type != null) {
       String name = field.getName();
       if (type.equals("id")) {
-        collectIdDeclarations(name, manager.getModule(), targets);
+        manager.collectIdDeclarations(name, targets);
       }
       for (PsiFile file : manager.findResourceFiles(type, name, false)) {
         targets.add(file);
@@ -368,28 +364,6 @@ public class AndroidResourceUtil {
     return null;
   }
 
-  public static void collectIdDeclarations(@NotNull final String id, Module module, final List<PsiElement> targets) {
-    Collection<VirtualFile> files =
-      FileBasedIndex.getInstance().getContainingFiles(AndroidIdIndex.INDEX_ID, id, GlobalSearchScope.projectScope(module.getProject()));
-    PsiManager psiManager = PsiManager.getInstance(module.getProject());
-    for (VirtualFile file : files) {
-      PsiFile psiFile = psiManager.findFile(file);
-      if (psiFile instanceof XmlFile) {
-        psiFile.accept(new XmlRecursiveElementVisitor() {
-          @Override
-          public void visitXmlAttributeValue(XmlAttributeValue attributeValue) {
-            if (isIdDeclaration(attributeValue)) {
-              String idInAttr = getResourceNameByReferenceText(attributeValue.getValue());
-              if (id.equals(idInAttr)) {
-                targets.add(attributeValue);
-              }
-            }
-          }
-        });
-      }
-    }
-  }
-
   public static boolean isRJavaField(@NotNull PsiFile file, @NotNull PsiField field) {
     PsiClass aClass = field.getContainingClass();
     if (aClass != null) {