From fdc2a9f22f58c237d180fee4943b01f5d780f839 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2019 11:09:29 -0400 Subject: [PATCH] syntax: add call reference (funref+recv capture) `&x.foo` Signed-off-by: Jean Privat --- src/parser/nit.sablecc3xx | 2 ++ src/parser/parser_abs.nit | 7 +++++++ src/parser/parser_nodes.nit | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/parser/nit.sablecc3xx b/src/parser/nit.sablecc3xx index d7380c5..8e8bce4 100644 --- a/src/parser/nit.sablecc3xx +++ b/src/parser/nit.sablecc3xx @@ -639,6 +639,7 @@ expr_new~nopar~nobra {-> expr} = expr_atom~nopar~nobra {-> expr_atom~nopar~nobra.expr} | {new} kwnew no type_atom~nobra_nopar args {-> New expr.new(kwnew, type_atom~nobra_nopar.type, Null, args.exprs)} | {isset_attr} kwisset recv~nopar~nobra qualified_o attrid {-> New expr.isset_attr(kwisset, recv~nopar~nobra.expr, attrid)} + | {callref} amp recv~nopar~nobra qid args {-> New expr.callref(amp, recv~nopar~nobra.expr, qid, args.exprs)} ; expr_atom~nopar~nobra {-> expr} @@ -1021,6 +1022,7 @@ expr = {block} expr* kwend? | {attr_assign} expr [id]:attrid assign [value]:expr | {attr_reassign} expr [id]:attrid assign_op [value]:expr | {call} expr qid [args]:exprs + | {callref} amp expr qid [args]:exprs | {call_assign} expr qid [args]:exprs assign [value]:expr | {call_reassign} expr qid [args]:exprs assign_op [value]:expr | {super} qualified? kwsuper [args]:exprs diff --git a/src/parser/parser_abs.nit b/src/parser/parser_abs.nit index 8c0930c..5815230 100644 --- a/src/parser/parser_abs.nit +++ b/src/parser/parser_abs.nit @@ -1000,6 +1000,13 @@ class ACallExpr var n_qid: AQid is writable, noinit var n_args: AExprs is writable, noinit end +class ACallrefExpr + super AExpr + var n_amp: TAmp is writable, noinit + var n_expr: AExpr is writable, noinit + var n_qid: AQid is writable, noinit + var n_args: AExprs is writable, noinit +end class ACallAssignExpr super AExpr var n_expr: AExpr is writable, noinit diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 92dbea0..10e732a 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -2456,6 +2456,27 @@ class ACallReassignExpr super ASendReassignFormExpr end +# A reference to a method with a captured receiver. eg. `&x.foo` or just `&foo` is self is captured. +# +# Currently, the syntax is analogous to a simple call (`recv.foo`) with a prefix `&`. +# On chains, only the last call is captured (`.` has a higher precedence than `&`). +# +# The syntax is analogous to a call (except the &), there is always a receiver (including the implicit self or sys) and arguments are accepted by the parser. +# +# TODO There is no clear syntax proposal +# +# * to avoid the capture of a receiver since a receiver is statically expected to resolve the method name +# * for special method names (setters, brackets and operators) +# +# Note: The class specializes `ASendExpr` (trough `ACallFormExpr`) so some behavior of a genuine send expression must be redefined. +class ACallrefExpr + super ACallFormExpr + + # The `&` operator + var n_amp: TAmp is writable, noinit +end + + # A call to `super`. OR a call of a super-constructor class ASuperExpr super AExpr -- 1.7.9.5