// Copyright (c) 2017, 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_plugin/channel/channel.dart';
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin/src/protocol/protocol_internal.dart';

/**
 * The result produced by a generator.
 *
 * Clients may not extend, implement or mix-in this class.
 */
class GeneratorResult<T extends ResponseResult> {
  /**
   * The result to be sent to the server, or `null` if there is no response, as
   * when the generator is generating a notification.
   */
  final T result;

  /**
   * The notifications that should be sent to the server. The list will be empty
   * if there are no notifications.
   */
  final List<Notification> notifications;

  /**
   * Initialize a newly created generator result with the given [result] and
   * [notifications].
   */
  GeneratorResult(this.result, this.notifications);

  /**
   * Use the given communications [channel] to send the notifications to the
   * server.
   */
  void sendNotifications(PluginCommunicationChannel channel) {
    for (final notification in notifications) {
      channel.sendNotification(notification);
    }
  }
}
