// 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.

/// Operations to be performed during the simulation.
import '../utilities/server.dart';

/// An operation that will send an 'analysis.updateContent' request.
class Analysis_UpdateContent extends ServerOperation {
  /// The path of the file whose content is being updated.
  final String filePath;

  /// The overlay used to update the content.
  final dynamic overlay;

  /// Initialize an operation to send an 'analysis.updateContent' request with
  /// the given [filePath] and [overlay] as parameters.
  Analysis_UpdateContent(this.filePath, this.overlay);

  @override
  void perform(Server server) {
    server.sendAnalysisUpdateContent({filePath: overlay});
//    if (overlay is ChangeContentOverlay) {
//      List<SourceEdit> edits = (overlay as ChangeContentOverlay).edits;
//      if (edits.length == 1) {
//        SourceEdit edit = edits[0];
//        if (edit.replacement.endsWith('.')) {
//          int offset = edit.offset + edit.replacement.length - 1;
//          server.sendCompletionGetSuggestions(filePath, offset);
//        }
//      }
//    }
  }
}

/// An operation that will send a 'completion.getSuggestions' request.
class Completion_GetSuggestions extends ServerOperation {
  /// The path of the file in which completions are being requested.
  final String filePath;

  /// The offset at which completions are being requested.
  final int offset;

  /// Initialize an operation to send a 'completion.getSuggestions' request with
  /// the given [filePath] and [offset] as parameters.
  Completion_GetSuggestions(this.filePath, this.offset);

  @override
  void perform(Server server) {
    server.sendCompletionGetSuggestions(filePath, offset);
  }
}

/// An operation to be performed during the simulation.
abstract class ServerOperation {
  /// Perform this operation by communicating with the given [server].
  void perform(Server server);
}
