diff --git a/lib/coffee_script/nodes.rb b/lib/coffee_script/nodes.rb index ffc2998c..8f3d38de 100644 --- a/lib/coffee_script/nodes.rb +++ b/lib/coffee_script/nodes.rb @@ -354,7 +354,7 @@ module CoffeeScript def compile_node(o) idx, step = o.delete(:index), o.delete(:step) - raise SyntaxError, "unexpected range literal" unless idx + return compile_array(o) unless idx vars = "#{idx}=#{@from_var}" step = step ? step.compile(o) : '1' compare = "(#{@from_var} <= #{@to_var} ? #{idx} #{less_operator} #{@to_var} : #{idx} #{greater_operator} #{@to_var})" @@ -362,6 +362,15 @@ module CoffeeScript write("#{vars}; #{compare}; #{incr}") end + # Expand the range into the equivalent array, if it's not being used as + # part of a comprehension, slice, or splice. + # TODO: This generates pretty ugly code ... shrink it. + def compile_array(o) + body = Expressions.wrap(LiteralNode.new(Value.new('i'))) + arr = Expressions.wrap(ForNode.new(body, {:source => self}, Value.new('i'))) + ParentheticalNode.new(CallNode.new(CodeNode.new([], arr))).compile(o) + end + end # An array slice literal. Unlike JavaScript's Array#slice, the second parameter diff --git a/lib/coffee_script/value.rb b/lib/coffee_script/value.rb index 532e1db8..49d65979 100644 --- a/lib/coffee_script/value.rb +++ b/lib/coffee_script/value.rb @@ -5,7 +5,7 @@ module CoffeeScript class Value attr_reader :value, :line - def initialize(value, line) + def initialize(value, line=nil) @value, @line = value, line end