rubocop 0.85.1 → 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 (409) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -4
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +227 -26
  5. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  6. data/lib/rubocop/cli/command/base.rb +1 -0
  7. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  8. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +3 -3
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/cli.rb +2 -4
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +21 -4
  14. data/lib/rubocop/config_loader.rb +41 -69
  15. data/lib/rubocop/config_loader_resolver.rb +4 -4
  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 +39 -13
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  34. data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
  35. data/lib/rubocop/cop/generator.rb +1 -1
  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 +4 -4
  47. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  48. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
  51. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  52. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  53. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  54. data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
  55. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  56. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  57. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
  58. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  59. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  60. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  64. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  68. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  73. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  74. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  76. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  77. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  78. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  79. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  80. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  81. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  82. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  83. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  84. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  85. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  86. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  87. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  88. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  89. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  90. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  91. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  92. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  93. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  94. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  95. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  96. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  97. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  98. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  99. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  100. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  101. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  102. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  103. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  104. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  105. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
  106. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  107. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  108. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  109. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  110. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  112. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  113. data/lib/rubocop/cop/lint/loop.rb +23 -2
  114. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  115. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  116. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  117. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  118. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  119. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  120. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  121. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  122. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  123. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  124. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  125. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  126. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  127. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
  128. data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
  129. data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
  130. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  131. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +43 -40
  132. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  133. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  134. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  135. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  136. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  137. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  138. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
  139. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  140. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  141. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  142. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  143. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  144. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  145. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  146. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  147. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  149. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  150. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  151. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  152. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  153. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  154. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  155. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  156. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  157. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  158. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  159. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  160. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  161. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  162. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  163. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  164. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  165. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  166. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  167. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  168. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  169. data/lib/rubocop/cop/lint/void.rb +3 -7
  170. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  171. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  172. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  173. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  174. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  175. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  176. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  177. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  178. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  179. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
  180. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  181. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  182. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  183. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  184. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  185. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  186. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  187. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  188. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  189. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  190. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  191. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  192. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  193. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  194. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  195. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  196. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  197. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  198. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  199. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  200. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  201. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  202. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  203. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  204. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  205. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  206. data/lib/rubocop/cop/mixin/range_help.rb +19 -5
  207. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
  208. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  209. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  210. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
  211. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -5
  212. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
  213. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  214. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  215. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  216. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  217. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
  218. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  219. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  220. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  221. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  222. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  223. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
  224. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  225. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  226. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  227. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  228. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  229. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  230. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  231. data/lib/rubocop/cop/offense.rb +16 -2
  232. data/lib/rubocop/cop/registry.rb +3 -3
  233. data/lib/rubocop/cop/security/eval.rb +2 -2
  234. data/lib/rubocop/cop/security/json_load.rb +6 -8
  235. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  236. data/lib/rubocop/cop/security/open.rb +2 -2
  237. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  238. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  239. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  240. data/lib/rubocop/cop/style/alias.rb +41 -36
  241. data/lib/rubocop/cop/style/and_or.rb +9 -11
  242. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  243. data/lib/rubocop/cop/style/array_join.rb +6 -8
  244. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  245. data/lib/rubocop/cop/style/attr.rb +11 -9
  246. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  247. data/lib/rubocop/cop/style/bare_percent_literals.rb +11 -13
  248. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  249. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
  250. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  251. data/lib/rubocop/cop/style/block_delimiters.rb +25 -27
  252. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  253. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  254. data/lib/rubocop/cop/style/class_and_module_children.rb +15 -12
  255. data/lib/rubocop/cop/style/class_check.rb +7 -9
  256. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  257. data/lib/rubocop/cop/style/class_vars.rb +24 -7
  258. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  259. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  260. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  261. data/lib/rubocop/cop/style/command_literal.rb +24 -25
  262. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  263. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  264. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
  265. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  266. data/lib/rubocop/cop/style/copyright.rb +15 -15
  267. data/lib/rubocop/cop/style/date_time.rb +2 -2
  268. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  269. data/lib/rubocop/cop/style/dir.rb +9 -12
  270. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +8 -10
  271. data/lib/rubocop/cop/style/documentation.rb +8 -10
  272. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  273. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  274. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  275. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  276. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  277. data/lib/rubocop/cop/style/empty_case_condition.rb +27 -26
  278. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  279. data/lib/rubocop/cop/style/empty_literal.rb +20 -21
  280. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  281. data/lib/rubocop/cop/style/encoding.rb +6 -10
  282. data/lib/rubocop/cop/style/end_block.rb +4 -6
  283. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  284. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  285. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
  286. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  287. data/lib/rubocop/cop/style/exponential_notation.rb +9 -11
  288. data/lib/rubocop/cop/style/float_division.rb +8 -11
  289. data/lib/rubocop/cop/style/for.rb +11 -15
  290. data/lib/rubocop/cop/style/format_string.rb +21 -19
  291. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  292. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +20 -42
  293. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  294. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  295. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  296. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  297. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  298. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  299. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  300. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  301. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  302. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  303. data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
  304. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  305. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  306. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  307. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  308. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  309. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  310. data/lib/rubocop/cop/style/inverse_methods.rb +23 -33
  311. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  312. data/lib/rubocop/cop/style/lambda.rb +7 -12
  313. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  314. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  315. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  316. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  317. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  318. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  319. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  320. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  321. data/lib/rubocop/cop/style/min_max.rb +8 -12
  322. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  323. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  324. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  325. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  326. data/lib/rubocop/cop/style/module_function.rb +10 -13
  327. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  328. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  329. data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
  330. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  331. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  332. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -8
  333. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  334. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  335. data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
  336. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
  337. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  338. data/lib/rubocop/cop/style/next.rb +2 -2
  339. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  340. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  341. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  342. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  343. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  344. data/lib/rubocop/cop/style/proc.rb +1 -1
  345. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  346. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  347. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  348. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  349. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  350. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  351. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  352. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
  353. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  354. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
  355. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
  356. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  357. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  358. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  359. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  360. data/lib/rubocop/cop/style/sample.rb +1 -1
  361. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  362. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  363. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  364. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  365. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  366. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  367. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  368. data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
  369. data/lib/rubocop/cop/style/symbol_array.rb +6 -6
  370. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  371. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  372. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  373. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  374. data/lib/rubocop/cop/style/word_array.rb +1 -1
  375. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  376. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  377. data/lib/rubocop/cop/team.rb +98 -82
  378. data/lib/rubocop/cop/tokens_util.rb +84 -0
  379. data/lib/rubocop/cop/util.rb +5 -15
  380. data/lib/rubocop/cop/utils/format_string.rb +2 -3
  381. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  382. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  383. data/lib/rubocop/cop/variable_force.rb +0 -2
  384. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  385. data/lib/rubocop/error.rb +1 -0
  386. data/lib/rubocop/file_finder.rb +12 -12
  387. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -3
  388. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  389. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  390. data/lib/rubocop/name_similarity.rb +7 -3
  391. data/lib/rubocop/options.rb +18 -11
  392. data/lib/rubocop/path_util.rb +19 -19
  393. data/lib/rubocop/platform.rb +1 -1
  394. data/lib/rubocop/rake_task.rb +7 -9
  395. data/lib/rubocop/result_cache.rb +12 -8
  396. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  397. data/lib/rubocop/rspec/expect_offense.rb +63 -22
  398. data/lib/rubocop/rspec/shared_contexts.rb +16 -17
  399. data/lib/rubocop/runner.rb +35 -34
  400. data/lib/rubocop/target_finder.rb +14 -11
  401. data/lib/rubocop/target_ruby.rb +2 -2
  402. data/lib/rubocop/version.rb +2 -2
  403. data/lib/rubocop.rb +33 -5
  404. metadata +49 -11
  405. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  406. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  407. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  408. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  409. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -6,8 +6,31 @@ module RuboCop
6
6
  # This cop checks if the length a class exceeds some maximum value.
7
7
  # Comment lines can optionally be ignored.
8
8
  # The maximum allowed length is configurable.
9
- class ClassLength < Cop
10
- include ClassishLength
9
+ #
10
+ # You can set literals you want to fold with `CountAsOne`.
11
+ # Available are: 'array', 'hash', and 'heredoc'. Each literal
12
+ # will be counted as one line regardless of its actual size.
13
+ #
14
+ # @example CountAsOne: ['array', 'heredoc']
15
+ #
16
+ # class Foo
17
+ # ARRAY = [ # +1
18
+ # 1,
19
+ # 2
20
+ # ]
21
+ #
22
+ # HASH = { # +3
23
+ # key: 'value'
24
+ # }
25
+ #
26
+ # MSG = <<~HEREDOC # +1
27
+ # Heredoc
28
+ # content.
29
+ # HEREDOC
30
+ # end # 5 points
31
+ #
32
+ class ClassLength < Base
33
+ include CodeLength
11
34
 
12
35
  def on_class(node)
13
36
  check_code_length(node)
@@ -22,7 +45,7 @@ module RuboCop
22
45
  private
23
46
 
24
47
  def_node_matcher :class_definition?, <<~PATTERN
25
- (casgn nil? _ (block (send (const nil? :Class) :new) ...))
48
+ (casgn nil? _ (block (send (const {nil? cbase} :Class) :new) ...))
26
49
  PATTERN
27
50
 
28
51
  def message(length, max_length)
@@ -13,19 +13,52 @@ module RuboCop
13
13
  # operator (or keyword and) can be converted to a nested if statement,
14
14
  # and ||/or is shorthand for a sequence of ifs, so they also add one.
15
15
  # Loops can be said to have an exit condition, so they add one.
16
- class CyclomaticComplexity < Cop
16
+ # Blocks that are calls to builtin iteration methods
17
+ # (e.g. `ary.map{...}) also add one, others are ignored.
18
+ #
19
+ # def each_child_node(*types) # count begins: 1
20
+ # unless block_given? # unless: +1
21
+ # return to_enum(__method__, *types)
22
+ #
23
+ # children.each do |child| # each{}: +1
24
+ # next unless child.is_a?(Node) # unless: +1
25
+ #
26
+ # yield child if types.empty? || # if: +1, ||: +1
27
+ # types.include?(child.type)
28
+ # end
29
+ #
30
+ # self
31
+ # end # total: 6
32
+ class CyclomaticComplexity < Base
17
33
  include MethodComplexity
34
+ include Utils::IteratingBlock
18
35
 
19
36
  MSG = 'Cyclomatic complexity for %<method>s is too high. ' \
20
37
  '[%<complexity>d/%<max>d]'
21
- COUNTED_NODES = %i[if while until for
22
- rescue when and or].freeze
38
+ COUNTED_NODES = %i[if while until for csend block block_pass
39
+ rescue when and or or_asgn and_asgn].freeze
23
40
 
24
41
  private
25
42
 
26
- def complexity_score_for(_node)
43
+ def complexity_score_for(node)
44
+ return 0 if iterating_block?(node) == false
45
+ return 0 if node.csend_type? && discount_for_repeated_csend?(node)
46
+
27
47
  1
28
48
  end
49
+
50
+ def block_method(node)
51
+ case node.type
52
+ when :block
53
+ node.method_name
54
+ when :block_pass
55
+ node.parent.method_name
56
+ end
57
+ end
58
+
59
+ def count_block?(block)
60
+ KNOWN_ITERATING_METHODS.include? block.method_name
61
+ end
29
62
  end
30
63
  end
31
64
  end
@@ -6,8 +6,31 @@ module RuboCop
6
6
  # This cop checks if the length of a method exceeds some maximum value.
7
7
  # Comment lines can optionally be ignored.
8
8
  # The maximum allowed length is configurable.
9
- class MethodLength < Cop
10
- include TooManyLines
9
+ #
10
+ # You can set literals you want to fold with `CountAsOne`.
11
+ # Available are: 'array', 'hash', and 'heredoc'. Each literal
12
+ # will be counted as one line regardless of its actual size.
13
+ #
14
+ # @example CountAsOne: ['array', 'heredoc']
15
+ #
16
+ # def m
17
+ # array = [ # +1
18
+ # 1,
19
+ # 2
20
+ # ]
21
+ #
22
+ # hash = { # +3
23
+ # key: 'value'
24
+ # }
25
+ #
26
+ # <<~HEREDOC # +1
27
+ # Heredoc
28
+ # content.
29
+ # HEREDOC
30
+ # end # 5 points
31
+ #
32
+ class MethodLength < Base
33
+ include CodeLength
11
34
 
12
35
  LABEL = 'Method'
13
36
 
@@ -6,8 +6,31 @@ module RuboCop
6
6
  # This cop checks if the length a module exceeds some maximum value.
7
7
  # Comment lines can optionally be ignored.
8
8
  # The maximum allowed length is configurable.
9
- class ModuleLength < Cop
10
- include ClassishLength
9
+ #
10
+ # You can set literals you want to fold with `CountAsOne`.
11
+ # Available are: 'array', 'hash', and 'heredoc'. Each literal
12
+ # will be counted as one line regardless of its actual size.
13
+ #
14
+ # @example CountAsOne: ['array', 'heredoc']
15
+ #
16
+ # module M
17
+ # ARRAY = [ # +1
18
+ # 1,
19
+ # 2
20
+ # ]
21
+ #
22
+ # HASH = { # +3
23
+ # key: 'value'
24
+ # }
25
+ #
26
+ # MSG = <<~HEREDOC # +1
27
+ # Heredoc
28
+ # content.
29
+ # HEREDOC
30
+ # end # 5 points
31
+ #
32
+ class ModuleLength < Base
33
+ include CodeLength
11
34
 
12
35
  def on_module(node)
13
36
  check_code_length(node)
@@ -22,7 +45,7 @@ module RuboCop
22
45
  private
23
46
 
24
47
  def_node_matcher :module_definition?, <<~PATTERN
25
- (casgn nil? _ (block (send (const nil? :Module) :new) ...))
48
+ (casgn nil? _ (block (send (const {nil? cbase} :Module) :new) ...))
26
49
  PATTERN
27
50
 
28
51
  def message(length, max_length)
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # This cop checks for methods with too many parameters.
7
7
  # The maximum number of parameters is configurable.
8
8
  # Keyword arguments can optionally be excluded from the total count.
9
- class ParameterLists < Cop
9
+ class ParameterLists < Base
10
10
  include ConfigurableMax
11
11
 
12
12
  MSG = 'Avoid parameter lists longer than %<max>d parameters. ' \
@@ -18,7 +18,7 @@ module RuboCop
18
18
 
19
19
  return if argument_to_lambda_or_proc?(node)
20
20
 
21
- add_offense(node) do
21
+ add_offense(node, message: format(MSG, max: max_params, count: args_count(node))) do
22
22
  self.max = count
23
23
  end
24
24
  end
@@ -29,10 +29,6 @@ module RuboCop
29
29
  ^lambda_or_proc?
30
30
  PATTERN
31
31
 
32
- def message(node)
33
- format(MSG, max: max_params, count: args_count(node))
34
- end
35
-
36
32
  def args_count(node)
37
33
  if count_keyword_args?
38
34
  node.children.size
@@ -26,13 +26,11 @@ module RuboCop
26
26
  # do_something until a && b # 2
27
27
  # end # ===
28
28
  # end # 7 complexity points
29
- class PerceivedComplexity < Cop
30
- include MethodComplexity
31
-
29
+ class PerceivedComplexity < CyclomaticComplexity
32
30
  MSG = 'Perceived complexity for %<method>s is too high. ' \
33
31
  '[%<complexity>d/%<max>d]'
34
- COUNTED_NODES = %i[if case while until
35
- for rescue and or].freeze
32
+
33
+ COUNTED_NODES = (CyclomaticComplexity::COUNTED_NODES - [:when] + [:case]).freeze
36
34
 
37
35
  private
38
36
 
@@ -42,17 +40,18 @@ module RuboCop
42
40
  # If cond is nil, that means each when has an expression that
43
41
  # evaluates to true or false. It's just an alternative to
44
42
  # if/elsif/elsif... so the when nodes count.
43
+ nb_branches = node.when_branches.length + (node.else_branch ? 1 : 0)
45
44
  if node.condition.nil?
46
- node.when_branches.length
45
+ nb_branches
47
46
  else
48
47
  # Otherwise, the case node gets 0.8 complexity points and each
49
48
  # when gets 0.2.
50
- (0.8 + 0.2 * node.when_branches.length).round
49
+ (0.8 + 0.2 * nb_branches).round
51
50
  end
52
51
  when :if
53
52
  node.else? && !node.elsif? ? 2 : 1
54
53
  else
55
- 1
54
+ super
56
55
  end
57
56
  end
58
57
  end
@@ -11,10 +11,13 @@ module RuboCop
11
11
  # We separate the *calculator* from the *cop* so that the calculation,
12
12
  # the formula itself, is easier to test.
13
13
  class AbcSizeCalculator
14
+ include IteratingBlock
15
+ include RepeatedCsendDiscount
16
+
14
17
  # > Branch -- an explicit forward program branch out of scope -- a
15
18
  # > function call, class method call ..
16
19
  # > http://c2.com/cgi/wiki?AbcMetric
17
- BRANCH_NODES = %i[send csend].freeze
20
+ BRANCH_NODES = %i[send csend yield].freeze
18
21
 
19
22
  # > Condition -- a logical/Boolean test, == != <= >= < > else case
20
23
  # > default try catch ? and unary conditionals.
@@ -25,18 +28,22 @@ module RuboCop
25
28
  new(node).calculate
26
29
  end
27
30
 
31
+ # TODO: move to rubocop-ast
32
+ ARGUMENT_TYPES = %i[arg optarg restarg kwarg kwoptarg kwrestarg blockarg].freeze
33
+
28
34
  def initialize(node)
29
35
  @assignment = 0
30
36
  @branch = 0
31
37
  @condition = 0
32
38
  @node = node
39
+ reset_repeated_csend
33
40
  end
34
41
 
35
42
  def calculate
36
43
  @node.each_node do |child|
37
- if child.assignment?
38
- @assignment += 1
39
- elsif branch?(child)
44
+ @assignment += 1 if assignment?(child)
45
+
46
+ if branch?(child)
40
47
  evaluate_branch_nodes(child)
41
48
  elsif condition?(child)
42
49
  evaluate_condition_node(child)
@@ -54,6 +61,7 @@ module RuboCop
54
61
  @condition += 1
55
62
  else
56
63
  @branch += 1
64
+ @condition += 1 if node.csend_type? && !discount_for_repeated_csend?(node)
57
65
  end
58
66
  end
59
67
 
@@ -70,11 +78,46 @@ module RuboCop
70
78
 
71
79
  private
72
80
 
81
+ def assignment?(node)
82
+ node.for_type? ||
83
+ node.op_asgn_type? ||
84
+ (node.respond_to?(:setter_method?) && node.setter_method?) ||
85
+ (simple_assignment?(node) && capturing_variable?(node.children.first))
86
+ end
87
+
88
+ def simple_assignment?(node)
89
+ return false if node.masgn_type?
90
+
91
+ if node.equals_asgn?
92
+ reset_on_lvasgn(node) if node.lvasgn_type?
93
+ return true
94
+ end
95
+
96
+ argument?(node)
97
+ end
98
+
99
+ def capturing_variable?(name)
100
+ name && !/^_/.match?(name)
101
+ end
102
+
103
+ # Returns true for nodes which otherwise would be counted
104
+ # as one too many assignment
105
+ def assignment_doubled_in_ast?(node)
106
+ node.masgn_type? || node.or_asgn_type? || node.and_asgn_type?
107
+ end
108
+
73
109
  def branch?(node)
74
110
  BRANCH_NODES.include?(node.type)
75
111
  end
76
112
 
113
+ # TODO: move to rubocop-ast
114
+ def argument?(node)
115
+ ARGUMENT_TYPES.include?(node.type)
116
+ end
117
+
77
118
  def condition?(node)
119
+ return false if iterating_block?(node) == false
120
+
78
121
  CONDITION_NODES.include?(node.type)
79
122
  end
80
123
  end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Metrics
6
+ module Utils
7
+ # Helps to calculate code length for the provided node.
8
+ class CodeLengthCalculator
9
+ extend NodePattern::Macros
10
+ include Util
11
+
12
+ FOLDABLE_TYPES = %i[array hash heredoc].freeze
13
+ CLASSLIKE_TYPES = %i[class module].freeze
14
+
15
+ def initialize(node, processed_source, count_comments: false, foldable_types: [])
16
+ @node = node
17
+ @processed_source = processed_source
18
+ @count_comments = count_comments
19
+ @foldable_checks = build_foldable_checks(foldable_types)
20
+ @foldable_types = normalize_foldable_types(foldable_types)
21
+ end
22
+
23
+ def calculate
24
+ length = code_length(@node)
25
+ return length if @foldable_types.empty?
26
+
27
+ each_top_level_descendant(@node, @foldable_types) do |descendant|
28
+ if foldable_node?(descendant)
29
+ descendant_length = code_length(descendant)
30
+ length = length - descendant_length + 1
31
+ end
32
+ end
33
+
34
+ length
35
+ end
36
+
37
+ private
38
+
39
+ def build_foldable_checks(types)
40
+ types.map do |type|
41
+ case type
42
+ when :array
43
+ ->(node) { node.array_type? }
44
+ when :hash
45
+ ->(node) { node.hash_type? }
46
+ when :heredoc
47
+ ->(node) { heredoc_node?(node) }
48
+ else
49
+ raise ArgumentError, "Unknown foldable type: #{type.inspect}. "\
50
+ "Valid foldable types are: #{FOLDABLE_TYPES.join(', ')}."
51
+ end
52
+ end
53
+ end
54
+
55
+ def normalize_foldable_types(types)
56
+ types.concat(%i[str dstr]) if types.delete(:heredoc)
57
+ types
58
+ end
59
+
60
+ def code_length(node)
61
+ if classlike_node?(node)
62
+ classlike_code_length(node)
63
+ elsif heredoc_node?(node)
64
+ heredoc_length(node)
65
+ else
66
+ body = extract_body(node)
67
+ return 0 unless body
68
+
69
+ body.source.each_line.count { |line| !irrelevant_line?(line) }
70
+ end
71
+ end
72
+
73
+ def heredoc_node?(node)
74
+ node.respond_to?(:heredoc?) && node.heredoc?
75
+ end
76
+
77
+ def classlike_code_length(node)
78
+ return 0 if namespace_module?(node)
79
+
80
+ body_line_numbers = line_range(node).to_a[1...-1]
81
+
82
+ target_line_numbers = body_line_numbers -
83
+ line_numbers_of_inner_nodes(node, :module, :class)
84
+
85
+ target_line_numbers.reduce(0) do |length, line_number|
86
+ source_line = @processed_source[line_number]
87
+ next length if irrelevant_line?(source_line)
88
+
89
+ length + 1
90
+ end
91
+ end
92
+
93
+ def namespace_module?(node)
94
+ classlike_node?(node.body)
95
+ end
96
+
97
+ def line_numbers_of_inner_nodes(node, *types)
98
+ line_numbers = Set.new
99
+
100
+ node.each_descendant(*types) do |inner_node|
101
+ line_range = line_range(inner_node)
102
+ line_numbers.merge(line_range)
103
+ end
104
+
105
+ line_numbers.to_a
106
+ end
107
+
108
+ def heredoc_length(node)
109
+ lines = node.loc.heredoc_body.source.lines
110
+ lines.count { |line| !irrelevant_line?(line) } + 2
111
+ end
112
+
113
+ def each_top_level_descendant(node, types, &block)
114
+ node.each_child_node do |child|
115
+ next if classlike_node?(child)
116
+
117
+ if types.include?(child.type)
118
+ yield child
119
+ else
120
+ each_top_level_descendant(child, types, &block)
121
+ end
122
+ end
123
+ end
124
+
125
+ def classlike_node?(node)
126
+ CLASSLIKE_TYPES.include?(node.type)
127
+ end
128
+
129
+ def foldable_node?(node)
130
+ @foldable_checks.any? { |check| check.call(node) }
131
+ end
132
+
133
+ def extract_body(node)
134
+ case node.type
135
+ when :class, :module, :block, :def, :defs
136
+ node.body
137
+ when :casgn
138
+ _scope, _name, value = *node
139
+ extract_body(value)
140
+ else
141
+ node
142
+ end
143
+ end
144
+
145
+ # Returns true for lines that shall not be included in the count.
146
+ def irrelevant_line?(source_line)
147
+ source_line.blank? || !count_comments? && comment_line?(source_line)
148
+ end
149
+
150
+ def count_comments?
151
+ @count_comments
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Metrics
6
+ module Utils
7
+ # Used to identify iterating blocks like `.map{}` and `.map(&:...)`
8
+ module IteratingBlock
9
+ enumerable = %i[
10
+ all? any? chain chunk chunk_while collect collect_concat count cycle
11
+ detect drop drop_while each each_cons each_entry each_slice
12
+ each_with_index each_with_object entries filter filter_map find
13
+ find_all find_index flat_map grep grep_v group_by inject lazy map
14
+ max max_by min min_by minmax minmax_by none? one? partition reduce
15
+ reject reverse_each select slice_after slice_before slice_when sort
16
+ sort_by sum take take_while tally to_h uniq zip
17
+ ]
18
+
19
+ enumerator = %i[with_index with_object]
20
+
21
+ array = %i[
22
+ bsearch bsearch_index collect! combination d_permutation delete_if
23
+ each_index keep_if map! permutation product reject! repeat
24
+ repeated_combination select! sort sort! sort_by sort_by
25
+ ]
26
+
27
+ hash = %i[
28
+ each_key each_pair each_value fetch fetch_values has_key? merge
29
+ merge! transform_keys transform_keys! transform_values
30
+ transform_values!
31
+ ]
32
+
33
+ KNOWN_ITERATING_METHODS = (Set.new(enumerable) + enumerator + array + hash).freeze
34
+
35
+ # Returns the name of the method called with a block
36
+ # if node is a block node, or a block-pass node.
37
+ def block_method_name(node)
38
+ case node.type
39
+ when :block
40
+ node.method_name
41
+ when :block_pass
42
+ node.parent.method_name
43
+ end
44
+ end
45
+
46
+ # Returns true iff name is a known iterating type (e.g. :each, :transform_values)
47
+ def iterating_method?(name)
48
+ KNOWN_ITERATING_METHODS.include? name
49
+ end
50
+
51
+ # Returns nil if node is neither a block node or a block-pass node.
52
+ # Otherwise returns true/false if method call is a known iterating call
53
+ def iterating_block?(node)
54
+ name = block_method_name(node)
55
+ name && iterating_method?(name)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Metrics
6
+ module Utils
7
+ # @api private
8
+ #
9
+ # Helps to calculate code length for the provided node.
10
+ module RepeatedCsendDiscount
11
+ def reset_repeated_csend
12
+ @repeated_csend = {}
13
+ end
14
+
15
+ def discount_for_repeated_csend?(csend_node)
16
+ receiver = csend_node.receiver
17
+
18
+ return false unless receiver.lvar_type?
19
+
20
+ var_name = receiver.children.first
21
+ seen = @repeated_csend.fetch(var_name) do
22
+ @repeated_csend[var_name] = csend_node
23
+ return false
24
+ end
25
+
26
+ !seen.equal?(csend_node)
27
+ end
28
+
29
+ def reset_on_lvasgn(node)
30
+ var_name = node.children.first
31
+ @repeated_csend.delete(var_name)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -5,8 +5,9 @@ module RuboCop
5
5
  module Migration
6
6
  # Check that cop names in rubocop:disable comments are given with
7
7
  # department name.
8
- class DepartmentName < Cop
8
+ class DepartmentName < Base
9
9
  include RangeHelp
10
+ extend AutoCorrector
10
11
 
11
12
  MSG = 'Department name is missing.'
12
13
 
@@ -18,8 +19,8 @@ module RuboCop
18
19
  # `DepartmentName/CopName` or` all`.
19
20
  DISABLING_COPS_CONTENT_TOKEN = %r{[A-z]+/[A-z]+|all}.freeze
20
21
 
21
- def investigate(processed_source)
22
- processed_source.each_comment do |comment|
22
+ def on_new_investigation
23
+ processed_source.comments.each do |comment|
23
24
  next if comment.text !~ DISABLE_COMMENT_FORMAT
24
25
 
25
26
  offset = Regexp.last_match(1).length
@@ -38,18 +39,6 @@ module RuboCop
38
39
  end
39
40
  end
40
41
 
41
- def autocorrect(range)
42
- shall_warn = false
43
- cop_name = range.source
44
- qualified_cop_name = Cop.registry.qualified_cop_name(cop_name,
45
- nil, shall_warn)
46
- unless qualified_cop_name.include?('/')
47
- qualified_cop_name = qualified_legacy_cop_name(cop_name)
48
- end
49
-
50
- ->(corrector) { corrector.replace(range, qualified_cop_name) }
51
- end
52
-
53
42
  private
54
43
 
55
44
  def disable_comment_offset
@@ -60,7 +49,16 @@ module RuboCop
60
49
  start = comment.location.expression.begin_pos + offset
61
50
  range = range_between(start, start + name.length)
62
51
 
63
- add_offense(range, location: range)
52
+ add_offense(range) do |corrector|
53
+ cop_name = range.source
54
+ qualified_cop_name = Registry.global.qualified_cop_name(cop_name, nil, warn: false)
55
+
56
+ unless qualified_cop_name.include?('/')
57
+ qualified_cop_name = qualified_legacy_cop_name(cop_name)
58
+ end
59
+
60
+ corrector.replace(range, qualified_cop_name)
61
+ end
64
62
  end
65
63
 
66
64
  def valid_content_token?(content_token)
@@ -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