rubocop 0.51.0 → 0.52.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 (360) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/config/default.yml +86 -10
  4. data/config/disabled.yml +9 -4
  5. data/config/enabled.yml +1105 -1006
  6. data/lib/rubocop.rb +30 -3
  7. data/lib/rubocop/ast/builder.rb +2 -0
  8. data/lib/rubocop/ast/node.rb +24 -2
  9. data/lib/rubocop/ast/node/args_node.rb +17 -0
  10. data/lib/rubocop/ast/node/array_node.rb +1 -1
  11. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  12. data/lib/rubocop/ast/node/send_node.rb +20 -0
  13. data/lib/rubocop/ast/node/str_node.rb +14 -0
  14. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  15. data/lib/rubocop/ast/traversal.rb +4 -4
  16. data/lib/rubocop/cli.rb +45 -4
  17. data/lib/rubocop/comment_config.rb +2 -5
  18. data/lib/rubocop/config.rb +42 -8
  19. data/lib/rubocop/config_loader.rb +39 -100
  20. data/lib/rubocop/config_loader_resolver.rb +99 -2
  21. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
  23. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
  24. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
  25. data/lib/rubocop/cop/cop.rb +16 -46
  26. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  27. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
  28. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  29. data/lib/rubocop/cop/generator.rb +23 -4
  30. data/lib/rubocop/cop/internal_affairs.rb +1 -1
  31. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  32. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
  33. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  34. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  35. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  36. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +4 -7
  37. data/lib/rubocop/cop/layout/align_hash.rb +16 -16
  38. data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
  39. data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
  40. data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
  41. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  42. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
  43. data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
  44. data/lib/rubocop/cop/layout/dot_position.rb +22 -13
  45. data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
  46. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
  47. data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  51. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  52. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  53. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
  54. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
  55. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  56. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  57. data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
  58. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
  59. data/lib/rubocop/cop/layout/indent_array.rb +67 -20
  60. data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
  61. data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
  62. data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
  63. data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
  64. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  65. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  66. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
  67. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  68. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  69. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
  70. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  71. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
  72. data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
  73. data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
  74. data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
  75. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  76. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
  77. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
  78. data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
  79. data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
  80. data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
  81. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  82. data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
  83. data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
  84. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  87. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
  88. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
  89. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
  90. data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
  91. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  92. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  93. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
  94. data/lib/rubocop/cop/layout/tab.rb +2 -2
  95. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
  96. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
  97. data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
  98. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  99. data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
  100. data/lib/rubocop/cop/lint/else_layout.rb +2 -2
  101. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  102. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
  103. data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
  104. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  105. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  106. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  107. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  108. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
  109. data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
  110. data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
  111. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  112. data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
  113. data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
  114. data/lib/rubocop/cop/lint/script_permission.rb +1 -0
  115. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  116. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  117. data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
  118. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
  119. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
  120. data/lib/rubocop/cop/message_annotator.rb +4 -2
  121. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  122. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  123. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  124. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  125. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  126. data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
  127. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  128. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  129. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
  130. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  131. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
  132. data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
  133. data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
  134. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
  135. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
  136. data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
  137. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
  138. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  139. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
  140. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
  141. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  142. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  143. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  144. data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
  145. data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
  146. data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
  147. data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
  148. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
  149. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
  150. data/lib/rubocop/cop/naming/constant_name.rb +32 -3
  151. data/lib/rubocop/cop/naming/file_name.rb +19 -8
  152. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
  153. data/lib/rubocop/cop/naming/method_name.rb +20 -14
  154. data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
  155. data/lib/rubocop/cop/naming/variable_name.rb +17 -2
  156. data/lib/rubocop/cop/naming/variable_number.rb +10 -27
  157. data/lib/rubocop/cop/offense.rb +6 -1
  158. data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
  159. data/lib/rubocop/cop/performance/casecmp.rb +5 -4
  160. data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
  161. data/lib/rubocop/cop/performance/count.rb +5 -4
  162. data/lib/rubocop/cop/performance/detect.rb +7 -4
  163. data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
  164. data/lib/rubocop/cop/performance/end_with.rb +2 -2
  165. data/lib/rubocop/cop/performance/flat_map.rb +3 -2
  166. data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
  167. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
  168. data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
  169. data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
  170. data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
  171. data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
  172. data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
  173. data/lib/rubocop/cop/performance/size.rb +2 -2
  174. data/lib/rubocop/cop/performance/start_with.rb +2 -2
  175. data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
  176. data/lib/rubocop/cop/performance/times_map.rb +14 -15
  177. data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
  178. data/lib/rubocop/cop/rails/action_filter.rb +22 -0
  179. data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
  180. data/lib/rubocop/cop/rails/application_job.rb +4 -2
  181. data/lib/rubocop/cop/rails/application_record.rb +4 -2
  182. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  183. data/lib/rubocop/cop/rails/delegate.rb +20 -25
  184. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
  185. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  186. data/lib/rubocop/cop/rails/exit.rb +7 -0
  187. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
  188. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
  189. data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
  190. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  191. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  192. data/lib/rubocop/cop/rails/output.rb +9 -0
  193. data/lib/rubocop/cop/rails/output_safety.rb +14 -20
  194. data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
  195. data/lib/rubocop/cop/rails/presence.rb +105 -0
  196. data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
  197. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  198. data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
  199. data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
  200. data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
  201. data/lib/rubocop/cop/rails/save_bang.rb +2 -2
  202. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
  203. data/lib/rubocop/cop/rails/validation.rb +7 -7
  204. data/lib/rubocop/cop/security/json_load.rb +4 -2
  205. data/lib/rubocop/cop/security/marshal_load.rb +4 -2
  206. data/lib/rubocop/cop/style/alias.rb +24 -26
  207. data/lib/rubocop/cop/style/and_or.rb +34 -28
  208. data/lib/rubocop/cop/style/array_join.rb +9 -0
  209. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  210. data/lib/rubocop/cop/style/attr.rb +14 -4
  211. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
  212. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  213. data/lib/rubocop/cop/style/block_comments.rb +14 -2
  214. data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
  215. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
  216. data/lib/rubocop/cop/style/case_equality.rb +12 -0
  217. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  218. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
  219. data/lib/rubocop/cop/style/class_check.rb +28 -9
  220. data/lib/rubocop/cop/style/class_methods.rb +8 -8
  221. data/lib/rubocop/cop/style/class_vars.rb +4 -3
  222. data/lib/rubocop/cop/style/collection_methods.rb +4 -2
  223. data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
  224. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  225. data/lib/rubocop/cop/style/command_literal.rb +70 -21
  226. data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
  227. data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
  228. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
  229. data/lib/rubocop/cop/style/copyright.rb +19 -20
  230. data/lib/rubocop/cop/style/date_time.rb +2 -2
  231. data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
  232. data/lib/rubocop/cop/style/dir.rb +2 -2
  233. data/lib/rubocop/cop/style/documentation.rb +17 -2
  234. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
  235. data/lib/rubocop/cop/style/each_with_object.rb +5 -5
  236. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  237. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  238. data/lib/rubocop/cop/style/empty_else.rb +52 -22
  239. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  240. data/lib/rubocop/cop/style/empty_literal.rb +17 -5
  241. data/lib/rubocop/cop/style/empty_method.rb +4 -10
  242. data/lib/rubocop/cop/style/encoding.rb +2 -1
  243. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  244. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  245. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  246. data/lib/rubocop/cop/style/flip_flop.rb +11 -0
  247. data/lib/rubocop/cop/style/format_string.rb +29 -2
  248. data/lib/rubocop/cop/style/format_string_token.rb +15 -14
  249. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
  250. data/lib/rubocop/cop/style/global_vars.rb +11 -1
  251. data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
  252. data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
  253. data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
  254. data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
  255. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
  256. data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
  257. data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
  258. data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
  259. data/lib/rubocop/cop/style/lambda.rb +23 -31
  260. data/lib/rubocop/cop/style/lambda_call.rb +15 -9
  261. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
  262. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
  263. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
  264. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
  265. data/lib/rubocop/cop/style/method_missing.rb +8 -8
  266. data/lib/rubocop/cop/style/min_max.rb +12 -12
  267. data/lib/rubocop/cop/style/missing_else.rb +5 -4
  268. data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
  269. data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
  270. data/lib/rubocop/cop/style/module_function.rb +17 -5
  271. data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
  272. data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
  273. data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
  274. data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
  275. data/lib/rubocop/cop/style/negated_if.rb +22 -30
  276. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  277. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
  278. data/lib/rubocop/cop/style/next.rb +39 -11
  279. data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
  280. data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
  281. data/lib/rubocop/cop/style/not.rb +14 -4
  282. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
  283. data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
  284. data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
  285. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
  286. data/lib/rubocop/cop/style/option_hash.rb +11 -14
  287. data/lib/rubocop/cop/style/or_assignment.rb +2 -2
  288. data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
  289. data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
  290. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
  291. data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
  292. data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
  293. data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
  294. data/lib/rubocop/cop/style/proc.rb +8 -0
  295. data/lib/rubocop/cop/style/raise_args.rb +8 -14
  296. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  297. data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
  298. data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
  299. data/lib/rubocop/cop/style/redundant_return.rb +5 -4
  300. data/lib/rubocop/cop/style/redundant_self.rb +25 -26
  301. data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
  302. data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
  303. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  304. data/lib/rubocop/cop/style/return_nil.rb +4 -8
  305. data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
  306. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  307. data/lib/rubocop/cop/style/semicolon.rb +18 -8
  308. data/lib/rubocop/cop/style/send.rb +9 -0
  309. data/lib/rubocop/cop/style/signal_exception.rb +100 -0
  310. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  311. data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
  312. data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
  313. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
  314. data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
  315. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  316. data/lib/rubocop/cop/style/string_literals.rb +22 -0
  317. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
  318. data/lib/rubocop/cop/style/string_methods.rb +18 -7
  319. data/lib/rubocop/cop/style/symbol_array.rb +5 -9
  320. data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
  321. data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
  322. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  323. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  324. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  325. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  326. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
  327. data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
  328. data/lib/rubocop/cop/style/unless_else.rb +15 -0
  329. data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
  330. data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
  331. data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
  332. data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
  333. data/lib/rubocop/cop/style/when_then.rb +13 -0
  334. data/lib/rubocop/cop/style/while_until_do.rb +26 -4
  335. data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
  336. data/lib/rubocop/cop/style/word_array.rb +4 -8
  337. data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
  338. data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
  339. data/lib/rubocop/cop/util.rb +42 -33
  340. data/lib/rubocop/cop/variable_force.rb +1 -1
  341. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  342. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  343. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  344. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
  345. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  346. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  347. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  348. data/lib/rubocop/node_pattern.rb +2 -3
  349. data/lib/rubocop/options.rb +8 -8
  350. data/lib/rubocop/path_util.rb +15 -3
  351. data/lib/rubocop/processed_source.rb +5 -2
  352. data/lib/rubocop/rspec/shared_contexts.rb +4 -0
  353. data/lib/rubocop/runner.rb +1 -1
  354. data/lib/rubocop/token.rb +74 -0
  355. data/lib/rubocop/version.rb +1 -1
  356. metadata +37 -10
  357. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
  358. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  359. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
  360. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Checks for space between a the name of a called method and a left
