| Index: pkg/analysis_server/lib/src/services/index2/index2.dart
|
| diff --git a/pkg/analysis_server/lib/src/services/index2/index2.dart b/pkg/analysis_server/lib/src/services/index2/index2.dart
|
| index 975939f390337109b2c1e0764ae2c0699410b131..a3da32b1fdd3e94ebbb82a7f3b67e797284d6a26 100644
|
| --- a/pkg/analysis_server/lib/src/services/index2/index2.dart
|
| +++ b/pkg/analysis_server/lib/src/services/index2/index2.dart
|
| @@ -222,14 +222,14 @@ class _PackageIndexRequester {
|
| _PackageIndexRequester(this.index);
|
|
|
| /**
|
| - * Return the [element]'s identifier in the [index] or `null` if the
|
| + * Return the [element]'s identifier in the [index] or `-1` if the
|
| * [element] is not referenced in the [index].
|
| */
|
| int findElementId(Element element) {
|
| // Find the id of the element's unit.
|
| int unitId = getUnitId(element);
|
| - if (unitId == null) {
|
| - return null;
|
| + if (unitId == -1) {
|
| + return -1;
|
| }
|
| // Prepare the offset of the element.
|
| int offset = element.nameOffset;
|
| @@ -239,7 +239,7 @@ class _PackageIndexRequester {
|
| // Find the first occurrence of an element with the same offset.
|
| int elementId = _findFirstOccurrence(index.elementOffsets, offset);
|
| if (elementId == -1) {
|
| - return null;
|
| + return -1;
|
| }
|
| // Try to find the element id using offset, unit and kind.
|
| IndexSyntheticElementKind kind =
|
| @@ -253,7 +253,7 @@ class _PackageIndexRequester {
|
| return elementId;
|
| }
|
| }
|
| - return null;
|
| + return -1;
|
| }
|
|
|
| /**
|
| @@ -276,7 +276,7 @@ class _PackageIndexRequester {
|
| */
|
| List<Location> getRelations(Element element, IndexRelationKind kind) {
|
| int elementId = findElementId(element);
|
| - if (elementId == null) {
|
| + if (elementId == -1) {
|
| return const <Location>[];
|
| }
|
| List<Location> locations = <Location>[];
|
| @@ -293,7 +293,7 @@ class _PackageIndexRequester {
|
| * in the [index].
|
| */
|
| int getStringId(String str) {
|
| - return index.strings.indexOf(str);
|
| + return binarySearch(index.strings, str);
|
| }
|
|
|
| /**
|
| @@ -304,7 +304,13 @@ class _PackageIndexRequester {
|
| CompilationUnitElement unitElement =
|
| PackageIndexAssembler.getUnitElement(element);
|
| int libraryUriId = getUriId(unitElement.library.source.uri);
|
| + if (libraryUriId == -1) {
|
| + return -1;
|
| + }
|
| int unitUriId = getUriId(unitElement.source.uri);
|
| + if (unitUriId == -1) {
|
| + return -1;
|
| + }
|
| for (int i = 0; i < index.unitLibraryUris.length; i++) {
|
| if (index.unitLibraryUris[i] == libraryUriId &&
|
| index.unitUnitUris[i] == unitUriId) {
|
| @@ -424,17 +430,26 @@ class _UnitIndexRequester {
|
| * [name] is referenced with a qualifier, but is not resolved.
|
| */
|
| List<Location> getUnresolvedMemberReferences(String name) {
|
| + // Find the name ID in the package index.
|
| + int nameId = packageRequester.getStringId(name);
|
| + if (nameId == -1) {
|
| + return const <Location>[];
|
| + }
|
| + // Find the first usage of the name.
|
| + int i =_findFirstOccurrence(unitIndex.usedNames, nameId);
|
| + if (i == -1) {
|
| + return const <Location>[];
|
| + }
|
| + // Create locations for every usage of the name.
|
| List<Location> locations = <Location>[];
|
| String unitLibraryUri = null;
|
| String unitUnitUri = null;
|
| - for (int i = 0; i < unitIndex.usedNames.length; i++) {
|
| - int nameIndex = unitIndex.usedNames[i];
|
| - if (packageRequester.index.strings[nameIndex] == name) {
|
| - unitLibraryUri ??= packageRequester.getUnitLibraryUri(unitIndex.unit);
|
| - unitUnitUri ??= packageRequester.getUnitUnitUri(unitIndex.unit);
|
| - locations.add(new Location(unitLibraryUri, unitUnitUri,
|
| - unitIndex.usedNameOffsets[i], name.length, true));
|
| - }
|
| + for (; i < unitIndex.usedNames.length &&
|
| + unitIndex.usedNames[i] == nameId; i++) {
|
| + unitLibraryUri ??= packageRequester.getUnitLibraryUri(unitIndex.unit);
|
| + unitUnitUri ??= packageRequester.getUnitUnitUri(unitIndex.unit);
|
| + locations.add(new Location(unitLibraryUri, unitUnitUri,
|
| + unitIndex.usedNameOffsets[i], name.length, true));
|
| }
|
| return locations;
|
| }
|
|
|