Class: Semdiff::StructuresCompiler

Inherits:
Prism::MutationCompiler
  • Object
show all
Includes:
Prism::DSL, CompilerUtils
Defined in:
lib/semdiff/structures_compiler.rb

Overview

StructuresCompiler is a compiler that normalizes common data structure operations.

Examples:

```ruby
# Expression              Canonical Form
Array.new                 []
Array.new(0)              []
Hash.new                  {}
Hash[]                    {}
array.push(e)             array << e
"a".concat("b")           "a" << "b"
hash.store(key, value)    hash[key] = value
''                        ""
```

Instance Method Summary collapse

Methods included from CompilerUtils

inherit_newline

Instance Method Details

#visit_call_node(node) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/semdiff/structures_compiler.rb', line 23

def visit_call_node(node)
  receiver  = visit(node.receiver)
  arguments = visit(node.arguments)
  block     = visit(node.block)

  result = case node.name
           when :new
             transform_constructor(node, receiver, arguments, block)
           when :[]
             transform_class_bracket_method(node, receiver, arguments)
           when :push
             transform_push_to_shovel(node, receiver, arguments)
           when :concat
             transform_concat_to_shovel(node, receiver, arguments)
           when :store
             transform_store_to_bracket_assign(node, receiver, arguments)
           end

  if result
    CompilerUtils.inherit_newline(node, result)
  else
    node.copy(receiver: receiver, arguments: arguments, block: block)
  end
end