| // Copyright 2015 the V8 project authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef V8_PENDING_COMPILATION_ERROR_HANDLER_H_ | 
 | #define V8_PENDING_COMPILATION_ERROR_HANDLER_H_ | 
 |  | 
 | #include "src/base/macros.h" | 
 | #include "src/globals.h" | 
 | #include "src/handles.h" | 
 | #include "src/messages.h" | 
 |  | 
 | namespace v8 { | 
 | namespace internal { | 
 |  | 
 | class AstRawString; | 
 | class Isolate; | 
 | class Script; | 
 |  | 
 | // Helper class for handling pending compilation errors consistently in various | 
 | // compilation phases. | 
 | class PendingCompilationErrorHandler { | 
 |  public: | 
 |   PendingCompilationErrorHandler() | 
 |       : has_pending_error_(false), | 
 |         start_position_(-1), | 
 |         end_position_(-1), | 
 |         message_(MessageTemplate::kNone), | 
 |         arg_(nullptr), | 
 |         char_arg_(nullptr), | 
 |         error_type_(kSyntaxError) {} | 
 |  | 
 |   void ReportMessageAt(int start_position, int end_position, | 
 |                        MessageTemplate::Template message, | 
 |                        const char* arg = nullptr, | 
 |                        ParseErrorType error_type = kSyntaxError) { | 
 |     if (has_pending_error_) return; | 
 |     has_pending_error_ = true; | 
 |     start_position_ = start_position; | 
 |     end_position_ = end_position; | 
 |     message_ = message; | 
 |     char_arg_ = arg; | 
 |     arg_ = nullptr; | 
 |     error_type_ = error_type; | 
 |   } | 
 |  | 
 |   void ReportMessageAt(int start_position, int end_position, | 
 |                        MessageTemplate::Template message, | 
 |                        const AstRawString* arg, | 
 |                        ParseErrorType error_type = kSyntaxError) { | 
 |     if (has_pending_error_) return; | 
 |     has_pending_error_ = true; | 
 |     start_position_ = start_position; | 
 |     end_position_ = end_position; | 
 |     message_ = message; | 
 |     char_arg_ = nullptr; | 
 |     arg_ = arg; | 
 |     error_type_ = error_type; | 
 |   } | 
 |  | 
 |   void ReportMessageAt(int start_position, int end_position, | 
 |                        MessageTemplate::Template message, Handle<String> arg, | 
 |                        ParseErrorType error_type = kSyntaxError) { | 
 |     if (has_pending_error_) return; | 
 |     has_pending_error_ = true; | 
 |     start_position_ = start_position; | 
 |     end_position_ = end_position; | 
 |     message_ = message; | 
 |     char_arg_ = nullptr; | 
 |     arg_ = nullptr; | 
 |     handle_arg_ = arg; | 
 |     error_type_ = error_type; | 
 |   } | 
 |  | 
 |   bool has_pending_error() const { return has_pending_error_; } | 
 |  | 
 |   void ThrowPendingError(Isolate* isolate, Handle<Script> script); | 
 |  | 
 |  private: | 
 |   bool has_pending_error_; | 
 |   int start_position_; | 
 |   int end_position_; | 
 |   MessageTemplate::Template message_; | 
 |   const AstRawString* arg_; | 
 |   const char* char_arg_; | 
 |   Handle<String> handle_arg_; | 
 |   ParseErrorType error_type_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PendingCompilationErrorHandler); | 
 | }; | 
 |  | 
 | }  // namespace internal | 
 | }  // namespace v8 | 
 | #endif  // V8_PENDING_COMPILATION_ERROR_HANDLER_H_ |