Module: RuboCop::Cop::Util

Includes:
PathUtil
Included in:
Cop, LineBreakCorrector, PercentLiteralCorrector, StringLiteralCorrector
Defined in:
lib/rubocop/cop/util.rb

Overview

This module contains a collection of useful utility methods.

Constant Summary collapse

LITERAL_REGEX =

Match literal regex characters, not including anchors, character classes, alternatives, groups, repetitions, references, etc

/[\w\s\-,"'!#%&<>=;:`~]|\\[^AbBdDgGhHkpPRwWXsSzZ0-9]/.freeze

Class Method Summary collapse

Methods included from PathUtil

absolute?, chdir, hidden_dir?, hidden_file_in_not_hidden_dir?, match_path?, pwd, relative_path, reset_pwd, smart_path

Class Method Details

.begins_its_line?(range) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/rubocop/cop/util.rb', line 38

def begins_its_line?(range)
  (range.source_line =~ /\S/) == range.column
end

.comment_line?(line_source) ⇒ Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/rubocop/cop/util.rb', line 16

def comment_line?(line_source)
  line_source =~ /^\s*#/
end

.double_quotes_required?(string) ⇒ Boolean

If converting a string to Ruby string literal source code, must double quotes be used?

Returns:

  • (Boolean)


60
61
62
63
64
65
66
67
68
# File 'lib/rubocop/cop/util.rb', line 60

def double_quotes_required?(string)
  # Double quotes are required for strings which either:
  # - Contain single quotes
  # - Contain non-printable characters, which must use an escape

  # Regex matches IF there is a ' or there is a \\ in the string that is
  # not preceded/followed by another \\ (e.g. "\\x34") but not "\\\\".
  string =~ /'|(?<! \\) \\{2}* \\ (?![\\"])/x
end

.escape_string(string) ⇒ Object



74
75
76
# File 'lib/rubocop/cop/util.rb', line 74

def escape_string(string)
  string.inspect[1..-2].tap { |s| s.gsub!(/\\"/, '"') }
end

.first_part_of_call_chain(node) ⇒ Object

Returns, for example, a bare if node if the given node is an if with calls chained to the end of it.



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/rubocop/cop/util.rb', line 44

def first_part_of_call_chain(node)
  while node
    case node.type
    when :send
      node = node.receiver
    when :block
      node = node.send_node
    else
      break
    end
  end
  node
end

.interpret_string_escapes(string) ⇒ Object



90
91
92
# File 'lib/rubocop/cop/util.rb', line 90

def interpret_string_escapes(string)
  StringInterpreter.interpret(string)
end

.line_range(node) ⇒ Object



20
21
22
# File 'lib/rubocop/cop/util.rb', line 20

def line_range(node)
  node.first_line..node.last_line
end

.needs_escaping?(string) ⇒ Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/rubocop/cop/util.rb', line 70

def needs_escaping?(string)
  double_quotes_required?(escape_string(string))
end

.on_node(syms, sexp, excludes = []) {|sexp| ... } ⇒ Object

Yields:

  • (sexp)


29
30
31
32
33
34
35
36
# File 'lib/rubocop/cop/util.rb', line 29

def on_node(syms, sexp, excludes = [], &block)
  return to_enum(:on_node, syms, sexp, excludes) unless block_given?

  yield sexp if Array(syms).include?(sexp.type)
  return if Array(excludes).include?(sexp.type)

  sexp.each_child_node { |elem| on_node(syms, elem, excludes, &block) }
end

.parentheses?(node) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
27
# File 'lib/rubocop/cop/util.rb', line 24

def parentheses?(node)
  node.loc.respond_to?(:end) && node.loc.end &&
    node.loc.end.is?(')')
end

.same_line?(node1, node2) ⇒ Boolean

Returns:

  • (Boolean)


94
95
96
97
98
# File 'lib/rubocop/cop/util.rb', line 94

def same_line?(node1, node2)
  node1.respond_to?(:loc) &&
    node2.respond_to?(:loc) &&
    node1.loc.line == node2.loc.line
end

.to_string_literal(string) ⇒ Object



78
79
80
81
82
83
84
# File 'lib/rubocop/cop/util.rb', line 78

def to_string_literal(string)
  if needs_escaping?(string) && compatible_external_encoding_for?(string)
    string.inspect
  else
    "'#{string.gsub('\\') { '\\\\' }}'"
  end
end

.to_supported_styles(enforced_style) ⇒ Object



100
101
102
103
104
# File 'lib/rubocop/cop/util.rb', line 100

def to_supported_styles(enforced_style)
  enforced_style
    .sub(/^Enforced/, 'Supported')
    .sub('Style', 'Styles')
end

.tokens(node) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/rubocop/cop/util.rb', line 106

def tokens(node)
  @tokens ||= {}
  return @tokens[node.object_id] if @tokens[node.object_id]

  source_range = node.source_range
  begin_pos = source_range.begin_pos
  end_pos = source_range.end_pos

  @tokens[node.object_id] = processed_source.tokens.select do |token|
    token.end_pos <= end_pos && token.begin_pos >= begin_pos
  end
end

.trim_string_interporation_escape_character(str) ⇒ Object



86
87
88
# File 'lib/rubocop/cop/util.rb', line 86

def trim_string_interporation_escape_character(str)
  str.gsub(/\\\#{(.*?)\}/) { "\#{#{Regexp.last_match(1)}}" }
end