Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/MemoryIndexStoreImpl.java |
diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/MemoryIndexStoreImpl.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/MemoryIndexStoreImpl.java |
index 48d01bbf77a934930941e1f85f178589334519d3..ba6ba3ebf085ead7e89a05a5592b5e01a06043dd 100644 |
--- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/MemoryIndexStoreImpl.java |
+++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/MemoryIndexStoreImpl.java |
@@ -13,9 +13,12 @@ |
*/ |
package com.google.dart.engine.internal.index; |
+import com.google.common.annotations.VisibleForTesting; |
import com.google.common.collect.Lists; |
import com.google.common.collect.Maps; |
+import com.google.common.collect.Sets; |
import com.google.dart.engine.element.ElementLocation; |
+import com.google.dart.engine.element.ElementProxy; |
import com.google.dart.engine.index.IndexStore; |
import com.google.dart.engine.index.Location; |
import com.google.dart.engine.index.MemoryIndexStore; |
@@ -24,7 +27,7 @@ import com.google.dart.engine.source.Source; |
import java.io.IOException; |
import java.io.InputStream; |
-import java.io.ObjectOutputStream; |
+import java.io.OutputStream; |
import java.util.List; |
import java.util.Map; |
import java.util.Set; |
@@ -33,18 +36,6 @@ import java.util.Set; |
* {@link IndexStore} which keeps full index in memory. |
*/ |
public class MemoryIndexStoreImpl implements MemoryIndexStore { |
-// /** |
-// * @return the {@link Source} which contains given {@link Element}, may be <code>null</code>. |
-// */ |
-// private static Source getSource(Element element) { |
-// while (element != null) { |
-// if (element instanceof CompilationUnitElement) { |
-// return ((CompilationUnitElement) element).getSource(); |
-// } |
-// element = element.getEnclosingElement(); |
-// } |
-// return null; |
-// } |
/** |
* A table mapping elements to tables mapping relationships to lists of locations. |
@@ -52,38 +43,53 @@ public class MemoryIndexStoreImpl implements MemoryIndexStore { |
private Map<ElementLocation, Map<Relationship, List<ContributedLocation>>> relationshipMap = Maps.newHashMapWithExpectedSize(4096); |
/** |
- * A table mapping the resources that are known to the index to a set of the elements known to be |
- * in those resources. |
+ * A set of all {@link Source}s with elements or relationships. |
*/ |
- private Map<Source, Set<ElementLocation>> sourceToElementsMap = Maps.newHashMapWithExpectedSize(1024); |
+ private Set<Source> sources = Sets.newHashSetWithExpectedSize(1024); |
/** |
- * Contains {@link ContributedLocation}s contributed by their |
- * {@link ContributedLocation#getContributor()}. |
+ * {@link ElementLocation}s by {@link Source} where they are declared. |
*/ |
- private Map<Source, List<ContributedLocation>> contributorToContributedLocations = Maps.newHashMap(); |
+ private Map<Source, List<ElementLocation>> sourceToDeclarations = Maps.newHashMapWithExpectedSize(1024); |
+ |
+ /** |
+ * {@link ContributedLocation}s by {@link Source} where they are contributed. |
+ */ |
+ private Map<Source, List<ContributedLocation>> sourceToLocations = Maps.newHashMapWithExpectedSize(1024); |
@Override |
public void clear() { |
- // TODO(scheglov) |
- throw new UnsupportedOperationException(); |
+ relationshipMap.clear(); |
} |
@Override |
public int getElementCount() { |
- // TODO(scheglov) |
- throw new UnsupportedOperationException(); |
+ return relationshipMap.size(); |
+ } |
+ |
+ @VisibleForTesting |
+ public int getLocationCount() { |
+ int count = 0; |
+ for (List<ContributedLocation> contributedLocations : sourceToLocations.values()) { |
+ count += contributedLocations.size(); |
+ } |
+ return count; |
} |
@Override |
public int getRelationshipCount() { |
- // TODO(scheglov) |
- throw new UnsupportedOperationException(); |
+ int count = 0; |
+ for (Map<Relationship, List<ContributedLocation>> elementRelationshipMap : relationshipMap.values()) { |
+ for (List<ContributedLocation> contributedLocations : elementRelationshipMap.values()) { |
+ count += contributedLocations.size(); |
+ } |
+ } |
+ return count; |
} |
@Override |
- public Location[] getRelationships(ElementLocation elementLocation, Relationship relationship) { |
- Map<Relationship, List<ContributedLocation>> elementRelationshipMap = relationshipMap.get(elementLocation); |
+ public Location[] getRelationships(ElementProxy element, Relationship relationship) { |
+ Map<Relationship, List<ContributedLocation>> elementRelationshipMap = relationshipMap.get(element.getLocation()); |
if (elementRelationshipMap != null) { |
List<ContributedLocation> contributedLocations = elementRelationshipMap.get(relationship); |
if (contributedLocations != null) { |
@@ -99,9 +105,8 @@ public class MemoryIndexStoreImpl implements MemoryIndexStore { |
} |
@Override |
- public int getResourceCount() { |
- // TODO(scheglov) |
- throw new UnsupportedOperationException(); |
+ public int getSourceCount() { |
+ return sources.size(); |
} |
@Override |
@@ -111,48 +116,79 @@ public class MemoryIndexStoreImpl implements MemoryIndexStore { |
} |
@Override |
- public void recordRelationship(Source contributor, ElementLocation element, |
- Relationship relationship, Location location) { |
- if (contributor == null || element == null || location == null) { |
+ public void recordRelationship(ElementProxy element, Relationship relationship, Location location) { |
+ if (element == null || location == null) { |
return; |
} |
-// recordElement(element); |
-// recordElement(location.getElement()); |
+ // prepare information |
+ ElementLocation elementLocation = element.getLocation(); |
+ Source elementSource = element.getSource(); |
+ Source locationSource = location.getElement().getSource(); |
+ // remember sources |
+ sources.add(elementSource); |
+ sources.add(locationSource); |
+ recordSourceToDeclarations(elementSource, elementLocation); |
+ // |
+ List<ContributedLocation> locationsOfLocationSource = sourceToLocations.get(locationSource); |
+ if (locationsOfLocationSource == null) { |
+ locationsOfLocationSource = Lists.newArrayList(); |
+ sourceToLocations.put(locationSource, locationsOfLocationSource); |
+ } |
// add ContributedLocation for "element" |
- ContributedLocation contributedLocation; |
{ |
- Map<Relationship, List<ContributedLocation>> elementRelationshipMap = relationshipMap.get(element); |
- if (elementRelationshipMap == null) { |
- elementRelationshipMap = Maps.newHashMap(); |
- relationshipMap.put(element, elementRelationshipMap); |
+ Map<Relationship, List<ContributedLocation>> elementRelMap = relationshipMap.get(elementLocation); |
+ if (elementRelMap == null) { |
+ elementRelMap = Maps.newHashMap(); |
+ relationshipMap.put(elementLocation, elementRelMap); |
} |
- List<ContributedLocation> locations = elementRelationshipMap.get(relationship); |
+ List<ContributedLocation> locations = elementRelMap.get(relationship); |
if (locations == null) { |
locations = Lists.newArrayList(); |
- elementRelationshipMap.put(relationship, locations); |
+ elementRelMap.put(relationship, locations); |
} |
- contributedLocation = new ContributedLocation(locations, contributor, location); |
+ new ContributedLocation(locationsOfLocationSource, locations, location); |
} |
- // add to "contributor" -> "locations" map |
-// recordContributorToLocation(contributor, contributedLocation); |
} |
@Override |
- public void regenerateResource(Source source) { |
- // TODO(scheglov) |
- throw new UnsupportedOperationException(); |
+ public void removeSource(Source source) { |
+ sources.remove(source); |
+ // remove relationships with elements in removed source |
+ List<ElementLocation> declaredElements = sourceToDeclarations.remove(source); |
+ if (declaredElements != null) { |
+ for (ElementLocation elementLocation : declaredElements) { |
+ Map<Relationship, List<ContributedLocation>> elementRelationshipMap = relationshipMap.remove(elementLocation); |
+ if (elementRelationshipMap != null) { |
+ for (List<ContributedLocation> contributedLocations : elementRelationshipMap.values()) { |
+ for (ContributedLocation contributedLocation : contributedLocations) { |
+ contributedLocation.getDeclarationOwner().remove(contributedLocation); |
+ } |
+ } |
+ } |
+ } |
+ } |
+ // remove relationships in removed source |
+ List<ContributedLocation> contributedLocations = sourceToLocations.remove(source); |
+ if (contributedLocations != null) { |
+ for (ContributedLocation contributedLocation : contributedLocations) { |
+ contributedLocation.getLocationOwner().remove(contributedLocation); |
+ } |
+ } |
} |
@Override |
- public void removeResource(Source source) { |
+ public void writeIndex(OutputStream output) throws IOException { |
// TODO(scheglov) |
throw new UnsupportedOperationException(); |
} |
- @Override |
- public void writeIndex(ObjectOutputStream output) throws IOException { |
- // TODO(scheglov) |
- throw new UnsupportedOperationException(); |
+ private void recordSourceToDeclarations(Source elementSource, ElementLocation elementLocation) { |
+ List<ElementLocation> declaredElements = sourceToDeclarations.get(elementSource); |
+ if (declaredElements == null) { |
+ declaredElements = Lists.newArrayList(); |
+ sourceToDeclarations.put(elementSource, declaredElements); |
+ } |
+ declaredElements.add(elementLocation); |
} |
// /** |
@@ -162,7 +198,6 @@ public class MemoryIndexStoreImpl implements MemoryIndexStore { |
// super(); |
// } |
// |
-// // TODO(scheglov) read/write |
//// /** |
//// * Return a reader that can read the contents of this index from a stream. |
//// * |