class Prism::DesugarOrWriteDefinedNode

:nodoc:

def compile

Desugar `x ||= y` to `defined?(x) ? x : x = y`
def compile
  if_node(
    location: node.location,
    if_keyword_loc: node.operator_loc,
    predicate: defined_node(
      location: node.name_loc,
      value: public_send(read_class, location: node.name_loc, **arguments),
      keyword_loc: node.operator_loc
    ),
    then_keyword_loc: node.operator_loc,
    statements: statements_node(
      location: node.location,
      body: [public_send(read_class, location: node.name_loc, **arguments)]
    ),
    subsequent: else_node(
      location: node.location,
      else_keyword_loc: node.operator_loc,
      statements: statements_node(
        location: node.location,
        body: [
          public_send(
            write_class,
            location: node.location,
            **arguments,
            name_loc: node.name_loc,
            value: node.value,
            operator_loc: node.operator_loc
          )
        ]
      ),
      end_keyword_loc: node.operator_loc
    ),
    end_keyword_loc: node.operator_loc
  )
end

def initialize(node, default_source, read_class, write_class, **arguments)

def initialize(node, default_source, read_class, write_class, **arguments)
  @node = node
  @default_source = default_source
  @read_class = read_class
  @write_class = write_class
  @arguments = arguments
end