class RuboCop::Cop::Lint::TripleQuotes

‘A string’
# good (but not the same spacing as the bad case)
STRING
A string
<<STRING
# good

A string

# good
”‘
A string
”’
# bad
“”“
A string
”“”
# bad
@example
for strings delimited by 5, 7, etc. quotation marks.
NOTE: Although this cop is called triple quotes, the same behavior is present
is still only the “actual” string within the delimiters.
pair of quotes produces an additional concatenated empty string, so the result
in fact it is just extra unnecessary quotes and produces the same string. Each
gives the impression that there is something special about triple quotes, but
being adjacent in a statement (ie. ‘“foo”“bar” == “foobar”`). This sometimes
Ruby allows multiple strings to be implicitly concatenated by just
of quotes greater than 1).
This cop checks for “triple quotes” (strings delimited by any odd number

def empty_str_nodes(node)

def empty_str_nodes(node)
  node.each_child_node(:str).select { |str| str.value == '' }
end

def on_dstr(node)

def on_dstr(node)
  return if (empty_str_nodes = empty_str_nodes(node)).none?
  opening_quotes = node.source.scan(/(?<=\A)['"]*/)[0]
  return if opening_quotes.size < 3
  # If the node is composed of only empty `str` nodes, keep one
  empty_str_nodes.shift if empty_str_nodes.size == node.child_nodes.size
  add_offense(node) do |corrector|
    empty_str_nodes.each do |str|
      corrector.remove(str)
    end
  end
end