// Copyright (c) 2018, 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.

import 'package:analyzer/file_system/file_system.dart';

/**
 * Information about the root directory associated with an analysis context.
 *
 * Clients may not extend, implement or mix-in this class.
 */
abstract class ContextRoot {
  /**
   * A list of the files and directories within the root directory that should
   * not be analyzed.
   */
  List<Resource> get excluded;

  /**
   * A collection of the absolute, normalized paths of files and directories
   * within the root directory that should not be analyzed.
   */
  Iterable<String> get excludedPaths;

  /**
   * A list of the files and directories within the root directory that should
   * be analyzed. If all of the files in the root directory (other than those
   * that are explicitly excluded) should be analyzed, then this list will
   * contain the root directory.
   */
  List<Resource> get included;

  /**
   * A collection of the absolute, normalized paths of files within the root
   * directory that should be analyzed. If all of the files in the root
   * directory (other than those that are explicitly excluded) should be
   * analyzed, then this collection will contain the path of the root directory.
   */
  Iterable<String> get includedPaths;

  /**
   * The analysis options file that should be used when analyzing the files
   * within this context root, or `null` if there is no options file.
   */
  File get optionsFile;

  /**
   * The packages file that should be used when analyzing the files within this
   * context root, or `null` if there is no options file.
   */
  File get packagesFile;

  /**
   * The resource provider used to access the file system.
   */
  ResourceProvider get resourceProvider;

  /**
   * The root directory containing the files to be analyzed.
   */
  Folder get root;

  /**
   * Return the absolute, normalized paths of all of the files that are
   * contained in this context. These are all of the files that are included
   * directly or indirectly by one or more of the [includedPaths] and that are
   * not excluded by any of the [excludedPaths].
   *
   * Note that the list is not filtered based on the file suffix, so non-Dart
   * files can be returned.
   */
  Iterable<String> analyzedFiles();

  /**
   * Return `true` if the file or directory with the given [path] will be
   * analyzed in this context. A file (or directory) will be analyzed if it is
   * either the same as or contained in one of the [includedPaths] and, if it is
   * contained in one of the [includedPaths], is not the same as or contained
   * in one of the [excludedPaths].
   */
  bool isAnalyzed(String path);
}