6
+ # Checks for space between the name of a called method and a left
7
7
  # parenthesis.
8
8
  #
9
9
  # @example
@@ -40,19 +40,6 @@ module RuboCop
40
40
  add_offense(node)
41
41
  end
42
42
 
43
- private
44
-
45
- def contains_quotes_or_commas?(node)
46
- node.values.any? do |value|
47
- literal = value.children.first.to_s.scrub
48
-
49
- # To avoid likely false positives (e.g. a single ' or ")
50
- next if literal.gsub(/[^\p{Alnum}]/, '').empty?
51
-
52
- QUOTES_AND_COMMAS.any? { |pat| literal =~ pat }
53
- end
54
- end
55
-
56
43
  # rubocop:disable Performance/HashEachMethods
57
44
  def autocorrect(node)
58
45
  lambda do |corrector|
@@ -68,7 +55,20 @@ module RuboCop
68
55
  end
69
56
  end
70
57
  end
71
- # rubocop:enable Performance/HashEachMethod
58
+ # rubocop:enable Performance/HashEachMethods
59
+
60
+ private
61
+
62
+ def contains_quotes_or_commas?(node)
63
+ node.values.any? do |value|
64
+ literal = value.children.first.to_s.scrub
65
+
66
+ # To avoid likely false positives (e.g. a single ' or ")
67
+ next if literal.gsub(/[^\p{Alnum}]/, '').empty?
68
+
69
+ QUOTES_AND_COMMAS.any? { |pat| literal =~ pat }
70
+ end
71
+ end
72
72
  end
