nitc: dump_tree can display the lines of the source-code
authorJean Privat <jean@pryen.org>
Thu, 9 Feb 2017 18:14:39 +0000 (13:14 -0500)
committerJean Privat <jean@pryen.org>
Thu, 9 Feb 2017 18:22:11 +0000 (13:22 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

src/parser/parser_nodes.nit

index e96d7b6..d8dc9eb 100644 (file)
@@ -39,10 +39,15 @@ abstract class ANode
        fun is_structural: Bool do return false
 
        # Write the subtree on stdout.
-       # See `ASTDump`
-       fun dump_tree(display_structural: nullable Bool)
+       #
+       # Visit the subtree and display it with additional and useful information.
+       #
+       # By default, this displays all kind of nodes and the corresponding lines of codes.
+       #
+       # See `ASTDump` for details.
+       fun dump_tree(display_structural, display_line: nullable Bool)
        do
-               var d = new ASTDump(display_structural or else true)
+               var d = new ASTDump(display_structural or else true, display_line or else true)
                d.enter_visit(self)
                d.write_to(sys.stdout)
        end
@@ -191,6 +196,14 @@ class ASTDump
        # Should tokens (and structural production like AQId) be displayed?
        var display_structural: Bool
 
+       # Display lines?
+       #
+       # Should each new line be displayed (numbered and in gray)?
+       var display_line: Bool
+
+       # Current line number (when printing lines)
+       private var line = 0
+
        redef fun visit(n)
        do
                if not display_structural and n.is_structural then return
@@ -201,6 +214,25 @@ class ASTDump
                last_parent = p
        end
 
+       redef fun write_line(o, n, p)
+       do
+               if display_line then
+                       var ls = n.location.line_start
+                       var file = n.location.file
+                       var line = self.line
+                       if ls > line and file != null then
+                               if line == 0 then line = ls - 1
+                               while line < ls do
+                                       line += 1
+                                       o.write "{line}\t{file.get_line(line)}\n".light_gray
+                               end
+                               self.line = ls
+                       end
+               end
+
+               super
+       end
+
        redef fun display(n)
        do
                return "{n.class_name} {n.dump_info(self)} @{n.location}"