From cffb94d72366b20cc63d4c9caf37ccc702e851a9 Mon Sep 17 00:00:00 2001 From: Nathan Weizenbaum Date: Tue, 13 Sep 2011 17:13:21 -0700 Subject: [PATCH] Nice error tracing for @content chains. --- lib/sass/tree/visitors/perform.rb | 8 ++++++- test/sass/engine_test.rb | 36 +++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/lib/sass/tree/visitors/perform.rb b/lib/sass/tree/visitors/perform.rb index e5d7319c7f..53df1fa3b9 100644 --- a/lib/sass/tree/visitors/perform.rb +++ b/lib/sass/tree/visitors/perform.rb @@ -218,7 +218,13 @@ def visit_mixin(node) def visit_content(node) raise Sass::SyntaxError.new("No @content passed.") unless content = @environment.content - with_environment(@environment.caller) {content.map {|c| visit(c.dup)}} + trace_node = Sass::Tree::TraceNode.from_node('@content', node) + with_environment(@environment.caller) {trace_node.children = content.map {|c| visit(c.dup)}} + trace_node + rescue Sass::SyntaxError => e + e.modify_backtrace(:mixin => '@content', :line => node.line) + e.add_backtrace(:line => node.line) + raise e end # Runs any SassScript that may be embedded in a property. diff --git a/test/sass/engine_test.rb b/test/sass/engine_test.rb index 751bdaae89..347496959c 100755 --- a/test/sass/engine_test.rb +++ b/test/sass/engine_test.rb @@ -2612,6 +2612,42 @@ def test_content_not_seen_through_mixin assert_equal(7, e.sass_line) end + def test_content_backtrace_for_perform + render(< e + assert_equal([ + {:mixin => '@content', :line => 6, :filename => 'test_content_backtrace_for_perform_inline.sass'}, + {:mixin => 'foo', :line => 2, :filename => 'test_content_backtrace_for_perform_inline.sass'}, + {:line => 5, :filename => 'test_content_backtrace_for_perform_inline.sass'}, + ], e.sass_backtrace) + end + + def test_content_backtrace_for_cssize + render(< e + assert_equal([ + {:mixin => '@content', :line => 6, :filename => 'test_content_backtrace_for_cssize_inline.sass'}, + {:mixin => 'foo', :line => 2, :filename => 'test_content_backtrace_for_cssize_inline.sass'}, + {:line => 5, :filename => 'test_content_backtrace_for_cssize_inline.sass'}, + ], e.sass_backtrace) + end + private def assert_hash_has(hash, expected)