Pass line number and character offset from the Engine to the Lexer.

This commit is contained in:
Chris Eppstein 2008-12-09 12:09:34 -08:00
parent c5334c3f79
commit 0d6d7e1c0a
7 changed files with 16 additions and 13 deletions

View File

@ -413,9 +413,9 @@ END
Tree::MixinNode.new(name, args.map {|s| parse_script(s)}, @options)
end
def parse_script(script, line = nil)
def parse_script(script, line = nil, offset = 0)
line ||= @line
Script.parse(script, line)
Script.parse(script, line, offset)
end
def import_paths
paths = @options[:load_paths] || []

View File

@ -18,12 +18,12 @@ module Sass
# The regular expression used to validate variables without matching
VALIDATE = /^!\w+$/
def self.resolve(value, line, environment)
parse(value, line).perform(environment).to_s
def self.resolve(value, line, offset, environment)
parse(value, line, offset).perform(environment).to_s
end
def self.parse(value, line)
Parser.parse(value)
def self.parse(value, line, offset)
Parser.parse(value, line, offset)
rescue Sass::SyntaxError => e
if e.message == "SassScript error"
e.instance_eval do

View File

@ -38,8 +38,10 @@ module Sass
:op => %r{(#{Regexp.union(*OP_NAMES.map{|s| Regexp.new(Regexp.escape(s) + (s =~ /\w$/ ? '(?:\b|$)' : ''))})})}
}
def initialize(str)
def initialize(str, line, offset)
@scanner = StringScanner.new(str)
@line = line
@offset = offset
end
def token

View File

@ -3,8 +3,8 @@ require 'sass/script/lexer'
module Sass
module Script
class Parser
def initialize(str)
@lexer = Lexer.new(str)
def initialize(str, line, offset)
@lexer = Lexer.new(str, line, offset)
end
def parse

View File

@ -68,7 +68,7 @@ module Sass
if escapes % 2 == 1
str << '#{'
else
str << Sass::Script.resolve(balance(scan, ?{, ?}, 1)[0][0...-1], line, environment)
str << Sass::Script.resolve(balance(scan, ?{, ?}, 1)[0][0...-1], line, scan.pos - scan.matchedsize, environment)
end
end

View File

@ -78,11 +78,12 @@ class SassFunctionTest < Test::Unit::TestCase
private
def assert_rgb_hsl(rgb, hsl)
assert_equal(rgb, Sass::Script::Functions.hsl(*hsl.map(&Sass::Script::Parser.method(:parse))).value)
hsl = hsl.map {|v| Sass::Script::Parser.parse v, 0, 0 }
assert_equal(rgb, Sass::Script::Functions.hsl(*hsl).value)
end
def evaluate(value)
Sass::Script::Parser.parse(value).perform({}).to_s
Sass::Script::Parser.parse(value, 0, 0).perform({}).to_s
end
def assert_error_message(message, value)

View File

@ -6,7 +6,7 @@ class SassScriptTest < Test::Unit::TestCase
include Sass::Script
def eval(str, environment = {})
Sass::Script.resolve(str, 0, environment)
Sass::Script.resolve(str, 0, 0, environment)
end
def test_color_checks_input