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