// Copyright (c) 2014, 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.

#ifndef RUNTIME_VM_REPORT_H_
#define RUNTIME_VM_REPORT_H_

#include "vm/allocation.h"
#include "vm/token_position.h"

namespace dart {

// Forward declarations.
class Error;
class ICData;
class RawString;
class Script;
class StackFrame;
class String;

class Report : AllStatic {
 public:
  enum Kind {
    kWarning,
    kError,
    kBailout,
  };

  static const bool AtLocation = false;
  static const bool AfterLocation = true;

  // Report an already formatted error via a long jump.
  DART_NORETURN static void LongJump(const Error& error);

  // Concatenate and report an already formatted error and a new error message.
  DART_NORETURN static void LongJumpF(const Error& prev_error,
                                      const Script& script,
                                      TokenPosition token_pos,
                                      const char* format,
                                      ...) PRINTF_ATTRIBUTE(4, 5);
  DART_NORETURN static void LongJumpV(const Error& prev_error,
                                      const Script& script,
                                      TokenPosition token_pos,
                                      const char* format,
                                      va_list args);

  // Report a warning/jswarning/error/bailout message.
  static void MessageF(Kind kind,
                       const Script& script,
                       TokenPosition token_pos,
                       bool report_after_token,
                       const char* format,
                       ...) PRINTF_ATTRIBUTE(5, 6);
  static void MessageV(Kind kind,
                       const Script& script,
                       TokenPosition token_pos,
                       bool report_after_token,
                       const char* format,
                       va_list args);

  // Prepend a source snippet to the message.
  // A null script means no source and a negative token_pos means no position.
  static RawString* PrependSnippet(Kind kind,
                                   const Script& script,
                                   TokenPosition token_pos,
                                   bool report_after_token,
                                   const String& message);

 private:
  DISALLOW_COPY_AND_ASSIGN(Report);
};

}  // namespace dart

#endif  // RUNTIME_VM_REPORT_H_