73
73
  end
74
74
  end
@@ -36,6 +36,17 @@ module RuboCop
36
36
  add_offense(node)
37
37
  end
38
38
 
39
+ def autocorrect(node)
40
+ lambda do |corrector|
41
+ node.children.each do |child|
42
+ range = child.loc.expression
43
+
44
+ corrector.remove_trailing(range, 1) if /,$/ =~ range.source
45
+ corrector.remove_leading(range, 1) if /^:/ =~ range.source
46
+ end
47
+ end
48
+ end
49
+
39
50
  private
40
51
 
41
52
  def contains_colons_or_commas?(node)
@@ -49,17 +60,6 @@ module RuboCop
49
60
  patterns.any? { |pat| literal =~ pat }
50
61
  end
51
62
  end
52
-
53
- def autocorrect(node)
54
- lambda do |corrector|
55
- node.children.each do |child|
56
- range = child.loc.expression
57
-
58
- corrector.remove_trailing(range, 1) if /,$/ =~ range.source
59
- corrector.remove_leading(range, 1) if /^:/ =~ range.source
60
- end
61
- end
62
- end
63
63
  end
64
64
  end
65
65
  end
@@ -33,7 +33,7 @@ module RuboCop
33
33
  def_node_matcher :redundant_with_index?, <<-PATTERN
