rubocop 0.75.1 → 0.80.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 (199) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +374 -335
  5. data/lib/rubocop.rb +53 -32
  6. data/lib/rubocop/ast/builder.rb +43 -41
  7. data/lib/rubocop/ast/node.rb +5 -13
  8. data/lib/rubocop/ast/node/block_node.rb +2 -0
  9. data/lib/rubocop/ast/node/def_node.rb +11 -0
  10. data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
  11. data/lib/rubocop/ast/node/regexp_node.rb +2 -4
  12. data/lib/rubocop/ast/node/return_node.rb +24 -0
  13. data/lib/rubocop/ast/traversal.rb +20 -3
  14. data/lib/rubocop/cli.rb +11 -227
  15. data/lib/rubocop/cli/command.rb +21 -0
  16. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  17. data/lib/rubocop/cli/command/base.rb +33 -0
  18. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  19. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  20. data/lib/rubocop/cli/command/show_cops.rb +80 -0
  21. data/lib/rubocop/cli/command/version.rb +17 -0
  22. data/lib/rubocop/cli/environment.rb +21 -0
  23. data/lib/rubocop/comment_config.rb +8 -3
  24. data/lib/rubocop/config.rb +8 -1
  25. data/lib/rubocop/config_loader.rb +20 -20
  26. data/lib/rubocop/config_loader_resolver.rb +2 -1
  27. data/lib/rubocop/config_obsoletion.rb +73 -10
  28. data/lib/rubocop/config_validator.rb +77 -110
  29. data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
  30. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  31. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
  32. data/lib/rubocop/cop/commissioner.rb +15 -7
  33. data/lib/rubocop/cop/cop.rb +31 -6
  34. data/lib/rubocop/cop/corrector.rb +8 -7
  35. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
  36. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  37. data/lib/rubocop/cop/generator.rb +3 -4
  38. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  39. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  40. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  41. data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
  42. data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
  43. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +1 -1
  44. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  45. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  46. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
  47. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  48. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  49. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
  50. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  51. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
  52. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  53. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +16 -8
  54. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +5 -5
  55. data/lib/rubocop/cop/layout/leading_comment_space.rb +33 -2
  56. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  57. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +68 -112
  58. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  59. data/lib/rubocop/cop/layout/multiline_block_layout.rb +14 -5
  60. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +0 -4
  61. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  62. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  63. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  64. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  65. data/lib/rubocop/cop/layout/space_around_operators.rb +50 -7
  66. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  67. data/lib/rubocop/cop/layout/space_before_first_arg.rb +8 -0
  68. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  69. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -4
  70. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -9
  71. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  72. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  73. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  74. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  75. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  76. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  77. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  78. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  79. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  80. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  81. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  82. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  83. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
  84. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +18 -15
  85. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  86. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
  87. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
  88. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  89. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  90. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  91. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  92. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  93. data/lib/rubocop/cop/lint/useless_setter_call.rb +5 -1
  94. data/lib/rubocop/cop/lint/void.rb +4 -4
  95. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  96. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  97. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  98. data/lib/rubocop/cop/migration/department_name.rb +30 -2
  99. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  100. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +4 -0
  101. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  102. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  103. data/lib/rubocop/cop/mixin/hash_transform_method.rb +172 -0
  104. data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
  105. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  106. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  107. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  108. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
  109. data/lib/rubocop/cop/mixin/trailing_comma.rb +16 -18
  110. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  111. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  112. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  113. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  114. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
  115. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  116. data/lib/rubocop/cop/offense.rb +11 -0
  117. data/lib/rubocop/cop/registry.rb +8 -3
  118. data/lib/rubocop/cop/style/alias.rb +1 -1
  119. data/lib/rubocop/cop/style/array_join.rb +1 -1
  120. data/lib/rubocop/cop/style/attr.rb +10 -2
  121. data/lib/rubocop/cop/style/block_delimiters.rb +60 -1
  122. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  123. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
  124. data/lib/rubocop/cop/style/copyright.rb +11 -7
  125. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +2 -2
  126. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  127. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  128. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  129. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  130. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  131. data/lib/rubocop/cop/style/format_string.rb +10 -7
  132. data/lib/rubocop/cop/style/format_string_token.rb +2 -0
  133. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +99 -11
  134. data/lib/rubocop/cop/style/guard_clause.rb +3 -2
  135. data/lib/rubocop/cop/style/hash_each_methods.rb +87 -0
  136. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  137. data/lib/rubocop/cop/style/hash_transform_keys.rb +79 -0
  138. data/lib/rubocop/cop/style/hash_transform_values.rb +79 -0
  139. data/lib/rubocop/cop/style/if_unless_modifier.rb +45 -3
  140. data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
  141. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  142. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  143. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  144. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -205
  145. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  146. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
  147. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  148. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  149. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  150. data/lib/rubocop/cop/style/multiline_when_then.rb +6 -2
  151. data/lib/rubocop/cop/style/nested_modifier.rb +4 -2
  152. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  153. data/lib/rubocop/cop/style/next.rb +5 -5
  154. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  155. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  156. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -3
  157. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  158. data/lib/rubocop/cop/style/or_assignment.rb +3 -2
  159. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
  160. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  161. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  162. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  163. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
  164. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  165. data/lib/rubocop/cop/style/redundant_return.rb +27 -29
  166. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
  167. data/lib/rubocop/cop/style/safe_navigation.rb +13 -10
  168. data/lib/rubocop/cop/style/semicolon.rb +2 -2
  169. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  170. data/lib/rubocop/cop/style/symbol_array.rb +2 -2
  171. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  172. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +0 -22
  173. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  174. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  175. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  176. data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
  177. data/lib/rubocop/cop/team.rb +5 -0
  178. data/lib/rubocop/cop/util.rb +1 -1
  179. data/lib/rubocop/cop/utils/format_string.rb +10 -18
  180. data/lib/rubocop/cop/variable_force.rb +11 -6
  181. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  182. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -3
  183. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  184. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  185. data/lib/rubocop/formatter/junit_formatter.rb +63 -0
  186. data/lib/rubocop/formatter/tap_formatter.rb +1 -3
  187. data/lib/rubocop/node_pattern.rb +100 -12
  188. data/lib/rubocop/options.rb +17 -11
  189. data/lib/rubocop/processed_source.rb +1 -1
  190. data/lib/rubocop/rake_task.rb +1 -0
  191. data/lib/rubocop/result_cache.rb +24 -8
  192. data/lib/rubocop/rspec/shared_contexts.rb +5 -0
  193. data/lib/rubocop/runner.rb +50 -29
  194. data/lib/rubocop/target_finder.rb +12 -6
  195. data/lib/rubocop/target_ruby.rb +151 -0
  196. data/lib/rubocop/version.rb +1 -1
  197. metadata +69 -35
  198. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
  199. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
