Class: Ast::Merge::Comment::RegionMergePolicy

Inherits:
Object
  • Object
show all
Defined in:
lib/ast/merge/comment/region_merge_policy.rb

Overview

Passive policy object describing when normalized comment regions are good candidates for Ast::Merge::Text sub-merging.

This does not perform a merge. It only standardizes the eligibility rules so format gems can adopt textual comment-region merging consistently.

Constant Summary collapse

TEXT_MERGEABLE_KINDS =

Region kinds eligible for text sub-merging.

Returns:

  • (Array<Symbol>)
%i[leading trailing orphan preamble postlude].freeze
STRATEGIES =

Supported policy outcomes.

Returns:

  • (Array<Symbol>)
%i[preserve_preferred text_submerge].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(preferred_region:, other_region: nil, attachment: nil, freeze_token: nil, details: {}, **options) ⇒ RegionMergePolicy

Returns a new instance of RegionMergePolicy.



23
24
25
26
27
28
29
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 23

def initialize(preferred_region:, other_region: nil, attachment: nil, freeze_token: nil, details: {}, **options)
  @preferred_region = preferred_region
  @other_region = other_region
  @attachment = attachment
  @freeze_token = freeze_token
  @details = details.merge(options).freeze
end

Instance Attribute Details

#attachmentObject (readonly)

Returns the value of attribute attachment.



21
22
23
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 21

def attachment
  @attachment
end

#detailsObject (readonly)

Returns the value of attribute details.



21
22
23
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 21

def details
  @details
end

#freeze_tokenObject (readonly)

Returns the value of attribute freeze_token.



21
22
23
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 21

def freeze_token
  @freeze_token
end

#other_regionObject (readonly)

Returns the value of attribute other_region.



21
22
23
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 21

def other_region
  @other_region
end

#preferred_regionObject (readonly)

Returns the value of attribute preferred_region.



21
22
23
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 21

def preferred_region
  @preferred_region
end

Instance Method Details

#freeze_sensitive?Boolean

Returns:

  • (Boolean)


55
56
57
58
59
60
61
62
63
64
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 55

def freeze_sensitive?
  return false unless freeze_token

  region_marked = [preferred_region, other_region].compact.any? do |region|
    region.respond_to?(:freeze_marker?) && region.freeze_marker?(freeze_token)
  end
  attachment_marked = attachment.respond_to?(:freeze_marker?) && attachment.freeze_marker?(freeze_token)

  region_marked || attachment_marked
end

#inline?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 51

def inline?
  [preferred_region, other_region].compact.any? { |region| region.respond_to?(:inline?) && region.inline? }
end

#inspectString

Return a concise debug representation of the policy.

Returns:

  • (String)


95
96
97
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 95

def inspect
  "#<#{self.class.name} strategy=#{strategy} preferred=#{preferred_region&.kind.inspect} other=#{other_region&.kind.inspect}>"
end

#preserve_preferred?Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 47

def preserve_preferred?
  strategy == :preserve_preferred
end

#strategySymbol

Return the merge strategy for this region pair.

Returns:

  • (Symbol)


34
35
36
37
38
39
40
41
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 34

def strategy
  return :preserve_preferred if freeze_sensitive?
  return :preserve_preferred unless compatible_region_pair?
  return :preserve_preferred unless text_merge_candidate?(preferred_region)
  return :preserve_preferred unless text_merge_candidate?(other_region)

  :text_submerge
end

#text_merge_candidate?(region) ⇒ Boolean

Returns:

  • (Boolean)


66
67
68
69
70
71
72
73
74
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 66

def text_merge_candidate?(region)
  return false unless region
  return false unless region.respond_to?(:kind)
  return false unless TEXT_MERGEABLE_KINDS.include?(region.kind)
  return false if region.respond_to?(:empty?) && region.empty?
  return false unless multiline?(region)

  true
end

#text_submerge?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 43

def text_submerge?
  strategy == :text_submerge
end

#to_hHash

Return the policy as a normalized Hash.

Returns:

  • (Hash)


79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 79

def to_h
  {
    strategy: strategy,
    text_submerge: text_submerge?,
    preserve_preferred: preserve_preferred?,
    freeze_sensitive: freeze_sensitive?,
    inline: inline?,
    preferred_kind: preferred_region&.kind,
    other_kind: other_region&.kind,
    details: details
  }
end