Resolve variable references in mixin defaults to other args first, then globals.

This commit is contained in:
Nathan Weizenbaum 2008-10-15 01:09:11 -07:00
parent 538e5e9519
commit f541899530
3 changed files with 6 additions and 6 deletions

View File

@ -396,7 +396,7 @@ END
default_arg_found ||= default default_arg_found ||= default
raise SyntaxError.new("Invalid variable \"#{arg}\".", @line) unless arg =~ Script::VALIDATE raise SyntaxError.new("Invalid variable \"#{arg}\".", @line) unless arg =~ Script::VALIDATE
raise SyntaxError.new("Required arguments must not follow optional arguments \"#{arg}\".", @line) if default_arg_found && !default raise SyntaxError.new("Required arguments must not follow optional arguments \"#{arg}\".", @line) if default_arg_found && !default
default = Script.parse(default, @line).perform(@environment) if default default = Script.parse(default, @line) if default
{ :name => arg[1..-1], :default_value => default } { :name => arg[1..-1], :default_value => default }
end end
mixin = @mixins[name] = Mixin.new(name, args, []) mixin = @mixins[name] = Mixin.new(name, args, [])

View File

@ -15,8 +15,8 @@ module Sass::Tree
perform_children(@mixin.args.zip(@args).inject(environment.dup) do |env, (arg, value)| perform_children(@mixin.args.zip(@args).inject(environment.dup) do |env, (arg, value)|
env[arg[:name]] = if value env[arg[:name]] = if value
value.perform(environment) value.perform(environment)
else elsif arg[:default_value]
arg[:default_value] arg[:default_value].perform(env)
end end
raise Sass::SyntaxError.new("Mixin #{@mixin.name} is missing parameter !#{arg[:name]}.") unless env[arg[:name]] raise Sass::SyntaxError.new("Mixin #{@mixin.name} is missing parameter !#{arg[:name]}.") unless env[arg[:name]]
env env

View File

@ -387,12 +387,12 @@ SASS
one { one {
color: #ffffff; color: #ffffff;
padding: 1px; padding: 1px;
margin: 8px; } margin: 4px; }
two { two {
color: #ffffff; color: #ffffff;
padding: 2px; padding: 2px;
margin: 8px; } margin: 5px; }
three { three {
color: #ffffff; color: #ffffff;
@ -400,7 +400,7 @@ three {
margin: 3px; } margin: 3px; }
CSS CSS
!a = 5px !a = 5px
=foo(!a, !b = 1px, !c = 3px + !a) =foo(!a, !b = 1px, !c = 3px + !b)
:color= !a :color= !a
:padding= !b :padding= !b
:margin= !c :margin= !c