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

library front_end.diagnostic_message;

import '../fasta/fasta_codes.dart'
    show Code, DiagnosticMessageFromJson, FormattedMessage;

import '../fasta/severity.dart' show Severity;

/// The type of a diagnostic message callback. For example:
///
///    void handler(DiagnosticMessage message) {
///      if (enableTerminalColors) { // See [terminal_color_support.dart].
///        message.ansiFormatted.forEach(stderr.writeln);
///      } else {
///        message.plainTextFormatted.forEach(stderr.writeln);
///      }
///    }
typedef DiagnosticMessageHandler = void Function(DiagnosticMessage);

/// Represents a diagnostic message that can be reported from a tool, for
/// example, a compiler.
///
/// The word *diagnostic* is used loosely here, as a tool may also use this for
/// reporting any kind of message, including non-diagnostic messages such as
/// licensing, informal, or logging information. This allows a well-behaved
/// tool to never directly write to stdout or stderr.
abstract class DiagnosticMessage {
  DiagnosticMessage._(); // Prevent subclassing.

  Iterable<String> get ansiFormatted;

  Iterable<String> get plainTextFormatted;

  Severity get severity;
}

/// This method is subject to change.
Uri getMessageUri(DiagnosticMessage message) {
  return message is FormattedMessage
      ? message.uri
      : message is DiagnosticMessageFromJson ? message.uri : null;
}

/// This method is subject to change.
int getMessageCharOffset(DiagnosticMessage message) {
  return message is FormattedMessage ? message.charOffset : null;
}

/// This method is subject to change.
int getMessageLength(DiagnosticMessage message) {
  return message is FormattedMessage ? message.length : null;
}

/// This method is subject to change.
Code getMessageCodeObject(DiagnosticMessage message) {
  return message is FormattedMessage ? message.code : null;
}

/// This method is subject to change.
String getMessageHeaderText(DiagnosticMessage message) {
  return message is FormattedMessage ? message.message : null;
}

/// This method is subject to change.
int getMessageCode(DiagnosticMessage message) {
  return message is FormattedMessage ? message.code.index : -1;
}

/// This method is subject to change.
Map<String, dynamic> getMessageArguments(DiagnosticMessage message) {
  return message is FormattedMessage ? message.arguments : null;
}

/// This method is subject to change.
Iterable<DiagnosticMessage> getMessageRelatedInformation(
    DiagnosticMessage message) {
  return message is FormattedMessage ? message.relatedInformation : null;
}
