Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Unified Diff: pkg/analysis_server/lib/src/services/index/store/split_store.dart

Issue 1075773002: Use file/offset/kind triplet as elements id. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analysis_server/lib/src/services/index/store/split_store.dart
diff --git a/pkg/analysis_server/lib/src/services/index/store/split_store.dart b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
index ab2f025b800b4b2ecb767709dda4d0f8514bc177..6610d8afd1961e51636fc6ebee8fb25614b77ff3 100644
--- a/pkg/analysis_server/lib/src/services/index/store/split_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
@@ -17,20 +17,24 @@ import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/java_engine.dart';
import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
class _TopElementData {
final String name;
- final int elementId;
+ final int elementId1;
Brian Wilkerson 2015/04/09 14:06:25 More meaningful names would be good here (and belo
+ final int elementId2;
+ final int elementId3;
factory _TopElementData(ElementCodec elementCodec, Element element) {
- return new _TopElementData._(
- element.name, elementCodec.encode(element, false));
+ return new _TopElementData._(element.name, elementCodec.encode1(element),
+ elementCodec.encode2(element), elementCodec.encode3(element));
}
- _TopElementData._(this.name, this.elementId);
+ _TopElementData._(
+ this.name, this.elementId1, this.elementId2, this.elementId3);
Element getElement(AnalysisContext context, ElementCodec elementCodec) {
- return elementCodec.decode(context, elementId);
+ return elementCodec.decode(context, elementId1, elementId2, elementId3);
}
}
@@ -156,17 +160,23 @@ class FileNodeManager implements NodeManager {
}
RelationKeyData _readElementRelationKey(_DataInputStream stream) {
- int elementId = stream.readInt();
+ int elementId1 = stream.readInt();
+ int elementId2 = stream.readInt();
+ int elementId3 = stream.readInt();
int relationshipId = stream.readInt();
- return new RelationKeyData.forData(elementId, relationshipId);
+ return new RelationKeyData.forData(
+ elementId1, elementId2, elementId3, relationshipId);
}
LocationData _readLocationData(_DataInputStream stream) {
- int elementId = stream.readInt();
+ int elementId1 = stream.readInt();
+ int elementId2 = stream.readInt();
+ int elementId3 = stream.readInt();
int offset = stream.readInt();
int length = stream.readInt();
int flags = stream.readInt();
- return new LocationData.forData(elementId, offset, length, flags);
+ return new LocationData.forData(
+ elementId1, elementId2, elementId3, offset, length, flags);
}
IndexNode _readNode(_DataInputStream stream) {
@@ -204,7 +214,9 @@ class FileNodeManager implements NodeManager {
}
void _writeElementRelationKey(_DataOutputStream stream, RelationKeyData key) {
- stream.writeInt(key.elementId);
+ stream.writeInt(key.elementId1);
+ stream.writeInt(key.elementId2);
+ stream.writeInt(key.elementId3);
stream.writeInt(key.relationshipId);
}
@@ -224,7 +236,9 @@ class FileNodeManager implements NodeManager {
_writeElementRelationKey(stream, key);
stream.writeInt(locations.length);
for (LocationData location in locations) {
- stream.writeInt(location.elementId);
+ stream.writeInt(location.elementId1);
+ stream.writeInt(location.elementId2);
+ stream.writeInt(location.elementId3);
stream.writeInt(location.offset);
stream.writeInt(location.length);
stream.writeInt(location.flags);
@@ -305,18 +319,19 @@ class IndexNode {
*/
List<InspectLocation> inspect_getRelations(String name, int elementId) {
List<InspectLocation> result = <InspectLocation>[];
- _relations.forEach((RelationKeyData key, locations) {
- if (key.elementId == elementId) {
- for (LocationData location in locations) {
- Relationship relationship =
- _relationshipCodec.decode(key.relationshipId);
- List<String> path =
- _elementCodec.inspect_decodePath(location.elementId);
- result.add(new InspectLocation(name, relationship, path,
- location.offset, location.length, location.flags));
- }
- }
- });
+ // TODO(scheglov) restore index inspections?
+// _relations.forEach((RelationKeyData key, locations) {
+// if (key.elementId == elementId) {
+// for (LocationData location in locations) {
+// Relationship relationship =
+// _relationshipCodec.decode(key.relationshipId);
+// List<String> path =
+// _elementCodec.inspect_decodePath(location.elementId);
+// result.add(new InspectLocation(name, relationship, path,
+// location.offset, location.length, location.flags));
+// }
+// }
+// });
return result;
}
@@ -361,15 +376,20 @@ class LocationData {
static const int _FLAG_QUALIFIED = 1 << 0;
static const int _FLAG_RESOLVED = 1 << 1;
- final int elementId;
+ final int elementId1;
+ final int elementId2;
+ final int elementId3;
final int offset;
final int length;
final int flags;
- LocationData.forData(this.elementId, this.offset, this.length, this.flags);
+ LocationData.forData(this.elementId1, this.elementId2, this.elementId3,
+ this.offset, this.length, this.flags);
LocationData.forObject(ElementCodec elementCodec, Location location)
- : elementId = elementCodec.encode(location.element, false),
+ : elementId1 = elementCodec.encode1(location.element),
+ elementId2 = elementCodec.encode2(location.element),
+ elementId3 = elementCodec.encode3(location.element),
offset = location.offset,
length = location.length,
flags = (location.isQualified ? _FLAG_QUALIFIED : 0) |
@@ -377,7 +397,13 @@ class LocationData {
@override
int get hashCode {
- return 31 * (31 * elementId + offset) + length;
+ int hash = 0;
+ hash = JenkinsSmiHash.combine(hash, elementId1);
+ hash = JenkinsSmiHash.combine(hash, elementId2);
+ hash = JenkinsSmiHash.combine(hash, elementId3);
+ hash = JenkinsSmiHash.combine(hash, offset);
+ hash = JenkinsSmiHash.combine(hash, length);
+ return JenkinsSmiHash.finish(hash);
}
@override
@@ -386,7 +412,9 @@ class LocationData {
return false;
}
LocationData other = obj;
- return other.elementId == elementId &&
+ return other.elementId1 == elementId1 &&
+ other.elementId2 == elementId2 &&
+ other.elementId3 == elementId3 &&
other.offset == offset &&
other.length == length &&
other.flags == flags;
@@ -396,7 +424,8 @@ class LocationData {
* Returns a {@link Location} that is represented by this {@link LocationData}.
*/
Location getLocation(AnalysisContext context, ElementCodec elementCodec) {
- Element element = elementCodec.decode(context, elementId);
+ Element element =
+ elementCodec.decode(context, elementId1, elementId2, elementId3);
if (element == null) {
return null;
}
@@ -461,20 +490,35 @@ abstract class NodeManager {
* An [Element] to [Location] relation key.
*/
class RelationKeyData {
- final int elementId;
+ final int elementId1;
+ final int elementId2;
+ final int elementId3;
final int relationshipId;
- RelationKeyData.forData(this.elementId, this.relationshipId);
+ RelationKeyData.forData(
+ this.elementId1, this.elementId2, this.elementId3, this.relationshipId);
RelationKeyData.forObject(ElementCodec elementCodec,
RelationshipCodec relationshipCodec, Element element,
Relationship relationship)
- : elementId = elementCodec.encode(element, true),
+ : elementId1 = elementCodec.encode1(element),
+ elementId2 = elementCodec.encode2(element),
+ elementId3 = elementCodec.encode3(element),
relationshipId = relationshipCodec.encode(relationship);
@override
int get hashCode {
- return 31 * elementId + relationshipId;
+ int hash = 0;
+ hash = JenkinsSmiHash.combine(hash, elementId1);
+ hash = JenkinsSmiHash.combine(hash, elementId2);
+ hash = JenkinsSmiHash.combine(hash, elementId3);
+ hash = JenkinsSmiHash.combine(hash, relationshipId);
+ return JenkinsSmiHash.finish(hash);
+ }
+
+ @override
+ String toString() {
+ return 'Key($elementId2, $elementId2, $elementId3, $relationshipId)';
}
@override
@@ -483,7 +527,9 @@ class RelationKeyData {
return false;
}
RelationKeyData other = obj;
- return other.elementId == elementId &&
+ return other.elementId1 == elementId1 &&
+ other.elementId2 == elementId2 &&
+ other.elementId3 == elementId3 &&
other.relationshipId == relationshipId;
}
}
@@ -746,42 +792,44 @@ class SplitIndexStore implements IndexStore {
String name) {
Map<List<String>, List<InspectLocation>> result =
<List<String>, List<InspectLocation>>{};
- // prepare elements
- Map<int, List<String>> elementMap = _elementCodec.inspect_getElements(name);
- // prepare relations with each element
- List<Future> futures = <Future>[];
- if (_nodeManager is FileNodeManager) {
- List<String> nodeNames =
- (_nodeManager as FileNodeManager).inspect_getAllNodeNames();
- nodeNames.forEach((nodeName) {
- Future<IndexNode> nodeFuture = _nodeManager.getNode(nodeName);
- Future relationsFuture = nodeFuture.then((node) {
- if (node != null) {
- elementMap.forEach((int elementId, List<String> elementPath) {
- List<InspectLocation> relations =
- node.inspect_getRelations(nodeName, elementId);
- List<InspectLocation> resultLocations = result[elementPath];
- if (resultLocations == null) {
- resultLocations = <InspectLocation>[];
- result[elementPath] = resultLocations;
- }
- resultLocations.addAll(relations);
- });
- }
- });
- futures.add(relationsFuture);
- });
- }
- // wait for all nodex
- return Future.wait(futures).then((_) {
- return result;
- });
+ // TODO(scheglov) restore index inspections?
+ return new Future.value(result);
+// // prepare elements
+// Map<int, List<String>> elementMap = _elementCodec.inspect_getElements(name);
+// // prepare relations with each element
+// List<Future> futures = <Future>[];
+// if (_nodeManager is FileNodeManager) {
+// List<String> nodeNames =
+// (_nodeManager as FileNodeManager).inspect_getAllNodeNames();
+// nodeNames.forEach((nodeName) {
+// Future<IndexNode> nodeFuture = _nodeManager.getNode(nodeName);
+// Future relationsFuture = nodeFuture.then((node) {
+// if (node != null) {
+// elementMap.forEach((int elementId, List<String> elementPath) {
+// List<InspectLocation> relations =
+// node.inspect_getRelations(nodeName, elementId);
+// List<InspectLocation> resultLocations = result[elementPath];
+// if (resultLocations == null) {
+// resultLocations = <InspectLocation>[];
+// result[elementPath] = resultLocations;
+// }
+// resultLocations.addAll(relations);
+// });
+// }
+// });
+// futures.add(relationsFuture);
+// });
+// }
+// // wait for all nodex
+// return Future.wait(futures).then((_) {
+// return result;
+// });
}
@override
void recordRelationship(
Element element, Relationship relationship, Location location) {
- if (element == null || element.location == null) {
+ if (element == null || element is MultiplyDefinedElement) {
return;
}
if (location == null) {

Powered by Google App Engine
This is Rietveld 408576698