34
34
  (block
35
35
  $(send
36
- _ {:each_with_index :with_index})
36
+ _ {:each_with_index :with_index} ...)
37
37
  (args
38
38
  (arg _))
39
39
  ...)
@@ -51,7 +51,7 @@ module RuboCop
51
51
  if send.method_name == :each_with_index
52
52
  corrector.replace(send.loc.selector, 'each')
53
53
  else
54
- corrector.remove(send.loc.selector)
54
+ corrector.remove(with_index_range(send))
55
55
  corrector.remove(send.loc.dot)
56
56
  end
57
57
  end
@@ -69,7 +69,10 @@ module RuboCop
69
69
  end
70
70
 
71
71
  def with_index_range(send)
72
- range_between(send.loc.selector.begin_pos, send.loc.selector.end_pos)
72
+ range_between(
73
+ send.loc.selector.begin_pos,
74
+ send.loc.expression.end_pos
75
+ )
73
76
  end
74
77
  end
75
78
  end
@@ -72,7 +72,7 @@ module RuboCop
72
72
  def with_object_range(send)
73
73
  range_between(
74
74
  send.loc.selector.begin_pos,
75
- send.source.length
75
+ send.loc.expression.end_pos
76
76
  )
77
77
  end
78
78
  end
@@ -17,7 +17,7 @@ module RuboCop
17
17
  # # bad
18
18
  #
19
19
  # if day.is? :tuesday && month == :jan
20
- # ...
20
+ # # ...
21
21
  # end
22
22
  #
23
23
  # @example
@@ -25,6 +25,8 @@ module RuboCop
25
25
  # # good
26
26
  #
27
27
  # if day.is?(:tuesday) && month == :jan
28
+ # # ...
29
+ # end
28
30
  class RequireParentheses < Cop
29
31
  MSG = 'Use parentheses in the method call to avoid confusion about ' \
30
32
  'precedence.'.freeze
@@ -55,11 +55,9 @@ module RuboCop
55
55
  )
56
56
  end
57
57
 
58
- private
59
-
60
58
  def autocorrect(node)
61
59
  rescued, _, _body = *node
