From e30a267c9da8f9b470c122d4d3d16345ca04567e Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 1 Jan 2010 11:19:57 -0500 Subject: [PATCH] fixing precedence order, so that you can nest range comprehensions --- lib/coffee_script/grammar.y | 3 ++- lib/coffee_script/nodes.rb | 9 +++++---- .../execution/test_nested_comprehensions.coffee | 11 +++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/execution/test_nested_comprehensions.coffee diff --git a/lib/coffee_script/grammar.y b/lib/coffee_script/grammar.y index 8bf0ad07..30351fda 100644 --- a/lib/coffee_script/grammar.y +++ b/lib/coffee_script/grammar.y @@ -32,7 +32,8 @@ prechigh left '.' right INDENT left OUTDENT - right THROW FOR IN WHILE WHEN NEW SUPER ELSE + right WHEN IN + right THROW FOR WHILE NEW SUPER ELSE left UNLESS EXTENDS IF left ASSIGN '||=' '&&=' right RETURN '=>' diff --git a/lib/coffee_script/nodes.rb b/lib/coffee_script/nodes.rb index 7d6280da..14b72820 100644 --- a/lib/coffee_script/nodes.rb +++ b/lib/coffee_script/nodes.rb @@ -360,10 +360,11 @@ module CoffeeScript write("#{idt}#{@from_var} = #{from_val};\n#{idt}#{@to_var} = #{to_val};\n#{idt}") end - def compile(o, fv) - vars = "#{fv}=#{@from_var}" - compare = "(#{@from_var} <= #{@to_var} ? #{fv} #{less_operator} #{@to_var} : #{fv} #{greater_operator} #{@to_var})" - incr = "(#{@from_var} <= #{@to_var} ? #{fv} += 1 : #{fv} -= 1)" + def compile(o, idx=nil) + raise SyntaxError, "unexpected range literal" unless idx + vars = "#{idx}=#{@from_var}" + compare = "(#{@from_var} <= #{@to_var} ? #{idx} #{less_operator} #{@to_var} : #{idx} #{greater_operator} #{@to_var})" + incr = "(#{@from_var} <= #{@to_var} ? #{idx} += 1 : #{idx} -= 1)" write("#{vars}; #{compare}; #{incr}") end diff --git a/test/fixtures/execution/test_nested_comprehensions.coffee b/test/fixtures/execution/test_nested_comprehensions.coffee new file mode 100644 index 00000000..ce6952d8 --- /dev/null +++ b/test/fixtures/execution/test_nested_comprehensions.coffee @@ -0,0 +1,11 @@ +multi_liner: + for x in [3..5] + for y in [3..5] + [x, y] + +single_liner: + [x, y] for y in [3..5] for x in [3..5] + +print(multi_liner.length is single_liner.length) +print(5 is multi_liner[2][2][1]) +print(5 is single_liner[2][2][1])