class RuboCop::Cop::Lint::ImplicitStringConcatenation

]
‘Item 2’
‘Item 1’ <br>array = [
array = [‘Item 1’ + ‘Item 2’]
array = [‘Item 1Item 2’]
# good
@example
array = [‘Item 1’ ‘Item 2’]
# bad
@example
which are on the same line.
This cop checks for implicit string concatenation of string literals

def display_str(node)

def display_str(node)
  if /\n/.match?(node.source)
    str_content(node).inspect
  else
    node.source
  end
end

def each_bad_cons(node)

def each_bad_cons(node)
  node.children.each_cons(2) do |child_node1, child_node2|
    # `'abc' 'def'` -> (dstr (str "abc") (str "def"))
    next unless string_literals?(child_node1, child_node2)
    next unless child_node1.last_line == child_node2.first_line
    # Make sure we don't flag a string literal which simply has
    # embedded newlines
    # `"abc\ndef"` also -> (dstr (str "abc") (str "def"))
    next unless child_node1.source[-1] == ending_delimiter(child_node1)
    yield child_node1, child_node2
  end
end

def ending_delimiter(str)

def ending_delimiter(str)
  # implicit string concatenation does not work with %{}, etc.
  case str.source[0]
  when "'"
    "'"
  when '"'
    '"'
  end
end

def on_dstr(node)

def on_dstr(node)
  each_bad_cons(node) do |child_node1, child_node2|
    range   = child_node1.source_range.join(child_node2.source_range)
    message = format(MSG,
                     string1: display_str(child_node1),
                     string2: display_str(child_node2))
    if node.parent&.array_type?
      message << FOR_ARRAY
    elsif node.parent&.send_type?
      message << FOR_METHOD
    end
    add_offense(range, message: message)
  end
end

def str_content(node)

def str_content(node)
  if node.str_type?
    node.children[0]
  else
    node.children.map { |c| str_content(c) }.join
  end
end

def string_literal?(node)

def string_literal?(node)
  node.str_type? ||
    (node.dstr_type? && node.children.all? { |c| string_literal?(c) })
end

def string_literals?(node1, node2)

def string_literals?(node1, node2)
  string_literal?(node1) && string_literal?(node2)
end