| 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].
|
| */
|
|
|