X-Git-Url: http://nitlanguage.org diff --git a/lib/nitcc_runtime.nit b/lib/nitcc_runtime.nit index 31c0a45..bfd137d 100644 --- a/lib/nitcc_runtime.nit +++ b/lib/nitcc_runtime.nit @@ -274,7 +274,7 @@ end # Print a node (using to_s) on a line and recustively each children indented (with two spaces) class TreePrinterVisitor super Visitor - var writer: OStream + var writer: Writer private var indent = 0 redef fun visit(n) do @@ -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 @@ -322,7 +357,7 @@ abstract class Node # Produce a graphiz file for the syntaxtic tree rooted at `self`. fun to_dot(filepath: String) do - var f = new OFStream.open(filepath) + var f = new FileWriter.open(filepath) f.write("digraph g \{\n") f.write("rankdir=BT;\n") @@ -346,7 +381,7 @@ abstract class Node f.close end - private fun to_dot_visitor(f: OStream, a: Array[NToken]) + private fun to_dot_visitor(f: Writer, a: Array[NToken]) do f.write("n{object_id} [label=\"{node_name}\"];\n") for x in children do @@ -494,7 +529,7 @@ class Nodes[T: Node] end # A production with a specific, named and statically typed children -class NProd +abstract class NProd super Node redef var children: SequenceRead[nullable Node] = new NProdChildren(self) @@ -558,7 +593,7 @@ abstract class TestParser end text = args.shift else - var f = new IFStream.open(filepath) + var f = new FileReader.open(filepath) text = f.read_all f.close end @@ -582,7 +617,7 @@ abstract class TestParser var tokout = "{name}.tokens.out" print "TOKEN: {tokens.length} tokens (see {tokout})" - var f = new OFStream.open(tokout) + var f = new FileWriter.open(tokout) for t in tokens do f.write "{t.to_s}\n" end @@ -594,7 +629,7 @@ abstract class TestParser var n = p.parse var astout = "{name}.ast.out" - f = new OFStream.open(astout) + f = new FileWriter.open(astout) var tpv = new TreePrinterVisitor(f) var astdotout = "{name}.ast.dot" if n isa NError then