Skip to content

Commit 73397b6

Browse files
committed
use libsass provided error filename and line no
1 parent f8b95c5 commit 73397b6

File tree

3 files changed

+23
-29
lines changed

3 files changed

+23
-29
lines changed

lib/sassc/engine.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ def render
4040

4141
if status != 0
4242
message = Native.context_get_error_message(context)
43-
raise SyntaxError.new(message)
43+
filename = Native.context_get_error_file(context)
44+
line = Native.context_get_error_line(context)
45+
46+
raise SyntaxError.new(message, filename: filename, line: line)
4447
end
4548

4649
css = Native.context_get_output_string(context)

lib/sassc/error.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ class UnsupportedValue < BaseError; end
1111
# it's important to provide filename and line number information.
1212
# This will be used in various error reports to users, including backtraces;
1313
class SyntaxError < BaseError
14-
LINE_INFO_REGEX = /on line (\d+) of (.+)/
14+
def initialize(message, filename: nil, line: nil)
15+
@filename = filename
16+
@line = line
17+
super(message)
18+
end
1519

1620
def backtrace
1721
return nil if super.nil?
@@ -20,11 +24,8 @@ def backtrace
2024

2125
# The backtrace of the error within Sass files.
2226
def sass_backtrace
23-
line_info = message.split("\n").find { |line| line.match(LINE_INFO_REGEX) }
24-
return [] unless line_info
25-
26-
_, line, filename = line_info.match(LINE_INFO_REGEX).to_a
27-
["#{Pathname.getwd.join(filename)}:#{line}"]
27+
return [] unless @filename && @line
28+
["#{@filename}:#{@line}"]
2829
end
2930
end
3031
end

test/error_test.rb

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,24 @@
22

33
module SassC
44
class ErrorTest < MiniTest::Test
5+
def render(data, opts={})
6+
Engine.new(data, opts).render
7+
end
8+
59
def test_first_backtrace_is_sass
6-
line = 2
710
filename = "app/assets/stylesheets/application.scss"
811

912
begin
10-
raise SassC::SyntaxError.new(<<-ERROR)
11-
Error: property "padding" must be followed by a ':'
12-
on line #{line} of #{filename}
13-
>> padding top: 10px;
14-
--^
15-
ERROR
16-
rescue SassC::SyntaxError => err
17-
expected = "#{Pathname.getwd.join(filename)}:#{line}"
18-
assert_equal expected, err.backtrace.first
19-
end
20-
21-
begin
22-
raise SassC::SyntaxError.new(<<-ERROR)
23-
Error: no mixin named border-radius
13+
template = <<-SCSS
14+
.foo {
15+
baz: bang;
16+
padding top: 10px;
17+
}
18+
SCSS
2419

25-
Backtrace:
26-
\t#{filename}:#{line}
27-
on line #{line} of #{filename}
28-
>> @include border-radius(5px);
29-
-------------^
30-
ERROR
20+
render(template, filename: filename)
3121
rescue SassC::SyntaxError => err
32-
expected = "#{Pathname.getwd.join(filename)}:#{line}"
22+
expected = "#{filename}:3"
3323
assert_equal expected, err.backtrace.first
3424
end
3525
end

0 commit comments

Comments
 (0)