metamodel: rename 'universal' to 'enum'
[nit.git] / src / location.nit
index 992b3a4..c6e4dee 100644 (file)
@@ -17,7 +17,7 @@
 package location
 
 class Location
-special Comparable
+       super Comparable
        redef type OTHER: Location
 
        readable var _file: String
@@ -36,19 +36,67 @@ special Comparable
 
        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