rubocop 0.79.0 → 0.83.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 (225) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +5 -5
  4. data/config/default.yml +184 -50
  5. data/lib/rubocop.rb +15 -5
  6. data/lib/rubocop/ast/builder.rb +2 -0
  7. data/lib/rubocop/ast/node.rb +12 -19
  8. data/lib/rubocop/ast/node/array_node.rb +13 -0
  9. data/lib/rubocop/ast/node/block_node.rb +5 -1
  10. data/lib/rubocop/ast/node/case_match_node.rb +56 -0
  11. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +8 -0
  12. data/lib/rubocop/ast/node/regexp_node.rb +2 -4
  13. data/lib/rubocop/ast/node/send_node.rb +4 -0
  14. data/lib/rubocop/ast/traversal.rb +20 -9
  15. data/lib/rubocop/cli.rb +11 -5
  16. data/lib/rubocop/comment_config.rb +6 -1
  17. data/lib/rubocop/config.rb +40 -10
  18. data/lib/rubocop/config_loader.rb +43 -33
  19. data/lib/rubocop/config_loader_resolver.rb +28 -1
  20. data/lib/rubocop/config_obsoletion.rb +4 -1
  21. data/lib/rubocop/config_validator.rb +18 -1
  22. data/lib/rubocop/cop/badge.rb +5 -5
  23. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  24. data/lib/rubocop/cop/corrector.rb +48 -24
  25. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
  26. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  27. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  28. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
  29. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  30. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  31. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  32. data/lib/rubocop/cop/generator.rb +3 -2
  33. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  34. data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
  35. data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
  36. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  37. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  38. data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
  39. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
  40. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +68 -0
  41. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  42. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +16 -10
  43. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  44. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
  45. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  46. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  47. data/lib/rubocop/cop/layout/leading_comment_space.rb +34 -3
  48. data/lib/rubocop/cop/layout/line_length.rb +36 -4
  49. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  50. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +0 -4
  51. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  52. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  53. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  54. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +133 -0
  55. data/lib/rubocop/cop/layout/space_around_operators.rb +37 -2
  56. data/lib/rubocop/cop/layout/space_before_first_arg.rb +8 -0
  57. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  58. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  59. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -9
  60. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  61. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  62. data/lib/rubocop/cop/lint/ambiguous_operator.rb +38 -0
  63. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  64. data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
  65. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  66. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  67. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  68. data/lib/rubocop/cop/lint/ensure_return.rb +18 -1
  69. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  70. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  71. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  72. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  73. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  74. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  75. data/lib/rubocop/cop/lint/loop.rb +6 -4
  76. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  77. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  78. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  79. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  80. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +21 -9
  81. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
  82. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  83. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
  84. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +12 -7
  85. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  86. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  87. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  88. data/lib/rubocop/cop/lint/suppressed_exception.rb +12 -28
  89. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  90. data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
  91. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  92. data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -0
  93. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  94. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +5 -0
  95. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -0
  96. data/lib/rubocop/cop/migration/department_name.rb +36 -10
  97. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +4 -0
  98. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
  99. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +16 -1
  100. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  101. data/lib/rubocop/cop/mixin/line_length_help.rb +2 -1
  102. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
  103. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  104. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
  105. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  106. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -10
  107. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  108. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  109. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  110. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  111. data/lib/rubocop/cop/naming/method_name.rb +26 -0
  112. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  113. data/lib/rubocop/cop/registry.rb +11 -4
  114. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
  115. data/lib/rubocop/cop/style/alias.rb +4 -4
  116. data/lib/rubocop/cop/style/and_or.rb +5 -6
  117. data/lib/rubocop/cop/style/array_join.rb +1 -1
  118. data/lib/rubocop/cop/style/block_delimiters.rb +60 -1
  119. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  120. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  121. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  122. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -8
  123. data/lib/rubocop/cop/style/copyright.rb +1 -1
  124. data/lib/rubocop/cop/style/dir.rb +1 -1
  125. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  126. data/lib/rubocop/cop/style/documentation.rb +43 -5
  127. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  128. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  129. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  130. data/lib/rubocop/cop/style/empty_method.rb +1 -5
  131. data/lib/rubocop/cop/style/end_block.rb +6 -0
  132. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  133. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  134. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  135. data/lib/rubocop/cop/style/format_string.rb +2 -2
  136. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -11
  137. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  138. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  139. data/lib/rubocop/cop/style/hash_syntax.rb +3 -5
  140. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  141. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  142. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  143. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  144. data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
  145. data/lib/rubocop/cop/style/lambda.rb +3 -2
  146. data/lib/rubocop/cop/style/lambda_call.rb +1 -21
  147. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +5 -0
  148. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -4
  149. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  150. data/lib/rubocop/cop/style/module_function.rb +58 -12
  151. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  152. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  153. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  154. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  155. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -4
  156. data/lib/rubocop/cop/style/next.rb +2 -2
  157. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  158. data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
  159. data/lib/rubocop/cop/style/not.rb +1 -1
  160. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  161. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  162. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  163. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
  164. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  165. data/lib/rubocop/cop/style/or_assignment.rb +4 -3
  166. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  167. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  168. data/lib/rubocop/cop/style/proc.rb +1 -1
  169. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  170. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  171. data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
  172. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  173. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  174. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  175. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  176. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  177. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  178. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  179. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  180. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  181. data/lib/rubocop/cop/style/safe_navigation.rb +1 -1
  182. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  183. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  184. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  185. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  186. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  187. data/lib/rubocop/cop/style/symbol_array.rb +3 -3
  188. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  189. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
  190. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -22
  191. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
  192. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  193. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
  194. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  195. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  196. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  197. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  198. data/lib/rubocop/cop/style/word_array.rb +1 -1
  199. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  200. data/lib/rubocop/cop/util.rb +24 -0
  201. data/lib/rubocop/cop/variable_force.rb +4 -1
  202. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  203. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  204. data/lib/rubocop/cop/variable_force/variable.rb +1 -0
  205. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  206. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  207. data/lib/rubocop/formatter/junit_formatter.rb +74 -0
  208. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  209. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  210. data/lib/rubocop/name_similarity.rb +12 -9
  211. data/lib/rubocop/node_pattern.rb +96 -10
  212. data/lib/rubocop/options.rb +18 -5
  213. data/lib/rubocop/processed_source.rb +1 -4
  214. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  215. data/lib/rubocop/rspec/expect_offense.rb +1 -1
  216. data/lib/rubocop/rspec/shared_contexts.rb +0 -4
  217. data/lib/rubocop/runner.rb +7 -2
  218. data/lib/rubocop/target_finder.rb +6 -4
  219. data/lib/rubocop/target_ruby.rb +2 -2
  220. data/lib/rubocop/version.rb +1 -1
  221. metadata +35 -25
  222. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  223. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
  224. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  225. data/lib/rubocop/string_util.rb +0 -14
