1package com.github.javaparser;
2
3import static com.github.javaparser.Position.pos;
4
5/**
6 * A range of characters in a source file, from "begin" to "end", including the characters at "begin" and "end".
7 */
8public class Range {
9    public static final Range UNKNOWN = range(Position.UNKNOWN, Position.UNKNOWN);
10
11    public final Position begin;
12    public final Position end;
13
14    public Range(Position begin, Position end) {
15        if (begin == null) {
16            throw new IllegalArgumentException("begin can't be null");
17        }
18        if (end == null) {
19            throw new IllegalArgumentException("end can't be null");
20        }
21        this.begin = begin;
22        this.end = end;
23    }
24
25    public static Range range(Position begin, Position end) {
26        return new Range(begin, end);
27    }
28
29    public static Range range(int beginLine, int beginColumn, int endLine, int endColumn) {
30        return new Range(pos(beginLine, beginColumn), pos(endLine, endColumn));
31    }
32
33    public Range withBeginColumn(int column) {
34        return range(begin.withColumn(column), end);
35    }
36
37    public Range withBeginLine(int line) {
38        return range(begin.withLine(line), end);
39    }
40
41    public Range withEndColumn(int column) {
42        return range(begin, end.withColumn(column));
43    }
44
45    public Range withEndLine(int line) {
46        return range(begin, end.withLine(line));
47    }
48
49    public Range withBegin(Position begin) {
50        return range(begin, this.end);
51    }
52
53    public Range withEnd(Position end) {
54        return range(this.begin, end);
55    }
56
57    public boolean contains(Range other) {
58        return begin.isBefore(other.begin) && end.isAfter(other.end);
59    }
60
61    public boolean isBefore(Position position) {
62        return end.isBefore(position);
63    }
64
65    public boolean isAfter(Position position) {
66        return begin.isAfter(position);
67    }
68
69    @Override
70    public boolean equals(Object o) {
71        if (this == o) return true;
72        if (o == null || getClass() != o.getClass()) return false;
73
74        Range range = (Range) o;
75
76        return begin.equals(range.begin) && end.equals(range.end);
77
78    }
79
80    @Override
81    public int hashCode() {
82        return 31 * begin.hashCode() + end.hashCode();
83    }
84
85    @Override
86    public String toString() {
87        return begin+"-"+end;
88    }
89}
90