Module: RLSL::Prism::Emitters::BaseEmitter::ExpressionEmission

Included in:
RLSL::Prism::Emitters::BaseEmitter
Defined in:
lib/rlsl/prism/emitters/base_emitter/expression_emission.rb

Instance Method Summary collapse

Instance Method Details

#emit_array_index(node) ⇒ Object



79
80
81
82
83
84
85
86
87
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 79

def emit_array_index(node)
  array = emit(node.array)
  index = if node.index.is_a?(IR::Literal) && node.index.value.to_i == node.index.value
            node.index.value.to_i.to_s
          else
            emit(node.index)
          end
  "#{array}[#{index}]"
end

#emit_assignment(node) ⇒ Object



60
61
62
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 60

def emit_assignment(node)
  "#{emit(node.target)} = #{emit(node.value)}"
end

#emit_binary_op(node) ⇒ Object



26
27
28
29
30
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 26

def emit_binary_op(node)
  left = emit_with_precedence(node.left, node.operator)
  right = emit_with_precedence(node.right, node.operator)
  "#{left} #{node.operator} #{right}"
end

#emit_bool_literal(node) ⇒ Object



22
23
24
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 22

def emit_bool_literal(node)
  node.value.to_s
end

#emit_constant(node) ⇒ Object



64
65
66
67
68
69
70
71
72
73
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 64

def emit_constant(node)
  case node.name
  when :PI
    "3.14159265358979323846"
  when :TAU
    "6.28318530717958647692"
  else
    node.name.to_s
  end
end

#emit_field_access(node) ⇒ Object



48
49
50
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 48

def emit_field_access(node)
  "#{emit(node.receiver)}.#{node.field}"
end

#emit_func_call(node) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 36

def emit_func_call(node)
  func_name = function_name(node.name)
  args = node.args.map { |arg| emit(arg) }.join(", ")

  if node.receiver
    receiver = emit(node.receiver)
    "#{func_name}(#{receiver}, #{args})"
  else
    "#{func_name}(#{args})"
  end
end

#emit_literal(node) ⇒ Object



18
19
20
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 18

def emit_literal(node)
  format_number(node.value)
end

#emit_parenthesized(node) ⇒ Object



75
76
77
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 75

def emit_parenthesized(node)
  "(#{emit(node.expression)})"
end

#emit_swizzle(node) ⇒ Object



52
53
54
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 52

def emit_swizzle(node)
  "#{emit(node.receiver)}.#{node.components}"
end

#emit_ternary(node) ⇒ Object



56
57
58
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 56

def emit_ternary(node)
  "(#{emit(node.condition)} ? #{emit(node.then_expr)} : #{emit(node.else_expr)})"
end

#emit_unary_op(node) ⇒ Object



32
33
34
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 32

def emit_unary_op(node)
  "#{node.operator}#{emit(node.operand)}"
end

#emit_var_decl(node) ⇒ Object



8
9
10
11
12
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 8

def emit_var_decl(node)
  type = type_name(node.type || :float)
  value = emit(node.initializer)
  "#{type} #{node.name} = #{value}"
end

#emit_var_ref(node) ⇒ Object



14
15
16
# File 'lib/rlsl/prism/emitters/base_emitter/expression_emission.rb', line 14

def emit_var_ref(node)
  node.name.to_s
end