@@ -10,26 +10,25 @@ module RuboCop
10
10
  # @example
11
11
  #
12
12
  # # bad
13
- #
14
13
  # if 20
15
14
  # do_something
16
15
  # end
17
16
  #
18
- # @example
19
- #
20
17
  # # bad
21
- #
22
18
  # if some_var && true
23
19
  # do_something
24
20
  # end
25
21
  #
26
- # @example
27
- #
28
22
  # # good
29
- #
30
23
  # if some_var && some_condition
31
24
  # do_something
32
25
  # end
26
+ #
27
+ # # good
28
+ # # When using a boolean value for an infinite loop.
29
+ # while true
30
+ # break if condition
31
+ # end
33
32
  class LiteralAsCondition < Cop
34
33
  MSG = 'Literal `%<literal>s` appeared as a condition.'
35
34
 
@@ -38,20 +37,18 @@ module RuboCop
38
37
  end
39
38
 
40
39
  def on_while(node)
41
- check_for_literal(node)
42
- end
40
+ return if condition(node).true_type?
43
41
 
44
- def on_while_post(node)
45
42
  check_for_literal(node)
46
43
  end
44
+ alias on_while_post on_while
47
45
 
48
46
  def on_until(node)
49
- check_for_literal(node)
50
- end
47
+ return if condition(node).false_type?
51
48
 
