Class: RuboCop::Cop::Lint::TripleQuotes

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/lint/triple_quotes.rb

Overview

This cop checks for “triple quotes” (strings delimted by any odd number of quotes greater than 1).

Ruby allows multiple strings to be implicitly concatenated by just being adjacent in a statement (ie. `“foo”“bar” == “foobar”`). This sometimes gives the impression that there is something special about triple quotes, but in fact it is just extra unnecessary quotes and produces the same string. Each pair of quotes produces an additional concatenated empty string, so the result is still only the “actual” string within the delimiters.

NOTE: Although this cop is called triple quotes, the same behavior is present for strings delimited by 5, 7, etc. quotation marks.

Examples:

# bad
"""
  A string
"""

# bad
'''
  A string
'''

# good
"
  A string
"

# good
<<STRING
  A string
STRING

# good (but not the same spacing as the bad case)
'A string'

Constant Summary collapse

MSG =
'Delimiting a string with multiple quotes has no effect, use a single quote instead.'

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods inherited from Base

#add_global_offense, #add_offense, autocorrect_incompatible_with, badge, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #ready, #relevant_file?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#on_dstr(node) ⇒ Object


47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/rubocop/cop/lint/triple_quotes.rb', line 47

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