lib/nitcc_runtime: extract `Position::underline` from objcwrapper
authorAlexis Laferrière <alexis.laf@xymus.net>
Fri, 4 Sep 2015 15:46:42 +0000 (11:46 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Fri, 4 Sep 2015 18:12:16 +0000 (14:12 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

contrib/objcwrapper/src/objcwrapper.nit
lib/nitcc_runtime.nit

index 418d639..28746d8 100644 (file)
@@ -62,15 +62,7 @@ for src in opts.rest do
                var pos = root.position
                print_error "Syntax Error: {root.message}, at {pos or else ""}"
                print_error "in {src}"
-               if pos != null then
-                       var lines = content.split("\n")
-                       for line in [pos.line_start..pos.line_end] do
-                               print_error lines[line-1]
-                       end
-
-                       var ptr = " "*(pos.col_start-1).max(0) + "^"*(pos.col_end-pos.col_start)
-                       print_error ptr
-               end
+               if pos != null then print_error pos.underline(content)
                failed_parsing.add src
                continue
        end
index b413c7e..bfd137d 100644 (file)
@@ -296,7 +296,42 @@ class Position
        var line_end: Int
        var col_start: Int
        var col_end: Int
+
        redef fun to_s do return "{line_start}:{col_start}-{line_end}:{col_end}"
+
+       # Get the lines covered by `self` and underline the target columns.
+       #
+       # This is useful for pretty printing errors or debug the output
+       #
+       # ~~~
+       # var src = "var Foo = new Array[Int]"
+       # var pos = new Position(0,0, 1, 1, 5, 8)
+       #
+       # assert pos.underline(src) == """
+       # var Foo = new Array[Int]
+       #     ^^^"""
+       # ~~~
+       fun underline(source: Text): String
+       do
+               var res = new FlatBuffer
+
+               # All the concerned lines
+               var lines = source.split("\n")
+               for line in [line_start..line_end] do
+                       res.append lines[line-1]
+                       res.append "\n"
+               end
+
+               # Cover all columns, no matter their lines
+               var col_start = col_start.min(col_end)
+               var col_end = self.col_start.max(col_end)
+
+               # "           ^^^^"
+               var ptr = " "*(col_start-1).max(0) + "^"*(col_end-col_start)
+               res.append ptr
+
+               return res.to_s
+       end
 end
 
 # A node of a syntactic tree