// 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:analysis_server/src/analysis_server.dart';

/**
 * A class that can be used to confirm an analysis server instance to better
 * support intermittent file systems.
 *
 * See also [AnalysisServerOptions.detachableFileSystemManager].
 */
abstract class DetachableFileSystemManager {
  /**
   * Indicate that the [DetachableFileSystemManager] and the containing analysis
   * server are being shut down.
   */
  void dispose();

  /**
   * Forward on the 'analysis.setAnalysisRoots' request.
   *
   * This class can choose to pass through all [setAnalysisRoots] calls to the
   * underlying analysis server, it can choose to modify the given
   * [includedPaths] and other parameters, or it could choose to delays calls to
   * [setAnalysisRoots].
   */
  void setAnalysisRoots(String requestId, List<String> includedPaths,
      List<String> excludedPaths, Map<String, String> packageRoots);

  /**
   * Called exactly once before any calls to [setAnalysisRoots].
   */
  void setAnalysisServer(AnalysisServer server);
}
