Class: Prism::Merge::BeginNodeMergePlanner

Inherits:
Object
  • Object
show all
Defined in:
lib/prism/merge/begin_node_merge_planner.rb

Defined Under Namespace

Classes: Step

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(merger:, template_node:, dest_node:, node_preference:) ⇒ BeginNodeMergePlanner

Returns a new instance of BeginNodeMergePlanner.



23
24
25
26
27
28
# File 'lib/prism/merge/begin_node_merge_planner.rb', line 23

def initialize(merger:, template_node:, dest_node:, node_preference:)
  @merger = merger
  @template_node = template_node
  @dest_node = dest_node
  @node_preference = node_preference
end

Instance Attribute Details

#dest_nodeObject (readonly)

Returns the value of attribute dest_node.



21
22
23
# File 'lib/prism/merge/begin_node_merge_planner.rb', line 21

def dest_node
  @dest_node
end

#mergerObject (readonly)

Returns the value of attribute merger.



21
22
23
# File 'lib/prism/merge/begin_node_merge_planner.rb', line 21

def merger
  @merger
end

#node_preferenceObject (readonly)

Returns the value of attribute node_preference.



21
22
23
# File 'lib/prism/merge/begin_node_merge_planner.rb', line 21

def node_preference
  @node_preference
end

#template_nodeObject (readonly)

Returns the value of attribute template_node.



21
22
23
# File 'lib/prism/merge/begin_node_merge_planner.rb', line 21

def template_node
  @template_node
end

Instance Method Details

#planObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/prism/merge/begin_node_merge_planner.rb', line 30

def plan
  template_clause_regions = clause_regions_by_type(template_node)
  dest_clause_regions = clause_regions_by_type(dest_node)
  template_clause_nodes = merger.send(:begin_node_clause_nodes_by_type, template_node)
  dest_clause_nodes = merger.send(:begin_node_clause_nodes_by_type, dest_node)
  return [] if template_clause_regions.empty? && dest_clause_regions.empty?

  clause_types = if node_preference == :template
                   merger.send(:merge_ordered_clause_types, template_clause_regions.keys,
                               dest_clause_regions.keys)
                 else
                   merger.send(:merge_ordered_clause_types, dest_clause_regions.keys,
                               template_clause_regions.keys)
                 end
  clause_types = merger.send(:canonicalize_rescue_clause_order, clause_types)
  clause_types = merger.send(:canonicalize_begin_clause_kind_order, clause_types)

  clause_types.each_with_object([]) do |clause_type, steps|
    template_region = template_clause_regions[clause_type]
    dest_region = dest_clause_regions[clause_type]
    template_clause_node = template_clause_nodes[clause_type]
    dest_clause_node = dest_clause_nodes[clause_type]

    if template_region && dest_region && template_clause_node && dest_clause_node
      merged_step = build_shared_clause_step(
        clause_type: clause_type,
        template_region: template_region,
        dest_region: dest_region,
        template_clause_node: template_clause_node,
        dest_clause_node: dest_clause_node
      )
      steps << merged_step
      next
    end

    unmatched_step = build_unmatched_clause_step(
      clause_type: clause_type,
      template_region: template_region,
      dest_region: dest_region,
      template_clause_node: template_clause_node,
      dest_clause_node: dest_clause_node
    )
    steps << unmatched_step if unmatched_step
  end
end