Class: Sass::Script::Tree::Operation
- Defined in:
- 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
#filename, #line, #options, #source_range
Instance Method Summary collapse
-
#_perform(environment) ⇒ Sass::Script::Value
protected
Evaluates the operation.
-
#children ⇒ Array<Node>
Returns the operands for this operation.
- #deep_copy
-
#initialize(operand1, operand2, operator) ⇒ Operation
constructor
A new instance of Operation.
-
#inspect ⇒ String
A human-readable s-expression representation of the operation.
- #to_sass(opts = {})
Methods inherited from Node
#dasherize, #force_division!, #opts, #perform
Constructor Details
#initialize(operand1, operand2, operator) ⇒ Operation
Returns a new instance of Operation.
15 16 17 18 19 20 |
# File '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 'lib/sass/script/tree/operation.rb', line 5
def operand1
@operand1
end
|
#operand2 (readonly)
Returns the value of attribute operand2.
6 7 8 |
# File 'lib/sass/script/tree/operation.rb', line 6
def operand2
@operand2
end
|
#operator (readonly)
Returns the value of attribute operator.
7 8 9 |
# File 'lib/sass/script/tree/operation.rb', line 7
def operator
@operator
end
|
Instance Method Details
#_perform(environment) ⇒ Sass::Script::Value (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 |
# File '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
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} #{@operator == :eq ? '==' : '!='} #{value2}"
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
|
#children ⇒ Array<Node>
Returns the operands for this operation.
44 45 46 |
# File 'lib/sass/script/tree/operation.rb', line 44
def children
[@operand1, @operand2]
end
|
#deep_copy
49 50 51 52 53 54 |
# File '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
|
#inspect ⇒ String
Returns A human-readable s-expression representation of the operation.
23 24 25 |
# File '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 '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
|