location: add pstart and pend
[nit.git] / src / location.nit
index a643c7e..26b6fa1 100644 (file)
@@ -33,6 +33,14 @@ class SourceFile
                line_starts[0] = 0
        end
 
+       # Create a new sourcefile using a dummy filename and a given content
+       init from_string(filename: String, string: String)
+       do
+               self.filename = filename
+               self.string = string
+               line_starts[0] = 0
+       end
+
        # Position of each line start
        var line_starts: Array[Int] = new Array[Int]
 end
@@ -56,6 +64,27 @@ class Location
                _column_end = column_e
        end
 
+       # The index in the start character in the source
+       fun pstart: Int do return file.line_starts[line_start-1] + column_start-1
+
+       # The index on the end character in the source
+       fun pend: Int do return file.line_starts[line_end-1] + column_end-1
+
+       # 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 = self.pstart
+               var pend = self.pend
+               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
@@ -130,10 +159,10 @@ class Location
        end
 
        # Return the associated line with the location highlihted with color and a carret under the starting position
-       # `color' must be and terminal escape sequence used as "{escape}[{color}m;"
-       # "0;31" for red
-       # "1;31" for bright red
-       # "0;32" for green
+       # `color` must be and terminal escape sequence used as `"{escape}[{color}m;"`
+       # * `"0;31"` for red
+       # * `"1;31"` for bright red
+       # * `"0;32"` for green
        fun colored_line(color: String): String
        do
                var esc = 27.ascii