Class Sass::Tree::MixinNode
In: lib/sass/tree/mixin_node.rb
Parent: Node
Haml::Util Engine Color SyntaxError UnitConversionError StandardError AbstractSequence CommaSequence Sequence SimpleSequence Simple Parent Universal Class SelectorPseudoClass Id Pseudo Attribute Interpolation Element Node Operation Literal UnaryOperation StringInterpolation Funcall Interpolation Variable Lexer CssLexer Number Bool String Parser Parser CssParser EvaluationContext StaticParser SassParser CssParser Node DebugNode IfNode CommentNode ForNode PropNode MixinNode CharsetNode DirectiveNode VariableNode WarnNode ExtendNode RootNode WhileNode MixinDefNode RuleNode Enumerable ImportNode Merb::BootLoader MerbBootLoader Repl CSS Environment Rack StalenessChecker lib/sass/repl.rb lib/sass/css.rb lib/sass/environment.rb lib/sass/error.rb lib/sass/engine.rb lib/sass/selector/simple_sequence.rb lib/sass/selector/abstract_sequence.rb lib/sass/selector/sequence.rb lib/sass/selector/comma_sequence.rb lib/sass/selector/simple.rb lib/sass/selector.rb Selector lib/sass/script/css_parser.rb lib/sass/script/lexer.rb lib/sass/script/color.rb lib/sass/script/string.rb lib/sass/script/unary_operation.rb lib/sass/script/variable.rb lib/sass/script/funcall.rb lib/sass/script/string_interpolation.rb lib/sass/script/operation.rb lib/sass/script/bool.rb lib/sass/script/parser.rb lib/sass/script/node.rb lib/sass/script/literal.rb lib/sass/script/interpolation.rb lib/sass/script/css_lexer.rb lib/sass/script/number.rb lib/sass/script/functions.rb Functions Script lib/sass/scss/sass_parser.rb lib/sass/scss/static_parser.rb lib/sass/scss/parser.rb lib/sass/scss/css_parser.rb ScriptLexer ScriptParser RX SCSS Callbacks Files lib/sass/tree/while_node.rb lib/sass/tree/if_node.rb lib/sass/tree/mixin_def_node.rb lib/sass/tree/debug_node.rb lib/sass/tree/root_node.rb lib/sass/tree/for_node.rb lib/sass/tree/import_node.rb lib/sass/tree/prop_node.rb lib/sass/tree/node.rb lib/sass/tree/comment_node.rb lib/sass/tree/extend_node.rb lib/sass/tree/charset_node.rb lib/sass/tree/mixin_node.rb lib/sass/tree/warn_node.rb lib/sass/tree/directive_node.rb lib/sass/tree/rule_node.rb lib/sass/tree/variable_node.rb Tree lib/sass/plugin/rack.rb lib/sass/plugin/staleness_checker.rb lib/sass/plugin/merb.rb Plugin Sass dot/m_86_0.png

A static node representing a mixin include. When in a static tree, the sole purpose is to wrap exceptions to add the mixin to the backtrace.

@see Sass::Tree

Methods

Public Class methods

@param name [String] The name of the mixin @param args [Array<Script::Node>] The arguments to the mixin

[Source]

    # File lib/sass/tree/mixin_node.rb, line 18
18:     def initialize(name, args)
19:       @name = name
20:       @args = args
21:       super()
22:     end

Public Instance methods

@see Node#cssize

[Source]

    # File lib/sass/tree/mixin_node.rb, line 25
25:     def cssize(extends, parent = nil)
26:       _cssize(extends, parent) # Pass on the parent even if it's not a MixinNode
27:     end

@see Node#options=

[Source]

    # File lib/sass/tree/mixin_node.rb, line 11
11:     def options=(opts)
12:       super
13:       @args.each {|a| a.context = :equals} if opts[:sass2]
14:     end

Protected Instance methods

@see Node#_cssize

[Source]

    # File lib/sass/tree/mixin_node.rb, line 38
38:     def _cssize(extends, parent)
39:       children.map do |c|
40:         parent.check_child! c
41:         c.cssize(extends, parent)
42:       end.flatten
43:     rescue Sass::SyntaxError => e
44:       e.modify_backtrace(:mixin => @name, :filename => filename, :line => line)
45:       e.add_backtrace(:filename => filename, :line => line)
46:       raise e
47:     end

Runs the mixin.

@param environment [Sass::Environment] The lexical environment containing

  variable and mixin values

@raise [Sass::SyntaxError] if there is no mixin with the given name @raise [Sass::SyntaxError] if an incorrect number of arguments was passed @see Sass::Tree

[Source]

    # File lib/sass/tree/mixin_node.rb, line 56
56:     def perform!(environment)
57:       handle_include_loop!(environment) if environment.mixins_in_use.include?(@name)
58: 
59:       original_env = environment
60:       original_env.push_frame(:filename => filename, :line => line)
61:       original_env.prepare_frame(:mixin => @name)
62:       raise Sass::SyntaxError.new("Undefined mixin '#{@name}'.") unless mixin = environment.mixin(@name)
63: 
64:       raise Sass::SyntaxError.new("Mixin \#{@name} takes \#{mixin.args.size} argument\#{'s' if mixin.args.size != 1}\n but \#{@args.size} \#{@args.size == 1 ? 'was' : 'were'} passed.\n".gsub("\n", "")) if mixin.args.size < @args.size
65:       environment = mixin.args.zip(@args).
66:         inject(Sass::Environment.new(mixin.environment)) do |env, ((var, default), value)|
67:         env.set_local_var(var.name,
68:           if value
69:             value.perform(environment)
70:           elsif default
71:             val = default.perform(env)
72:             if default.context == :equals && val.is_a?(Sass::Script::String)
73:               val = Sass::Script::String.new(val.value)
74:             end
75:             val
76:           end)
77:         raise Sass::SyntaxError.new("Mixin #{@name} is missing parameter #{var.inspect}.") unless env.var(var.name)
78:         env
79:       end
80: 
81:       self.children = mixin.tree.map {|c| c.perform(environment)}.flatten
82:     rescue Sass::SyntaxError => e
83:       if original_env # Don't add backtrace info if this is an @include loop
84:         e.modify_backtrace(:mixin => @name, :line => @line)
85:         e.add_backtrace(:line => @line)
86:       end
87:       raise e
88:     ensure
89:       original_env.pop_frame if original_env
90:     end

@see Node#to_src

[Source]

    # File lib/sass/tree/mixin_node.rb, line 32
32:     def to_src(tabs, opts, fmt)
33:       args = '(' + @args.map {|a| a.to_sass(opts)}.join(", ") + ')' unless @args.empty?
34:       "#{'  ' * tabs}#{fmt == :sass ? '+' : '@include '}#{dasherize(@name, opts)}#{args}#{semi fmt}\n"
35:     end

Private Instance methods

[Source]

     # File lib/sass/tree/mixin_node.rb, line 98
 98:     def handle_include_loop!(environment)
 99:       msg = "An @include loop has been found:"
100:       mixins = environment.stack.map {|s| s[:mixin]}.compact
101:       if mixins.size == 2 && mixins[0] == mixins[1]
102:         raise Sass::SyntaxError.new("#{msg} #{@name} includes itself")
103:       end
104: 
105:       mixins << @name
106:       msg << "\n" << Haml::Util.enum_cons(mixins, 2).map do |m1, m2|
107:         "    #{m1} includes #{m2}"
108:       end.join("\n")
109:       raise Sass::SyntaxError.new(msg)
110:     end

[Validate]