diff --git a/lib/coffee-script/nodes.js b/lib/coffee-script/nodes.js index bb7c1813..6464949f 100644 --- a/lib/coffee-script/nodes.js +++ b/lib/coffee-script/nodes.js @@ -1868,6 +1868,8 @@ obj = _ref2[_i]; if (obj instanceof Assign) { names.push(obj.variable.base.value); + } else if (obj instanceof Splat) { + names.push(obj.name.unwrap().value); } else if (obj.isArray() || obj.isObject()) { names.push.apply(names, this.names(obj.base)); } else if (obj["this"]) { diff --git a/src/nodes.coffee b/src/nodes.coffee index 22584459..d2848ce0 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -1279,6 +1279,9 @@ exports.Param = class Param extends Base # * assignments within destructured parameters `{foo:bar}` if obj instanceof Assign names.push obj.variable.base.value + # * splats within destructured parameters `[xs...]` + else if obj instanceof Splat + names.push obj.name.unwrap().value # * destructured parameters within destructured parameters `[{a}]` else if obj.isArray() or obj.isObject() names.push @names(obj.base)... diff --git a/test/assignment.coffee b/test/assignment.coffee index 8426dc21..6a7ceef0 100644 --- a/test/assignment.coffee +++ b/test/assignment.coffee @@ -350,3 +350,10 @@ test "#1838: Regression with variable assignment", -> 'dave' eq name, 'dave' + +test '#2211: splats in destructured parameters', -> + doesNotThrow -> CoffeeScript.compile '([a...]) ->' + doesNotThrow -> CoffeeScript.compile '([a...],b) ->' + doesNotThrow -> CoffeeScript.compile '([a...],[b...]) ->' + throws -> CoffeeScript.compile '([a...,[a...]]) ->' + doesNotThrow -> CoffeeScript.compile '([a...,[b...]]) ->'