Class: Evilution::Mutator::Operator::StringLiteral Private
- Defined in:
- lib/evilution/mutator/operator/string_literal.rb
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Instance Attribute Summary
Attributes inherited from Base
Instance Method Summary collapse
-
#initialize(skip_heredoc_literals: false, **rest) ⇒ StringLiteral
constructor
private
A new instance of StringLiteral.
- #visit_interpolated_regular_expression_node(node) ⇒ Object private
- #visit_interpolated_string_node(node) ⇒ Object private
-
#visit_interpolated_symbol_node(node) ⇒ Object
private
Inner StringNode chunks of an interpolated symbol (
:"visit_#{type}"), interpolated regular expression (/^#{needle}/), or interpolated x-string (`echo #{cmd}`) are not free string literals — they are fragments of a different literal kind. - #visit_interpolated_x_string_node(node) ⇒ Object private
- #visit_string_node(node) ⇒ Object private
Methods inherited from Base
#call, clear_parse_cache!, operator_name, parsed_tree_for
Constructor Details
#initialize(skip_heredoc_literals: false, **rest) ⇒ StringLiteral
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of StringLiteral.
6 7 8 9 |
# File 'lib/evilution/mutator/operator/string_literal.rb', line 6 def initialize(skip_heredoc_literals: false, **rest) super(**rest) @skip_heredoc_literals = skip_heredoc_literals end |
Instance Method Details
#visit_interpolated_regular_expression_node(node) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
57 58 59 |
# File 'lib/evilution/mutator/operator/string_literal.rb', line 57 def visit_interpolated_regular_expression_node(node) visit_non_string_parts(node) end |
#visit_interpolated_string_node(node) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/evilution/mutator/operator/string_literal.rb', line 11 def visit_interpolated_string_node(node) if node.heredoc? return if @skip_heredoc_literals node.parts.each do |part| next if part.is_a?(Prism::StringNode) visit(part) end return end # Adjacent-string concatenation — both `"foo" "bar"` and the line-continued # form `"foo" \\\n "bar"` — lands in an InterpolatedStringNode whose parts # are all StringNodes. Mutating chunks individually splices the wrong span: # for the continued form Ruby treats `nil \\\n "rest"` as a confusing # parse rather than a clean nil; for both forms the result is one StringNode # plus an orphaned adjacent literal, not a meaningful mutation of the whole # expression. Replace the entire concatenation in one shot instead. if adjacent_string_concat?(node) emit_string_mutations(node) return end super end |
#visit_interpolated_symbol_node(node) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Inner StringNode chunks of an interpolated symbol (:"visit_#{type}"),
interpolated regular expression (/^#{needle}/), or interpolated x-string
(`echo #{cmd}`) are not free string literals — they are fragments of
a different literal kind. Mutating them splices empty-string bytes into the
middle of a :"..." / /.../ / `...` token, producing unparseable
code. Visit only the interpolation parts (which may contain mutatable
expressions); skip the raw StringNode chunks.
53 54 55 |
# File 'lib/evilution/mutator/operator/string_literal.rb', line 53 def visit_interpolated_symbol_node(node) visit_non_string_parts(node) end |
#visit_interpolated_x_string_node(node) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
61 62 63 |
# File 'lib/evilution/mutator/operator/string_literal.rb', line 61 def visit_interpolated_x_string_node(node) visit_non_string_parts(node) end |
#visit_string_node(node) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
38 39 40 41 42 43 44 |
# File 'lib/evilution/mutator/operator/string_literal.rb', line 38 def visit_string_node(node) return super if node.heredoc? emit_string_mutations(node) super end |