js-on-sx: obj destructure rename + rest + nested tolerance
Pattern {key: local-name} emits ("rename" key local). Transpile
emits (define local (js-get-prop tmp key)).
Rest in obj pattern stubs (no supported), nested {} and [] treated
as holes.
442/444 unit (+2), 148/148 slice unchanged.
This commit is contained in:
@@ -862,17 +862,45 @@
|
||||
(st names)
|
||||
(cond
|
||||
((jp-at? st "punct" "}") nil)
|
||||
((jp-at? st "punct" "...")
|
||||
(begin
|
||||
(jp-advance! st)
|
||||
(when
|
||||
(= (get (jp-peek st) :type) "ident")
|
||||
(append! names (list "rest" (get (jp-peek st) :value)))
|
||||
(jp-advance! st))))
|
||||
(else
|
||||
(begin
|
||||
(let
|
||||
((nm (get (jp-peek st) :value)))
|
||||
((key (get (jp-peek st) :value)))
|
||||
(if
|
||||
(or
|
||||
(= (get (jp-peek st) :type) "ident")
|
||||
(= (get (jp-peek st) :type) "string"))
|
||||
(= (get (jp-peek st) :type) "string")
|
||||
(= (get (jp-peek st) :type) "number"))
|
||||
(jp-advance! st)
|
||||
(error "expected ident in obj pattern"))
|
||||
(append! names nm))
|
||||
(error "expected key in obj pattern"))
|
||||
(if
|
||||
(jp-at? st "punct" ":")
|
||||
(begin
|
||||
(jp-advance! st)
|
||||
(cond
|
||||
((= (get (jp-peek st) :type) "ident")
|
||||
(begin
|
||||
(append!
|
||||
names
|
||||
(list "rename" key (get (jp-peek st) :value)))
|
||||
(jp-advance! st)))
|
||||
((jp-at? st "punct" "{")
|
||||
(begin (jp-skip-balanced st "{" "}") (append! names nil)))
|
||||
((jp-at? st "punct" "[")
|
||||
(begin (jp-skip-balanced st "[" "]") (append! names nil)))
|
||||
(else
|
||||
(error "expected ident/pattern after : in obj pattern"))))
|
||||
(append! names key))
|
||||
(when
|
||||
(jp-at? st "op" "=")
|
||||
(begin (jp-advance! st) (jp-parse-assignment st))))
|
||||
(cond
|
||||
((jp-at? st "punct" ",")
|
||||
(begin (jp-advance! st) (jp-parse-obj-pattern-loop st names)))
|
||||
|
||||
Reference in New Issue
Block a user