rubocop 0.51.0 → 0.52.0

Sign up to get free protection for your applications and to get access to all the features.
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