Module: Evilution::AST::HeredocSpan
- Defined in:
- lib/evilution/ast/heredoc_span.rb
Overview
Computes the byte-length needed for a mutation whose target range contains heredoc anchors (‘<<~MARKER` / `<<-MARKER` / `<<MARKER`).
Prism reports a heredoc anchor’s ‘location` as the inline range of just `<<~MARKER` — the body lines and the closing terminator live in `closing_loc` which is on a later line. An operator that builds a byte edit from the anchor’s inline range (e.g. ‘argument_removal` using `node.arguments.location`) covers the anchor but leaves the body+terminator in place, producing an orphaned heredoc fragment that the parser rejects.
‘extend_length` walks the supplied AST node for heredoc descendants whose anchor falls inside `[offset, offset + length)` and returns a length wide enough to also cover those descendants’ ‘closing_loc.end_offset` — so the mutation’s ‘replacement` replaces the heredoc body and terminator along with the anchor.
Class Method Summary collapse
Class Method Details
.extend_length(node:, offset:, length:) ⇒ Object
25 26 27 28 29 30 31 32 33 34 |
# File 'lib/evilution/ast/heredoc_span.rb', line 25 def extend_length(node:, offset:, length:) return length if node.nil? end_offset = offset + length max_end = end_offset Walker.new(offset, end_offset) do |closing_end| max_end = closing_end if closing_end > max_end end.visit(node) max_end - offset end |