52
- def on_until_post(node)
53
49
  check_for_literal(node)
54
50
  end
51
+ alias on_until_post on_until
55
52
 
56
53
  def on_case(case_node)
57
54
  if case_node.condition
@@ -37,7 +37,7 @@ module RuboCop
37
37
  return if node.dstr_type? # nested, fixed in next iteration
38
38
 
39
39
  value = autocorrected_value(node)
40
- ->(corrector) { corrector.replace(node.parent.source_range, value) }
40
+ ->(corrector) { corrector.replace(node.parent, value) }
41
41
  end
42
42
 
43
43
  private
@@ -27,18 +27,20 @@ module RuboCop
27
27
  #
28
28
  # # good
29
29
  #
30
- # # using while
31
- # while some_condition
30
+ # # while replacement
31
+ # loop do
32
32
  # do_something
33
+ # break unless some_condition
33
34
  # end
34
35
  #
35
36
  # @example
36
37
  #
37
38
  # # good
38
39
  #
39
- # # using until
40
- # until some_condition
40
+ # # until replacement
41
+ # loop do
41
42
  # do_something
43
+ # break if some_condition
42
44
  # end
43
45
  class Loop < Cop
44
46
  MSG = 'Use `Kernel#loop` with `break` rather than ' \
@@ -39,7 +39,7 @@ module RuboCop
39
39
  new_center = "#{center.source} && #{center.source}"
40
40
 
41
41
  lambda do |corrector|
42
- corrector.replace(center.source_range, new_center)
42
+ corrector.replace(center, new_center)
43
43
  end
44
44
  end
45
45
  end
@@ -31,14 +31,14 @@ module RuboCop
31
31
  # # good
32
32
  #
33
33
  # def foo
34
- # self.class_eval do
34
+ # self.class.class_eval do
35
35
  # def bar
36
36
  # end
37
37
  # end
38
38
  # end
39
39
  #
40
40
  # def foo
41
- # self.module_exec do
41
+ # self.class.module_exec do
42
42
  # def bar
43
43
  # end
44
44
  # end
@@ -52,12 +52,12 @@ module RuboCop
52
52
  def autocorrect(node)
53
53
  if unsorted_dir_block?(node)
54
54
  lambda do |corrector|
55
- corrector.replace(node.loc.expression, "#{node.source}.sort.each")
55
+ corrector.replace(node, "#{node.source}.sort.each")
56
56
  end
57
57
  else
58
58
  lambda do |corrector|
59
59
  source = node.receiver.source
60
- corrector.replace(node.loc.expression, "#{source}.sort.each")
60
+ corrector.replace(node, "#{source}.sort.each")
61
61
  end
62
62
  end
63
63
  end
@@ -55,7 +55,7 @@ module RuboCop
55
55
 
56
56
  def autocorrect(node)
57
57
  lambda do |corrector|
