| 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 00bfeabfcf7dc1f47744434f482d4cad479e8e63..374ccaf2434896644df597c1c955517eebbd7a90 100644
|
| --- a/pkg/analysis_server/lib/src/services/index/index.dart
|
| +++ b/pkg/analysis_server/lib/src/services/index/index.dart
|
| @@ -6,6 +6,8 @@ library services.index;
|
|
|
| import 'dart:async';
|
|
|
| +import 'package:analysis_server/analysis/index/index_core.dart';
|
| +import 'package:analysis_server/src/services/index/indexable_element.dart';
|
| import 'package:analyzer/src/generated/ast.dart';
|
| import 'package:analyzer/src/generated/element.dart';
|
| import 'package:analyzer/src/generated/engine.dart';
|
| @@ -19,39 +21,23 @@ typedef bool ElementNameFilter(String name);
|
|
|
| /**
|
| * The interface [Index] defines the behavior of objects that maintain an index
|
| - * storing relations between [Element]s.
|
| + * storing relations between indexable objects.
|
| *
|
| * Any modification operations are executed before any read operation.
|
| * There is no guarantee about the order in which the [Future]s for read
|
| * operations will complete.
|
| */
|
| -abstract class Index {
|
| +abstract class Index implements IndexStore {
|
| /**
|
| - * Answers index statistics.
|
| - */
|
| - String get statistics;
|
| -
|
| - /**
|
| - * Removes from the index all the information.
|
| + * Set the index contributors used by this index to the given list of
|
| + * [contributors].
|
| */
|
| - void clear();
|
| + void set contributors(List<IndexContributor> contributors);
|
|
|
| /**
|
| - * Asynchronously returns a list containing all of the locations of the
|
| - * elements that have the given [relationship] with the given [element].
|
| - *
|
| - * For example, if the element represents a function and the relationship is
|
| - * the `is-invoked-by` relationship, then the locations will be all of the
|
| - * places where the function is invoked.
|
| - *
|
| - * [element] - the element that has the relationship with the locations to be
|
| - * returned.
|
| - *
|
| - * [relationship] - the relationship between the given element and the
|
| - * locations to be returned.
|
| + * Answers index statistics.
|
| */
|
| - Future<List<LocationImpl>> getRelationships(
|
| - Element element, RelationshipImpl relationship);
|
| + String get statistics;
|
|
|
| /**
|
| * Returns top-level [Element]s whose names satisfy to [nameFilter].
|
| @@ -75,51 +61,80 @@ abstract class Index {
|
| void indexUnit(AnalysisContext context, CompilationUnit unit);
|
|
|
| /**
|
| - * Removes from the index all of the information associated with [context].
|
| - *
|
| - * This method should be invoked when [context] is disposed.
|
| + * Starts the index.
|
| + * Should be called before any other method.
|
| */
|
| - void removeContext(AnalysisContext context);
|
| + void run();
|
|
|
| /**
|
| - * Removes from the index all of the information associated with elements or
|
| - * locations in [source]. This includes relationships between an element in
|
| - * [source] and any other locations, relationships between any other elements
|
| - * and a location within [source].
|
| - *
|
| - * This method should be invoked when [source] is no longer part of the code
|
| - * base.
|
| - *
|
| - * [context] - the [AnalysisContext] in which [source] being removed
|
| - * [source] - the [Source] being removed
|
| + * Stops the index.
|
| + * After calling this method operations may not be executed.
|
| */
|
| - void removeSource(AnalysisContext context, Source source);
|
| + void stop();
|
| +}
|
|
|
| +/**
|
| + * An [Element] which is used to index references to the name without specifying
|
| + * a concrete kind of this name - field, method or something else.
|
| + */
|
| +class IndexableName implements IndexableObject {
|
| + // TODO(brianwilkerson) Replace NameElement with this class. This will require
|
| + // generalizing the search engine to use IndexableObject rather than Element.
|
| /**
|
| - * Removes from the index all of the information associated with elements or
|
| - * locations in the given sources. This includes relationships between an
|
| - * element in the given sources and any other locations, relationships between
|
| - * any other elements and a location within the given sources.
|
| - *
|
| - * This method should be invoked when multiple sources are no longer part of
|
| - * the code base.
|
| - *
|
| - * [context] - the [AnalysisContext] in which [Source]s being removed.
|
| - * [container] - the [SourceContainer] holding the sources being removed.
|
| + * The name to be indexed.
|
| */
|
| - void removeSources(AnalysisContext context, SourceContainer container);
|
| + final String name;
|
|
|
| /**
|
| - * Starts the index.
|
| - * Should be called before any other method.
|
| + * Initialize a newly created indexable name to represent the given [name].
|
| */
|
| - void run();
|
| + IndexableName(this.name);
|
| +
|
| + @override
|
| + IndexableObjectKind get kind => IndexableNameKind.INSTANCE;
|
| +
|
| + @override
|
| + int get length => 0;
|
|
|
| + @override
|
| + int get offset {
|
| + return -1;
|
| + }
|
| +
|
| + @override
|
| + Source get source => null;
|
| +
|
| + @override
|
| + String toString() => name;
|
| +}
|
| +
|
| +/**
|
| + * The kind of an indexable name.
|
| + */
|
| +class IndexableNameKind implements IndexableObjectKind {
|
| /**
|
| - * Stops the index.
|
| - * After calling this method operations may not be executed.
|
| + * The unique instance of this class.
|
| */
|
| - void stop();
|
| + static final IndexableNameKind INSTANCE =
|
| + new IndexableNameKind._(IndexableObjectKind.nextIndex);
|
| +
|
| + /**
|
| + * The index uniquely identifying this kind.
|
| + */
|
| + final int index;
|
| +
|
| + /**
|
| + * Initialize a newly created kind to have the given [index].
|
| + */
|
| + IndexableNameKind._(this.index) {
|
| + IndexableObjectKind.register(this);
|
| + }
|
| +
|
| + @override
|
| + IndexableObject decode(AnalysisContext context, String filePath, int offset) {
|
| + throw new UnsupportedError(
|
| + 'Indexable names cannot be decoded through their kind');
|
| + }
|
| }
|
|
|
| /**
|
| @@ -217,7 +232,7 @@ class IndexConstants {
|
| * to the resource containing the element rather than the start of the element
|
| * within that resource.
|
| */
|
| -class LocationImpl {
|
| +class LocationImpl implements Location {
|
| static const int _FLAG_QUALIFIED = 1 << 0;
|
| static const int _FLAG_RESOLVED = 1 << 1;
|
|
|
| @@ -227,9 +242,9 @@ class LocationImpl {
|
| static const List<LocationImpl> EMPTY_LIST = const <LocationImpl>[];
|
|
|
| /**
|
| - * The element containing this location.
|
| + * The indexable object containing this location.
|
| */
|
| - final Element element;
|
| + final IndexableObject indexable;
|
|
|
| /**
|
| * The offset of this location within the resource containing the element.
|
| @@ -247,17 +262,13 @@ class LocationImpl {
|
| int _flags;
|
|
|
| /**
|
| - * Initializes a newly created location to be relative to the given element at
|
| - * the given [offset] with the given [length].
|
| - *
|
| - * [element] - the [Element] containing this location.
|
| - * [offset] - the offset within the resource containing [element].
|
| - * [length] - the length of this location
|
| + * Initializes a newly created location to be relative to the given
|
| + * [indexable] object at the given [offset] with the given [length].
|
| */
|
| - LocationImpl(this.element, this.offset, this.length,
|
| + LocationImpl(this.indexable, this.offset, this.length,
|
| {bool isQualified: false, bool isResolved: true}) {
|
| - if (element == null) {
|
| - throw new ArgumentError("element location cannot be null");
|
| + if (indexable == null) {
|
| + throw new ArgumentError("indexable object cannot be null");
|
| }
|
| _flags = 0;
|
| if (isQualified) {
|
| @@ -269,13 +280,20 @@ class LocationImpl {
|
| }
|
|
|
| /**
|
| - * Returns `true` if this location is a qualified reference.
|
| + * The element containing this location.
|
| */
|
| + @deprecated
|
| + Element get element {
|
| + if (indexable is IndexableElement) {
|
| + return (indexable as IndexableElement).element;
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + @override
|
| bool get isQualified => (_flags & _FLAG_QUALIFIED) != 0;
|
|
|
| - /**
|
| - * Returns `true` if this location is a resolved reference.
|
| - */
|
| + @override
|
| bool get isResolved => (_flags & _FLAG_RESOLVED) != 0;
|
|
|
| @override
|
| @@ -287,7 +305,7 @@ class LocationImpl {
|
| if (isResolved) {
|
| flagsStr += ' resolved';
|
| }
|
| - return '[${offset} - ${(offset + length)}) $flagsStr in ${element}';
|
| + return '[${offset} - ${(offset + length)}) $flagsStr in ${indexable}';
|
| }
|
| }
|
|
|
| @@ -298,7 +316,7 @@ class LocationWithData<D> extends LocationImpl {
|
| final D data;
|
|
|
| LocationWithData(LocationImpl location, this.data)
|
| - : super(location.element, location.offset, location.length);
|
| + : super(location.indexable, location.offset, location.length);
|
| }
|
|
|
| /**
|
| @@ -319,7 +337,7 @@ class NameElement extends ElementImpl {
|
| * Relationship between an element and a location. Relationships are identified
|
| * by a globally unique identifier.
|
| */
|
| -class RelationshipImpl {
|
| +class RelationshipImpl implements Relationship {
|
| /**
|
| * A table mapping relationship identifiers to relationships.
|
| */
|
|
|