rubocop 0.85.0 → 0.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -17
  3. data/bin/rubocop-profile +31 -0
  4. data/config/default.yml +132 -11
  5. data/lib/rubocop.rb +17 -1
  6. data/lib/rubocop/cli.rb +2 -4
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  8. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +1 -1
  10. data/lib/rubocop/config.rb +1 -1
  11. data/lib/rubocop/config_loader.rb +39 -67
  12. data/lib/rubocop/config_loader_resolver.rb +1 -1
  13. data/lib/rubocop/config_obsoletion.rb +0 -1
  14. data/lib/rubocop/config_store.rb +4 -0
  15. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  16. data/lib/rubocop/cop/badge.rb +1 -1
  17. data/lib/rubocop/cop/base.rb +407 -0
  18. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  19. data/lib/rubocop/cop/commissioner.rb +48 -50
  20. data/lib/rubocop/cop/cop.rb +91 -235
  21. data/lib/rubocop/cop/corrector.rb +38 -115
  22. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  23. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +7 -2
  24. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  25. data/lib/rubocop/cop/generator.rb +1 -1
  26. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  27. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  28. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  29. data/lib/rubocop/cop/layout/class_structure.rb +2 -37
  30. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
  31. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  32. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  33. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
  34. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  35. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  36. data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
  37. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  38. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
  39. data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
  40. data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
  41. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  42. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  43. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  44. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +27 -68
  45. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  46. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  47. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
  48. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  49. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  50. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  51. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  52. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  53. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -4
  54. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  55. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  56. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
  57. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  58. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
  59. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +3 -2
  60. data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
  61. data/lib/rubocop/cop/lint/literal_as_condition.rb +11 -1
  62. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +8 -1
  63. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  64. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +69 -2
  65. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -3
  66. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  67. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  68. data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
  69. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  70. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +31 -25
  71. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
  72. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
  73. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +9 -1
  74. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  75. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  76. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
  77. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
  78. data/lib/rubocop/cop/metrics/block_length.rb +22 -0
  79. data/lib/rubocop/cop/metrics/class_length.rb +25 -2
  80. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
  81. data/lib/rubocop/cop/metrics/method_length.rb +23 -0
  82. data/lib/rubocop/cop/metrics/module_length.rb +25 -2
  83. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  84. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  85. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  86. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  87. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  88. data/lib/rubocop/cop/mixin/code_length.rb +4 -0
  89. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  90. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  91. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  92. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  93. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  94. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  95. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  96. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  97. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  98. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  99. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  100. data/lib/rubocop/cop/mixin/range_help.rb +1 -1
  101. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
  102. data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
  103. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  104. data/lib/rubocop/cop/mixin/surrounding_space.rb +10 -5
  105. data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
  106. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
  107. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -4
  108. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  109. data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
  110. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
  111. data/lib/rubocop/cop/naming/file_name.rb +1 -3
  112. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  113. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  114. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  115. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  116. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  117. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  118. data/lib/rubocop/cop/offense.rb +16 -2
  119. data/lib/rubocop/cop/registry.rb +62 -7
  120. data/lib/rubocop/cop/style/accessor_grouping.rb +147 -0
  121. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  122. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -2
  123. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  124. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +146 -0
  125. data/lib/rubocop/cop/style/block_delimiters.rb +2 -4
  126. data/lib/rubocop/cop/style/case_like_if.rb +217 -0
  127. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  128. data/lib/rubocop/cop/style/class_vars.rb +21 -0
  129. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  130. data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
  131. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
  132. data/lib/rubocop/cop/style/copyright.rb +3 -3
  133. data/lib/rubocop/cop/style/date_time.rb +1 -1
  134. data/lib/rubocop/cop/style/dir.rb +2 -2
  135. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
  136. data/lib/rubocop/cop/style/documentation.rb +2 -2
  137. data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
  138. data/lib/rubocop/cop/style/empty_literal.rb +5 -5
  139. data/lib/rubocop/cop/style/encoding.rb +1 -1
  140. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
  141. data/lib/rubocop/cop/style/exponential_notation.rb +8 -10
  142. data/lib/rubocop/cop/style/float_division.rb +7 -10
  143. data/lib/rubocop/cop/style/format_string_token.rb +5 -5
  144. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  145. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +62 -0
  146. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  147. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  148. data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
  149. data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -11
  150. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
  151. data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
  152. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  153. data/lib/rubocop/cop/style/missing_else.rb +1 -11
  154. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  155. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  156. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  157. data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
  158. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
  159. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  160. data/lib/rubocop/cop/style/next.rb +2 -2
  161. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  162. data/lib/rubocop/cop/style/numeric_predicate.rb +3 -4
  163. data/lib/rubocop/cop/style/parallel_assignment.rb +3 -3
  164. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  165. data/lib/rubocop/cop/style/proc.rb +1 -1
  166. data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
  167. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  168. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
  169. data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
  170. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  171. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  172. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  173. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
  174. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  175. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
  176. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
  177. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  178. data/lib/rubocop/cop/style/redundant_sort.rb +3 -2
  179. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  180. data/lib/rubocop/cop/style/sample.rb +1 -1
  181. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  182. data/lib/rubocop/cop/style/signal_exception.rb +1 -1
  183. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  184. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  185. data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
  186. data/lib/rubocop/cop/style/symbol_array.rb +5 -5
  187. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  188. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  189. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  190. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  191. data/lib/rubocop/cop/style/word_array.rb +1 -1
  192. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  193. data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
  194. data/lib/rubocop/cop/team.rb +105 -81
  195. data/lib/rubocop/cop/util.rb +2 -2
  196. data/lib/rubocop/cop/utils/format_string.rb +19 -2
  197. data/lib/rubocop/cop/variable_force/variable.rb +5 -3
  198. data/lib/rubocop/file_finder.rb +12 -12
  199. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  200. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  201. data/lib/rubocop/name_similarity.rb +7 -3
  202. data/lib/rubocop/options.rb +15 -8
  203. data/lib/rubocop/path_util.rb +4 -19
  204. data/lib/rubocop/platform.rb +1 -1
  205. data/lib/rubocop/rake_task.rb +6 -9
  206. data/lib/rubocop/result_cache.rb +12 -8
  207. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  208. data/lib/rubocop/rspec/expect_offense.rb +65 -21
  209. data/lib/rubocop/rspec/shared_contexts.rb +19 -16
  210. data/lib/rubocop/runner.rb +34 -33
  211. data/lib/rubocop/target_finder.rb +3 -3
  212. data/lib/rubocop/target_ruby.rb +2 -2
  213. data/lib/rubocop/version.rb +1 -1
  214. metadata +34 -9
  215. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
