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 Negation Id Pseudo Attribute Interpolation Element Node Operation Literal UnaryOperation StringInterpolation Funcall Variable Interpolation Lexer CssLexer Number String Bool Parser Parser CssParser EvaluationContext StaticParser SassParser CssParser Node DebugNode IfNode CommentNode ForNode PropNode MixinNode DirectiveNode VariableNode RootNode WarnNode ExtendNode RuleNode MixinDefNode WhileNode 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 ScriptParser ScriptLexer RX SCSS Files Callbacks 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/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_61_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 50
50:     def _cssize(extends, parent)
51:       children.map do |c|
52:         parent.check_child! c
53:         c.cssize(extends, parent)
54:       end.flatten
55:     rescue Sass::SyntaxError => e
56:       e.modify_backtrace(:mixin => @name, :filename => filename, :line => line)
57:       e.add_backtrace(:filename => filename, :line => line)
58:       raise e
59:     end

Returns an error message if the given child node is invalid, and false otherwise.

{ExtendNode}s are valid within {MixinNode}s.

@param child [Tree::Node] A potential child node @return [Boolean, String] Whether or not the child node is valid,

  as well as the error message to display if it is invalid

[Source]

    # File lib/sass/tree/mixin_node.rb, line 39
39:     def invalid_child?(child)
40:       super unless child.is_a?(ExtendNode)
41:     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 68
 68:     def perform!(environment)
 69:       handle_include_loop!(environment) if environment.mixins_in_use.include?(@name)
 70: 
 71:       original_env = environment
 72:       original_env.push_frame(:filename => filename, :line => line)
 73:       original_env.prepare_frame(:mixin => @name)
 74:       raise Sass::SyntaxError.new("Undefined mixin '#{@name}'.") unless mixin = environment.mixin(@name)
 75: 
 76:       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
 77:       environment = mixin.args.zip(@args).
 78:         inject(Sass::Environment.new(mixin.environment)) do |env, ((var, default), value)|
 79:         env.set_local_var(var.name,
 80:           if value
 81:             value.perform(environment)
 82:           elsif default
 83:             val = default.perform(env)
 84:             if default.context == :equals && val.is_a?(Sass::Script::String)
 85:               val = Sass::Script::String.new(val.value)
 86:             end
 87:             val
 88:           end)
 89:         raise Sass::SyntaxError.new("Mixin #{@name} is missing parameter #{var.inspect}.") unless env.var(var.name)
 90:         env
 91:       end
 92: 
 93:       self.children = mixin.tree.map {|c| c.perform(environment)}.flatten
 94:     rescue Sass::SyntaxError => e
 95:       if original_env # Don't add backtrace info if this is an @include loop
 96:         e.modify_backtrace(:mixin => @name, :line => @line)
 97:         e.add_backtrace(:line => @line)
 98:       end
 99:       raise e
100:     ensure
101:       original_env.pop_frame if original_env
102:     end

@see Node#to_src

[Source]

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

Private Instance methods

[Source]

     # File lib/sass/tree/mixin_node.rb, line 110
110:     def handle_include_loop!(environment)
111:       msg = "An @include loop has been found:"
112:       mixins = environment.stack.map {|s| s[:mixin]}.compact
113:       if mixins.size == 2 && mixins[0] == mixins[1]
114:         raise Sass::SyntaxError.new("#{msg} #{@name} includes itself")
115:       end
116: 
117:       mixins << @name
118:       msg << "\n" << Haml::Util.enum_cons(mixins, 2).map do |m1, m2|
119:         "    #{m1} includes #{m2}"
120:       end.join("\n")
121:       raise Sass::SyntaxError.new(msg)
122:     end

[Validate]