+ # The verbatim associated text in the source-file
+ fun text: String
+ do
+ var res = self.text_cache
+ if res != null then return res
+ var l = self
+ var pstart = l.file.line_starts[l.line_start-1] + l.column_start-1
+ var pend = l.file.line_starts[l.line_end-1] + l.column_end-1
+ res = l.file.string.substring(pstart, pend-pstart+1)
+ self.text_cache = res
+ return res
+ end
+
+ private var text_cache: nullable String
+
+ init with_file(f: SourceFile) 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