grammar: add `for_group` in `for` for multi-iterators
[nit.git] / src / parser / parser_nodes.nit
index 8c7b941..df01109 100644 (file)
@@ -203,6 +203,7 @@ class ANodes[E: ANode]
        private var parent: ANode
        private var items = new Array[E]
        redef fun iterator do return items.iterator
+       redef fun reverse_iterator do return items.reverse_iterator
        redef fun length do return items.length
        redef fun is_empty do return items.is_empty
        redef fun push(e)
@@ -311,6 +312,35 @@ abstract class Token
        # May have disappeared in the AST
        var next_token: nullable Token = null
 
+       # Is `self` a token discarded from the AST?
+       #
+       # Loose tokens are not present in the AST.
+       # It means they were identified by the lexer but were discarded by the parser.
+       # It also means that they are not visited or manipulated by AST-related functions.
+       #
+       # Each loose token is attached to the non-loose token that precedes or follows it.
+       # The rules are the following:
+       #
+       # * tokens that follow a non-loose token on a same line are attached to it.
+       #   See `next_looses`.
+       # * other tokens, thus that precede a non-loose token on the same line or the next one,
+       # are attached to this one. See `prev_looses`.
+       #
+       # Loose tokens are mostly end of lines (`TEol`) and comments (`TComment`).
+       # Whitespace are ignored by the lexer, so they are not even considered as loose tokens.
+       # See `blank_before` to get the whitespace that separate tokens.
+       var is_loose = false
+
+       # Loose tokens that precede `self`.
+       #
+       # These tokens start the line or belong to a line with only loose tokens.
+       var prev_looses = new Array[Token] is lazy
+
+       # Loose tokens that follow `self`
+       #
+       # These tokens are on the same line than `self`.
+       var next_looses = new Array[Token] is lazy
+
        # The verbatim blank text between `prev_token` and `self`
        fun blank_before: String
        do
@@ -936,13 +966,8 @@ abstract class TokenLiteral
        end
 end
 
-# A literal decimal integer
-class TNumber
-       super TokenLiteral
-end
-
-# A literal hexadecimal integer
-class THexNumber
+# A literal integer
+class TInteger
        super TokenLiteral
 end
 
@@ -1142,9 +1167,15 @@ class AStdClassdef
        # The name of the class
        var n_id: nullable TClassid = null is writable
 
+       # The `[` symbol
+       var n_obra: nullable TObra = null is writable
+
        # The list of formal parameter types
        var n_formaldefs = new ANodes[AFormaldef](self)
 
+       # The `]` symbol
+       var n_cbra: nullable TCbra = null is writable
+
        # The extern block code
        var n_extern_code_block: nullable AExternCodeBlock = null is writable
 
@@ -1240,21 +1271,30 @@ end
 class AAttrPropdef
        super APropdef
 
-       # The identifier for a old-style attribute (null if new-style)
+       # The `var` keyword
        var n_kwvar: TKwvar is writable, noinit
 
-       # The identifier for a new-style attribute (null if old-style)
+       # The identifier for a new-style attribute
        var n_id2: TId is writable, noinit
 
        # The declared type of the attribute
        var n_type: nullable AType = null is writable
 
+       # The `=` symbol
+       var n_assign: nullable TAssign = null is writable
+
        # The initial value, if any (set with `=`)
        var n_expr: nullable AExpr = null is writable
 
+       # The `do` keyword
+       var n_kwdo: nullable TKwdo = null is writable
+
        # The initial value, if any (set with `do return`)
        var n_block: nullable AExpr = null is writable
 
+       # The `end` keyword
+       var n_kwend: nullable TKwend = null is writable
+
        redef fun hot_location
        do
                return n_id2.location
@@ -1280,9 +1320,15 @@ class AMethPropdef
        # The signature of the method, if any
        var n_signature: nullable ASignature = null is writable
 
+       # The `do` keyword
+       var n_kwdo: nullable TKwdo = null is writable
+
        # The body (in Nit) of the method, if any
        var n_block: nullable AExpr = null is writable
 
+       # The `end` keyword
+       var n_kwend: nullable TKwend = null is writable
+
        # The list of declared callbacks (for extern methods)
        var n_extern_calls: nullable AExternCalls = null is writable
 
@@ -1603,6 +1649,16 @@ class ABraassignMethid
        var n_assign: TAssign is writable, noinit
 end
 
+# A potentially qualified simple identifier `foo::bar::baz`
+class AQid
+       super Prod
+       # The qualifier, if any
+       var n_qualified: nullable AQualified = null is writable
+
+       # The final identifier
+       var n_id: TId is writable, noinit
+end
+
 # A signature in a method definition. eg `(x,y:X,z:Z):T`
 class ASignature
        super Prod
@@ -1643,8 +1699,14 @@ class AType
        # The name of the class or of the formal type
        var n_id: TClassid is writable, noinit
 
+       # The opening bracket
+       var n_obra: nullable TObra = null is writable
+
        # Type arguments for a generic type
        var n_types = new ANodes[AType](self)
+
+       # The closing bracket
+       var n_cbra: nullable TCbra = null is writable
 end
 
 # A label at the end of a block or in a break/continue statement. eg `label x`
@@ -1771,9 +1833,15 @@ class AIfExpr
        # The expression used as the condition of the `if`
        var n_expr: AExpr is writable, noinit
 
+       # The `then` keyword
+       var n_kwthen: TKwthen is writable, noinit
+
        # The body of the `then` part
        var n_then: nullable AExpr = null is writable
 
