summaryrefslogtreecommitdiffstats
path: root/tools/gn/location.h
blob: 20551256e141e723bcd2b345de5f20aa34af8667 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright (c) 2013 The Chromium 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 TOOLS_GN_LOCATION_H_
#define TOOLS_GN_LOCATION_H_

#include <algorithm>

#include "base/logging.h"

class InputFile;

// Represents a place in a source file. Used for error reporting.
class Location {
 public:
  Location()
      : file_(NULL),
        line_number_(-1),
        char_offset_(-1) {
  }
  Location(const InputFile* file, int line_number, int char_offset)
      : file_(file),
        line_number_(line_number),
        char_offset_(char_offset) {
  }

  const InputFile* file() const { return file_; }
  int line_number() const { return line_number_; }
  int char_offset() const { return char_offset_; }

  bool operator==(const Location& other) const {
    return other.file_ == file_ &&
           other.line_number_ == line_number_ &&
           other.char_offset_ == char_offset_;
  }

  bool operator<(const Location& other) const {
    DCHECK(file_ == other.file_);
    if (line_number_ != other.line_number_)
      return line_number_ < other.line_number_;
    return char_offset_ < other.char_offset_;
  }

 private:
  const InputFile* file_;  // Null when unset.
  int line_number_;  // -1 when unset.
  int char_offset_;  // -1 when unset.
};

// Represents a range in a source file. Used for error reporting.
// The end is exclusive i.e. [begin, end)
class LocationRange {
 public:
  LocationRange() {}
  LocationRange(const Location& begin, const Location& end)
      : begin_(begin),
        end_(end) {
    DCHECK(begin_.file() == end_.file());
  }

  const Location& begin() const { return begin_; }
  const Location& end() const { return end_; }

  LocationRange Union(const LocationRange& other) const {
    DCHECK(begin_.file() == other.begin_.file());
    return LocationRange(
        begin_ < other.begin_ ? begin_ : other.begin_,
        end_ < other.end_ ? other.end_ : end_);
  }

 private:
  Location begin_;
  Location end_;
};

#endif  // TOOLS_GN_LOCATION_H_