Index: pkg/analysis_server/lib/src/services/index/index.dart |
diff --git a/pkg/analysis_server/lib/src/services/index/index.dart b/pkg/analysis_server/lib/src/services/index/index.dart |
index 7270ac241aec63b6d5f45d6e6bf2c269bff5fbdc..aa0663732fc6225d45e8868f8ce76f3edd5d6fba 100644 |
--- a/pkg/analysis_server/lib/src/services/index/index.dart |
+++ b/pkg/analysis_server/lib/src/services/index/index.dart |
@@ -341,24 +341,39 @@ class _PackageIndexRequester { |
* [element] is not referenced in the [index]. |
*/ |
int findElementId(Element element) { |
+ IndexElementInfo info = new IndexElementInfo(element); |
+ element = info.element; |
// Find the id of the element's unit. |
int unitId = getUnitId(element); |
if (unitId == -1) { |
return -1; |
} |
// Prepare information about the element. |
- ElementInfo info = PackageIndexAssembler.newElementInfo(unitId, element); |
- // Find the first occurrence of an element with the same offset. |
- int elementId = _findFirstOccurrence(index.elementOffsets, info.offset); |
+ int unitMemberId = getElementUnitMemberId(element); |
+ if (unitMemberId == -1) { |
+ return -1; |
+ } |
+ int classMemberId = getElementClassMemberId(element); |
+ if (classMemberId == -1) { |
+ return -1; |
+ } |
+ int parameterId = getElementParameterId(element); |
+ if (parameterId == -1) { |
+ return -1; |
+ } |
+ // Try to find the element id using classMemberId, parameterId, and kind. |
+ int elementId = |
+ _findFirstOccurrence(index.elementNameUnitMemberIds, unitMemberId); |
if (elementId == -1) { |
return -1; |
} |
- // Try to find the element id using offset, unit and kind. |
for (; |
- elementId < index.elementOffsets.length && |
- index.elementOffsets[elementId] == info.offset; |
+ elementId < index.elementNameUnitMemberIds.length && |
+ index.elementNameUnitMemberIds[elementId] == unitMemberId; |
elementId++) { |
if (index.elementUnits[elementId] == unitId && |
+ index.elementNameClassMemberIds[elementId] == classMemberId && |
+ index.elementNameParameterIds[elementId] == parameterId && |
index.elementKinds[elementId] == info.kind) { |
return elementId; |
} |
@@ -383,6 +398,45 @@ class _PackageIndexRequester { |
} |
/** |
+ * Return the [element]'s class member name identifier, `null` is not a class |
+ * member, or `-1` if the [element] is not referenced in the [index]. |
+ */ |
+ int getElementClassMemberId(Element element) { |
+ for (; element != null; element = element.enclosingElement) { |
+ if (element.enclosingElement is ClassElement) { |
+ return getStringId(element.name); |
+ } |
+ } |
+ return getStringId(PackageIndexAssembler.NULL_STRING); |
+ } |
+ |
+ /** |
+ * Return the [element]'s class member name identifier, `null` is not a class |
+ * member, or `-1` if the [element] is not referenced in the [index]. |
+ */ |
+ int getElementParameterId(Element element) { |
+ for (; element != null; element = element.enclosingElement) { |
+ if (element is ParameterElement) { |
+ return getStringId(element.name); |
+ } |
+ } |
+ return getStringId(PackageIndexAssembler.NULL_STRING); |
+ } |
+ |
+ /** |
+ * Return the [element]'s top-level name identifier, `0` is the unit, or |
+ * `-1` if the [element] is not referenced in the [index]. |
+ */ |
+ int getElementUnitMemberId(Element element) { |
+ for (; element != null; element = element.enclosingElement) { |
+ if (element.enclosingElement is CompilationUnitElement) { |
+ return getStringId(element.name); |
+ } |
+ } |
+ return getStringId(PackageIndexAssembler.NULL_STRING); |
+ } |
+ |
+ /** |
* Complete with a list of locations where the given [element] has relation |
* of the given [kind]. |
*/ |