62
- range = Parser::Source::Range.new(node.loc.expression,
60
+ range = Parser::Source::Range.new(node.loc.expression.source_buffer,
63
61
  node.loc.keyword.end_pos,
64
62
  rescued.loc.expression.end_pos)
65
63
 
@@ -68,6 +66,8 @@ module RuboCop
68
66
  end
69
67
  end
70
68
 
69
+ private
70
+
71
71
  def correction(*exceptions)
72
72
  correction = valid_exceptions(exceptions).map(&:source).join(', ')
73
73
  correction = " #{correction}" unless correction.empty?
@@ -10,6 +10,7 @@ module RuboCop
10
10
  SHEBANG = '#!'.freeze
11
11
 
12
12
  def investigate(processed_source)
13
+ return if @options.key?(:stdin)
13
14
  return if Platform.windows?
14
15
  return unless start_with_shebang?(processed_source)
15
16
  return if executable?(processed_source)
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for shadowed arguments.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ #
12
+ # do_something do |foo|
13
+ # foo = 42
14
+ # puts foo
15
+ # end
16
+ #
17
+ # def do_something(foo)
18
+ # foo = 42
19
+ # puts foo
20
+ # end
21
+ #
22
+ # @example
23
+ #
24
+ # # good
25
+ #
26
+ # do_something do |foo|
27
+ # foo = foo + 42
28
+ # puts foo
29
+ # end
30
+ #
31
+ # def do_something(foo)
32
+ # foo = foo + 42
33
+ # puts foo
34
+ # end
35
+ #
36
+ # def do_something(foo)
37
+ # puts foo
38
+ # end
39
+ class ShadowedArgument < Cop
40
+ MSG = 'Argument `%s` was shadowed by a local variable before it was ' \
41
+ 'used.'.freeze
42
+
43
+ def_node_search :uses_var?, '(lvar %)'
44
+
45
+ def join_force?(force_class)
46
+ force_class == VariableForce
47
+ end
48
+
49
+ def after_leaving_scope(scope, _variable_table)
50
+ scope.variables.each_value do |variable|
51
+ check_argument(variable)
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def check_argument(argument)
58
+ return unless argument.method_argument? || argument.block_argument?
59
+
60
+ shadowing_assignment(argument) do |node|
61
+ message = format(MSG, argument.name)
62
+
63
+ add_offense(node, message: message)
64
+ end
65
+ end
66
+
67
+ def shadowing_assignment(argument)
68
+ return unless argument.referenced?
69
+
70
+ assignment_without_argument_usage(argument) do |node, location_known|
71
+ assignment_without_usage_pos = node.source_range.begin_pos
72
+
73
+ references = argument_references(argument)
74
+
75
+ # If argument was referenced before it was reassigned
76
+ # then it's not shadowed
77
+ next if references.any? do |reference|
78
+ next true if !reference.explicit? && ignore_implicit_references?
79
+
80
+ reference_pos = reference.node.source_range.begin_pos
81
+
82
+ reference_pos <= assignment_without_usage_pos
83
+ end
84
+
85
+ yield location_known ? node : argument.declaration_node
86
+ end
87
+ end
88
+
89
+ # Find the first argument assignment, which doesn't reference the
90
+ # argument at the rhs. If the assignment occurs inside a branch or
91
+ # block, it is impossible to tell whether it's executed, so precise
92
+ # shadowing location is not known.
93
+ #
94
+ def assignment_without_argument_usage(argument)
95
+ argument.assignments.reduce(true) do |location_known, assignment|
96
+ assignment_node = assignment.meta_assignment_node || assignment.node
97
+
98
+ node_within_block_or_conditional =
99
+ node_within_block_or_conditional?(assignment_node.parent,
100
+ argument.scope.node)
101
+
102
+ unless uses_var?(assignment_node, argument.name)
103
+ # It's impossible to decide whether a branch or block is executed,
104
+ # so the precise reassignment location is undecidable.
105
+ next false if node_within_block_or_conditional
106
+
107
+ yield(assignment.node, location_known)
108
+ break
109
+ end
110
+
111
+ location_known
112
+ end
113
+ end
114
+
115
+ # Check whether the given node is nested into block or conditional.
116
+ #
117
+ def node_within_block_or_conditional?(node, stop_search_node)
118
+ return false if node == stop_search_node
119
+
120
+ CONDITIONAL_NODES.include?(node.type) ||
121
+ node.block_type? ||
122
+ node_within_block_or_conditional?(node.parent, stop_search_node)
123
+ end
124
+
125
+ # Get argument references without assignments' references
126
+ #
127
+ def argument_references(argument)
128
+ assignment_references = argument
129
+ .assignments
130
+ .flat_map(&:references)
131
+ .map(&:source_range)
132
+
133
+ argument.references.reject do |ref|
134
+ next false unless ref.explicit?
135
+
136
+ assignment_references.include?(ref.node.source_range)
137
+ end
138
+ end
139
+
140
+ def ignore_implicit_references?
141
+ cop_config['IgnoreImplicitReferences']
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -33,12 +33,6 @@ module RuboCop
33
33
  end
34
34
  end
35
35
 
36
- private
37
-
38
- def message(node)
39
- node.receiver ? MSG_DEFAULT : MSG_SELF
40
- end
41
-
42
36
  def autocorrect(node)
43
37
  lambda do |corrector|
44
38
  receiver, _method_name, *_args = *node
@@ -52,6 +46,12 @@ module RuboCop
52
46
  )
53
47
  end
54
48
  end
49
+
50
+ private
51
+
52
+ def message(node)
53
+ node.receiver ? MSG_DEFAULT : MSG_SELF
54
+ end
55
55
  end
56
56
  end
57
57
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # The Lint/UnneededDisable cop needs to be disabled so as to be able to provide
4
+ # a (bad) example of an unneeded disable.
5
+ # rubocop:disable Lint/UnneededDisable
3
6
  module RuboCop
