From 94155c681051112ab80582eb8bbca703cb74114f Mon Sep 17 00:00:00 2001 From: Nathan Weizenbaum Date: Mon, 4 Jan 2010 16:24:32 -0800 Subject: [PATCH] [Sass] [SCSS] Make sure that SassScript errors have the proper line number reported. --- lib/sass/scss/parser.rb | 25 ++++++++++++++----------- test/sass/scss/scss_test.rb | 11 +++++++++++ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/lib/sass/scss/parser.rb b/lib/sass/scss/parser.rb index 729e3874..f9a66794 100644 --- a/lib/sass/scss/parser.rb +++ b/lib/sass/scss/parser.rb @@ -70,20 +70,20 @@ module Sass def mixin name = tok! IDENT - args = sass_script_parser.parse_mixin_definition_arglist + args = sass_script(:parse_mixin_definition_arglist) ss block(node(Sass::Tree::MixinDefNode.new(name, args))) end def include name = tok! IDENT - args = sass_script_parser.parse_mixin_include_arglist + args = sass_script(:parse_mixin_include_arglist) ss node(Sass::Tree::MixinNode.new(name, args)) end def debug - node(Sass::Tree::DebugNode.new(sass_script_parser.parse)) + node(Sass::Tree::DebugNode.new(sass_script(:parse))) end def for @@ -92,25 +92,25 @@ module Sass ss tok!(/from/) - from = sass_script_parser.parse_until Set["to", "through"] + from = sass_script(:parse_until, Set["to", "through"]) ss @expected = '"to" or "through"' exclusive = (tok(/to/) || tok!(/through/)) == 'to' - to = sass_script_parser.parse + to = sass_script(:parse) ss block(node(Sass::Tree::ForNode.new(var, from, to, exclusive))) end def while - expr = sass_script_parser.parse + expr = sass_script(:parse) ss block(node(Sass::Tree::WhileNode.new(expr))) end def if - expr = sass_script_parser.parse + expr = sass_script(:parse) ss block(node(Sass::Tree::IfNode.new(expr))) end @@ -149,7 +149,7 @@ module Sass tok!(/=/) ss - expr = sass_script_parser.parse + expr = sass_script(:parse) node(Sass::Tree::VariableNode.new(name, expr, guarded)) end @@ -370,7 +370,7 @@ module Sass if tok(/=/) expression = true @use_property_exception = true - sass_script_parser.parse + sass_script(:parse) else @expected = '":" or "="' tok!(/:/) @@ -448,9 +448,12 @@ module Sass node end - def sass_script_parser + def sass_script(*args) ScriptParser.new(@scanner, @line, - @scanner.pos - (@scanner.string.rindex("\n") || 0)) + @scanner.pos - (@scanner.string.rindex("\n") || 0)).send(*args) + rescue Sass::SyntaxError => e + e.modify_backtrace :line => @line + raise e end EXPR_NAMES = { diff --git a/test/sass/scss/scss_test.rb b/test/sass/scss/scss_test.rb index a301111e..29b2678c 100644 --- a/test/sass/scss/scss_test.rb +++ b/test/sass/scss/scss_test.rb @@ -536,4 +536,15 @@ SCSS assert_equal 'Invalid CSS after " bar:{baz: ": expected expression (e.g. 1px, bold) or "{", was ".fail} }"', e.message assert_equal 2, e.sass_line end + + def test_script_error + render < e + assert_equal "Expected expression, was plus token.", e.message + assert_equal 2, e.sass_line + end end