58
- corrector.replace(node.loc.expression,
58
+ corrector.replace(node,
59
59
  correct_method(node, node.receiver))
60
60
  end
61
61
  end
@@ -9,14 +9,12 @@ module RuboCop
9
9
  # @example
10
10
  #
11
11
  # # bad
12
- #
13
- # puts (x + y)
14
- #
15
- # @example
12
+ # do_something (foo)
16
13
  #
17
14
  # # good
18
- #
19
- # puts(x + y)
15
+ # do_something(foo)
16
+ # do_something (2 + 3) * 4
17
+ # do_something (foo * bar).baz
20
18
  class ParenthesesAsGroupedExpression < Cop
21
19
  include RangeHelp
22
20
 
@@ -25,20 +23,34 @@ module RuboCop
25
23
  def on_send(node)
26
24
  return unless node.arguments.one?
27
25
  return if node.operator_method? || node.setter_method?
28
-
29
- return unless node.first_argument.source.start_with?('(')
26
+ return if grouped_parentheses?(node)
30
27
 
31
28
  space_length = spaces_before_left_parenthesis(node)
32
29
  return unless space_length.positive?
33
30
 
34
31
  range = space_range(node.first_argument.source_range, space_length)
35
32
 
36
- add_offense(nil, location: range)
33
+ add_offense(node, location: range)
37
34
  end
38
35
  alias on_csend on_send
39
36
 
37
+ def autocorrect(node)
38
+ space_length = spaces_before_left_parenthesis(node)
39
+ range = space_range(node.first_argument.source_range, space_length)
40
+
41
+ lambda do |corrector|
42
+ corrector.remove(range)
43
+ end
44
+ end
45
+
40
46
  private
41
47
 
48
+ def grouped_parentheses?(node)
49
+ first_argument = node.first_argument
50
+
51
+ first_argument.send_type? && first_argument.receiver&.begin_type?
52
+ end
53
+
42
54
  def spaces_before_left_parenthesis(node)
43
55
  receiver = node.receiver
44
56
  receiver_length = if receiver
@@ -42,13 +42,13 @@ module RuboCop
42
42
 
43
43
  def autocorrect(node)
44
44
  lambda do |corrector|
45
- node.values.each do |value|
45
+ node.each_value do |value|
46
46
  range = value.loc.expression
47
47
 
48
48
  match = range.source.match(TRAILING_QUOTE)
49
49
  corrector.remove_trailing(range, match[0].length) if match
50
50
 
51
- if range.source =~ LEADING_QUOTE
51
+ if LEADING_QUOTE.match?(range.source)
52
52
  corrector.remove_leading(range, 1)
53
53
  end
54
54
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for `raise` or `fail` statements which are
7
+ # raising `Exception` class.
8
+ #
9
+ # You can specify a module name that will be an implicit namespace
10
+ # using `AllowedImplicitNamespaces` option. The cop cause a false positive
11
+ # for namespaced `Exception` when a namespace is omitted. This option can
12
+ # prevent the false positive by specifying a namespace to be omitted for
13
+ # `Exception`. Alternatively, make `Exception` a fully qualified class
14
+ # name with an explicit namespace.
15
+ #
16
+ # @example
17
+ # # bad
18
+ # raise Exception, 'Error message here'
19
+ #
20
+ # # good
21
+ # raise StandardError, 'Error message here'
22
+ #
23
+ # @example AllowedImplicitNamespaces: ['Gem']
24
+ # # good
25
+ # module Gem
26
+ # def self.foo
27
+ # raise Exception # This exception means `Gem::Exception`.
28
+ # end
29
+ # end
30
+ class RaiseException < Cop
31
+ MSG = 'Use `StandardError` over `Exception`.'
32
+
33
+ def_node_matcher :exception?, <<~PATTERN
34
+ (send nil? {:raise :fail} (const ${cbase nil?} :Exception) ... )
35
+ PATTERN
36
+
37
+ def_node_matcher :exception_new_with_message?, <<~PATTERN
38
+ (send nil? {:raise :fail}
39
+ (send (const ${cbase nil?} :Exception) :new ... ))
40
+ PATTERN
41
+
42
+ def on_send(node)
43
+ exception?(node, &check(node)) ||
44
+ exception_new_with_message?(node, &check(node))
45
+ end
46
+
47
+ private
48
+
49
+ def check(node)
50
+ lambda do |cbase|
51
+ return if cbase.nil? && implicit_namespace?(node)
52
+
53
+ add_offense(node)
54
+ end
55
+ end
56
+
57
+ def implicit_namespace?(node)
58
+ return false unless (parent = node.parent)
59
+
60
+ if parent.module_type?
61
+ namespace = parent.identifier.source
62
+
63
+ return allow_implicit_namespaces.include?(namespace)
64
+ end
65
+
66
+ implicit_namespace?(parent)
67
+ end
68
+
69
+ def allow_implicit_namespaces
70
+ cop_config['AllowedImplicitNamespaces'] || []
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -26,7 +26,6 @@ module RuboCop
26
26
  # # good
27
27
  # x += 1
28
28
  class RedundantCopDisableDirective < Cop
29
- include NameSimilarity
30
29
  include RangeHelp
31
30
 
32
31
  COP_NAME = 'Lint/RedundantCopDisableDirective'
@@ -235,7 +234,7 @@ module RuboCop
235
234
  elsif all_cop_names.include?(cop)
236
235
  "`#{cop}`"
237
236
  else
238
- similar = find_similar_name(cop, [])
237
+ similar = NameSimilarity.find_similar_name(cop, all_cop_names)
239
238
  if similar
240
239
  "`#{cop}` (did you mean `#{similar}`?)"
241
240
  else
@@ -244,10 +243,6 @@ module RuboCop
244
243
  end
245
244
  end
246
245
 
247
- def collect_variable_like_names(scope)
248
- all_cop_names.each { |name| scope << name }
249
- end
250
-
251
246
  def all_cop_names
252
247
  @all_cop_names ||= Cop.registry.names
253
248
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # The Lint/RedundantCopEnableDirective cop needs to be disabled so as
4
- # to be able to provide a (bad) example of an unneeded enable.
3
+ # The Lint/RedundantCopEnableDirective and Lint/RedundantCopDisableDirective
4
+ # cops need to be disabled so as to be able to provide a (bad) example of an
5
+ # unneeded enable.
5
6
 
6
7
  # rubocop:disable Lint/RedundantCopEnableDirective
8
+ # rubocop:disable Lint/RedundantCopDisableDirective
7
9
  module RuboCop
8
10
  module Cop
9
11
  module Lint
@@ -21,15 +23,15 @@ module RuboCop
21
23
  # foo = 1
22
24
  # @example
23
25
  # # bad
24
- # # rubocop:disable Layout/LineLength
25
- # baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
26
- # # rubocop:enable Layout/LineLength
26
+ # # rubocop:disable Style/StringLiterals
27
+ # foo = "1"
28
+ # # rubocop:enable Style/StringLiterals
27
29
  # baz
28
30
  # # rubocop:enable all
29
31
  #
30
32
  # # good
31
- # # rubocop:disable Layout/LineLength
32
- # baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
33
+ # # rubocop:disable Style/StringLiterals
34
+ # foo = "1"
33
35
  # # rubocop:enable all
34
36
  # baz
35
37
  class RedundantCopEnableDirective < Cop
@@ -112,3 +114,6 @@ module RuboCop
112
114
  end
113
115
  end
114
116
  end
117
+
118
+ # rubocop:enable Lint/RedundantCopDisableDirective
119
+ # rubocop:enable Lint/RedundantCopEnableDirective
@@ -38,7 +38,7 @@ module RuboCop
38
38
  lambda do |corrector|
39
39
  receiver = node.receiver
40
40
  corrector.replace(
41
- node.source_range,
41
+ node,
42
42
  if receiver
43
43
  receiver.source
44
44
  else
@@ -32,7 +32,7 @@ module RuboCop
32
32
  def_node_matcher :bad_method?, <<~PATTERN
33
33
  {
34
34
  (send $(csend ...) $_ ...)
35
- (send $(block (csend ...) ...) $_ ...)
35
+ (send $({block numblock} (csend ...) ...) $_ ...)
36
36
  }
37
37
  PATTERN
38
38
 
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks unexpected overrides of the `Struct` built-in methods
7
+ # via `Struct.new`.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # Bad = Struct.new(:members, :clone, :count)
12
+ # b = Bad.new([], true, 1)
13
+ # b.members #=> [] (overriding `Struct#members`)
14
+ # b.clone #=> true (overriding `Object#clone`)
15
+ # b.count #=> 1 (overriding `Enumerable#count`)
16
+ #
17
+ # # good
18
+ # Good = Struct.new(:id, :name)
19
+ # g = Good.new(1, "foo")
20
+ # g.members #=> [:id, :name]
21
+ # g.clone #=> #<struct Good id=1, name="foo">
22
+ # g.count #=> 2
23
+ #
24
+ class StructNewOverride < Cop
25
+ MSG = '`%<member_name>s` member overrides `Struct#%<method_name>s`' \
26
+ ' and it may be unexpected.'
27
+
28
+ STRUCT_METHOD_NAMES = Struct.instance_methods
29
+ STRUCT_MEMBER_NAME_TYPES = %i[sym str].freeze
30
+
31
+ def_node_matcher :struct_new, <<~PATTERN
32
+ (send
33
+ (const ${nil? cbase} :Struct) :new ...)
34
+ PATTERN
35
+
36
+ def on_send(node)
37
+ return unless struct_new(node) do
38
+ node.arguments.each_with_index do |arg, index|
39
+ # Ignore if the first argument is a class name
40
+ next if index.zero? && arg.str_type?
41
+
42
+ # Ignore if the argument is not a member name
43
+ next unless STRUCT_MEMBER_NAME_TYPES.include?(arg.type)
44
+
45
+ member_name = arg.value
46
+
47
+ next unless STRUCT_METHOD_NAMES.include?(member_name.to_sym)
48
+
49
+ message = format(MSG, member_name: member_name.inspect,
50
+ method_name: member_name.to_s)
51
+ add_offense(arg, message: message)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Lint
6
6
  # This cop checks for *rescue* blocks with no body.
7
7
  #
8
- # @example AllowComments: false (default)
8
+ # @example
9
9
  #
10
10
  # # bad
11
11
  # def some_method
@@ -14,25 +14,11 @@ module RuboCop
14
14
  # end
15
15
  #
16
16
  # # bad
17
- # def some_method
18
- # do_something
19
- # rescue
20
- # # do nothing
21
- # end
22
- #
23
- # # bad
24
17
  # begin
25
18
  # do_something
26
19
  # rescue
27
20
  # end
28
21
  #
29
- # # bad
30
- # begin
31
- # do_something
32
- # rescue
33
- # # do nothing
34
- # end
35
- #
36
22
  # # good
37
23
  # def some_method
38
24
  # do_something
@@ -47,32 +33,36 @@ module RuboCop
47
33
  # handle_exception
48
34
  # end
49
35
  #
50
- # @example AllowComments: true
36
+ # @example AllowComments: true (default)
51
37
  #
52
- # # bad
38
+ # # good
53
39
  # def some_method
54
40
  # do_something
55
41
  # rescue
42
+ # # do nothing
56
43
  # end
57
44
  #
58
- # # bad
45
+ # # good
59
46
  # begin
60
47
  # do_something
61
48
  # rescue
49
+ # # do nothing
62
50
  # end
63
51
  #
64
- # # good
52
+ # @example AllowComments: false
53
+ #
54
+ # # bad
65
55
  # def some_method
66
56
  # do_something
67
57
  # rescue
68
- # # do nothing but comment
58
+ # # do nothing
69
59
  # end
70
60
  #
71
- # # good
61
+ # # bad
72
62
  # begin
73
63
  # do_something
74
64
  # rescue
75
- # # do nothing but comment
65
+ # # do nothing
76
66
  # end
77
67
  class SuppressedException < Cop
78
68
  MSG = 'Do not suppress exceptions.'
@@ -83,12 +73,6 @@ module RuboCop
83
73
 
84
74
  add_offense(node)
85
75
  end
86
-
87
- private
88
-
89
- def comment_lines?(node)
90
- processed_source[line_range(node)].any? { |line| comment_line?(line) }
91
- end
92
76
  end
93
77
  end
94
78
  end