@@ -109,7 +109,7 @@ module RuboCop
109
109
 
110
110
  def own_line_comment?(comment)
111
111
  own_line = processed_source.lines[comment.loc.line - 1]
112
- own_line =~ /\A\s*#/
112
+ /\A\s*#/.match?(own_line)
113
113
  end
114
114
 
115
115
  def line_after_comment(comment)
@@ -129,11 +129,11 @@ module RuboCop
129
129
  end
130
130
 
131
131
  def less_indented?(line)
132
- line =~ /^\s*(end\b|[)}\]])/
132
+ /^\s*(end\b|[)}\]])/.match?(line)
133
133
  end
134
134
 
135
135
  def two_alternatives?(line)
136
- line =~ /^\s*(else|elsif|when|rescue|ensure)\b/
136
+ /^\s*(else|elsif|when|rescue|ensure)\b/.match?(line)
137
137
  end
138
138
  end
139
139
  end
@@ -119,7 +119,7 @@ module RuboCop
119
119
  /\A(#+\n)+\z/
120
120
  end
121
121
 
122
- !(comment_text =~ empty_comment_pattern).nil?
122
+ empty_comment_pattern.match?(comment_text)
123
123
  end
124
124
 
125
125
  def comment_text(comment)
@@ -109,6 +109,7 @@ module RuboCop
109
109
 
110
110
  def allowed_only_before_style?(node)
111
111
  if node.special_modifier?
112
+ return true if processed_source[node.last_line] == 'end'
112
113
  return false if next_line_empty?(node.last_line)
113
114
  end
114
115
 
@@ -62,6 +62,7 @@ module RuboCop
62
62
  #
63
63
  class EmptyLinesAroundAttributeAccessor < Cop
64
64
  include RangeHelp
65
+ include AllowedMethods
65
66
 
66
67
  MSG = 'Add an empty line after attribute accessor.'
67
68
 
@@ -96,6 +97,8 @@ module RuboCop
96
97
  end
97
98
 
98
99
  def next_line_node(node)
100
+ return if node.parent.if_type?
101
+
99
102
  node.parent.children[node.sibling_index + 1]
100
103
  end
101
104
 
@@ -112,14 +115,6 @@ module RuboCop
112
115
  def allow_alias_syntax?
113
116
  cop_config.fetch('AllowAliasSyntax', true)
114
117
  end
115
-
116
- def allowed_method?(name)
117
- allowed_methods.include?(name.to_s)
118
- end
119
-
120
- def allowed_methods
121
- cop_config.fetch('AllowedMethods', [])
122
- end
123
118
  end
124
119
  end
125
120
  end
@@ -150,9 +150,10 @@ module RuboCop
150
150
  end
151
151
 
152
152
  def alignment_node(node)
153
- if style == :keyword
153
+ case style
154
+ when :keyword
154
155
  node
155
- elsif style == :variable
156
+ when :variable
156
157
  alignment_node_for_variable_style(node)
157
158
  else
158
159
  start_line_range(node)
@@ -65,7 +65,7 @@ module RuboCop
65
65
 
66
66
  # If there is no LF on the last line, we don't care if there's no CR.
67
67
  def unimportant_missing_cr?(index, last_line, line)
68
- style == :crlf && index == last_line - 1 && line !~ /\n$/
68
+ style == :crlf && index == last_line - 1 && !/\n$/.match?(line)
69
69
  end
70
70
 
71
71
  def offense_message(line)
@@ -168,7 +168,7 @@ module RuboCop
168
168
 
169
169
  send_node = arg_node.parent
170
170
  text = base_range(send_node, arg_node).source.strip
171
- base = if text !~ /\n/ && special_inner_call_indentation?(send_node)
171
+ base = if !/\n/.match?(text) && special_inner_call_indentation?(send_node)
172
172
  "`#{text}`"
173
173
  elsif comment_line?(text.lines.reverse_each.first)
174
174
  'the start of the previous line (not counting the comment)'
@@ -241,6 +241,10 @@ module RuboCop
241
241
  .select { |c| begins_its_line?(c.loc.expression) }
242
242
  .map { |c| c.loc.line }
243
243
  end
244
+
245
+ def on_new_investigation
246
+ @comment_lines = nil
247
+ end
244
248
  end
245
249
  end
246
250
  end
@@ -37,7 +37,7 @@ module RuboCop
37
37
 
38
38
  def assignment_on_same_line?(node)
39
39
  source = node.source_range.source_line[0...node.loc.column]
40
- source =~ /\s*=\s*$/
40
+ /\s*=\s*$/.match?(source)
41
41
  end
42
42
  end
43
43
  end
@@ -200,7 +200,7 @@ module RuboCop
200
200
  alias on_super on_send
201
201
  alias on_yield on_send
202
202
 
203
- def on_hash(node)
203
+ def on_hash(node) # rubocop:todo Metrics/CyclomaticComplexity
204
204
  return if ignored_node?(node)
205
205
  return if node.pairs.empty? || node.single_line?
206
206
 
@@ -219,8 +219,7 @@ module RuboCop
219
219
  correct_node(node, delta)
220
220
  end
221
221
 
222
- attr_accessor :offences_by
223
- attr_accessor :column_deltas
222
+ attr_accessor :offences_by, :column_deltas
224
223
 
225
224
  private
226
225
 
@@ -147,7 +147,7 @@ module RuboCop
147
147
  def indent_level(str)
148
148
  indentations = str.lines
149
149
  .map { |line| line[/^\s*/] }
150
- .reject { |line| line == "\n" }
150
+ .reject { |line| line.end_with?("\n") }
151
151
  indentations.empty? ? 0 : indentations.min_by(&:size).size
152
152
  end
153
153
 
@@ -95,17 +95,27 @@ module RuboCop
95
95
  end
96
96
 
97
97
  def line_break_necessary_in_args?(node)
98
- needed_length = node.source_range.column +
99
- node.source.lines.first.length +
100
- block_arg_string(node, node.arguments).length +
101
- PIPE_SIZE
102
- needed_length > max_line_length
98
+ needed_length_for_args(node) > max_line_length
99
+ end
100
+
101
+ def needed_length_for_args(node)
102
+ node.source_range.column +
103
+ characters_needed_for_space_and_pipes(node) +
104
+ node.source.lines.first.chomp.length +
105
+ block_arg_string(node, node.arguments).length
106
+ end
107
+
108
+ def characters_needed_for_space_and_pipes(node)
109
+ if node.source.lines.first.end_with?("|\n")
110
+ PIPE_SIZE
111
+ else
112
+ 1 + PIPE_SIZE * 2
113
+ end
103
114
  end
104
115
 
105
116
  def add_offense_for_expression(node, expr, msg)
106
117
  expression = expr.source_range
107
118
  range = range_between(expression.begin_pos, expression.end_pos)
108
-
109
119
  add_offense(node, location: range, message: msg)
110
120
  end
111
121
 
@@ -121,7 +131,7 @@ module RuboCop
121
131
  end
122
132
 
123
133
  def autocorrect_body(corrector, node, block_body)
124
- first_node = if block_body.begin_type?
134
+ first_node = if block_body.begin_type? && !block_body.source.start_with?('(')
125
135
  block_body.children.first
126
136
  else
127
137
  block_body
@@ -39,7 +39,7 @@ module RuboCop
39
39
  private
40
40
 
41
41
  def followed_by_space?(colon)
42
- colon.source_buffer.source[colon.end_pos] =~ /\s/
42
+ /\s/.match?(colon.source_buffer.source[colon.end_pos])
43
43
  end
44
44
  end
45
45
  end
@@ -24,9 +24,10 @@ module RuboCop
24
24
  # # good
25
25
  # {}.each { | x, y | puts x }
26
26
  # ->( x, y ) { puts x }
27
- class SpaceAroundBlockParameters < Cop
27
+ class SpaceAroundBlockParameters < Base
28
28
  include ConfigurableEnforcedStyle
29
29
  include RangeHelp
30
+ extend AutoCorrector
30
31
 
31
32
  def on_block(node)
32
33
  arguments = node.arguments
@@ -38,23 +39,6 @@ module RuboCop
38
39
  check_each_arg(arguments)
39
40
  end
40
41
 
41
- # @param target [RuboCop::AST::Node,Parser::Source::Range]
42
- def autocorrect(target)
43
- lambda do |corrector|
44
- if target.is_a?(RuboCop::AST::Node)
45
- if target.parent.children.first == target
46
- corrector.insert_before(target, ' ')
47
- else
48
- corrector.insert_after(target, ' ')
49
- end
50
- elsif /^\s+$/.match?(target.source)
51
- corrector.remove(target)
52
- else
53
- corrector.insert_after(target, ' ')
54
- end
55
- end
56
- end
57
-
58
42
  private
59
43
 
60
44
  def pipes(arguments)
@@ -72,11 +56,12 @@ module RuboCop
72
56
  def check_inside_pipes(arguments)
73
57
  opening_pipe, closing_pipe = pipes(arguments)
74
58
 
75
- if style == :no_space
59
+ case style
60
+ when :no_space
76
61
  check_no_space_style_inside_pipes(arguments.children,
77
62
  opening_pipe,
78
63
  closing_pipe)
79
- elsif style == :space
64
+ when :space
80
65
  check_space_style_inside_pipes(arguments.children,
81
66
  opening_pipe,
82
67
  closing_pipe)
@@ -97,7 +82,7 @@ module RuboCop
97
82
 
98
83
  check_no_space(opening_pipe.end_pos, first.begin_pos,
99
84
  'Space before first')
100
- check_no_space(last_end_pos_inside_pipes(last.end_pos),
85
+ check_no_space(last_end_pos_inside_pipes(last),
101
86
  closing_pipe.begin_pos, 'Space after last')
102
87
  end
103
88
 
@@ -118,7 +103,7 @@ module RuboCop
118
103
 
119
104
  def check_closing_pipe_space(args, closing_pipe)
120
105
  last = args.last.source_range
121
- last_end_pos = last_end_pos_inside_pipes(last.end_pos)
106
+ last_end_pos = last_end_pos_inside_pipes(last)
122
107
 
123
108
  check_space(last_end_pos, closing_pipe.begin_pos, last,
124
109
  'after last block parameter')
@@ -126,8 +111,9 @@ module RuboCop
126
111
  'Extra space after last')
127
112
  end
128
113
 
129
- def last_end_pos_inside_pipes(pos)
130
- processed_source.buffer.source[pos] == ',' ? pos + 1 : pos
114
+ def last_end_pos_inside_pipes(range)
115
+ pos = range.end_pos
116
+ range.source_buffer.source[pos] == ',' ? pos + 1 : pos
131
117
  end
132
118
 
133
119
  def check_each_arg(args)
@@ -151,7 +137,14 @@ module RuboCop
151
137
  return if space_begin_pos != space_end_pos
152
138
 
153
139
  target = node || range
154
- add_offense(target, location: range, message: "Space #{msg} missing.")
140
+ message = "Space #{msg} missing."
141
+ add_offense(target, message: message) do |corrector|
142
+ if node
143
+ corrector.insert_before(node, ' ')
144
+ else
145
+ corrector.insert_after(target, ' ')
146
+ end
147
+ end
155
148
  end
156
149
 
157
150
  def check_no_space(space_begin_pos, space_end_pos, msg)
@@ -160,8 +153,10 @@ module RuboCop
160
153
  range = range_between(space_begin_pos, space_end_pos)
161
154
  return if range.source.include?("\n")
162
155
 
163
- add_offense(range, location: range,
164
- message: "#{msg} block parameter detected.")
156
+ message = "#{msg} block parameter detected."
157
+ add_offense(range, message: message) do |corrector|
158
+ corrector.remove(range)
159
+ end
165
160
  end
166
161
  end
167
162
  end
@@ -186,7 +186,7 @@ module RuboCop
186
186
  pos = range.begin_pos - 1
187
187
  return false if pos.negative?
188
188
 
189
- range.source_buffer.source[pos] !~ /[\s(|{\[;,*=]/
189
+ !/[\s(|{\[;,*=]/.match?(range.source_buffer.source[pos])
190
190
  end
191
191
 
192
192
  def space_after_missing?(range)
@@ -198,7 +198,7 @@ module RuboCop
198
198
  return false if accept_namespace_operator?(range) &&
199
199
  namespace_operator?(range, pos)
200
200
 
201
- char !~ /[\s;,#\\)}\].]/
201
+ !/[\s;,#\\)}\].]/.match?(char)
202
202
  end
203
203
 
204
204
  def accepted_opening_delimiter?(range, char)
@@ -34,96 +34,55 @@ module RuboCop
34
34
  # RuboCop::Cop::Cop
35
35
  # ::RuboCop::Cop
36
36
  #
37
- class SpaceAroundMethodCallOperator < Cop
38
- include SurroundingSpace
37
+ class SpaceAroundMethodCallOperator < Base
38
+ include RangeHelp
39
+ extend AutoCorrector
40
+
41
+ SPACES_REGEXP = /\A[ \t]+\z/.freeze
39
42
 
40
43
  MSG = 'Avoid using spaces around a method call operator.'
41
44
 
42
45
  def on_send(node)
43
- return unless dot_or_safe_navigation_operator?(node)
46
+ return unless node.dot? || node.safe_navigation?
44
47
 
45
- check_and_add_offense(node)
48
+ check_space_before_dot(node)
49
+ check_space_after_dot(node)
46
50
  end
51
+ alias on_csend on_send
47
52
 
48
53
  def on_const(node)
49
54
  return unless node.loc.double_colon
50
55
 
51
- check_and_add_offense(node, false)
52
- end
53
-
54
- def autocorrect(node)
55
- operator = operator_token(node)
56
- left = left_token_for_auto_correction(node, operator)
57
- right = right_token_for_auto_correction(operator)
58
-
59
- lambda do |corrector|
60
- SpaceCorrector.remove_space(
61
- processed_source, corrector, left, right
62
- )
63
- end
56
+ check_space_after_double_colon(node)
64
57
  end
65
58
 
66
- alias on_csend on_send
67
-
68
59
  private
69
60
 
70
- def check_and_add_offense(node, add_left_offense = true)
71
- operator = operator_token(node)
72
- left = previous_token(operator)
73
- right = next_token(operator)
74
-
75
- if !right.comment? && valid_right_token?(right, operator)
76
- no_space_offenses(node, operator, right, MSG)
77
- end
78
- return unless valid_left_token?(left, operator)
79
-
80
- no_space_offenses(node, left, operator, MSG) if add_left_offense
81
- end
82
-
83
- def operator_token(node)
84
- operator_location =
85
- node.const_type? ? node.loc.double_colon : node.loc.dot
86
-
87
- processed_source.find_token do |token|
88
- token.pos == operator_location
89
- end
90
- end
91
-
92
- def previous_token(current_token)
93
- index = processed_source.tokens.index(current_token)
94
- index.zero? ? nil : processed_source.tokens[index - 1]
95
- end
96
-
97
- def next_token(current_token)
98
- index = processed_source.tokens.index(current_token)
99
- processed_source.tokens[index + 1]
100
- end
101
-
102
- def dot_or_safe_navigation_operator?(node)
103
- node.dot? || node.safe_navigation?
61
+ def check_space_before_dot(node)
62
+ receiver_pos = node.receiver.source_range.end_pos
63
+ dot_pos = node.loc.dot.begin_pos
64
+ check_space(receiver_pos, dot_pos)
104
65
  end
105
66
 
106
- def valid_left_token?(left, operator)
107
- left && left.line == operator.line
67
+ def check_space_after_dot(node)
68
+ dot_pos = node.loc.dot.end_pos
69
+ selector_pos = node.loc.selector.begin_pos
70
+ check_space(dot_pos, selector_pos)
108
71
  end
109
72
 
110
- def valid_right_token?(right, operator)
111
- right && right.line == operator.line
73
+ def check_space_after_double_colon(node)
74
+ double_colon_pos = node.loc.double_colon.end_pos
75
+ name_pos = node.loc.name.begin_pos
76
+ check_space(double_colon_pos, name_pos)
112
77
  end
113
78
 
114
- def left_token_for_auto_correction(node, operator)
115
- left_token = previous_token(operator)
116
- return operator if node.const_type?
117
- return left_token if valid_left_token?(left_token, operator)
118
-
119
- operator
120
- end
79
+ def check_space(begin_pos, end_pos)
80
+ return if end_pos <= begin_pos
121
81
 
122
- def right_token_for_auto_correction(operator)
123
- right_token = next_token(operator)
124
- return right_token if !right_token.comment? && valid_right_token?(right_token, operator)
82
+ range = range_between(begin_pos, end_pos)
83
+ return unless range.source.match?(SPACES_REGEXP)
125
84
 
126
- operator
85
+ add_offense(range) { |corrector| corrector.remove(range) }
127
86
  end
128
87
  end
129
88
  end