From d6358b61087bf4a9433df2c9adccf78499498002 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Fri, 4 Sep 2015 11:46:42 -0400 Subject: [PATCH] lib/nitcc_runtime: extract `Position::underline` from objcwrapper MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- contrib/objcwrapper/src/objcwrapper.nit | 10 +-------- lib/nitcc_runtime.nit | 35 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/contrib/objcwrapper/src/objcwrapper.nit b/contrib/objcwrapper/src/objcwrapper.nit index 418d639..28746d8 100644 --- a/contrib/objcwrapper/src/objcwrapper.nit +++ b/contrib/objcwrapper/src/objcwrapper.nit @@ -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 diff --git a/lib/nitcc_runtime.nit b/lib/nitcc_runtime.nit index b413c7e..bfd137d 100644 --- a/lib/nitcc_runtime.nit +++ b/lib/nitcc_runtime.nit @@ -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 -- 1.7.9.5