// Copyright (c) 2015, 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 analysis_server.plugin.analysis.navigation.navigation_core;

import 'package:analysis_server/plugin/protocol/protocol.dart'
    show ElementKind, Location, NavigationRegion, NavigationTarget;
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
import 'package:analyzer/src/generated/source.dart' show Source;

/**
 * An object that [NavigationContributor]s use to record navigation regions.
 *
 * Clients are not expected to subtype this class.
 */
abstract class NavigationCollector {
  /**
   * Record a new navigation region with the given [offset] and [length] that
   * should navigate to the given [targetLocation].
   */
  void addRegion(
      int offset, int length, ElementKind targetKind, Location targetLocation);
}

/**
 * An object used to produce navigation regions.
 *
 * Clients are expected to subtype this class when implementing plugins.
 */
abstract class NavigationContributor {
  /**
   * Contribute navigation regions for a subset of the content of the given
   * [source] into the given [collector]. The subset is specified by the
   * [offset] and [length]. The [context] can be used to access analysis results.
   */
  void computeNavigation(NavigationCollector collector, AnalysisContext context,
      Source source, int offset, int length);
}
