class RuboCop::Cop::InternalAffairs::ExampleHeredocDelimiter

RUBY
example_ruby_code
expect_offense(<<~RUBY)
# good
CODE
example_ruby_code
expect_offense(<<~CODE)
# bad
@example
the delimiter.
Some editors may apply better syntax highlighting by using appropriate language names for
Use ‘RUBY` for heredoc delimiter of example Ruby code.

def autocorrect(corrector, node)

Returns:
  • (void) -

Parameters:
  • node (RuboCop::AST::StrNode) --
  • corrector (RuboCop::Cop::Corrector) --
def autocorrect(corrector, node)
  [
    heredoc_opening_delimiter_range_from(node),
    heredoc_closing_delimiter_range_from(node)
  ].each do |range|
    corrector.replace(range, EXPECTED_HEREDOC_DELIMITER)
  end
end

def expected_heredoc_delimiter?(node)

Returns:
  • (Boolean) -

Parameters:
  • node (RuboCop::AST::StrNode) --
def expected_heredoc_delimiter?(node)
  heredoc_delimiter_string_from(node) == EXPECTED_HEREDOC_DELIMITER
end

def expected_heredoc_delimiter_in_body?(node)

Returns:
  • (Boolean) -

Parameters:
  • node (RuboCop::AST::StrNode) --
def expected_heredoc_delimiter_in_body?(node)
  node.location.heredoc_body.source.lines.any? do |line|
    line.strip == EXPECTED_HEREDOC_DELIMITER
  end
end

def heredoc_closing_delimiter_range_from(node)

Returns:
  • (Parser::Source::Range) -

Parameters:
  • node (RuboCop::AST::StrNode) --
def heredoc_closing_delimiter_range_from(node)
  node.location.heredoc_end.end.adjust(
    begin_pos: -heredoc_delimiter_string_from(node).length
  )
end

def heredoc_delimiter_string_from(node)

Returns:
  • (String) -

Parameters:
  • node (RuboCop::AST::StrNode) --
def heredoc_delimiter_string_from(node)
  node.source[Heredoc::OPENING_DELIMITER, 2]
end

def heredoc_node_from(node)

Returns:
  • (RuboCop::AST::StrNode, nil) -

Parameters:
  • node (RuboCop::AST::SendNode) --
def heredoc_node_from(node)
  return unless node.first_argument.respond_to?(:heredoc?)
  return unless node.first_argument.heredoc?
  node.first_argument
end

def heredoc_opening_delimiter_range_from(node)

Returns:
  • (Parser::Source::Range) -

Parameters:
  • node (RuboCop::AST::StrNode) --
def heredoc_opening_delimiter_range_from(node)
  match_data = node.source.match(Heredoc::OPENING_DELIMITER)
  node.source_range.begin.adjust(
    begin_pos: match_data.begin(2),
    end_pos: match_data.end(2)
  )
end

def on_send(node)

Returns:
  • (void) -

Parameters:
  • node (RuboCop::AST::SendNode) --
def on_send(node)
  heredoc_node = heredoc_node_from(node)
  return unless heredoc_node
  return if expected_heredoc_delimiter?(heredoc_node)
  return if expected_heredoc_delimiter_in_body?(heredoc_node)
  add_offense(heredoc_node) do |corrector|
    autocorrect(corrector, heredoc_node)
  end
end