// 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 VM_REPORT_H_
#define 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,
    kMalformedType,
    kMalboundedType,
    kBailout,
  };

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

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

  // Concatenate and report an already formatted error and a new error message.
  static void LongJumpF(const Error& prev_error,
                        const Script& script, TokenPosition token_pos,
                        const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
  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  // VM_REPORT_H_

