package location
class Location
-special Comparable
+ super Comparable
redef type OTHER: Location
readable var _file: String
init with_file(f: String) do init(f,0,0,0,0)
+ redef fun ==(other: nullable Object): Bool do
+ if other == null then return false
+ if not other isa Location then return false
+
+ if other.file != file then return false
+ if other.line_start != line_start then return false
+ if other.line_end != line_end then return false
+ if other.column_start != column_start then return false
+ if other.column_end != column_end then return false
+
+ return true
+ end
+
+ fun located_in(loc: nullable Location): Bool do
+ if loc == null then return false
+
+ if line_start < loc.line_start then return false
+ if line_start > loc.line_end then return false
+
+ if line_end > loc.line_end then return false
+
+ if line_start == loc.line_start then
+ if column_start < loc.column_start then return false
+ if column_start > loc.column_end then return false
+ end
+
+ if line_end == loc.line_end and column_end > loc.column_end then return false
+
+ return true
+ end
+
redef fun to_s: String do
+ var file_part = file
+ if file_part.length > 0 then file_part += ":"
+
if line_start == line_end then
if column_start == column_end then
- return "{file}:{line_start},{column_start}"
+ return "{file_part}{line_start},{column_start}"
else
- return "{file}:{line_start},{column_start}--{column_end}"
+ return "{file_part}{line_start},{column_start}--{column_end}"
end
else
- return "{file}:{line_start},{column_start}--{line_end}:{column_end}"
+ return "{file_part}{line_start},{column_start}--{line_end},{column_end}"
end
end
+ fun relative_to(loc: nullable Location): String do
+ var relative: Location
+ if loc != null and loc.file == self.file then
+ relative = new Location("", self.line_start, self.line_end, self.column_start, self.column_end)
+ else
+ relative = new Location(self.file, self.line_start, self.line_end, self.column_start, self.column_end)
+ end
+ return relative.to_s
+ end
+
redef fun <(other: OTHER): Bool do
+ if self == other then return false
+ if self.located_in(other) then return true
+ if other.located_in(self) then return false
+
if line_start != other.line_start then return line_start < other.line_start
if column_start != other.column_start then return column_start < other.column_start
if line_end != other.line_end then return line_end < other.line_end