+       # The `else` keyword
+       var n_kwelse: nullable TKwelse = null is writable
+
        # The body of the `else` part
        var n_else: nullable AExpr = null is writable
 end
@@ -1839,11 +1907,8 @@ class AForExpr
        # The `for` keyword
        var n_kwfor: TKwfor is writable, noinit
 
-       # The list of name of the automatic variables
-       var n_ids = new ANodes[TId](self)
-
-       # The expression used as the collection to iterate on
-       var n_expr: AExpr is writable, noinit
+       # The list of groups to iterate
+       var n_groups = new ANodes[AForGroup](self)
 
        # The `do` keyword
        var n_kwdo: TKwdo is writable, noinit
@@ -1852,6 +1917,23 @@ class AForExpr
        var n_block: nullable AExpr = null is writable
 end
 
+# A collection iterated by a for, its automatic variables and its implicit iterator.
+#
+# Standard `for` iterate on a single collection.
+# Multiple `for` can iterate on more than one collection at once.
+class AForGroup
+       super Prod
+
+       # The list of name of the automatic variables
+       var n_ids = new ANodes[TId](self)
+
+       # The `in` keyword
+       var n_kwin: TKwin is writable, noinit
+
+       # The expression used as the collection to iterate on
+       var n_expr: AExpr is writable, noinit
+end
+
 # A `with` statement
 class AWithExpr
        super AExpr
@@ -1883,6 +1965,9 @@ class AAssertExpr
        # The expression used as the condition of the `assert`
        var n_expr: AExpr is writable, noinit
 
+       # The `else` keyword
+       var n_kwelse: nullable TKwelse = null is writable
+
        # The body to execute when the assert fails
        var n_else: nullable AExpr = null is writable
 end
@@ -1996,15 +2081,22 @@ class ANotExpr
        var n_expr: AExpr is writable, noinit
 end
 
+# A `==` or a `!=` expression
+#
+# Both have a similar effect on adaptive typing, so this class factorizes the common behavior.
+class AEqFormExpr
+       super ABinopExpr
+end
+
 # A `==` expression
 class AEqExpr
-       super ABinopExpr
+       super AEqFormExpr
        redef fun operator do return "=="
 end
 
 # A `!=` expression
 class ANeExpr
-       super ABinopExpr
+       super AEqFormExpr
        redef fun operator do return "!="
 end
 
@@ -2119,7 +2211,7 @@ class AAmpExpr
 end
 
 # A unary operation on a method
-class AUnaryopExpr
+abstract class AUnaryopExpr
        super ASendExpr
 
        # The operator
@@ -2158,7 +2250,7 @@ class ANewExpr
        var n_type: AType is writable, noinit
 
        # The name of the named-constructor, if any
-       var n_id: nullable TId = null is writable
+       var n_qid: nullable AQid = null is writable
 
        # The arguments of the `new`
        var n_args: AExprs is writable, noinit
@@ -2192,7 +2284,7 @@ abstract class ACallFormExpr
        super ASendExpr
 
        # The name of the method
-       var n_id: TId is writable, noinit
+       var n_qid: AQid is writable, noinit
 
        # The arguments of the call
        var n_args: AExprs is writable, noinit
@@ -2319,7 +2411,10 @@ abstract class ARangeExpr
        # The left (lower) element of the range
        var n_expr: AExpr is writable, noinit
 
-       # The right (uppr) element of the range
+       # The `..`
+       var n_dotdot: TDotdot is writable, noinit
+
+       # The right (upper) element of the range
        var n_expr2: AExpr is writable, noinit
 end
 
@@ -2400,24 +2495,11 @@ class ANullExpr
 end
 
 # An integer literal
-class AIntExpr
+class AIntegerExpr
        super AExpr
-end
-
-# An integer literal in decimal format
-class ADecIntExpr
-       super AIntExpr
 
-       # The decimal token
-       var n_number: TNumber is writable, noinit
-end
-
-# An integer literal in hexadecimal format
-class AHexIntExpr
-       super AIntExpr
-
-       # The hexadecimal token
-       var n_hex_number: THexNumber is writable, noinit
+       # The integer token
+       var n_integer: TInteger is writable, noinit
 end
 
 # A float literal
@@ -2740,7 +2822,7 @@ class AModuleName
        # The starting quad (`::`)
        var n_quad: nullable TQuad = null is writable
 
-       # The list of quad-separated project/group identifiers
+       # The list of quad-separated package/group identifiers
        var n_path = new ANodes[TId](self)
 
        # The final module identifier
@@ -2776,7 +2858,7 @@ class AQualified
        # The starting quad (`::`)
        var n_quad: nullable TQuad = null is writable
 
-       # The list of quad-separated project/group/module identifiers
+       # The list of quad-separated package/group/module identifiers
        var n_id = new ANodes[TId](self)
 
        # A class identifier
@@ -2802,6 +2884,9 @@ end
 class AAnnotations
        super Prod
 
+       # The `is` keyword, for *is* annotations
+       var n_kwis: nullable TKwis = null is writable
+
        # The `@` symbol, for *at* annotations
        var n_at: nullable TAt = null is writable
 
@@ -2813,6 +2898,9 @@ class AAnnotations
 
        # The closing parenthesis in *at* annotations
        var n_cpar: nullable TCpar = null is writable
+
+       # The `end` keyword, for *is* annotations
+       var n_kwend: nullable TKwend = null is writable
 end
 
 # A single annotation