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
.
Constant Summary collapse
- @@color_arithmetic_deprecation =
Sass::Deprecation.new
- @@unitless_equals_deprecation =
Sass::Deprecation.new
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.
18 19 20 21 22 23 |
# File 'lib/sass/script/tree/operation.rb', line 18
def initialize(operand1, operand2, operator)
@operand1 = operand1
@operand2 = operand2
@operator = operator
super()
end
|
Instance Attribute Details
#operand1 (readonly)
Returns the value of attribute operand1.
8 9 10 |
# File 'lib/sass/script/tree/operation.rb', line 8
def operand1
@operand1
end
|
#operand2 (readonly)
Returns the value of attribute operand2.
9 10 11 |
# File 'lib/sass/script/tree/operation.rb', line 9
def operand2
@operand2
end
|
#operator (readonly)
Returns the value of attribute operator.
10 11 12 |
# File 'lib/sass/script/tree/operation.rb', line 10
def operator
@operator
end
|
Instance Method Details
#_perform(environment) ⇒ Sass::Script::Value (protected)
Evaluates the operation.
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 |
# File 'lib/sass/script/tree/operation.rb', line 66
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
warn_for_color_arithmetic(value1, value2)
warn_for_unitless_equals(value1, value2, result)
result
end
|
#children ⇒ Array<Node>
Returns the operands for this operation.
47 48 49 |
# File 'lib/sass/script/tree/operation.rb', line 47
def children
[@operand1, @operand2]
end
|
#deep_copy
52 53 54 55 56 57 |
# File 'lib/sass/script/tree/operation.rb', line 52
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.
26 27 28 |
# File 'lib/sass/script/tree/operation.rb', line 26
def inspect
"(#{@operator.inspect} #{@operand1.inspect} #{@operand2.inspect})"
end
|
#to_sass(opts = {})
31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/sass/script/tree/operation.rb', line 31
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
|