Skip to content

Commit cf02f1b

Browse files
committed
closes #86; implemented named destructuring
1 parent 5bc43f4 commit cf02f1b

File tree

7 files changed

+144
-106
lines changed

7 files changed

+144
-106
lines changed

extras/coco.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/ast.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,13 @@ List = (function(_super){
956956
List.displayName = 'List';
957957
var prototype = __extends(List, _super).prototype;
958958
prototype.children = ['items'];
959+
prototype.show = function(){
960+
return this.name;
961+
};
962+
prototype.named = function(name){
963+
this.name = name;
964+
return this;
965+
};
959966
prototype.isEmpty = function(){
960967
return !this.items.length;
961968
};
@@ -1686,12 +1693,15 @@ exports.Assign = Assign = (function(_super){
16861693
return If(test, left).addElse(put).compileNode(o);
16871694
};
16881695
prototype.compileDestructuring = function(o, left){
1689-
var items, len, ret, rite, rref, cache, list, code;
1696+
var items, len, ret, rite, that, cache, rref, list, code;
16901697
items = left.items;
16911698
len = items.length;
16921699
ret = o.level && !this['void'];
16931700
rite = this.right.compile(o, len === 1 ? LEVEL_CALL : LEVEL_LIST);
1694-
if ((ret || len > 1) && (!ID.test(rite) || left.assigns(rite))) {
1701+
if (that = left.name) {
1702+
cache = that + " = " + rite;
1703+
o.scope.declare(rite = that);
1704+
} else if ((ret || len > 1) && (!ID.test(rite) || left.assigns(rite))) {
16951705
cache = (rref = o.scope.temporary('ref')) + " = " + rite;
16961706
rite = rref;
16971707
}
@@ -2112,7 +2122,7 @@ exports.Fun = Fun = (function(_super){
21122122
if (vr.isEmpty()) {
21132123
vr = Var(scope.temporary('arg'));
21142124
} else if (!(vr instanceof Var)) {
2115-
v = Var(vr.varName() || scope.temporary('arg'));
2125+
v = Var((_ref = vr.name, delete vr.name, _ref) || vr.varName() || scope.temporary('arg'));
21162126
assigns.push(Assign(vr, df ? Op(p.op, v, p.second) : v));
21172127
vr = v;
21182128
} else if (df) {

lib/grammar.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ bnf = {
3838
return L(Arr($2));
3939
}), o('{ Properties OptComma }', function(){
4040
return L(Obj($2));
41+
}), o('[ ArgList OptComma ] LABEL', function(){
42+
return L(Arr($2)).named($5);
43+
}), o('{ Properties OptComma } LABEL', function(){
44+
return L(Obj($2)).named($5);
4145
})
4246
],
4347
Key: [o('KeyBase'), o('Parenthetical')],

lib/parser.js

Lines changed: 101 additions & 97 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ast.co

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -572,9 +572,13 @@ class exports.Call extends Node
572572
#### List
573573
# An abstract node for a list of comma-separated items.
574574
class List extends Node
575-
children : [\items]
576-
isEmpty : -> not @items.length
577-
assigns : -> return true if node.assigns it for node of @items
575+
children: [\items]
576+
577+
show : -> @name
578+
named : (@name) -> this
579+
580+
isEmpty : -> not @items.length
581+
assigns : -> return true if node.assigns it for node of @items
578582

579583
@compile = (o, items) ->
580584
switch items.length
@@ -1011,7 +1015,10 @@ class exports.Assign extends Node
10111015
compileDestructuring: (o, left) ->
10121016
{items} = left; len = items.length; ret = o.level and not @void
10131017
rite = @right.compile o, if len is 1 then LEVEL_CALL else LEVEL_LIST
1014-
if (ret or len > 1) and (not ID.test rite or left.assigns rite)
1018+
if left.name
1019+
cache = "#that = #rite"
1020+
o.scope.declare rite = that
1021+
else if (ret or len > 1) and (not ID.test rite or left.assigns rite)
10151022
cache = "#{ rref = o.scope.temporary \ref } = #rite"
10161023
rite = rref
10171024
list = @"rend#{ left..displayName }" o, items, rite
@@ -1279,7 +1286,7 @@ class exports.Fun extends Node
12791286
if vr.isEmpty()
12801287
vr = Var scope.temporary \arg
12811288
else if vr not instanceof Var
1282-
v = Var vr.varName() || scope.temporary \arg
1289+
v = Var delete vr.name || vr.varName() || scope.temporary \arg
12831290
assigns.push Assign vr, if df then Op p.op, v, p.second else v
12841291
vr = v
12851292
else if df

src/grammar.co

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ bnf =
7676
List:
7777
o '[ ArgList OptComma ]' -> L Arr $2
7878
o '{ Properties OptComma }' -> L Obj $2
79+
# Can be labeled to perform named destructuring.
80+
o '[ ArgList OptComma ] LABEL' -> L Arr $2 .named $5
81+
o '{ Properties OptComma } LABEL' -> L Obj $2 .named $5
7982

8083
# **Key** represents a property name, before `:` or after `.`.
8184
Key:

test/assignment.co

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,3 +293,13 @@ o = d: 0, e: 1
293293
o{d, e} &&*= d: 2, e: 3
294294
eq 0 o.d
295295
eq 3 o.e
296+
297+
298+
### Named Destructuring
299+
[b, c]:a = [0 1]
300+
eq b, a.0
301+
eq c, a.1
302+
303+
let {p, q}:o = {2 3}
304+
eq p, o.p
305+
eq q, o.q

0 commit comments

Comments
 (0)