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_LOCATION_H_ 6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#define TOOLS_GN_LOCATION_H_ 7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include <algorithm> 9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/logging.h" 11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass InputFile; 13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Represents a place in a source file. Used for error reporting. 15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Location { 16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Location() 18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch : file_(NULL), 19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch line_number_(-1), 20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch char_offset_(-1) { 21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Location(const InputFile* file, int line_number, int char_offset) 23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch : file_(file), 24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch line_number_(line_number), 25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch char_offset_(char_offset) { 26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const InputFile* file() const { return file_; } 29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch int line_number() const { return line_number_; } 30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch int char_offset() const { return char_offset_; } 31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bool operator==(const Location& other) const { 33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return other.file_ == file_ && 34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch other.line_number_ == line_number_ && 35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch other.char_offset_ == char_offset_; 36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bool operator<(const Location& other) const { 39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DCHECK(file_ == other.file_); 40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (line_number_ != other.line_number_) 41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return line_number_ < other.line_number_; 42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return char_offset_ < other.char_offset_; 43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const InputFile* file_; // Null when unset. 47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch int line_number_; // -1 when unset. 48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch int char_offset_; // -1 when unset. 49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Represents a range in a source file. Used for error reporting. 52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// The end is exclusive i.e. [begin, end) 53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass LocationRange { 54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LocationRange() {} 56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LocationRange(const Location& begin, const Location& end) 57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch : begin_(begin), 58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch end_(end) { 59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DCHECK(begin_.file() == end_.file()); 60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Location& begin() const { return begin_; } 63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Location& end() const { return end_; } 64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LocationRange Union(const LocationRange& other) const { 66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DCHECK(begin_.file() == other.begin_.file()); 67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return LocationRange( 68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch begin_ < other.begin_ ? begin_ : other.begin_, 69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch end_ < other.end_ ? other.end_ : end_); 70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Location begin_; 74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Location end_; 75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif // TOOLS_GN_LOCATION_H_ 78