mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-05-03 03:00:14 -04:00
Issue #621. Added the ability to leave the start and end index off of arrays. list[5..] is now valid CoffeeScript, slicing to the end of the array.
This commit is contained in:
@@ -307,6 +307,14 @@
|
||||
return new RangeNode($2, $5);
|
||||
}), o("INDEX_START Expression . . . Expression INDEX_END", function() {
|
||||
return new RangeNode($2, $6, true);
|
||||
}), o("INDEX_START Expression . . INDEX_END", function() {
|
||||
return new RangeNode($2, null);
|
||||
}), o("INDEX_START Expression . . . INDEX_END", function() {
|
||||
return new RangeNode($2, null, true);
|
||||
}), o("INDEX_START . . Expression INDEX_END", function() {
|
||||
return new RangeNode(null, $4);
|
||||
}), o("INDEX_START . . . Expression INDEX_END", function() {
|
||||
return new RangeNode(null, $5, true);
|
||||
})
|
||||
],
|
||||
Array: [
|
||||
|
||||
17
lib/nodes.js
17
lib/nodes.js
@@ -692,11 +692,14 @@
|
||||
SliceNode.prototype["class"] = 'SliceNode';
|
||||
SliceNode.prototype.children = ['range'];
|
||||
SliceNode.prototype.compileNode = function(o) {
|
||||
var from, plusPart, to;
|
||||
from = this.range.from.compile(o);
|
||||
to = this.range.to.compile(o);
|
||||
plusPart = this.range.exclusive ? '' : ' + 1';
|
||||
return ".slice(" + (from) + ", " + (to) + (plusPart) + ")";
|
||||
var from, to;
|
||||
from = this.range.from ? this.range.from.compile(o) : '0';
|
||||
to = this.range.to ? this.range.to.compile(o) : '';
|
||||
to += (!to || this.range.exclusive ? '' : ' + 1');
|
||||
if (to) {
|
||||
to = ', ' + to;
|
||||
}
|
||||
return ".slice(" + (from) + (to) + ")";
|
||||
};
|
||||
return SliceNode;
|
||||
})();
|
||||
@@ -990,8 +993,8 @@
|
||||
l = this.variable.properties.length;
|
||||
range = this.variable.properties[l - 1].range;
|
||||
plus = range.exclusive ? '' : ' + 1';
|
||||
from = range.from.compile(o);
|
||||
to = range.to.compile(o) + ' - ' + from + plus;
|
||||
from = range.from ? range.from.compile(o) : '0';
|
||||
to = range.to ? range.to.compile(o) + ' - ' + from + plus : ("" + (name) + ".length");
|
||||
val = this.value.compile(o);
|
||||
return "" + (name) + ".splice.apply(" + (name) + ", [" + (from) + ", " + (to) + "].concat(" + (val) + "))";
|
||||
};
|
||||
|
||||
190
lib/parser.js
190
lib/parser.js
File diff suppressed because one or more lines are too long
@@ -348,6 +348,10 @@ grammar =
|
||||
Slice: [
|
||||
o "INDEX_START Expression . . Expression INDEX_END", -> new RangeNode $2, $5
|
||||
o "INDEX_START Expression . . . Expression INDEX_END", -> new RangeNode $2, $6, true
|
||||
o "INDEX_START Expression . . INDEX_END", -> new RangeNode $2, null
|
||||
o "INDEX_START Expression . . . INDEX_END", -> new RangeNode $2, null, true
|
||||
o "INDEX_START . . Expression INDEX_END", -> new RangeNode null, $4
|
||||
o "INDEX_START . . . Expression INDEX_END", -> new RangeNode null, $5, true
|
||||
]
|
||||
|
||||
# The array literal.
|
||||
|
||||
@@ -621,10 +621,11 @@ exports.SliceNode = class SliceNode extends BaseNode
|
||||
super()
|
||||
|
||||
compileNode: (o) ->
|
||||
from = @range.from.compile(o)
|
||||
to = @range.to.compile(o)
|
||||
plusPart = if @range.exclusive then '' else ' + 1'
|
||||
".slice(#{from}, #{to}#{plusPart})"
|
||||
from = if @range.from then @range.from.compile(o) else '0'
|
||||
to = if @range.to then @range.to.compile(o) else ''
|
||||
to += if not to or @range.exclusive then '' else ' + 1'
|
||||
to = ', ' + to if to
|
||||
".slice(#{from}#{to})"
|
||||
|
||||
#### ObjectNode
|
||||
|
||||
@@ -860,8 +861,8 @@ exports.AssignNode = class AssignNode extends BaseNode
|
||||
l = @variable.properties.length
|
||||
range = @variable.properties[l - 1].range
|
||||
plus = if range.exclusive then '' else ' + 1'
|
||||
from = range.from.compile(o)
|
||||
to = range.to.compile(o) + ' - ' + from + plus
|
||||
from = if range.from then range.from.compile(o) else '0'
|
||||
to = if range.to then range.to.compile(o) + ' - ' + from + plus else "#{name}.length"
|
||||
val = @value.compile(o)
|
||||
"#{name}.splice.apply(#{name}, [#{from}, #{to}].concat(#{val}))"
|
||||
|
||||
|
||||
@@ -56,3 +56,20 @@ array[5..10] = [0, 0, 0]
|
||||
ok array.join(' ') is '0 1 2 3 4 0 0 0'
|
||||
|
||||
|
||||
# Slices and splices that omit their beginning or end.
|
||||
array = [0..10]
|
||||
|
||||
ok array[7..].join(' ') is '7 8 9 10'
|
||||
ok array[-2..].join(' ') is '9 10'
|
||||
|
||||
ok array[...3].join(' ') is '0 1 2'
|
||||
ok array[..-5].join(' ') is '0 1 2 3 4 5 6'
|
||||
|
||||
array[3..] = [9, 8, 7]
|
||||
|
||||
ok array.join(' ') is '0 1 2 9 8 7'
|
||||
|
||||
array[...3] = [7, 8, 9]
|
||||
|
||||
ok array.join(' ') is '7 8 9 9 8 7'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user