mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
self-compiling pattern matching correctly
This commit is contained in:
parent
98f15d001f
commit
38d1381c02
2 changed files with 18 additions and 7 deletions
|
@ -779,7 +779,14 @@
|
||||||
idx = __b[1];
|
idx = __b[1];
|
||||||
}
|
}
|
||||||
access_class = this.variable.is_array() ? IndexNode : AccessorNode;
|
access_class = this.variable.is_array() ? IndexNode : AccessorNode;
|
||||||
obj instanceof SplatNode ? (val = new LiteralNode(obj.compile_value(o, val_var, this.variable.base.objects.indexOf(obj)))) : (val = new ValueNode(new LiteralNode(val_var), [new access_class(idx)]));
|
if (obj instanceof SplatNode) {
|
||||||
|
val = new LiteralNode(obj.compile_value(o, val_var, this.variable.base.objects.indexOf(obj)));
|
||||||
|
} else {
|
||||||
|
if (!(typeof idx === 'object')) {
|
||||||
|
idx = new LiteralNode(idx);
|
||||||
|
}
|
||||||
|
val = new ValueNode(new LiteralNode(val_var), [new access_class(idx)]);
|
||||||
|
}
|
||||||
assigns.push(new AssignNode(obj, val).compile(o));
|
assigns.push(new AssignNode(obj, val).compile(o));
|
||||||
}
|
}
|
||||||
return assigns.join("\n");
|
return assigns.join("\n");
|
||||||
|
@ -853,11 +860,13 @@
|
||||||
return this.index ? this.compile_param(o) : this.name.compile(o);
|
return this.index ? this.compile_param(o) : this.name.compile(o);
|
||||||
},
|
},
|
||||||
compile_param: function compile_param(o) {
|
compile_param: function compile_param(o) {
|
||||||
o.scope.find(this.name);
|
var name;
|
||||||
return this.name + ' = Array.prototype.slice.call(arguments, ' + this.index + ')';
|
name = this.name.compile(o);
|
||||||
|
o.scope.find(name);
|
||||||
|
return name + ' = Array.prototype.slice.call(arguments, ' + this.index + ')';
|
||||||
},
|
},
|
||||||
compile_value: function compile_value(o, name, index) {
|
compile_value: function compile_value(o, name, index) {
|
||||||
return "Array.prototype.slice.call(" + this.name + ', ' + this.index + ')';
|
return "Array.prototype.slice.call(" + name + ', ' + index + ')';
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
// A while loop, the only sort of low-level loop exposed by CoffeeScript. From
|
// A while loop, the only sort of low-level loop exposed by CoffeeScript. From
|
||||||
|
|
|
@ -600,6 +600,7 @@ AssignNode: exports.AssignNode: inherit Node, {
|
||||||
if obj instanceof SplatNode
|
if obj instanceof SplatNode
|
||||||
val: new LiteralNode(obj.compile_value(o, val_var, @variable.base.objects.indexOf(obj)))
|
val: new LiteralNode(obj.compile_value(o, val_var, @variable.base.objects.indexOf(obj)))
|
||||||
else
|
else
|
||||||
|
idx: new LiteralNode(idx) unless typeof idx is 'object'
|
||||||
val: new ValueNode(new LiteralNode(val_var), [new access_class(idx)])
|
val: new ValueNode(new LiteralNode(val_var), [new access_class(idx)])
|
||||||
assigns.push(new AssignNode(obj, val).compile(o))
|
assigns.push(new AssignNode(obj, val).compile(o))
|
||||||
assigns.join("\n")
|
assigns.join("\n")
|
||||||
|
@ -664,11 +665,12 @@ SplatNode: exports.SplatNode: inherit Node, {
|
||||||
if @index then @compile_param(o) else @name.compile(o)
|
if @index then @compile_param(o) else @name.compile(o)
|
||||||
|
|
||||||
compile_param: (o) ->
|
compile_param: (o) ->
|
||||||
o.scope.find @name
|
name: @name.compile(o)
|
||||||
@name + ' = Array.prototype.slice.call(arguments, ' + @index + ')'
|
o.scope.find name
|
||||||
|
name + ' = Array.prototype.slice.call(arguments, ' + @index + ')'
|
||||||
|
|
||||||
compile_value: (o, name, index) ->
|
compile_value: (o, name, index) ->
|
||||||
"Array.prototype.slice.call(" + @name + ', ' + @index + ')'
|
"Array.prototype.slice.call(" + name + ', ' + index + ')'
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue