rubocop 0.86.0 → 0.89.1

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 (377) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +198 -25
  5. data/lib/rubocop.rb +30 -5
  6. data/lib/rubocop/cli.rb +2 -4
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  10. data/lib/rubocop/cli/command/show_cops.rb +3 -3
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +20 -3
  14. data/lib/rubocop/config_loader.rb +41 -69
  15. data/lib/rubocop/config_loader_resolver.rb +3 -3
  16. data/lib/rubocop/config_obsoletion.rb +6 -2
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +407 -0
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  23. data/lib/rubocop/cop/commissioner.rb +47 -50
  24. data/lib/rubocop/cop/cop.rb +85 -236
  25. data/lib/rubocop/cop/corrector.rb +38 -115
  26. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  31. data/lib/rubocop/cop/force.rb +1 -0
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  34. data/lib/rubocop/cop/generator.rb +1 -1
  35. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  36. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  44. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  45. data/lib/rubocop/cop/layout/class_structure.rb +5 -44
  46. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  47. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -8
  50. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  52. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -0
  53. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  54. data/lib/rubocop/cop/layout/hash_alignment.rb +1 -2
  55. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  56. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  58. data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -6
  59. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  60. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  61. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  62. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  63. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  64. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  65. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  66. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  67. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  68. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  69. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  70. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  71. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  72. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  73. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  74. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  75. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  76. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  77. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  78. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  79. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  80. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  81. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  82. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  83. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  84. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  85. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  86. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  87. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  88. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  89. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  90. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  91. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  92. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  93. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  94. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  95. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  96. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  97. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  98. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  99. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  100. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  101. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  102. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  103. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  104. data/lib/rubocop/cop/lint/loop.rb +23 -2
  105. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  106. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  107. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  108. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  109. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  110. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  111. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  112. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  113. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  114. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  115. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  116. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  117. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  118. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  119. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  120. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  121. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  122. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +41 -40
  123. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  124. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  125. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  126. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  127. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  128. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  129. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  130. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  131. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  132. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  133. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  134. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  135. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  136. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  137. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  138. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  139. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  140. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  141. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  142. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  143. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  144. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  145. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  146. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  147. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  148. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  149. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  150. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  151. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  152. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  153. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  154. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  155. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  156. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  157. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  158. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  159. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  160. data/lib/rubocop/cop/lint/void.rb +3 -7
  161. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  162. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  163. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  164. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  165. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  166. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  167. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  168. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  169. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  170. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  171. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  172. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  173. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  174. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  175. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  176. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  177. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  178. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  179. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  180. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  181. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  182. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  183. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  184. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  185. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  186. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  187. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  188. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  189. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  190. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  191. data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -24
  192. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  193. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +10 -15
  194. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  195. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  196. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  197. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  198. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
  199. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  200. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  201. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  202. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  203. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  204. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  205. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  206. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  207. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  208. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  209. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  210. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  211. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  212. data/lib/rubocop/cop/offense.rb +16 -2
  213. data/lib/rubocop/cop/registry.rb +3 -3
  214. data/lib/rubocop/cop/security/eval.rb +2 -2
  215. data/lib/rubocop/cop/security/json_load.rb +6 -8
  216. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  217. data/lib/rubocop/cop/security/open.rb +2 -2
  218. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  219. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  220. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  221. data/lib/rubocop/cop/style/alias.rb +41 -36
  222. data/lib/rubocop/cop/style/and_or.rb +9 -11
  223. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  224. data/lib/rubocop/cop/style/array_join.rb +6 -8
  225. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  226. data/lib/rubocop/cop/style/attr.rb +11 -9
  227. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  228. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  229. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  230. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
  231. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  232. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  233. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  234. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  235. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  236. data/lib/rubocop/cop/style/class_check.rb +7 -9
  237. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  238. data/lib/rubocop/cop/style/class_vars.rb +24 -7
  239. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  240. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  241. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  242. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  243. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  244. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  245. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  246. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  247. data/lib/rubocop/cop/style/copyright.rb +12 -12
  248. data/lib/rubocop/cop/style/date_time.rb +2 -2
  249. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  250. data/lib/rubocop/cop/style/dir.rb +9 -12
  251. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  252. data/lib/rubocop/cop/style/documentation.rb +6 -8
  253. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  254. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  255. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  256. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  257. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  258. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  259. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  260. data/lib/rubocop/cop/style/empty_literal.rb +20 -21
  261. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  262. data/lib/rubocop/cop/style/encoding.rb +5 -9
  263. data/lib/rubocop/cop/style/end_block.rb +4 -6
  264. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  265. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  266. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
  267. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  268. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  269. data/lib/rubocop/cop/style/float_division.rb +8 -11
  270. data/lib/rubocop/cop/style/for.rb +11 -15
  271. data/lib/rubocop/cop/style/format_string.rb +21 -19
  272. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  273. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  274. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  275. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  276. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  277. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  278. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  279. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  280. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  281. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  282. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  283. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  284. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  285. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  286. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  287. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  288. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  289. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  290. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  291. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  292. data/lib/rubocop/cop/style/lambda.rb +7 -12
  293. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  294. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  295. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  296. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  297. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  298. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  299. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  300. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  301. data/lib/rubocop/cop/style/min_max.rb +8 -12
  302. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  303. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  304. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  305. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  306. data/lib/rubocop/cop/style/module_function.rb +10 -13
  307. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  308. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  309. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  310. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  311. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  312. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  313. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  314. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  315. data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
  316. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
  317. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  318. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  319. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  320. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  321. data/lib/rubocop/cop/style/proc.rb +1 -1
  322. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  323. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  324. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  325. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  326. data/lib/rubocop/cop/style/redundant_fetch_block.rb +26 -7
  327. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  328. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  329. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -1
  330. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -1
  331. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +11 -11
  332. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  333. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  334. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  335. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  336. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  337. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  338. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  339. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  340. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  341. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  342. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  343. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  344. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  345. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  346. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  347. data/lib/rubocop/cop/team.rb +98 -82
  348. data/lib/rubocop/cop/tokens_util.rb +84 -0
  349. data/lib/rubocop/cop/util.rb +3 -13
  350. data/lib/rubocop/cop/utils/format_string.rb +1 -2
  351. data/lib/rubocop/cop/variable_force.rb +0 -2
  352. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  353. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  354. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  355. data/lib/rubocop/error.rb +1 -0
  356. data/lib/rubocop/file_finder.rb +12 -12
  357. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  358. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  359. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  360. data/lib/rubocop/name_similarity.rb +1 -3
  361. data/lib/rubocop/options.rb +18 -11
  362. data/lib/rubocop/path_util.rb +17 -17
  363. data/lib/rubocop/rake_task.rb +7 -9
  364. data/lib/rubocop/result_cache.rb +12 -8
  365. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  366. data/lib/rubocop/rspec/expect_offense.rb +53 -22
  367. data/lib/rubocop/rspec/shared_contexts.rb +16 -17
  368. data/lib/rubocop/runner.rb +35 -34
  369. data/lib/rubocop/target_finder.rb +13 -10
  370. data/lib/rubocop/target_ruby.rb +1 -1
  371. data/lib/rubocop/version.rb +2 -2
  372. metadata +40 -11
  373. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  374. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  375. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  376. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  377. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -64,8 +64,9 @@ module RuboCop
64
64
  inner.begin_pos >= outer.begin_pos && inner.end_pos <= outer.end_pos
65
65
  end
66
66
 
67
+ # @deprecated Use processed_source.comment_at_line(line)
67
68
  def end_of_line_comment(line)
68
- processed_source.find_comment { |c| c.loc.line == line }
69
+ processed_source.line_with_comment?(line)
69
70
  end
70
71
  end
71
72
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # This module encapsulates the ability to allow certain methods when
6
+ # parsing.
7
+ module AllowedMethods
8
+ private
9
+
10
+ def allowed_method?(name)
11
+ allowed_methods.include?(name.to_s)
12
+ end
13
+
14
+ def allowed_methods
15
+ cop_config.fetch('AllowedMethods', [])
16
+ end
17
+ end
18
+ end
19
+ end
@@ -16,7 +16,7 @@ module RuboCop
16
16
  cop_config['MinSize']
17
17
  end
18
18
 
19
- def array_style_detected(style, ary_size)
19
+ def array_style_detected(style, ary_size) # rubocop:todo Metrics/AbcSize
20
20
  cfg = config_to_allow_offenses
21
21
  return if cfg['Enabled'] == false
22
22
 
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # extend this module to signal autocorrection support
6
+ module AutoCorrector
7
+ def support_autocorrect?
8
+ true
9
+ end
10
+ end
11
+ end
12
+ end
@@ -59,7 +59,7 @@ module RuboCop
59
59
  return if safe_to_ignore?(node)
60
60
 
61
61
  line = processed_source.lines[node.first_line - 1]
62
- return if processed_source.commented?(node.loc.begin)
62
+ return if processed_source.line_with_comment?(node.loc.line)
63
63
  return if line.length <= max
64
64
 
65
65
  extract_first_element_over_column_limit(node, elements, max)
@@ -171,7 +171,7 @@ module RuboCop
171
171
  # ...then each key/value pair is treated as a method 'argument'
172
172
  # when determining where line breaks should appear.
173
173
  if (last_arg = args.last)
174
- args = args.concat(args.pop.children) if last_arg.hash_type? && !last_arg.braces?
174
+ args = args[0...-1] + last_arg.children if last_arg.hash_type? && !last_arg.braces?
175
175
  end
176
176
  args
177
177
  end
@@ -6,8 +6,14 @@ module RuboCop
6
6
  module CodeLength
7
7
  include ConfigurableMax
8
8
 
9
+ MSG = '%<label>s has too many lines. [%<length>d/%<max>d]'
10
+
9
11
  private
10
12
 
13
+ def message(length, max_length)
14
+ format(MSG, label: cop_label, length: length, max: max_length)
15
+ end
16
+
11
17
  def max_length
12
18
  cop_config['Max']
13
19
  end
@@ -16,15 +22,21 @@ module RuboCop
16
22
  cop_config['CountComments']
17
23
  end
18
24
 
25
+ def count_as_one
26
+ Array(cop_config['CountAsOne']).map(&:to_sym)
27
+ end
28
+
19
29
  def check_code_length(node)
20
- length = code_length(node)
30
+ # Skip costly calculation when definitely not needed
31
+ return if node.line_count <= max_length
21
32
 
22
- return unless length > max_length
33
+ calculator = build_code_length_calculator(node)
34
+ length = calculator.calculate
35
+ return if length <= max_length
23
36
 
24
- location = node.casgn_type? ? :name : :expression
37
+ location = node.casgn_type? ? node.loc.name : node.loc.expression
25
38
 
26
- add_offense(node, location: location,
27
- message: message(length, max_length)) do
39
+ add_offense(location, message: message(length, max_length)) do
28
40
  self.max = length
29
41
  end
30
42
  end
@@ -33,6 +45,15 @@ module RuboCop
33
45
  def irrelevant_line(source_line)
34
46
  source_line.blank? || !count_comments? && comment_line?(source_line)
35
47
  end
48
+
49
+ def build_code_length_calculator(node)
50
+ Metrics::Utils::CodeLengthCalculator.new(
51
+ node,
52
+ processed_source,
53
+ count_comments: count_comments?,
54
+ foldable_types: count_as_one
55
+ )
56
+ end
36
57
  end
37
58
  end
38
59
  end
@@ -10,7 +10,7 @@ module RuboCop
10
10
  if valid_name?(node, name)
11
11
  correct_style_detected
12
12
  else
13
- add_offense(node, location: name_range, message: message(style)) do
13
+ add_offense(name_range, message: message(style)) do
14
14
  report_opposing_styles(node, name)
15
15
  end
16
16
  end
@@ -10,7 +10,9 @@ module RuboCop
10
10
  PATTERN
11
11
 
12
12
  base.def_node_matcher :class_new_definition, <<~PATTERN
13
- [!^(casgn nil? :#{base::SUPERCLASS} ...) (send (const nil? :Class) :new #{base::BASE_PATTERN})]
13
+ [!^(casgn {nil? cbase} :#{base::SUPERCLASS} ...)
14
+ !^^(casgn {nil? cbase} :#{base::SUPERCLASS} (block ...))
15
+ (send (const {nil? cbase} :Class) :new #{base::BASE_PATTERN})]
14
16
  PATTERN
15
17
  end
16
18
 
@@ -26,13 +26,6 @@ module RuboCop
26
26
  end
27
27
  end
28
28
 
29
- def autocorrect(node)
30
- lambda do |corrector|
31
- correction = prepare_correction(node)
32
- execute_correction(corrector, node, correction)
33
- end
34
- end
35
-
36
29
  private
37
30
 
38
31
  # @abstract Implemented with `def_node_matcher`
@@ -61,10 +54,11 @@ module RuboCop
61
54
  # `transform_values` if value transformation uses key.
62
55
  return if captures.transformation_uses_both_args?
63
56
 
64
- add_offense(
65
- node,
66
- message: "Prefer `#{new_method_name}` over `#{match_desc}`."
67
- )
57
+ message = "Prefer `#{new_method_name}` over `#{match_desc}`."
58
+ add_offense(node, message: message) do |corrector|
59
+ correction = prepare_correction(node)
60
+ execute_correction(corrector, node, correction)
61
+ end
68
62
  end
69
63
 
70
64
  # @abstract
@@ -12,9 +12,7 @@ module RuboCop
12
12
 
13
13
  def directive_on_source_line?(line_index)
14
14
  source_line_number = line_index + processed_source.buffer.first_line
15
- comment =
16
- processed_source.comments
17
- .detect { |e| e.location.line == source_line_number }
15
+ comment = processed_source.comment_at_line(source_line_number)
18
16
 
19
17
  return false unless comment
20
18
 
@@ -2,10 +2,13 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
+ # @api private
6
+ #
5
7
  # This module handles measurement and reporting of complexity in methods.
6
8
  module MethodComplexity
7
9
  include ConfigurableMax
8
10
  include IgnoredMethods
11
+ include Metrics::Utils::RepeatedCsendDiscount
9
12
  extend NodePattern::Macros
10
13
 
11
14
  def on_def(node)
@@ -37,6 +40,7 @@ module RuboCop
37
40
  return unless node.body
38
41
 
39
42
  max = cop_config['Max']
43
+ reset_repeated_csend
40
44
  complexity, abc_vector = complexity(node.body)
41
45
 
42
46
  return unless complexity > max
@@ -53,8 +57,12 @@ module RuboCop
53
57
  end
54
58
 
55
59
  def complexity(body)
56
- body.each_node(*self.class::COUNTED_NODES).reduce(1) do |score, n|
57
- score + complexity_score_for(n)
60
+ body.each_node(:lvasgn, *self.class::COUNTED_NODES).reduce(1) do |score, node|
61
+ if node.lvasgn_type?
62
+ reset_on_lvasgn(node)
63
+ next score
64
+ end
65
+ score + complexity_score_for(node)
58
66
  end
59
67
  end
60
68
  end
@@ -27,8 +27,7 @@ module RuboCop
27
27
  last_element_line =
28
28
  last_element_range_with_trailing_comma(node).last_line
29
29
 
30
- last_element_commented =
31
- processed_source.comments.any? { |c| c.loc.line == last_element_line }
30
+ last_element_commented = processed_source.comment_at_line(last_element_line)
32
31
 
33
32
  last_element_commented && (node.chained? || node.argument?)
34
33
  end
@@ -7,19 +7,17 @@ module RuboCop
7
7
  # 2. Added to NilClass by explicitly requiring any standard libraries
8
8
  # 3. Cop's configuration parameter AllowedMethods.
9
9
  module NilMethods
10
+ include AllowedMethods
11
+
10
12
  private
11
13
 
12
14
  def nil_methods
13
- nil.methods + other_stdlib_methods + allowed_methods
15
+ nil.methods + other_stdlib_methods + allowed_methods.map(&:to_sym)
14
16
  end
15
17
 
16
18
  def other_stdlib_methods
17
19
  [:to_d]
18
20
  end
19
-
20
- def allowed_methods
21
- cop_config['AllowedMethods'].map(&:to_sym)
22
- end
23
21
  end
24
22
  end
25
23
  end
@@ -15,8 +15,13 @@ module RuboCop
15
15
  node.source_range
16
16
  end
17
17
 
18
+ def gem_canonical_name(name)
19
+ name = name.tr('-_', '') unless cop_config['ConsiderPunctuation']
20
+ name.downcase
21
+ end
22
+
18
23
  def case_insensitive_out_of_order?(string_a, string_b)
19
- string_a.downcase < string_b.downcase
24
+ gem_canonical_name(string_a) < gem_canonical_name(string_b)
20
25
  end
21
26
 
22
27
  def consecutive_lines(previous, current)
@@ -28,12 +28,8 @@ module RuboCop
28
28
  end
29
29
 
30
30
  def comments_in_array?(node)
31
- comments = processed_source.comments
32
- array_range = node.source_range.to_a
33
-
34
- comments.any? do |comment|
35
- !(comment.loc.expression.to_a & array_range).empty?
36
- end
31
+ line_span = node.source_range.first_line...node.source_range.last_line
32
+ processed_source.each_comment_in_lines(line_span).any?
37
33
  end
38
34
 
39
35
  def check_percent_array(node)
@@ -46,7 +46,8 @@ module RuboCop
46
46
  end
47
47
 
48
48
  def range_with_surrounding_space(range:, side: :both,
49
- newlines: true, whitespace: false)
49
+ newlines: true, whitespace: false,
50
+ continuations: false)
50
51
  buffer = @processed_source.buffer
51
52
  src = buffer.source
52
53
 
@@ -55,10 +56,13 @@ module RuboCop
55
56
  begin_pos = range.begin_pos
56
57
  if go_left
57
58
  begin_pos =
58
- final_pos(src, begin_pos, -1, newlines, whitespace)
59
+ final_pos(src, begin_pos, -1, continuations, newlines, whitespace)
59
60
  end
60
61
  end_pos = range.end_pos
61
- end_pos = final_pos(src, end_pos, 1, newlines, whitespace) if go_right
62
+ if go_right
63
+ end_pos =
64
+ final_pos(src, end_pos, 1, continuations, newlines, whitespace)
65
+ end
62
66
  Parser::Source::Range.new(buffer, begin_pos, end_pos)
63
67
  end
64
68
 
@@ -101,17 +105,27 @@ module RuboCop
101
105
  end
102
106
  end
103
107
 
104
- def final_pos(src, pos, increment, newlines, whitespace)
108
+ # rubocop:disable Metrics/ParameterLists
109
+ def final_pos(src, pos, increment, continuations, newlines, whitespace)
105
110
  pos = move_pos(src, pos, increment, true, /[ \t]/)
111
+ pos = move_pos_str(src, pos, increment, continuations, "\\\n")
106
112
  pos = move_pos(src, pos, increment, newlines, /\n/)
107
113
  move_pos(src, pos, increment, whitespace, /\s/)
108
114
  end
115
+ # rubocop:enable Metrics/ParameterLists
109
116
 
110
117
  def move_pos(src, pos, step, condition, regexp)
111
118
  offset = step == -1 ? -1 : 0
112
119
  pos += step while condition && regexp.match?(src[pos + offset])
113
120
  pos.negative? ? 0 : pos
114
121
  end
122
+
123
+ def move_pos_str(src, pos, step, condition, needle)
124
+ size = needle.length
125
+ offset = step == -1 ? -size : 0
126
+ pos += size * step while condition && src[pos + offset, size] == needle
127
+ pos.negative? ? 0 : pos
128
+ end
115
129
  end
116
130
  end
117
131
  end
@@ -17,16 +17,16 @@ module RuboCop
17
17
  end
18
18
 
19
19
  def non_eligible_node?(node)
20
- node.nonempty_line_count > 3 ||
21
- !node.modifier_form? &&
22
- processed_source.commented?(node.loc.end)
20
+ node.modifier_form? ||
21
+ node.nonempty_line_count > 3 ||
22
+ processed_source.line_with_comment?(node.loc.last_line)
23
23
  end
24
24
 
25
25
  def non_eligible_body?(body)
26
26
  body.nil? ||
27
27
  body.empty_source? ||
28
28
  body.begin_type? ||
29
- processed_source.commented?(body.source_range)
29
+ processed_source.contains_comment?(body.source_range)
30
30
  end
31
31
 
32
32
  def non_eligible_condition?(condition)
@@ -36,14 +36,43 @@ module RuboCop
36
36
  def modifier_fits_on_single_line?(node)
37
37
  return true unless max_line_length
38
38
 
39
- length_in_modifier_form(node, node.condition) <= max_line_length
39
+ length_in_modifier_form(node) <= max_line_length
40
40
  end
41
41
 
42
- def length_in_modifier_form(node, cond)
43
- keyword = node.loc.keyword
44
- indentation = keyword.source_line[/^\s*/]
45
- line_length("#{indentation}#{node.body.source} #{keyword.source} " \
46
- "#{cond.source}")
42
+ def length_in_modifier_form(node)
43
+ keyword_element = node.loc.keyword
44
+ end_element = node.loc.end
45
+ code_before = keyword_element.source_line[0...keyword_element.column]
46
+ code_after = end_element.source_line[end_element.last_column..-1]
47
+ expression = to_modifier_form(node)
48
+ line_length("#{code_before}#{expression}#{code_after}")
49
+ end
50
+
51
+ def to_modifier_form(node)
52
+ expression = [node.body.source,
53
+ node.keyword,
54
+ node.condition.source].compact.join(' ')
55
+ parenthesized = parenthesize?(node) ? "(#{expression})" : expression
56
+ [parenthesized, first_line_comment(node)].compact.join(' ')
57
+ end
58
+
59
+ def first_line_comment(node)
60
+ comment =
61
+ processed_source.find_comment { |c| c.loc.line == node.loc.line }
62
+
63
+ comment ? comment.loc.expression.source : nil
64
+ end
65
+
66
+ def parenthesize?(node)
67
+ # Parenthesize corrected expression if changing to modifier-if form
68
+ # would change the meaning of the parent expression
69
+ # (due to the low operator precedence of modifier-if)
70
+ parent = node.parent
71
+ return false if parent.nil?
72
+ return true if parent.assignment? || parent.operator_keyword?
73
+ return true if %i[array pair].include?(parent.type)
74
+
75
+ node.parent.send_type?
47
76
  end
48
77
 
49
78
  def max_line_length
@@ -14,7 +14,7 @@ module RuboCop
14
14
  private
15
15
 
16
16
  def side_space_range(range:, side:)
17
- buffer = @processed_source.buffer
17
+ buffer = processed_source.buffer
18
18
  src = buffer.source
19
19
 
20
20
  begin_pos = range.begin_pos
@@ -30,29 +30,9 @@ module RuboCop
30
30
  Parser::Source::Range.new(buffer, begin_pos, end_pos)
31
31
  end
32
32
 
33
- def index_of_first_token(node)
34
- range = node.source_range
35
- token_table[range.line][range.column]
36
- end
37
-
38
- def index_of_last_token(node)
39
- range = node.source_range
40
- table_row = token_table[range.last_line]
41
- (0...range.last_column).reverse_each do |c|
42
- ix = table_row[c]
43
- return ix if ix
44
- end
45
- end
46
-
47
- def token_table
48
- @token_table ||= begin
49
- table = {}
50
- @processed_source.tokens.each_with_index do |t, ix|
51
- table[t.line] ||= {}
52
- table[t.line][t.column] = ix
53
- end
54
- table
55
- end
33
+ def on_new_investigation
34
+ @token_table = nil
35
+ super
56
36
  end
57
37
 
58
38
  def no_space_offenses(node, # rubocop:disable Metrics/ParameterLists