// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library services.index_store;

import 'package:analysis_server/plugin/index/index_core.dart';
import 'package:analysis_server/src/services/index/index.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/engine.dart';

/**
 * A container with information computed by an index - relations between
 * elements.
 */
abstract class InternalIndexStore extends IndexStore {
  /**
   * Answers index statistics.
   */
  String get statistics;

  /**
   * Notifies the index store that we are going to index the given [object].
   *
   * [context] - the [AnalysisContext] in which the [object] being indexed.
   * [object] - the object being indexed.
   *
   * Returns `true` if the given [object] may be indexed, or `false` if
   * belongs to a disposed [AnalysisContext], is not resolved completely, etc.
   */
  bool aboutToIndex(AnalysisContext context, Object object);

  /**
   * Notifies the index store that there was an error during the current
   * indexing, and all the information recorded after the last
   * [aboutToIndex] invocation must be discarded.
   */
  void cancelIndex();

  /**
   * Notifies the index store that the current object indexing is done.
   *
   * If this method is not invoked after corresponding [aboutToIndex]
   * invocation, all recorded information may be lost.
   */
  void doneIndex();

  /**
   * Returns top-level [Element]s whose names satisfy to [nameFilter].
   */
  List<Element> getTopLevelDeclarations(ElementNameFilter nameFilter);

  /**
   * Records the declaration of the given top-level [element].
   */
  void recordTopLevelDeclaration(Element element);
}