4
7
  module Cop
5
8
  module Lint
@@ -12,6 +15,16 @@ module RuboCop
12
15
  # their work. Instead, it waits until it's called in a later stage of the
13
16
  # execution. The reason it can't be implemented as a normal cop is that
14
17
  # it depends on the results of all other cops to do its work.
18
+ #
19
+ #
20
+ # @example
21
+ # # bad
22
+ # # rubocop:disable Metrics/LineLength
23
+ # x += 1
24
+ # # rubocop:enable Metrics/LineLength
25
+ #
26
+ # # good
27
+ # x += 1
15
28
  class UnneededDisable < Cop
16
29
  include NameSimilarity
17
30
 
@@ -48,12 +61,15 @@ module RuboCop
48
61
  # Eat the entire comment, the preceding space, and the preceding
49
62
  # newline if there is one.
50
63
  original_begin = range.begin_pos
51
- range = range_with_surrounding_space(range, :left, true)
52
- range_with_surrounding_space(range, :right,
64
+ range = range_with_surrounding_space(range: range,
65
+ side: :left,
66
+ newlines: true)
67
+ range_with_surrounding_space(range: range,
68
+ side: :right,
53
69
  # Special for a comment that
54
70
  # begins the file: remove
55
71
  # the newline at the end.
56
- original_begin.zero?)
72
+ newlines: original_begin.zero?)
57
73
  end
58
74
 
59
75
  def directive_range_in_list(range, ranges)
@@ -61,13 +77,15 @@ module RuboCop
61
77
  # is NOT being removed?
62
78
  if ends_its_line?(ranges.last) && trailing_range?(ranges, range)
63
79
  # Eat the comma on the left.
64
- range = range_with_surrounding_space(range, :left)
80
+ range = range_with_surrounding_space(range: range, side: :left)
65
81
  range = range_with_surrounding_comma(range, :left)
66
82
  end
67
83
 
68
84
  range = range_with_surrounding_comma(range, :right)
69
85
  # Eat following spaces up to EOL, but not the newline itself.
70
- range_with_surrounding_space(range, :right, false)
86
+ range_with_surrounding_space(range: range,
87
+ side: :right,
88
+ newlines: false)
71
89
  end
72
90
 
73
91
  def each_unneeded_disable(cop_disabled_line_ranges, offenses, comments,
@@ -75,7 +93,8 @@ module RuboCop
75
93
  disabled_ranges = cop_disabled_line_ranges[COP_NAME] || [0..0]
76
94
 
77
95
  cop_disabled_line_ranges.each do |cop, line_ranges|
78
- each_already_disabled(line_ranges, comments) do |comment|
96
+ each_already_disabled(line_ranges,
97
+ disabled_ranges, comments) do |comment|
79
98
  yield comment, cop
80
99
  end
81
100
 
@@ -88,10 +107,7 @@ module RuboCop
88
107
  cop)
89
108
  line_ranges.each_with_index do |line_range, ix|
90
109
  comment = comments.find { |c| c.loc.line == line_range.begin }
91
-
92
- unless all_disabled?(comment)
93
- next if ignore_offense?(disabled_ranges, line_range)
94
- end
110
+ next if ignore_offense?(disabled_ranges, line_range)
95
111
 
96
112
  unneeded_cop = find_unneeded(comment, offenses, cop, line_range,
97
113
  line_ranges[ix + 1])
@@ -99,8 +115,9 @@ module RuboCop
99
115
  end
100
116
  end
101
117
 
102
- def each_already_disabled(line_ranges, comments)
118
+ def each_already_disabled(line_ranges, disabled_ranges, comments)
103
119
  line_ranges.each_cons(2) do |previous_range, range|
120
+ next if ignore_offense?(disabled_ranges, range)
104
121
  next if previous_range.end != range.begin
105
122
 
106
123
  # If a cop is disabled in a range that begins on the same line as
@@ -236,3 +253,4 @@ module RuboCop
236
253
  end
237
254
  end
238
255
  end
256
+ # rubocop:enable Lint/UnneededDisable
@@ -40,7 +40,8 @@ module RuboCop
40
40
 
41
41
  def autocorrect(node)
42
42
  lambda do |corrector|
43
- range = range_with_surrounding_space(node.loc.expression, :right)
43
+ range = range_with_surrounding_space(range: node.loc.expression,
44
+ side: :right)
44
45
  corrector.remove(range)
45
46
  end
46
47
  end