From 7c132d65dc91701c2fd39e0944cb834fadfccbff Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 25 Dec 2009 20:36:22 -0800 Subject: [PATCH] started raising syntax errors for parens wrapped around expressions (they used to silently be ignored) --- lib/coffee_script/command_line.rb | 6 +++--- lib/coffee_script/nodes.rb | 9 ++++++--- lib/coffee_script/parse_error.rb | 4 ++-- test/unit/test_parser.rb | 6 ++++++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/coffee_script/command_line.rb b/lib/coffee_script/command_line.rb index 75f3b44d..f09f400d 100644 --- a/lib/coffee_script/command_line.rb +++ b/lib/coffee_script/command_line.rb @@ -125,13 +125,13 @@ Usage: end # Compile a single source file to JavaScript. - def compile(script, source='') + def compile(script, source='error') begin options = {} options[:no_wrap] = true if @options[:no_wrap] CoffeeScript.compile(script, options) - rescue CoffeeScript::ParseError => e - STDERR.puts e.message(source) + rescue CoffeeScript::ParseError, SyntaxError => e + STDERR.puts "#{source}: #{e.message}" exit(1) unless @options[:watch] nil end diff --git a/lib/coffee_script/nodes.rb b/lib/coffee_script/nodes.rb index 825aed64..ff361d19 100644 --- a/lib/coffee_script/nodes.rb +++ b/lib/coffee_script/nodes.rb @@ -608,7 +608,9 @@ module CoffeeScript end end - # An extra set of parenthesis, supplied by the script source. + # An extra set of parentheses, supplied by the script source. + # You can't wrap parentheses around bits that get compiled into JS statements, + # unfortunately. class ParentheticalNode < Node attr_reader :expressions @@ -617,7 +619,7 @@ module CoffeeScript end def statement? - @expressions.statement? + @expressions.unwrap.statement? end def custom_assign? @@ -629,10 +631,11 @@ module CoffeeScript end def compile(o={}) + raise SyntaxError, "parentheses can't be wrapped around a statement" if statement? o = super(o) compiled = @expressions.compile(o) compiled = compiled[0...-1] if compiled[-1..-1] == ';' - write(o[:no_paren] || statement? ? compiled : "(#{compiled})") + write(o[:no_paren] ? compiled : "(#{compiled})") end end diff --git a/lib/coffee_script/parse_error.rb b/lib/coffee_script/parse_error.rb index 88e1e2d2..b9cc2e43 100644 --- a/lib/coffee_script/parse_error.rb +++ b/lib/coffee_script/parse_error.rb @@ -9,9 +9,9 @@ module CoffeeScript @token_id, @value, @stack = token_id, value, stack end - def message(source_file=nil) + def message line = @value.respond_to?(:line) ? @value.line : "END" - line_part = source_file ? "#{source_file}:#{line}:" : "line #{line}:" + line_part = "line #{line}:" id_part = @token_id != @value.inspect ? ", unexpected #{@token_id.downcase}" : "" "#{line_part} syntax error for '#{@value.to_s}'#{id_part}" end diff --git a/test/unit/test_parser.rb b/test/unit/test_parser.rb index ef0b02a1..67bd93f3 100644 --- a/test/unit/test_parser.rb +++ b/test/unit/test_parser.rb @@ -77,4 +77,10 @@ class ParserTest < Test::Unit::TestCase assert nodes.compile(:no_wrap => true) == File.read('test/fixtures/generation/each_no_wrap.js') end + def test_no_wrapping_parens_around_statements + assert_raises(SyntaxError) do + @par.parse("(a: 1)").compile + end + end + end