@@ -96,6 +96,7 @@ module RuboCop
96
96
  )
97
97
  end
98
98
 
99
+ # rubocop:disable Metrics/AbcSize
99
100
  def alignment_source(node, starting_loc)
100
101
  ending_loc =
101
102
  case node.type
@@ -114,6 +115,7 @@ module RuboCop
114
115
 
115
116
  range_between(starting_loc.begin_pos, ending_loc.end_pos).source
116
117
  end
118
+ # rubocop:enable Metrics/AbcSize
117
119
 
118
120
  # We will use ancestor or wrapper with access modifier.
119
121
 
@@ -30,10 +30,12 @@ module RuboCop
30
30
 
31
31
  DO = 'do'
32
32
  SAFE_NAVIGATION = '&.'
33
+ NAMESPACE_OPERATOR = '::'
33
34
  ACCEPT_LEFT_PAREN =
34
35
  %w[break defined? next not rescue return super yield].freeze
35
36
  ACCEPT_LEFT_SQUARE_BRACKET =
36
37
  %w[super yield].freeze
38
+ ACCEPT_NAMESPACE_OPERATOR = 'super'
37
39
 
38
40
  def on_and(node)
39
41
  check(node, [:operator].freeze) if node.keyword?
@@ -193,6 +195,8 @@ module RuboCop
193
195
 
194
196
  return false if accepted_opening_delimiter?(range, char)
195
197
  return false if safe_navigation_call?(range, pos)
198
+ return false if accept_namespace_operator?(range) &&
199
+ namespace_operator?(range, pos)
196
200
 
