The lexical environment for SassScript. This keeps track of variable and mixin definitions.
A new environment is created for each level of Sass nesting. This allows variables to be lexically scoped. The new environment refers to the environment in the upper scope, so it has access to variables defined in enclosing scopes, but new variables are defined locally.
Environment also keeps track of the {Engine} options so that they can be made available to {Sass::Script::Functions}.
@param parent [Environment] See {#parent}
# File lib/sass/environment.rb, line 24 24: def initialize(parent = nil) 25: @vars = {} 26: @mixins = {} 27: @parent = parent 28: @stack = [] unless parent 29: @mixins_in_use = Set.new unless parent 30: set_var("important", Script::String.new("!important")) unless @parent 31: end
Note: when updating this, update haml/yard/inherited_hash.rb as well.
# File lib/sass/environment.rb, line 101 101: def inherited_hash(name) 102: class_eval def #{name}(name) _#{name}(name.gsub('_', '-')) end def _#{name}(name) @#{name}s[name] || @parent && @parent._#{name}(name) end protected :_#{name} def set_#{name}(name, value) name = name.gsub('_', '-') @#{name}s[name] = value unless try_set_#{name}(name, value) end def try_set_#{name}(name, value) if @#{name}s.include?(name) @#{name}s[name] = value true elsif @parent @parent.try_set_#{name}(name, value) else false end end protected :try_set_#{name} def set_local_#{name}(name, value) @#{name}s[name.gsub('_', '-')] = value end, __FILE__, __LINE__ + 1 103: end
A set of names of mixins currently present in the stack.
@return [Set
# File lib/sass/environment.rb, line 92 92: def mixins_in_use 93: @mixins_in_use ||= @parent.mixins_in_use 94: end
The options hash. See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
@return [{Symbol => Object}]
# File lib/sass/environment.rb, line 37 37: def options 38: @options || (parent && parent.options) || {} 39: end
Pop a stack frame from the mixin/include stack.
# File lib/sass/environment.rb, line 74 74: def pop_frame 75: stack.pop if stack.last && stack.last[:prepared] 76: popped = stack.pop 77: mixins_in_use.delete(popped[:mixin]) if popped && popped[:mixin] 78: end
Like {#push_frame}, but next time a stack frame is pushed, it will be merged with this frame.
@param frame_info [{Symbol => Object}] Same as for {#push_frame}.
# File lib/sass/environment.rb, line 69 69: def prepare_frame(frame_info) 70: push_frame(frame_info.merge(:prepared => true)) 71: end
Push a new stack frame onto the mixin/include stack.
@param frame_info [{Symbol => Object}]
Frame information has the following keys: `:filename` : The name of the file in which the lexical scope changed. `:mixin` : The name of the mixin in which the lexical scope changed, or `nil` if it wasn't within in a mixin. `:line` : The line of the file on which the lexical scope changed. Never nil.
# File lib/sass/environment.rb, line 55 55: def push_frame(frame_info) 56: if stack.last && stack.last[:prepared] 57: stack.last.delete(:prepared) 58: stack.last.merge!(frame_info) 59: else 60: stack.push(frame_info) 61: end 62: mixins_in_use << stack.last[:mixin] if stack.last[:mixin] && !stack.last[:prepared] 63: end
A list of stack frames in the mixin/include stack. The last element in the list is the most deeply-nested frame.
@return [Array<{Symbol => Object}>] The stack frames,
of the form passed to \{#push\_frame}.
# File lib/sass/environment.rb, line 85 85: def stack 86: @stack ||= @parent.stack 87: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.