syntax: add safe call syntax `x?.foo`
authorJean Privat <jean@pryen.org>
Wed, 10 Jul 2019 13:54:14 +0000 (09:54 -0400)
committerJean Privat <jean@pryen.org>
Wed, 10 Jul 2019 13:54:14 +0000 (09:54 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/parser/nit.sablecc3xx
src/parser/parser_abs.nit
src/parser/parser_nodes.nit

index 1931792..d7380c5 100644 (file)
@@ -204,6 +204,7 @@ ge = '>=';
 gg = '>>';
 starship = '<=>';
 bang='!';
+quest='?';
 at='@';
 semi=';';
 
@@ -792,6 +793,7 @@ atid~forclass {-> atid}
 
 recv~nopar~nobra {-> expr}
        = expr_atom~nopar~nobra dot no {-> expr_atom~nopar~nobra.expr}
+       | {safe} expr_atom~nopar~nobra quest dot no {-> New expr.safe(expr_atom~nopar~nobra.expr, quest)}
        | {implicit} {-> New expr.implicit_self()}
        ;
 
@@ -1053,6 +1055,7 @@ expr      = {block} expr* kwend?
        | {debug_type} kwdebug kwtype expr type
        | {vararg} expr dotdotdot
        | {namedarg} id assign expr
+       | {safe} expr quest
        | {type} type
        | {methid} expr [id]:methid
        | {at} annotations
index 2f42bfc..8c0930c 100644 (file)
@@ -295,6 +295,9 @@ end
 class TBang
        super Token
 end
+class TQuest
+       super Token
+end
 class TAt
        super Token
 end
@@ -1200,6 +1203,11 @@ class ANamedargExpr
        var n_assign: TAssign is writable, noinit
        var n_expr: AExpr is writable, noinit
 end
+class ASafeExpr
+       super AExpr
+       var n_expr: AExpr is writable, noinit
+       var n_quest: TQuest is writable, noinit
+end
 class ATypeExpr
        super AExpr
        var n_type: AType is writable, noinit
index 0c535c2..92dbea0 100644 (file)
@@ -983,6 +983,11 @@ class TStarship
        super TokenOperator
 end
 
+# The operator `?`
+class TQuest
+       super TokenOperator
+end
+
 # The operator `!`
 class TBang
        super TokenOperator
@@ -2750,6 +2755,17 @@ class AVarargExpr
        var n_dotdotdot: TDotdotdot is writable, noinit
 end
 
+# A receiver with a `?` suffix used in safe call operator.
+class ASafeExpr
+       super AExpr
+
+       # The expression made safe
+       var n_expr: AExpr is writable, noinit
+
+       # The `?` symbol
+       var n_quest: TQuest is writable, noinit
+end
+
 # An named notation used to pass an expression by name in a parameter
 class ANamedargExpr
        super AExpr