1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file.
4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#ifndef TOOLS_GN_ERR_H_
6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#define TOOLS_GN_ERR_H_
7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include <string>
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include <vector>
10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/location.h"
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/token.h"
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass ParseNode;
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Value;
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Result of doing some operation. Check has_error() to see if an error
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// occurred.
19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch//
20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// An error has a location and a message. Below that, is some optional help
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// text to go with the annotation of the location.
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch//
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// An error can also have sub-errors which are additionally printed out
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// below. They can provide additional context.
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Err {
26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public:
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  typedef std::vector<LocationRange> RangeList;
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Indicates no error.
30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Err();
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Error at a single point.
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Err(const Location& location,
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& msg,
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& help = std::string());
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Error at a given range.
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Err(const LocationRange& range,
39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& msg,
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& help = std::string());
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Error at a given token.
43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Err(const Token& token,
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& msg,
45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& help_text = std::string());
46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Error at a given node.
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Err(const ParseNode* node,
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& msg,
50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& help_text = std::string());
51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Error at a given value.
53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Err(const Value& value,
54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string msg,
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const std::string& help_text = std::string());
56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ~Err();
58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool has_error() const { return has_error_; }
60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const Location& location() const { return location_; }
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const std::string& message() const { return message_; }
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const std::string& help_text() const { return help_text_; }
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  void AppendRange(const LocationRange& range) { ranges_.push_back(range); }
65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const RangeList& ranges() const { return ranges_; }
66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  void AppendSubErr(const Err& err);
68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  void PrintToStdout() const;
70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private:
72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  void InternalPrintToStdout(bool is_sub_err) const;
73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool has_error_;
75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Location location_;
76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  std::vector<LocationRange> ranges_;
78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  std::string message_;
80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  std::string help_text_;
81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  std::vector<Err> sub_errs_;
83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif  // TOOLS_GN_ERR_H_
86