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