parser: add `is_loose`, `prev_looses` and `next_looses`
[nit.git] / src / parser / parser_nodes.nit
index 219c396..6d7233e 100644 (file)
@@ -311,6 +311,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
@@ -750,6 +779,21 @@ class TStarstareq
        super TokenOperator
 end
 
+# The operator `|=`
+class TPipeeq
+       super TokenOperator
+end
+
+# The operator `^=`
+class TCareteq
+       super TokenOperator
+end
+
+# The operator `&=`
+class TAmpeq
+       super TokenOperator
+end
+
 # The operator `<<=`
 class TLleq
        super TokenOperator
@@ -800,11 +844,31 @@ class TSlash
        super TokenOperator
 end
 
-# The operator `+%
+# The operator `%`
 class TPercent
        super TokenOperator
 end
 
+# The operator `|`
+class TPipe
+       super TokenOperator
+end
+
+# The operator `^`
+class TCaret
+       super TokenOperator
+end
+
+# The operator `&`
+class TAmp
+       super TokenOperator
+end
+
+# The operator `~`
+class TTilde
+       super TokenOperator
+end
+
 # The operator `==`
 class TEq
        super TokenOperator
@@ -860,6 +924,11 @@ class TAt
        super Token
 end
 
+# The symbol `;`
+class TSemi
+       super Token
+end
+
 # A class (or formal type) identifier. They start with an uppercase.
 class TClassid
        super Token
@@ -1102,9 +1171,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
 
@@ -1200,21 +1275,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
@@ -1240,9 +1324,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
 
@@ -1460,7 +1550,26 @@ end
 # A method name `%`
 class APercentMethid
        super AOperatorMethid
+end
 
+# A method name `|`
+class APipeMethid
+       super AOperatorMethid
+end
+
+# A method name `^`
+class ACaretMethid
+       super AOperatorMethid
+end
+
+# A method name `&`
+class AAmpMethid
+       super AOperatorMethid
+end
+
+# A method name `~`
+class ATildeMethid
+       super AOperatorMethid
 end
 
 # A method name `==`
@@ -1584,8 +1693,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`
@@ -1712,9 +1827,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
@@ -1783,6 +1904,9 @@ class AForExpr
        # 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
 
@@ -1824,6 +1948,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
@@ -2041,20 +2168,51 @@ class APercentExpr
        redef fun operator do return "%"
 end
 
-# A unary minus expression. eg `-x`
-class AUminusExpr
+# A `|` expression
+class APipeExpr
+       super ABinopExpr
+       redef fun operator do return "|"
+end
+
+# A `^` expression
+class ACaretExpr
+       super ABinopExpr
+       redef fun operator do return "^"
+end
+
+# A `&` expression
+class AAmpExpr
+       super ABinopExpr
+       redef fun operator do return "&"
+end
+
+# A unary operation on a method
+class AUnaryopExpr
        super ASendExpr
 
-       # The `-` symbol
-       var n_minus: TMinus is writable, noinit
+       # The operator
+       var n_op: Token is writable, noinit
+
+       # The name of the operator (eg '+')
+       fun operator: String is abstract
+end
+
+# A unary minus expression. eg `-x`
+class AUminusExpr
+       super AUnaryopExpr
+       redef fun operator do return "-"
 end
 
 # A unary plus expression. eg `+x`
 class AUplusExpr
-       super ASendExpr
+       super AUnaryopExpr
+       redef fun operator do return "+"
+end
 
-       # The `+` symbol
-       var n_plus: TPlus is writable, noinit
+# A unary `~` expression
+class AUtildeExpr
+       super AUnaryopExpr
+       redef fun operator do return "~"
 end
 
 # An explicit instantiation. eg `new T`
@@ -2229,7 +2387,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
 
@@ -2452,6 +2613,20 @@ class AVarargExpr
        var n_dotdotdot: TDotdotdot is writable, noinit
 end
 
+# An named notation used to pass an expression by name in a parameter
+class ANamedargExpr
+       super AExpr
+
+       # The name of the argument
+       var n_id: TId is writable, noinit
+
+       # The `=` synbol
+       var n_assign: TAssign is writable, noinit
+
+       # The passed expression
+       var n_expr: AExpr is writable, noinit
+end
+
 # A list of expression separated with commas (arguments for instance)
 class AManyExpr
        super AExpr
@@ -2594,6 +2769,27 @@ class AStarstarAssignOp
        redef fun operator do return "**"
 end
 
+# A `|=` assignment operation
+class APipeAssignOp
+       super AAssignOp
+
+       redef fun operator do return "|"
+end
+
+# A `^=` assignment operation
+class ACaretAssignOp
+       super AAssignOp
+
+       redef fun operator do return "^"
+end
+
+# A `&=` assignment operation
+class AAmpAssignOp
+       super AAssignOp
+
+       redef fun operator do return "&"
+end
+
 # A `<<=` assignment operation
 class ALlAssignOp
        super AAssignOp
@@ -2677,6 +2873,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
 
@@ -2688,6 +2887,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