1
0
Fork 0
mirror of https://github.com/haml/haml.git synced 2022-11-09 12:33:31 -05:00

Delay SassScript variable resolution until #perform.

This commit is contained in:
Nathan Weizenbaum 2008-10-12 20:26:56 -07:00
parent 983f8c199e
commit 6e347d5cca
7 changed files with 34 additions and 28 deletions

View file

@ -1,4 +1,5 @@
require 'strscan'
require 'sass/script/variable'
require 'sass/script/funcall'
require 'sass/script/operation'
require 'sass/script/literal'
@ -22,7 +23,7 @@ module Sass
end
def self.parse(value, environment, line)
Parser.parse(value, environment).perform
Parser.parse(value).perform(environment)
rescue Sass::SyntaxError => e
if e.message == "SassScript error"
e.instance_eval do

View file

@ -8,18 +8,14 @@ module Sass
@args = args
end
def to_s
perform.to_s
end
def inspect
"#{name}(#{args.map {|a| a.inspect}.join(', ')})"
end
def perform
args = self.args.map {|a| a.perform}
def perform(environment)
args = self.args.map {|a| a.perform(environment)}
unless Functions.public_instance_methods.include?(name) && name !~ /^__/
return Script::String.new("#{name}(#{args.join(', ')})")
return Script::String.new("#{name}(#{args.map {|a| a.perform(environment)}.join(', ')})")
end
return Functions.send(name, *args)

View file

@ -10,7 +10,7 @@ class Sass::Script::Literal # :nodoc:
@value = value
end
def perform
def perform(environment)
self
end

View file

@ -12,17 +12,13 @@ module Sass::Script
@operator = operator
end
def to_s
self.perform.to_s
end
def inspect
"(#{@operator.inspect} #{@operand1.inspect} #{@operand2.inspect})"
end
def perform
literal1 = @operand1.perform
literal2 = @operand2.perform
def perform(environment)
literal1 = @operand1.perform(environment)
literal2 = @operand2.perform(environment)
begin
literal1.send(@operator, literal2)
rescue NoMethodError => e

View file

@ -2,10 +2,9 @@ require 'sass/script/lexer'
module Sass
module Script
class Parser # :nodoc:
def initialize(str, environment = {})
class Parser
def initialize(str)
@lexer = Lexer.new(str)
@environment = environment
end
def parse
@ -88,9 +87,7 @@ RUBY
def variable
return literal unless c = try_tok(:const)
(val = @environment[c.last]) && (return val)
raise SyntaxError.new("Undefined variable: \"!#{c.last}\".")
Variable.new(c.last)
end
def literal

View file

@ -5,17 +5,13 @@ module Sass::Script
@operator = operator
end
def to_s
self.perform.to_s
end
def inspect
"(#{@operator.inspect} #{@operand.inspect})"
end
def perform
def perform(environment)
operator = "unary_#{@operator}"
literal = @operand.perform
literal = @operand.perform(environment)
literal.send(operator)
rescue NoMethodError => e
raise e unless e.name.to_s == operator.to_s

View file

@ -0,0 +1,20 @@
module Sass
module Script
class Variable # :nodoc:
attr_reader :name
def initialize(name)
@name = name
end
def inspect
"!#{name}"
end
def perform(environment)
(val = environment[name]) && (return val)
raise SyntaxError.new("Undefined variable: \"!#{name}\".")
end
end
end
end