// 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);
}