197
201
  char !~ /[\s;,#\\\)\}\]\.]/
198
202
  end
@@ -212,10 +216,18 @@ module RuboCop
212
216
  ACCEPT_LEFT_SQUARE_BRACKET.include?(range.source)
213
217
  end
214
218
 
219
+ def accept_namespace_operator?(range)
220
+ ACCEPT_NAMESPACE_OPERATOR == range.source
221
+ end
222
+
215
223
  def safe_navigation_call?(range, pos)
216
224
  range.source_buffer.source[pos, 2].start_with?(SAFE_NAVIGATION)
217
225
  end
218
226
 
227
+ def namespace_operator?(range, pos)
228
+ range.source_buffer.source[pos, 2].start_with?(NAMESPACE_OPERATOR)
229
+ end
230
+
219
231
  def preceded_by_operator?(node, _range)
220
232
  # regular dotted method calls bind more tightly than operators
221
233
  # so we need to climb up the AST past them
@@ -3,24 +3,55 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Checks that operators have space around them, except for **
7
- # which should not have surrounding space.
6
+ # Checks that operators have space around them, except for ** which
7
+ # should or shouldn't have surrounding space depending on configuration.
8
+ #
9
+ # This cop has `AllowForAlignment` option. When `true`, allows most
10
+ # uses of extra spacing if the intent is to align with an operator on
11
+ # the previous or next line, not counting empty lines or comment lines.
8
12
  #
9
13
  # @example
10
14
  # # bad
11
15
  # total = 3*4
12
16
  # "apple"+"juice"
13
17
  # my_number = 38/4
14
- # a ** b
15
18
  #
16
19
  # # good
17
20
  # total = 3 * 4
18
21
  # "apple" + "juice"
19
22
  # my_number = 38 / 4
23
+ #
24
+ # @example AllowForAlignment: true (default)
25
+ # # good
26
+ # {
27
+ # 1 => 2,
28
+ # 11 => 3
29
+ # }
30
+ #
31
+ # @example AllowForAlignment: false
32
+ # # bad
33
+ # {
34
+ # 1 => 2,
35
+ # 11 => 3
36
+ # }
37
+ #
38
+ # @example EnforcedStyleForExponentOperator: no_space (default)
39
+ # # bad
40
+ # a ** b
41
+ #
42
+ # # good
20
43
  # a**b
44
+ #
45
+ # @example EnforcedStyleForExponentOperator: space
46
+ # # bad
47
+ # a**b
48
+ #
49
+ # # good
50
+ # a ** b
21
51
  class SpaceAroundOperators < Cop
22
52
  include PrecedingFollowingAlignment
23
53
  include RangeHelp
54
+ include RationalLiteral
24
55
 
25
56
  IRREGULAR_METHODS = %i[[] ! []=].freeze
26
57
  EXCESSIVE_SPACE = ' '
@@ -53,6 +84,8 @@ module RuboCop
53
84
  end
54
85
 
55
86
  def on_send(node)
87
+ return if rational_literal?(node)
88
+
56
89
  if node.setter_method?
57
90
  on_special_asgn(node)
58
91
  elsif regular_operator?(node)
@@ -101,7 +134,7 @@ module RuboCop
101
134
 
102
135
  def autocorrect(range)
103
136
  lambda do |corrector|
104
- if range.source =~ /\*\*/
137
+ if range.source =~ /\*\*/ && !space_around_exponent_operator?
105
138
  corrector.replace(range, '**')
106
139
  elsif range.source.end_with?("\n")
107
140
  corrector.replace(range, " #{range.source.strip}\n")
@@ -138,8 +171,10 @@ module RuboCop
138
171
  end
139
172
 
140
173
  def offense_message(type, operator, with_space, right_operand)
141
- if operator.is?('**')
142
- 'Space around operator `**` detected.' unless with_space.is?('**')
174
+ if should_not_have_surrounding_space?(operator)
175
+ return if with_space.is?(operator.source)
176
+
177
+ "Space around operator `#{operator.source}` detected."
143
178
  elsif with_space.source !~ /^\s.*\s$/
144
179
  "Surrounding space missing for operator `#{operator.source}`."
145
180
  elsif excess_leading_space?(type, operator, with_space) ||
@@ -169,13 +204,21 @@ module RuboCop
169
204
  end
170
205
 
171
206
  def align_hash_cop_config
172
- config.for_cop('Layout/AlignHash')
207
+ config.for_cop('Layout/HashAlignment')
173
208
  end
174
209
 
175
210
  def hash_table_style?
176
211
  align_hash_cop_config &&
177
212
  align_hash_cop_config['EnforcedHashRocketStyle'] == 'table'
178
213
  end
214
+
215
+ def space_around_exponent_operator?
216
+ cop_config['EnforcedStyleForExponentOperator'] == 'space'
217
+ end
218
+
219
+ def should_not_have_surrounding_space?(operator)
220
+ operator.is?('**') ? !space_around_exponent_operator? : false
221
+ end
179
222
  end
180
223
  end
181
224
  end
@@ -41,6 +41,14 @@ module RuboCop
41
41
  def on_block(node)
42
42
  return if node.keywords?
43
43
 
44
+ # Do not register an offense for multi-line braces when specifying
45
+ # `EnforcedStyle: no_space`. It will conflict with auto-correction
46
+ # by `EnforcedStyle: line_count_based` of `Style/BlockDelimiters` cop.
47
+ # That means preventing auto-correction to incorrect auto-corrected
48
+ # code.
49
+ # See: https://github.com/rubocop-hq/rubocop/issues/7534
50
+ return if conflict_with_block_delimiters?(node)
51
+
44
52
  left_brace = node.loc.begin
45
53
  space_plus_brace = range_with_surrounding_space(range: left_brace)
46
54
  used_style =
@@ -110,6 +118,15 @@ module RuboCop
110
118
  end
111
119
  end
112
120
 
121
+ def conflict_with_block_delimiters?(node)
122
+ block_delimiters_style == 'line_count_based' &&
123
+ style == :no_space && node.multiline?
124
+ end
125
+
126
+ def block_delimiters_style
127
+ config.for_cop('Style/BlockDelimiters')['EnforcedStyle']
128
+ end
129
+
113
130
  def empty_braces?(loc)
114
131
  loc.begin.end_pos == loc.end.begin_pos
115
132
  end
@@ -54,6 +54,7 @@ module RuboCop
54
54
 
55
55
  def expect_params_after_method_name?(node)
56
56
  return false if node.parenthesized?
57
+ return true if no_space_between_method_name_and_first_argument?(node)
57
58
 
58
59
  first_arg = node.first_argument
59
60
 
@@ -61,6 +62,13 @@ module RuboCop
61
62
  !(allow_for_alignment? &&
62
63
  aligned_with_something?(first_arg.source_range))
63
64
  end
65
+
66
+ def no_space_between_method_name_and_first_argument?(node)
67
+ end_pos_of_method_name = node.loc.selector.end_pos
68
+ begin_pos_of_argument = node.first_argument.source_range.begin_pos
69
+
70
+ end_pos_of_method_name == begin_pos_of_argument
71
+ end
64
72
  end
65
73
  end
66
74
  end
@@ -48,9 +48,7 @@ module RuboCop
48
48
  if style == :require_space
49
49
  corrector.insert_before(children[1].source_range, ' ')
50
50
  else
51
- space_range = range_between(children[0].source_range.end_pos,
52
- children[1].source_range.begin_pos)
53
- corrector.remove(space_range)
51
+ corrector.remove(space_after_arrow(lambda_node))
54
52
  end
55
53
  end
56
54
  end
@@ -62,10 +60,14 @@ module RuboCop
62
60
  end
63
61
 
64
62
  def space_after_arrow?(lambda_node)
65
- arrow = lambda_node.parent.children[0]
66
- parentheses = lambda_node.parent.children[1]
67
- (parentheses.source_range.begin_pos - arrow.source_range.end_pos)
68
- .positive?
63
+ !space_after_arrow(lambda_node).empty?
64
+ end
65
+
66
+ def space_after_arrow(lambda_node)
67
+ arrow = lambda_node.parent.children[0].source_range
68
+ parentheses = lambda_node.parent.children[1].source_range
69
+
70
+ arrow.end.join(parentheses.begin)
69
71
  end
70
72
 
71
73
  def range_of_offense(node)
@@ -210,18 +210,21 @@ module RuboCop
210
210
 
211
211
  def compact_corrections(corrector, node, left, right)
212
212
  if qualifies_for_compact?(node, left, side: :left)
213
- range = side_space_range(range: left.pos, side: :right)
214
- corrector.remove(range)
213
+ compact(corrector, left, :right)
215
214
  elsif !left.space_after?
216
215
  corrector.insert_after(left.pos, ' ')
217
216
  end
218
217
  if qualifies_for_compact?(node, right)
219
- range = side_space_range(range: right.pos, side: :left)
220
- corrector.remove(range)
218
+ compact(corrector, right, :left)
221
219
  elsif !right.space_before?
222
220
  corrector.insert_before(right.pos, ' ')
223
221
  end
224
222
  end
223
+
224
+ def compact(corrector, bracket, side)
225
+ range = side_space_range(range: bracket.pos, side: side)
226
+ corrector.remove(range)
227
+ end
225
228
  end
226
229
  end
227
230
  end
@@ -83,17 +83,10 @@ module RuboCop
83
83
 
84
84
  def autocorrect(range)
85
85
  lambda do |corrector|
86
- # It is possible that BracesAroundHashParameters will remove the
87
- # braces while this cop inserts spaces. This can lead to unwanted
88
- # changes to the inspected code. If we replace the brace with a
89
- # brace plus space (rather than just inserting a space), then any
90
- # removal of the same brace will give us a clobbering error. This
91
- # in turn will make RuboCop fall back on cop-by-cop
92
- # auto-correction. Problem solved.
93
86
  case range.source
94
87
  when /\s/ then corrector.remove(range)
95
- when '{' then corrector.replace(range, '{ ')
96
- else corrector.replace(range, ' }')
88
+ when '{' then corrector.insert_after(range, ' ')
89
+ else corrector.insert_before(range, ' ')
97
90
  end
98
91
  end
99
92
  end
@@ -72,7 +72,7 @@ module RuboCop
72
72
  # If the second token is a comment, that means that a line break
73
73
  # follows, and that the rules for space inside don't apply.
74
74
  next if token2.comment?
75
- next unless token2.line == token1.line && token1.space_after?
75
+ next unless same_line?(token1, token2) && token1.space_after?
76
76
 
77
77
  yield range_between(token1.end_pos, token2.begin_pos)
78
78
  end
@@ -82,17 +82,18 @@ module RuboCop
82
82
  tokens.each_cons(2) do |token1, token2|
83
83
  next if can_be_ignored?(token1, token2)
84
84
 
85
- next unless token2.line == token1.line && !token1.space_after?
86
-
87
85
  if token1.left_parens?
88
86
  yield range_between(token2.begin_pos, token2.begin_pos + 1)
89
-
90
87
  elsif token2.right_parens?
91
88
  yield range_between(token2.begin_pos, token2.end_pos)
92
89
  end
93
90
  end
94
91
  end
95
92
 
93
+ def same_line?(token1, token2)
94
+ token1.line == token2.line
95
+ end
96
+
96
97
  def parens?(token1, token2)
97
98
  token1.left_parens? || token2.right_parens?
98
99
  end
@@ -104,8 +105,7 @@ module RuboCop
104
105
  # follows, and that the rules for space inside don't apply.
105
106
  return true if token2.comment?
106
107
 
107
- # Ignore empty parens. # TODO: Could be configurable.
108
- return true if token1.left_parens? && token2.right_parens?
108
+ return true unless same_line?(token1, token2) && !token1.space_after?
109
109
  end
110
110
  end
111
111
  end
@@ -37,7 +37,7 @@ module RuboCop
37
37
  # class Foo; end
38
38
  # # EOF
39
39
  #
40
- class TrailingBlankLines < Cop
40
+ class TrailingEmptyLines < Cop
41
41
  include ConfigurableEnforcedStyle
42
42
  include RangeHelp
43
43
 
@@ -14,6 +14,20 @@ module RuboCop
14
14
  # # good
15
15
  # x = 0
16
16
  #
17
+ # @example AllowInHeredoc: false (default)
18
+ # # The line in this example contains spaces after the 0.
19
+ # # bad
20
+ # code = <<~RUBY
21
+ # x = 0
22
+ # RUBY
23
+ #
24
+ # @example AllowInHeredoc: true
25
+ # # The line in this example contains spaces after the 0.
26
+ # # good
27
+ # code = <<~RUBY
28
+ # x = 0
29
+ # RUBY
30
+ #
17
31
  class TrailingWhitespace < Cop
18
32
  include RangeHelp
19
33
 
@@ -22,11 +36,13 @@ module RuboCop
22
36
  def investigate(processed_source)
23
37
  heredoc_ranges = extract_heredoc_ranges(processed_source.ast)
24
38
  processed_source.lines.each_with_index do |line, index|
39
+ lineno = index + 1
40
+
25
41
  next unless line.end_with?(' ', "\t")
26
- next if skip_heredoc? && inside_heredoc?(heredoc_ranges, index + 1)
42
+ next if skip_heredoc? && inside_heredoc?(heredoc_ranges, lineno)
27
43
 
28
44
  range = source_range(processed_source.buffer,
29
- index + 1,
45
+ lineno,
30
46
  (line.rstrip.length)...(line.length))
31
47
 
32
48
  add_offense(range, location: range)
@@ -45,7 +45,7 @@ module RuboCop
45
45
  def_node_matcher :debugger_call?, <<~PATTERN
46
46
  {(send {nil? #kernel?} {:debugger :byebug :remote_byebug} ...)
47
47
  (send (send {#kernel? nil?} :binding)
48
- {:pry :remote_pry :pry_remote} ...)
48
+ {:pry :remote_pry :pry_remote :console} ...)
49
49
  (send (const {nil? (cbase)} :Pry) :rescue ...)
50
50
  (send nil? {:save_and_open_page
51
51
  :save_and_open_screenshot
@@ -33,7 +33,7 @@ module RuboCop
33
33
 
34
34
  # @param [DefNode] node a constructor definition
35
35
  def check(node)
36
- return unless node.method_name == :initialize
36
+ return unless node.method?(:initialize)
37
37
 
38
38
  check_body(node.body)
39
39
  end
@@ -18,7 +18,7 @@ module RuboCop
18
18
  # # good
19
19
  #
20
20
  # hash = { food: 'apple', other_food: 'orange' }
21
- class DuplicatedKey < Cop
21
+ class DuplicateHashKey < Cop
22
22
  include Duplication
23
23
 
24
24
  MSG = 'Duplicated key in hash literal.'
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # num = 0
23
23
  # sum = numbers.each_with_object(num) { |e, a| a += e }
24
24
  class EachWithObjectArgument < Cop
25
- MSG = 'The argument to each_with_object can not be immutable.'
25
+ MSG = 'The argument to each_with_object cannot be immutable.'
26
26
 
27
27
  def_node_matcher :each_with_object?, <<~PATTERN
28
28
  ({send csend} _ :each_with_object $_)
@@ -86,13 +86,13 @@ module RuboCop
86
86
  erb_new_with_non_keyword_arguments(node) do |arguments|
87
87
  return if correct_arguments?(arguments)
88
88
 
89
- 1.upto(3) do |i|
90
- next if !arguments[i] || arguments[i].hash_type?
89
+ arguments[1..3].each_with_index do |argument, i|
90
+ next if !argument || argument.hash_type?
91
91
 
92
- message = format(MESSAGES[i - 1], arg_value: arguments[i].source)
92
+ message = format(MESSAGES[i], arg_value: argument.source)
93
93
 
94
94
  add_offense(
95
- node, location: arguments[i].source_range, message: message
95
+ node, location: argument.source_range, message: message
96
96
  )
97
97
  end
98
98
  end
@@ -138,14 +138,15 @@ module RuboCop
138
138
  end
139
139
 
140
140
  def override_by_legacy_args(kwargs, node)
141
+ arguments = node.arguments
141
142
  overridden_kwargs = kwargs.dup
142
143
 
143
- if node.arguments[2]
144
- overridden_kwargs[0] = "trim_mode: #{node.arguments[2].source}"
144
+ if arguments[2]
145
+ overridden_kwargs[0] = "trim_mode: #{arguments[2].source}"
145
146
  end
146
147
 
147
- if node.arguments[3] && !node.arguments[3].hash_type?
148
- overridden_kwargs[1] = "eoutvar: #{node.arguments[3].source}"
148
+ if arguments[3] && !arguments[3].hash_type?
149
+ overridden_kwargs[1] = "eoutvar: #{arguments[3].source}"
149
150
  end
150
151
 
151
152
  overridden_kwargs