nitc: ANode::dump_tree can skip structural nodes
[nit.git] / src / parser / parser_nodes.nit
index 9fe32f6..1d68c6f 100644 (file)
@@ -34,11 +34,14 @@ abstract class ANode
                sys.stderr.write "{hot_location} {self.class_name}: {message}\n{hot_location.colored_line("0;32")}\n"
        end
 
+       # Is `self` a token or a pure-structural production like `AQId`?
+       fun is_structural: Bool do return false
+
        # Write the subtree on stdout.
        # See `ASTDump`
-       fun dump_tree
+       fun dump_tree(display_structural: nullable Bool)
        do
-               var d = new ASTDump
+               var d = new ASTDump(display_structural or else true)
                d.enter_visit(self)
                d.write_to(sys.stdout)
        end
@@ -177,8 +180,14 @@ class ASTDump
        # Is used to handle the initial node parent and workaround possible inconsistent `ANode::parent`
        private var last_parent: nullable ANode = null
 
+       # Display tokens and structural production?
+       #
+       # Should tokens (and structural production like AQId) be displayed?
+       var display_structural: Bool
+
        redef fun visit(n)
        do
+               if not display_structural and n.is_structural then return
                var p = last_parent
                add(p, n)
                last_parent = n
@@ -331,6 +340,8 @@ abstract class Token
        # See `blank_before` to get the whitespace that separate tokens.
        var is_loose = false
 
+       redef fun is_structural do return true
+
        # Loose tokens that precede `self`.
        #
        # These tokens start the line or belong to a line with only loose tokens.
@@ -521,6 +532,11 @@ class TKwdo
        super TokenKeyword
 end
 
+# The keyword `catch`
+class TKwcatch
+       super TokenKeyword
+end
+
 # The keyword `var`
 class TKwvar
        super TokenKeyword
@@ -1662,6 +1678,8 @@ class AQid
 
        # The final identifier
        var n_id: TId is writable, noinit
+
+       redef fun is_structural do return true
 end
 
 # A potentially qualified class identifier `foo::bar::Baz`
@@ -1672,6 +1690,8 @@ class AQclassid
 
        # The final identifier
        var n_id: TClassid is writable, noinit
+
+       redef fun is_structural do return true
 end
 
 # A signature in a method definition. eg `(x,y:X,z:Z):T`
@@ -1776,13 +1796,10 @@ end
 
 # A `return` statement. eg `return x`
 class AReturnExpr
-       super AExpr
+       super AEscapeExpr
 
        # The `return` keyword
        var n_kwreturn: nullable TKwreturn = null is writable
-
-       # The return value, if any
-       var n_expr: nullable AExpr = null is writable
 end
 
 # A `yield` statement. eg `yield x`
@@ -1847,6 +1864,12 @@ class ADoExpr
 
        # The list of statements of the `do`.
        var n_block: nullable AExpr = null is writable
+
+       # The `catch` keyword
+       var n_kwcatch: nullable TKwcatch = null is writable
+
+       # The do catch block
+       var n_catch: nullable AExpr = null is writable
 end
 
 # A `if` statement