Class: Sass::Script::Tree::Operation
- Inherits:
- Node
- Object
- Node
- Sass::Script::Tree::Operation
- Defined in:
- /Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb
Overview
A SassScript parse node representing a binary operation, such as $a + $b
or "foo" + 1
.
Instance Attribute Summary (collapse)
- - operand1 readonly
Returns the value of attribute operand1.
- - operand2 readonly
Returns the value of attribute operand2.
- - operator readonly
Returns the value of attribute operator.
Attributes inherited from Node
#css_variable_warning, #filename, #line, #options, #source_range
Instance Method Summary (collapse)
- - (Sass::Script::Value) _perform(environment) protected
Evaluates the operation.
- - (Array<Node>) children
Returns the operands for this operation.
- - deep_copy
- - (Operation) initialize(operand1, operand2, operator) constructor
A new instance of Operation.
- - (String) inspect
A human-readable s-expression representation of the operation.
- - to_sass(opts = {})
Methods inherited from Node
#dasherize, #force_division!, #opts, #perform
Constructor Details
- (Operation) initialize(operand1, operand2, operator)
Returns a new instance of Operation
15 16 17 18 19 20 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 15
def initialize(operand1, operand2, operator)
@operand1 = operand1
@operand2 = operand2
@operator = operator
super()
end |
Instance Attribute Details
- operand1 (readonly)
Returns the value of attribute operand1
5 6 7 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 5
def operand1
@operand1
end |
- operand2 (readonly)
Returns the value of attribute operand2
6 7 8 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 6
def operand2
@operand2
end |
- operator (readonly)
Returns the value of attribute operator
7 8 9 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 7
def operator
@operator
end |
Instance Method Details
- (Sass::Script::Value) _perform(environment) (protected)
Evaluates the operation.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 63
def _perform(environment)
value1 = @operand1.perform(environment)
# Special-case :and and :or to support short-circuiting.
if @operator == :and
return value1.to_bool ? @operand2.perform(environment) : value1
elsif @operator == :or
return value1.to_bool ? value1 : @operand2.perform(environment)
end
value2 = @operand2.perform(environment)
if (value1.is_a?(Sass::Script::Value::Null) || value2.is_a?(Sass::Script::Value::Null)) &&
@operator != :eq && @operator != :neq
raise Sass::SyntaxError.new(
"Invalid null operation: \"#{value1.inspect} #{@operator} #{value2.inspect}\".")
end
if css_variable_warning && @operator == :div &&
!(value1.is_a?(Sass::Script::Value::Number) && value1.original &&
value2.is_a?(Sass::Script::Value::Number) && value2.original) &&
!(value1.is_a?(Sass::Script::Value::String) && value2.is_a?(Sass::Script::Value::String))
css_variable_warning.warn!
end
begin
result = opts(value1.send(@operator, value2))
rescue NoMethodError => e
raise e unless e.name.to_s == @operator.to_s
raise Sass::SyntaxError.new("Undefined operation: \"#{value1} #{@operator} #{value2}\".")
end
if (@operator == :eq || @operator == :neq) && value1.is_a?(Sass::Script::Value::Number) &&
value2.is_a?(Sass::Script::Value::Number) && value1.unitless? != value2.unitless? &&
result == (if @operator == :eq
Sass::Script::Value::Bool::TRUE
else
Sass::Script::Value::Bool::FALSE
end)
operation = "#{value1.to_sass} #{@operator == :eq ? '==' : '!='} #{value2.to_sass}"
future_value = @operator == :neq
Sass::Util.sass_warn <<WARNING
DEPRECATION WARNING on line #{line}#{" of #{filename}" if filename}:
The result of `#{operation}` will be `#{future_value}` in future releases of Sass.
Unitless numbers will no longer be equal to the same numbers with units.
WARNING
end
result
end |
- (Array<Node>) children
Returns the operands for this operation.
44 45 46 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 44
def children
[@operand1, @operand2]
end |
- deep_copy
49 50 51 52 53 54 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 49
def deep_copy
node = dup
node.instance_variable_set('@operand1', @operand1.deep_copy)
node.instance_variable_set('@operand2', @operand2.deep_copy)
node
end |
- (String) inspect
Returns A human-readable s-expression representation of the operation
23 24 25 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 23
def inspect
"(#{@operator.inspect} #{@operand1.inspect} #{@operand2.inspect})"
end |
- to_sass(opts = {})
28 29 30 31 32 33 34 35 36 37 38 | # File '/Users/ceppstei/Projects/sass-lang/.sass/lib/sass/script/tree/operation.rb', line 28
def to_sass(opts = {})
o1 = operand_to_sass @operand1, :left, opts
o2 = operand_to_sass @operand2, :right, opts
sep =
case @operator
when :comma; ", "
when :space; " "
else; " #{Sass::Script::Lexer::OPERATORS_REVERSE[@operator]} "
end
"#{o1}#{sep}#{o2}"
end |