Class: Ast::Merge::Comment::RegionMergePolicy
- Inherits:
-
Object
- Object
- Ast::Merge::Comment::RegionMergePolicy
- 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.
%i[leading trailing orphan preamble postlude].freeze
- STRATEGIES =
Supported policy outcomes.
%i[preserve_preferred text_submerge].freeze
Instance Attribute Summary collapse
-
#attachment ⇒ Object
readonly
Returns the value of attribute attachment.
-
#details ⇒ Object
readonly
Returns the value of attribute details.
-
#freeze_token ⇒ Object
readonly
Returns the value of attribute freeze_token.
-
#other_region ⇒ Object
readonly
Returns the value of attribute other_region.
-
#preferred_region ⇒ Object
readonly
Returns the value of attribute preferred_region.
Instance Method Summary collapse
- #freeze_sensitive? ⇒ Boolean
-
#initialize(preferred_region:, other_region: nil, attachment: nil, freeze_token: nil, details: {}, **options) ⇒ RegionMergePolicy
constructor
A new instance of RegionMergePolicy.
- #inline? ⇒ Boolean
-
#inspect ⇒ String
Return a concise debug representation of the policy.
- #preserve_preferred? ⇒ Boolean
-
#strategy ⇒ Symbol
Return the merge strategy for this region pair.
- #text_merge_candidate?(region) ⇒ Boolean
- #text_submerge? ⇒ Boolean
-
#to_h ⇒ Hash
Return the policy as a normalized Hash.
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: {}, **) @preferred_region = preferred_region @other_region = other_region @attachment = @freeze_token = freeze_token @details = details.merge().freeze end |
Instance Attribute Details
#attachment ⇒ Object (readonly)
Returns the value of attribute attachment.
21 22 23 |
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 21 def @attachment end |
#details ⇒ Object (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_token ⇒ Object (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_region ⇒ Object (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_region ⇒ Object (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
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 = .respond_to?(:freeze_marker?) && .freeze_marker?(freeze_token) region_marked || end |
#inline? ⇒ 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 |
#inspect ⇒ String
Return a concise debug representation of the policy.
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
47 48 49 |
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 47 def preserve_preferred? strategy == :preserve_preferred end |
#strategy ⇒ Symbol
Return the merge strategy for this region pair.
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
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
43 44 45 |
# File 'lib/ast/merge/comment/region_merge_policy.rb', line 43 def text_submerge? strategy == :text_submerge end |
#to_h ⇒ Hash
Return the policy as a normalized 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 |