rubocop 0.78.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (735) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +69 -39
  4. data/assets/output.html.erb +1 -1
  5. data/config/default.yml +1034 -139
  6. data/config/obsoletion.yml +200 -0
  7. data/exe/rubocop +2 -4
  8. data/lib/rubocop.rb +139 -66
  9. data/lib/rubocop/ast_aliases.rb +8 -0
  10. data/lib/rubocop/cached_data.rb +4 -4
  11. data/lib/rubocop/cli.rb +19 -13
  12. data/lib/rubocop/cli/command.rb +1 -0
  13. data/lib/rubocop/cli/command/auto_genenerate_config.rb +46 -19
  14. data/lib/rubocop/cli/command/base.rb +2 -0
  15. data/lib/rubocop/cli/command/execute_runner.rb +36 -12
  16. data/lib/rubocop/cli/command/init_dotfile.rb +3 -4
  17. data/lib/rubocop/cli/command/show_cops.rb +14 -13
  18. data/lib/rubocop/cli/command/suggest_extensions.rb +81 -0
  19. data/lib/rubocop/cli/command/version.rb +3 -2
  20. data/lib/rubocop/cli/environment.rb +1 -0
  21. data/lib/rubocop/comment_config.rb +54 -98
  22. data/lib/rubocop/config.rb +76 -34
  23. data/lib/rubocop/config_loader.rb +118 -114
  24. data/lib/rubocop/config_loader_resolver.rb +99 -28
  25. data/lib/rubocop/config_obsoletion.rb +67 -239
  26. data/lib/rubocop/config_obsoletion/changed_enforced_styles.rb +33 -0
  27. data/lib/rubocop/config_obsoletion/changed_parameter.rb +21 -0
  28. data/lib/rubocop/config_obsoletion/cop_rule.rb +33 -0
  29. data/lib/rubocop/config_obsoletion/extracted_cop.rb +44 -0
  30. data/lib/rubocop/config_obsoletion/parameter_rule.rb +44 -0
  31. data/lib/rubocop/config_obsoletion/removed_cop.rb +41 -0
  32. data/lib/rubocop/config_obsoletion/renamed_cop.rb +34 -0
  33. data/lib/rubocop/config_obsoletion/rule.rb +41 -0
  34. data/lib/rubocop/config_obsoletion/split_cop.rb +27 -0
  35. data/lib/rubocop/config_regeneration.rb +33 -0
  36. data/lib/rubocop/config_store.rb +31 -7
  37. data/lib/rubocop/config_validator.rb +89 -103
  38. data/lib/rubocop/cop/autocorrect_logic.rb +41 -39
  39. data/lib/rubocop/cop/badge.rb +16 -32
  40. data/lib/rubocop/cop/base.rb +450 -0
  41. data/lib/rubocop/cop/bundler/duplicated_gem.rb +30 -6
  42. data/lib/rubocop/cop/bundler/gem_comment.rb +117 -8
  43. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +13 -20
  44. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -4
  45. data/lib/rubocop/cop/commissioner.rb +98 -74
  46. data/lib/rubocop/cop/cop.rb +84 -234
  47. data/lib/rubocop/cop/corrector.rb +63 -117
  48. data/lib/rubocop/cop/correctors/alignment_corrector.rb +13 -23
  49. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -6
  50. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  51. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  52. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  53. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +4 -4
  54. data/lib/rubocop/cop/correctors/line_break_corrector.rb +9 -12
  55. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -6
  56. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  57. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  58. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -21
  59. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  60. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  61. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +6 -8
  62. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  63. data/lib/rubocop/cop/documentation.rb +22 -0
  64. data/lib/rubocop/cop/exclude_limit.rb +26 -0
  65. data/lib/rubocop/cop/force.rb +2 -1
  66. data/lib/rubocop/cop/gemspec/date_assignment.rb +57 -0
  67. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +6 -5
  68. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +4 -8
  69. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +48 -20
  70. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +4 -2
  71. data/lib/rubocop/cop/generator.rb +14 -25
  72. data/lib/rubocop/cop/generator/configuration_injector.rb +5 -6
  73. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  74. data/lib/rubocop/cop/ignored_node.rb +1 -3
  75. data/lib/rubocop/cop/internal_affairs.rb +7 -1
  76. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +68 -0
  77. data/lib/rubocop/cop/internal_affairs/example_description.rb +92 -0
  78. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +8 -17
  79. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +4 -4
  80. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
  81. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  82. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +12 -10
  83. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +62 -0
  84. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +65 -0
  85. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +12 -7
  86. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +11 -8
  87. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +148 -0
  88. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +6 -6
  89. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
  90. data/lib/rubocop/cop/layout/argument_alignment.rb +8 -9
  91. data/lib/rubocop/cop/layout/array_alignment.rb +58 -13
  92. data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
  93. data/lib/rubocop/cop/layout/begin_end_alignment.rb +74 -0
  94. data/lib/rubocop/cop/layout/block_alignment.rb +35 -43
  95. data/lib/rubocop/cop/layout/block_end_newline.rb +9 -11
  96. data/lib/rubocop/cop/layout/case_indentation.rb +22 -28
  97. data/lib/rubocop/cop/layout/class_structure.rb +58 -74
  98. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  99. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
  100. data/lib/rubocop/cop/layout/comment_indentation.rb +21 -25
  101. data/lib/rubocop/cop/layout/condition_position.rb +16 -8
  102. data/lib/rubocop/cop/layout/def_end_alignment.rb +9 -10
  103. data/lib/rubocop/cop/layout/dot_position.rb +20 -21
  104. data/lib/rubocop/cop/layout/else_alignment.rb +28 -6
  105. data/lib/rubocop/cop/layout/empty_comment.rb +29 -29
  106. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +39 -22
  107. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  108. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  109. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +140 -39
  110. data/lib/rubocop/cop/layout/empty_lines.rb +7 -12
  111. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +29 -38
  112. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +13 -9
  113. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +118 -0
  114. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  115. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  116. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  117. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -14
  118. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  119. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  120. data/lib/rubocop/cop/layout/end_alignment.rb +18 -24
  121. data/lib/rubocop/cop/layout/end_of_line.rb +8 -8
  122. data/lib/rubocop/cop/layout/extra_spacing.rb +23 -42
  123. data/lib/rubocop/cop/layout/first_argument_indentation.rb +40 -13
  124. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +24 -18
  125. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +4 -8
  126. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +25 -21
  127. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +3 -7
  128. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -13
  129. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -7
  130. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +8 -7
  131. data/lib/rubocop/cop/layout/hash_alignment.rb +37 -40
  132. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +46 -30
  133. data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -117
  134. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  135. data/lib/rubocop/cop/layout/indentation_style.rb +110 -0
  136. data/lib/rubocop/cop/layout/indentation_width.rb +22 -14
  137. data/lib/rubocop/cop/layout/initial_indentation.rb +7 -11
  138. data/lib/rubocop/cop/layout/leading_comment_space.rb +46 -13
  139. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  140. data/lib/rubocop/cop/layout/line_length.rb +61 -42
  141. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  142. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +3 -7
  143. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +36 -14
  144. data/lib/rubocop/cop/layout/multiline_block_layout.rb +51 -38
  145. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -9
  146. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +3 -7
  147. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +6 -13
  148. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  149. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +30 -19
  150. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  151. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +23 -9
  152. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  153. data/lib/rubocop/cop/layout/redundant_line_break.rb +125 -0
  154. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +37 -30
  155. data/lib/rubocop/cop/layout/space_after_colon.rb +10 -8
  156. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  157. data/lib/rubocop/cop/layout/space_after_method_name.rb +7 -10
  158. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  159. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  160. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +45 -52
  161. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +19 -23
  162. data/lib/rubocop/cop/layout/space_around_keyword.rb +22 -26
  163. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +98 -0
  164. data/lib/rubocop/cop/layout/space_around_operators.rb +59 -25
  165. data/lib/rubocop/cop/layout/space_before_block_braces.rb +41 -25
  166. data/lib/rubocop/cop/layout/space_before_brackets.rb +65 -0
  167. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  168. data/lib/rubocop/cop/layout/space_before_comment.rb +8 -9
  169. data/lib/rubocop/cop/layout/space_before_first_arg.rb +17 -15
  170. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  171. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +11 -21
  172. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +30 -39
  173. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +5 -15
  174. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +34 -39
  175. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +22 -48
  176. data/lib/rubocop/cop/layout/space_inside_parens.rb +39 -22
  177. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  178. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +9 -18
  179. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +18 -29
  180. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  181. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  182. data/lib/rubocop/cop/layout/trailing_whitespace.rb +42 -18
  183. data/lib/rubocop/cop/legacy/corrections_proxy.rb +43 -0
  184. data/lib/rubocop/cop/legacy/corrector.rb +27 -0
  185. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +54 -0
  186. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +21 -9
  187. data/lib/rubocop/cop/lint/ambiguous_operator.rb +53 -5
  188. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +36 -6
  189. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  190. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  191. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +55 -0
  192. data/lib/rubocop/cop/lint/boolean_symbol.rb +24 -4
  193. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  194. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +100 -0
  195. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  196. data/lib/rubocop/cop/lint/debugger.rb +61 -21
  197. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -14
  198. data/lib/rubocop/cop/lint/deprecated_constants.rb +80 -0
  199. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +148 -0
  200. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  201. data/lib/rubocop/cop/lint/duplicate_branch.rb +154 -0
  202. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -13
  203. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  204. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -4
  205. data/lib/rubocop/cop/lint/duplicate_methods.rb +12 -16
  206. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +77 -0
  207. data/lib/rubocop/cop/lint/duplicate_require.rb +47 -0
  208. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +47 -0
  209. data/lib/rubocop/cop/lint/each_with_object_argument.rb +3 -1
  210. data/lib/rubocop/cop/lint/else_layout.rb +29 -5
  211. data/lib/rubocop/cop/lint/empty_block.rb +82 -0
  212. data/lib/rubocop/cop/lint/empty_class.rb +93 -0
  213. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  214. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -7
  215. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  216. data/lib/rubocop/cop/lint/empty_file.rb +48 -0
  217. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -7
  218. data/lib/rubocop/cop/lint/empty_when.rb +31 -8
  219. data/lib/rubocop/cop/lint/ensure_return.rb +29 -16
  220. data/lib/rubocop/cop/lint/erb_new_arguments.rb +19 -21
  221. data/lib/rubocop/cop/lint/flip_flop.rb +9 -3
  222. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  223. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -3
  224. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +45 -10
  225. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +38 -0
  226. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +14 -16
  227. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  228. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +7 -7
  229. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +14 -20
  230. data/lib/rubocop/cop/lint/inherit_exception.rb +14 -9
  231. data/lib/rubocop/cop/lint/interpolation_check.rb +20 -7
  232. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +44 -0
  233. data/lib/rubocop/cop/lint/literal_as_condition.rb +24 -15
  234. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +44 -15
  235. data/lib/rubocop/cop/lint/loop.rb +31 -9
  236. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +9 -12
  237. data/lib/rubocop/cop/lint/missing_super.rb +101 -0
  238. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +36 -0
  239. data/lib/rubocop/cop/lint/multiple_comparison.rb +15 -15
  240. data/lib/rubocop/cop/lint/nested_method_definition.rb +21 -25
  241. data/lib/rubocop/cop/lint/nested_percent_literal.rb +17 -5
  242. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -1
  243. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +58 -0
  244. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +95 -15
  245. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +12 -9
  246. data/lib/rubocop/cop/lint/number_conversion.rb +97 -23
  247. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +47 -0
  248. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +39 -0
  249. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +12 -15
  250. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +96 -0
  251. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +31 -12
  252. data/lib/rubocop/cop/lint/percent_string_array.rb +6 -11
  253. data/lib/rubocop/cop/lint/percent_symbol_array.rb +12 -13
  254. data/lib/rubocop/cop/lint/raise_exception.rb +87 -0
  255. data/lib/rubocop/cop/lint/rand_one.rb +5 -4
  256. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +71 -75
  257. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +51 -37
  258. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +50 -0
  259. data/lib/rubocop/cop/lint/redundant_require_statement.rb +9 -10
  260. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +77 -0
  261. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +72 -35
  262. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +8 -15
  263. data/lib/rubocop/cop/lint/redundant_with_index.rb +13 -18
  264. data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -18
  265. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -2
  266. data/lib/rubocop/cop/lint/require_parentheses.rb +4 -6
  267. data/lib/rubocop/cop/lint/rescue_exception.rb +3 -4
  268. data/lib/rubocop/cop/lint/rescue_type.rb +10 -16
  269. data/lib/rubocop/cop/lint/return_in_void_context.rb +3 -6
  270. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +6 -9
  271. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +15 -17
  272. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +12 -4
  273. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  274. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  275. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +11 -19
  276. data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -14
  277. data/lib/rubocop/cop/lint/shadowed_exception.rb +18 -30
  278. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +21 -7
  279. data/lib/rubocop/cop/lint/struct_new_override.rb +59 -0
  280. data/lib/rubocop/cop/lint/suppressed_exception.rb +55 -18
  281. data/lib/rubocop/cop/lint/symbol_conversion.rb +188 -0
  282. data/lib/rubocop/cop/lint/syntax.rb +11 -30
  283. data/lib/rubocop/cop/lint/to_enum_arguments.rb +89 -0
  284. data/lib/rubocop/cop/lint/to_json.rb +21 -13
  285. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  286. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +55 -0
  287. data/lib/rubocop/cop/lint/triple_quotes.rb +71 -0
  288. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +5 -7
  289. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +85 -0
  290. data/lib/rubocop/cop/lint/unified_integer.rb +5 -8
  291. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +204 -0
  292. data/lib/rubocop/cop/lint/unreachable_code.rb +5 -7
  293. data/lib/rubocop/cop/lint/unreachable_loop.rb +186 -0
  294. data/lib/rubocop/cop/lint/unused_block_argument.rb +12 -11
  295. data/lib/rubocop/cop/lint/unused_method_argument.rb +42 -11
  296. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +5 -2
  297. data/lib/rubocop/cop/lint/uri_regexp.rb +12 -47
  298. data/lib/rubocop/cop/lint/useless_access_modifier.rb +38 -22
  299. data/lib/rubocop/cop/lint/useless_assignment.rb +9 -13
  300. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +7 -11
  301. data/lib/rubocop/cop/lint/useless_method_definition.rb +68 -0
  302. data/lib/rubocop/cop/lint/useless_setter_call.rb +15 -9
  303. data/lib/rubocop/cop/lint/useless_times.rb +109 -0
  304. data/lib/rubocop/cop/lint/void.rb +7 -18
  305. data/lib/rubocop/cop/message_annotator.rb +5 -4
  306. data/lib/rubocop/cop/metrics/abc_size.rb +26 -2
  307. data/lib/rubocop/cop/metrics/block_length.rb +40 -10
  308. data/lib/rubocop/cop/metrics/block_nesting.rb +5 -10
  309. data/lib/rubocop/cop/metrics/class_length.rb +40 -11
  310. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +38 -6
  311. data/lib/rubocop/cop/metrics/method_length.rb +32 -4
  312. data/lib/rubocop/cop/metrics/module_length.rb +29 -9
  313. data/lib/rubocop/cop/metrics/parameter_lists.rb +74 -11
  314. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -9
  315. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +76 -15
  316. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +160 -0
  317. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  318. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +143 -0
  319. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +42 -0
  320. data/lib/rubocop/cop/migration/department_name.rb +51 -16
  321. data/lib/rubocop/cop/mixin/alignment.rb +18 -11
  322. data/lib/rubocop/cop/mixin/allowed_identifiers.rb +18 -0
  323. data/lib/rubocop/cop/mixin/allowed_methods.rb +21 -0
  324. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  325. data/lib/rubocop/cop/mixin/array_min_size.rb +2 -4
  326. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  327. data/lib/rubocop/cop/mixin/check_line_breakable.rb +26 -18
  328. data/lib/rubocop/cop/mixin/code_length.rb +29 -8
  329. data/lib/rubocop/cop/mixin/comments_help.rb +42 -0
  330. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +7 -5
  331. data/lib/rubocop/cop/mixin/configurable_formatting.rb +4 -11
  332. data/lib/rubocop/cop/mixin/configurable_max.rb +1 -0
  333. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  334. data/lib/rubocop/cop/mixin/configurable_numbering.rb +4 -3
  335. data/lib/rubocop/cop/mixin/def_node.rb +3 -5
  336. data/lib/rubocop/cop/mixin/documentation_comment.rb +4 -7
  337. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +14 -14
  338. data/lib/rubocop/cop/mixin/empty_parameter.rb +2 -1
  339. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +16 -2
  340. data/lib/rubocop/cop/mixin/enforce_superclass.rb +16 -8
  341. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -3
  342. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +12 -9
  343. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  344. data/lib/rubocop/cop/mixin/hash_transform_method.rb +183 -0
  345. data/lib/rubocop/cop/mixin/ignored_methods.rb +36 -3
  346. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  347. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  348. data/lib/rubocop/cop/mixin/line_length_help.rb +17 -15
  349. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  350. data/lib/rubocop/cop/mixin/method_complexity.rb +26 -6
  351. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  352. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
  353. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -1
  354. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +13 -42
  355. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +14 -14
  356. data/lib/rubocop/cop/mixin/negative_conditional.rb +6 -4
  357. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  358. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +7 -5
  359. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  360. data/lib/rubocop/cop/mixin/percent_array.rb +14 -9
  361. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  362. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -12
  363. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +6 -9
  364. data/lib/rubocop/cop/mixin/range_help.rb +24 -13
  365. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  366. data/lib/rubocop/cop/mixin/rescue_node.rb +13 -7
  367. data/lib/rubocop/cop/mixin/safe_assignment.rb +6 -2
  368. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +6 -7
  369. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +5 -5
  370. data/lib/rubocop/cop/mixin/statement_modifier.rb +45 -22
  371. data/lib/rubocop/cop/mixin/string_help.rb +4 -1
  372. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  373. data/lib/rubocop/cop/mixin/surrounding_space.rb +15 -31
  374. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  375. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  376. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -27
  377. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +25 -32
  378. data/lib/rubocop/cop/mixin/unused_argument.rb +5 -9
  379. data/lib/rubocop/cop/mixin/visibility_help.rb +37 -0
  380. data/lib/rubocop/cop/naming/accessor_method_name.rb +19 -3
  381. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -8
  382. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -7
  383. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  384. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +13 -3
  385. data/lib/rubocop/cop/naming/constant_name.rb +5 -2
  386. data/lib/rubocop/cop/naming/file_name.rb +36 -34
  387. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +12 -6
  388. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +4 -4
  389. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +132 -24
  390. data/lib/rubocop/cop/naming/method_name.rb +31 -3
  391. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  392. data/lib/rubocop/cop/naming/predicate_name.rb +10 -13
  393. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +59 -15
  394. data/lib/rubocop/cop/naming/variable_name.rb +3 -1
  395. data/lib/rubocop/cop/naming/variable_number.rb +94 -9
  396. data/lib/rubocop/cop/offense.rb +35 -12
  397. data/lib/rubocop/cop/registry.rb +100 -24
  398. data/lib/rubocop/cop/security/eval.rb +4 -2
  399. data/lib/rubocop/cop/security/json_load.rb +8 -8
  400. data/lib/rubocop/cop/security/marshal_load.rb +4 -4
  401. data/lib/rubocop/cop/security/open.rb +15 -11
  402. data/lib/rubocop/cop/security/yaml_load.rb +8 -6
  403. data/lib/rubocop/cop/severity.rb +4 -14
  404. data/lib/rubocop/cop/style/access_modifier_declarations.rb +37 -13
  405. data/lib/rubocop/cop/style/accessor_grouping.rb +150 -0
  406. data/lib/rubocop/cop/style/alias.rb +46 -45
  407. data/lib/rubocop/cop/style/and_or.rb +30 -23
  408. data/lib/rubocop/cop/style/arguments_forwarding.rb +143 -0
  409. data/lib/rubocop/cop/style/array_coercion.rb +69 -0
  410. data/lib/rubocop/cop/style/array_join.rb +9 -9
  411. data/lib/rubocop/cop/style/ascii_comments.rb +6 -7
  412. data/lib/rubocop/cop/style/attr.rb +15 -15
  413. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +9 -12
  414. data/lib/rubocop/cop/style/bare_percent_literals.rb +12 -14
  415. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  416. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +125 -0
  417. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  418. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  419. data/lib/rubocop/cop/style/block_delimiters.rb +77 -26
  420. data/lib/rubocop/cop/style/case_equality.rb +55 -4
  421. data/lib/rubocop/cop/style/case_like_if.rb +258 -0
  422. data/lib/rubocop/cop/style/character_literal.rb +12 -15
  423. data/lib/rubocop/cop/style/class_and_module_children.rb +28 -21
  424. data/lib/rubocop/cop/style/class_check.rb +6 -11
  425. data/lib/rubocop/cop/style/class_equality_comparison.rb +67 -0
  426. data/lib/rubocop/cop/style/class_methods.rb +8 -14
  427. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  428. data/lib/rubocop/cop/style/class_vars.rb +23 -7
  429. data/lib/rubocop/cop/style/collection_compact.rb +91 -0
  430. data/lib/rubocop/cop/style/collection_methods.rb +24 -15
  431. data/lib/rubocop/cop/style/colon_method_call.rb +7 -9
  432. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  433. data/lib/rubocop/cop/style/combinable_loops.rb +92 -0
  434. data/lib/rubocop/cop/style/command_literal.rb +22 -28
  435. data/lib/rubocop/cop/style/comment_annotation.rb +24 -21
  436. data/lib/rubocop/cop/style/commented_keyword.rb +34 -21
  437. data/lib/rubocop/cop/style/conditional_assignment.rb +75 -91
  438. data/lib/rubocop/cop/style/constant_visibility.rb +31 -2
  439. data/lib/rubocop/cop/style/copyright.rb +21 -24
  440. data/lib/rubocop/cop/style/date_time.rb +16 -5
  441. data/lib/rubocop/cop/style/def_with_parentheses.rb +9 -12
  442. data/lib/rubocop/cop/style/dir.rb +11 -12
  443. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +87 -0
  444. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +169 -0
  445. data/lib/rubocop/cop/style/documentation.rb +92 -18
  446. data/lib/rubocop/cop/style/documentation_method.rb +2 -1
  447. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  448. data/lib/rubocop/cop/style/double_negation.rb +50 -6
  449. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -10
  450. data/lib/rubocop/cop/style/each_with_object.rb +17 -19
  451. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  452. data/lib/rubocop/cop/style/empty_case_condition.rb +22 -26
  453. data/lib/rubocop/cop/style/empty_else.rb +14 -22
  454. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  455. data/lib/rubocop/cop/style/empty_literal.rb +39 -31
  456. data/lib/rubocop/cop/style/empty_method.rb +12 -23
  457. data/lib/rubocop/cop/style/encoding.rb +6 -10
  458. data/lib/rubocop/cop/style/end_block.rb +7 -4
  459. data/lib/rubocop/cop/style/endless_method.rb +101 -0
  460. data/lib/rubocop/cop/style/eval_with_location.rb +143 -54
  461. data/lib/rubocop/cop/style/even_odd.rb +9 -11
  462. data/lib/rubocop/cop/style/expand_path_arguments.rb +27 -25
  463. data/lib/rubocop/cop/style/explicit_block_argument.rb +114 -0
  464. data/lib/rubocop/cop/style/exponential_notation.rb +116 -0
  465. data/lib/rubocop/cop/style/float_division.rb +60 -11
  466. data/lib/rubocop/cop/style/for.rb +7 -13
  467. data/lib/rubocop/cop/style/format_string.rb +30 -24
  468. data/lib/rubocop/cop/style/format_string_token.rb +78 -22
  469. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +83 -38
  470. data/lib/rubocop/cop/style/global_std_stream.rb +66 -0
  471. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  472. data/lib/rubocop/cop/style/guard_clause.rb +32 -13
  473. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +88 -0
  474. data/lib/rubocop/cop/style/hash_conversion.rb +133 -0
  475. data/lib/rubocop/cop/style/hash_each_methods.rb +86 -0
  476. data/lib/rubocop/cop/style/hash_except.rb +96 -0
  477. data/lib/rubocop/cop/style/hash_like_case.rb +77 -0
  478. data/lib/rubocop/cop/style/hash_syntax.rb +50 -45
  479. data/lib/rubocop/cop/style/hash_transform_keys.rb +95 -0
  480. data/lib/rubocop/cop/style/hash_transform_values.rb +92 -0
  481. data/lib/rubocop/cop/style/identical_conditional_branches.rb +10 -7
  482. data/lib/rubocop/cop/style/if_inside_else.rb +50 -2
  483. data/lib/rubocop/cop/style/if_unless_modifier.rb +76 -46
  484. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  485. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +122 -0
  486. data/lib/rubocop/cop/style/if_with_semicolon.rb +51 -3
  487. data/lib/rubocop/cop/style/implicit_runtime_error.rb +3 -1
  488. data/lib/rubocop/cop/style/infinite_loop.rb +27 -26
  489. data/lib/rubocop/cop/style/inline_comment.rb +4 -4
  490. data/lib/rubocop/cop/style/inverse_methods.rb +34 -42
  491. data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
  492. data/lib/rubocop/cop/style/keyword_parameters_order.rb +75 -0
  493. data/lib/rubocop/cop/style/lambda.rb +11 -17
  494. data/lib/rubocop/cop/style/lambda_call.rb +18 -35
  495. data/lib/rubocop/cop/style/line_end_concatenation.rb +21 -25
  496. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +58 -207
  497. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +189 -0
  498. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +44 -0
  499. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +19 -12
  500. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +14 -7
  501. data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -24
  502. data/lib/rubocop/cop/style/min_max.rb +10 -14
  503. data/lib/rubocop/cop/style/missing_else.rb +13 -25
  504. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +11 -5
  505. data/lib/rubocop/cop/style/mixin_grouping.rb +27 -40
  506. data/lib/rubocop/cop/style/mixin_usage.rb +12 -30
  507. data/lib/rubocop/cop/style/module_function.rb +70 -25
  508. data/lib/rubocop/cop/style/multiline_block_chain.rb +13 -5
  509. data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -11
  510. data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
  511. data/lib/rubocop/cop/style/multiline_memoization.rb +15 -13
  512. data/lib/rubocop/cop/style/multiline_method_signature.rb +33 -3
  513. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +32 -11
  514. data/lib/rubocop/cop/style/multiline_when_then.rb +31 -11
  515. data/lib/rubocop/cop/style/multiple_comparison.rb +76 -11
  516. data/lib/rubocop/cop/style/mutable_constant.rb +41 -33
  517. data/lib/rubocop/cop/style/negated_if.rb +10 -11
  518. data/lib/rubocop/cop/style/negated_if_else_condition.rb +120 -0
  519. data/lib/rubocop/cop/style/negated_unless.rb +10 -11
  520. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  521. data/lib/rubocop/cop/style/nested_modifier.rb +10 -17
  522. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +23 -20
  523. data/lib/rubocop/cop/style/nested_ternary_operator.rb +30 -4
  524. data/lib/rubocop/cop/style/next.rb +18 -27
  525. data/lib/rubocop/cop/style/nil_comparison.rb +19 -11
  526. data/lib/rubocop/cop/style/nil_lambda.rb +53 -0
  527. data/lib/rubocop/cop/style/non_nil_check.rb +56 -34
  528. data/lib/rubocop/cop/style/not.rb +20 -26
  529. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -11
  530. data/lib/rubocop/cop/style/numeric_literals.rb +19 -27
  531. data/lib/rubocop/cop/style/numeric_predicate.rb +17 -24
  532. data/lib/rubocop/cop/style/one_line_conditional.rb +75 -29
  533. data/lib/rubocop/cop/style/option_hash.rb +3 -4
  534. data/lib/rubocop/cop/style/optional_arguments.rb +4 -7
  535. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +53 -0
  536. data/lib/rubocop/cop/style/or_assignment.rb +14 -12
  537. data/lib/rubocop/cop/style/parallel_assignment.rb +27 -24
  538. data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -6
  539. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +22 -30
  540. data/lib/rubocop/cop/style/percent_q_literals.rb +9 -12
  541. data/lib/rubocop/cop/style/perl_backrefs.rb +84 -16
  542. data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -18
  543. data/lib/rubocop/cop/style/proc.rb +8 -8
  544. data/lib/rubocop/cop/style/raise_args.rb +39 -37
  545. data/lib/rubocop/cop/style/random_with_offset.rb +30 -35
  546. data/lib/rubocop/cop/style/redundant_argument.rb +85 -0
  547. data/lib/rubocop/cop/style/redundant_assignment.rb +106 -0
  548. data/lib/rubocop/cop/style/redundant_begin.rb +79 -13
  549. data/lib/rubocop/cop/style/redundant_capital_w.rb +7 -11
  550. data/lib/rubocop/cop/style/redundant_condition.rb +43 -18
  551. data/lib/rubocop/cop/style/redundant_conditional.rb +14 -15
  552. data/lib/rubocop/cop/style/redundant_exception.rb +22 -17
  553. data/lib/rubocop/cop/style/redundant_fetch_block.rb +115 -0
  554. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +52 -0
  555. data/lib/rubocop/cop/style/redundant_freeze.rb +16 -14
  556. data/lib/rubocop/cop/style/redundant_interpolation.rb +32 -27
  557. data/lib/rubocop/cop/style/redundant_parentheses.rb +51 -38
  558. data/lib/rubocop/cop/style/redundant_percent_q.rb +14 -17
  559. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +104 -0
  560. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +118 -0
  561. data/lib/rubocop/cop/style/redundant_return.rb +29 -29
  562. data/lib/rubocop/cop/style/redundant_self.rb +27 -29
  563. data/lib/rubocop/cop/style/redundant_self_assignment.rb +118 -0
  564. data/lib/rubocop/cop/style/redundant_sort.rb +32 -37
  565. data/lib/rubocop/cop/style/redundant_sort_by.rb +6 -9
  566. data/lib/rubocop/cop/style/regexp_literal.rb +14 -29
  567. data/lib/rubocop/cop/style/rescue_modifier.rb +39 -12
  568. data/lib/rubocop/cop/style/rescue_standard_error.rb +25 -23
  569. data/lib/rubocop/cop/style/return_nil.rb +13 -8
  570. data/lib/rubocop/cop/style/safe_navigation.rb +44 -39
  571. data/lib/rubocop/cop/style/sample.rb +14 -15
  572. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  573. data/lib/rubocop/cop/style/semicolon.rb +10 -10
  574. data/lib/rubocop/cop/style/send.rb +5 -7
  575. data/lib/rubocop/cop/style/signal_exception.rb +32 -27
  576. data/lib/rubocop/cop/style/single_argument_dig.rb +55 -0
  577. data/lib/rubocop/cop/style/single_line_block_params.rb +34 -12
  578. data/lib/rubocop/cop/style/single_line_methods.rb +65 -18
  579. data/lib/rubocop/cop/style/slicing_with_range.rb +38 -0
  580. data/lib/rubocop/cop/style/sole_nested_conditional.rb +167 -0
  581. data/lib/rubocop/cop/style/special_global_vars.rb +18 -51
  582. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +18 -25
  583. data/lib/rubocop/cop/style/static_class.rb +97 -0
  584. data/lib/rubocop/cop/style/stderr_puts.rb +9 -13
  585. data/lib/rubocop/cop/style/string_chars.rb +39 -0
  586. data/lib/rubocop/cop/style/string_concatenation.rb +142 -0
  587. data/lib/rubocop/cop/style/string_hash_keys.rb +8 -7
  588. data/lib/rubocop/cop/style/string_literals.rb +16 -13
  589. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +4 -3
  590. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  591. data/lib/rubocop/cop/style/strip.rb +10 -14
  592. data/lib/rubocop/cop/style/struct_inheritance.rb +33 -4
  593. data/lib/rubocop/cop/style/swap_values.rb +108 -0
  594. data/lib/rubocop/cop/style/symbol_array.rb +13 -24
  595. data/lib/rubocop/cop/style/symbol_literal.rb +5 -9
  596. data/lib/rubocop/cop/style/symbol_proc.rb +50 -32
  597. data/lib/rubocop/cop/style/ternary_parentheses.rb +30 -35
  598. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  599. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +10 -9
  600. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  601. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +37 -27
  602. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +43 -5
  603. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +86 -0
  604. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +46 -5
  605. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +12 -38
  606. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +16 -31
  607. data/lib/rubocop/cop/style/trivial_accessors.rb +36 -40
  608. data/lib/rubocop/cop/style/unless_else.rb +7 -11
  609. data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
  610. data/lib/rubocop/cop/style/unpack_first.rb +5 -11
  611. data/lib/rubocop/cop/style/variable_interpolation.rb +8 -11
  612. data/lib/rubocop/cop/style/when_then.rb +5 -9
  613. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  614. data/lib/rubocop/cop/style/while_until_modifier.rb +16 -24
  615. data/lib/rubocop/cop/style/word_array.rb +6 -25
  616. data/lib/rubocop/cop/style/yoda_condition.rb +33 -19
  617. data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -23
  618. data/lib/rubocop/cop/team.rb +147 -84
  619. data/lib/rubocop/cop/util.rb +43 -27
  620. data/lib/rubocop/cop/utils/format_string.rb +22 -9
  621. data/lib/rubocop/cop/variable_force.rb +15 -27
  622. data/lib/rubocop/cop/variable_force/assignment.rb +2 -2
  623. data/lib/rubocop/cop/variable_force/branch.rb +3 -9
  624. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  625. data/lib/rubocop/cop/variable_force/scope.rb +6 -9
  626. data/lib/rubocop/cop/variable_force/variable.rb +9 -12
  627. data/lib/rubocop/cops_documentation_generator.rb +270 -0
  628. data/lib/rubocop/core_ext/string.rb +2 -2
  629. data/lib/rubocop/directive_comment.rb +92 -0
  630. data/lib/rubocop/error.rb +1 -0
  631. data/lib/rubocop/ext/processed_source.rb +18 -0
  632. data/lib/rubocop/ext/regexp_node.rb +87 -0
  633. data/lib/rubocop/ext/regexp_parser.rb +92 -0
  634. data/lib/rubocop/file_finder.rb +12 -13
  635. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  636. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  637. data/lib/rubocop/formatter/clang_style_formatter.rb +5 -3
  638. data/lib/rubocop/formatter/disabled_config_formatter.rb +39 -30
  639. data/lib/rubocop/formatter/emacs_style_formatter.rb +2 -0
  640. data/lib/rubocop/formatter/formatter_set.rb +6 -6
  641. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +44 -0
  642. data/lib/rubocop/formatter/html_formatter.rb +6 -10
  643. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  644. data/lib/rubocop/formatter/junit_formatter.rb +78 -0
  645. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -2
  646. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  647. data/lib/rubocop/formatter/progress_formatter.rb +3 -4
  648. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  649. data/lib/rubocop/formatter/simple_text_formatter.rb +40 -7
  650. data/lib/rubocop/formatter/tap_formatter.rb +7 -3
  651. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -2
  652. data/lib/rubocop/lockfile.rb +40 -0
  653. data/lib/rubocop/magic_comment.rb +33 -4
  654. data/lib/rubocop/name_similarity.rb +18 -10
  655. data/lib/rubocop/options.rb +124 -77
  656. data/lib/rubocop/path_util.rb +20 -22
  657. data/lib/rubocop/platform.rb +1 -1
  658. data/lib/rubocop/rake_task.rb +12 -11
  659. data/lib/rubocop/remote_config.rb +6 -10
  660. data/lib/rubocop/result_cache.rb +50 -31
  661. data/lib/rubocop/rspec/cop_helper.rb +11 -35
  662. data/lib/rubocop/rspec/expect_offense.rb +129 -40
  663. data/lib/rubocop/rspec/shared_contexts.rb +78 -35
  664. data/lib/rubocop/runner.rb +112 -75
  665. data/lib/rubocop/string_interpreter.rb +3 -0
  666. data/lib/rubocop/target_finder.rb +53 -50
  667. data/lib/rubocop/target_ruby.rb +264 -0
  668. data/lib/rubocop/util.rb +16 -0
  669. data/lib/rubocop/version.rb +71 -7
  670. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  671. metadata +208 -94
  672. data/bin/console +0 -10
  673. data/bin/setup +0 -7
  674. data/lib/rubocop/ast/builder.rb +0 -82
  675. data/lib/rubocop/ast/node.rb +0 -644
  676. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  677. data/lib/rubocop/ast/node/and_node.rb +0 -29
  678. data/lib/rubocop/ast/node/args_node.rb +0 -29
  679. data/lib/rubocop/ast/node/array_node.rb +0 -57
  680. data/lib/rubocop/ast/node/block_node.rb +0 -117
  681. data/lib/rubocop/ast/node/break_node.rb +0 -17
  682. data/lib/rubocop/ast/node/case_node.rb +0 -56
  683. data/lib/rubocop/ast/node/class_node.rb +0 -31
  684. data/lib/rubocop/ast/node/def_node.rb +0 -71
  685. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  686. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  687. data/lib/rubocop/ast/node/float_node.rb +0 -12
  688. data/lib/rubocop/ast/node/for_node.rb +0 -53
  689. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  690. data/lib/rubocop/ast/node/if_node.rb +0 -175
  691. data/lib/rubocop/ast/node/int_node.rb +0 -12
  692. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  693. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  694. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  695. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  696. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  697. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  698. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -261
  699. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  700. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  701. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  702. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  703. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  704. data/lib/rubocop/ast/node/module_node.rb +0 -24
  705. data/lib/rubocop/ast/node/or_node.rb +0 -29
  706. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  707. data/lib/rubocop/ast/node/range_node.rb +0 -18
  708. data/lib/rubocop/ast/node/regexp_node.rb +0 -35
  709. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  710. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  711. data/lib/rubocop/ast/node/return_node.rb +0 -24
  712. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  713. data/lib/rubocop/ast/node/send_node.rb +0 -13
  714. data/lib/rubocop/ast/node/str_node.rb +0 -16
  715. data/lib/rubocop/ast/node/super_node.rb +0 -21
  716. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  717. data/lib/rubocop/ast/node/until_node.rb +0 -35
  718. data/lib/rubocop/ast/node/when_node.rb +0 -53
  719. data/lib/rubocop/ast/node/while_node.rb +0 -35
  720. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  721. data/lib/rubocop/ast/sexp.rb +0 -16
  722. data/lib/rubocop/ast/traversal.rb +0 -183
  723. data/lib/rubocop/cop/layout/tab.rb +0 -75
  724. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  725. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  726. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  727. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  728. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  729. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
  730. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
  731. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  732. data/lib/rubocop/node_pattern.rb +0 -801
  733. data/lib/rubocop/processed_source.rb +0 -216
  734. data/lib/rubocop/string_util.rb +0 -14
  735. data/lib/rubocop/token.rb +0 -114
@@ -41,8 +41,7 @@ module RuboCop
41
41
  #
42
42
  # @see https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-format
43
43
  class FormatSequence
44
- attr_reader :begin_pos, :end_pos
45
- attr_reader :flags, :width, :precision, :name, :type
44
+ attr_reader :begin_pos, :end_pos, :flags, :width, :precision, :name, :type
46
45
 
47
46
  def initialize(match)
48
47
  @source = match[0]
@@ -73,9 +72,7 @@ module RuboCop
73
72
  end
74
73
 
75
74
  def max_digit_dollar_num
76
- @source.scan(DIGIT_DOLLAR).map do |(digit_dollar_num)|
77
- digit_dollar_num.to_i
78
- end.max
75
+ @source.scan(DIGIT_DOLLAR).map { |(digit_dollar_num)| digit_dollar_num.to_i }.max
79
76
  end
80
77
 
81
78
  def style
@@ -97,6 +94,10 @@ module RuboCop
97
94
  @format_sequences ||= parse
98
95
  end
99
96
 
97
+ def valid?
98
+ !mixed_formats?
99
+ end
100
+
100
101
  def named_interpolation?
101
102
  format_sequences.any?(&:name)
102
103
  end
@@ -108,11 +109,23 @@ module RuboCop
108
109
  private
109
110
 
110
111
  def parse
111
- @source.to_enum(:scan, SEQUENCE).map do
112
- FormatSequence.new(
113
- Regexp.last_match
114
- )
112
+ matches = []
113
+ @source.scan(SEQUENCE) { matches << FormatSequence.new(Regexp.last_match) }
114
+ matches
115
+ end
116
+
117
+ def mixed_formats?
118
+ formats = format_sequences.reject(&:percent?).map do |seq|
119
+ if seq.name
120
+ :named
121
+ elsif seq.max_digit_dollar_num
122
+ :numbered
123
+ else
124
+ :unnumbered
125
+ end
115
126
  end
127
+
128
+ formats.uniq.size > 1
116
129
  end
117
130
  end
118
131
  end
@@ -22,11 +22,12 @@ module RuboCop
22
22
  #
23
23
  # def after_declaring_variable(variable, variable_table)
24
24
  # end
25
+ #
26
+ # @api private
25
27
  class VariableForce < Force # rubocop:disable Metrics/ClassLength
26
28
  VARIABLE_ASSIGNMENT_TYPE = :lvasgn
27
29
  REGEXP_NAMED_CAPTURE_TYPE = :match_with_lvasgn
28
- VARIABLE_ASSIGNMENT_TYPES =
29
- [VARIABLE_ASSIGNMENT_TYPE, REGEXP_NAMED_CAPTURE_TYPE].freeze
30
+ VARIABLE_ASSIGNMENT_TYPES = [VARIABLE_ASSIGNMENT_TYPE, REGEXP_NAMED_CAPTURE_TYPE].freeze
30
31
 
31
32
  ARGUMENT_DECLARATION_TYPES = [
32
33
  :arg, :optarg, :restarg,
@@ -36,8 +37,7 @@ module RuboCop
36
37
  ].freeze
37
38
 
38
39
  LOGICAL_OPERATOR_ASSIGNMENT_TYPES = %i[or_asgn and_asgn].freeze
39
- OPERATOR_ASSIGNMENT_TYPES =
40
- (LOGICAL_OPERATOR_ASSIGNMENT_TYPES + [:op_asgn]).freeze
40
+ OPERATOR_ASSIGNMENT_TYPES = (LOGICAL_OPERATOR_ASSIGNMENT_TYPES + [:op_asgn]).freeze
41
41
 
42
42
  MULTIPLE_ASSIGNMENT_TYPE = :masgn
43
43
 
@@ -152,9 +152,7 @@ module RuboCop
152
152
  def process_variable_assignment(node)
153
153
  name = node.children.first
154
154
 
155
- unless variable_table.variable_exist?(name)
156
- variable_table.declare_variable(name, node)
157
- end
155
+ variable_table.declare_variable(name, node) unless variable_table.variable_exist?(name)
158
156
 
159
157
  # Need to scan rhs before assignment so that we can mark previous
160
158
  # assignments as referenced if rhs has referencing to the variable
@@ -182,21 +180,21 @@ module RuboCop
182
180
  process_node(rhs_node)
183
181
  process_node(regexp_node)
184
182
 
185
- variable_names.each do |name|
186
- variable_table.assign_to_variable(name, node)
187
- end
183
+ variable_names.each { |name| variable_table.assign_to_variable(name, node) }
188
184
 
189
185
  skip_children!
190
186
  end
191
187
 
192
188
  def regexp_captured_names(node)
193
- regexp_string = node.children[0].children[0] || ''
189
+ regexp_string = node.children.select(&:str_type?).map do |child|
190
+ child.children.first
191
+ end.join || ''
192
+
194
193
  regexp = Regexp.new(regexp_string)
195
194
 
196
195
  regexp.named_captures.keys
197
196
  end
198
197
 
199
- # rubocop:disable Metrics/AbcSize
200
198
  def process_variable_operator_assignment(node)
201
199
  if LOGICAL_OPERATOR_ASSIGNMENT_TYPES.include?(node.type)
202
200
  asgn_node, rhs_node = *node
@@ -208,9 +206,7 @@ module RuboCop
208
206
 
209
207
  name = asgn_node.children.first
210
208
 
211
- unless variable_table.variable_exist?(name)
212
- variable_table.declare_variable(name, asgn_node)
213
- end
209
+ variable_table.declare_variable(name, asgn_node) unless variable_table.variable_exist?(name)
214
210
 
215
211
  # The following statements:
216
212
  #
@@ -233,7 +229,6 @@ module RuboCop
233
229
 
234
230
  skip_children!
235
231
  end
236
- # rubocop:enable Metrics/AbcSize
237
232
 
238
233
  def process_variable_multiple_assignment(node)
239
234
  lhs_node, rhs_node = *node
@@ -305,17 +300,14 @@ module RuboCop
305
300
  return unless method_name == :binding
306
301
  return if args && !args.children.empty?
307
302
 
308
- variable_table.accessible_variables.each do |variable|
309
- variable.reference!(node)
310
- end
303
+ variable_table.accessible_variables.each { |variable| variable.reference!(node) }
311
304
  end
312
305
 
313
306
  # Mark all assignments which are referenced in the same loop
314
307
  # as referenced by ignoring AST order since they would be referenced
315
308
  # in next iteration.
316
309
  def mark_assignments_as_referenced_in_loop(node)
317
- referenced_variable_names_in_loop, assignment_nodes_in_loop =
318
- find_variables_in_loop(node)
310
+ referenced_variable_names_in_loop, assignment_nodes_in_loop = find_variables_in_loop(node)
319
311
 
320
312
  referenced_variable_names_in_loop.each do |name|
321
313
  variable = variable_table.find_variable(name)
@@ -366,17 +358,13 @@ module RuboCop
366
358
  AssignmentReference.new(node)
367
359
  when *OPERATOR_ASSIGNMENT_TYPES
368
360
  asgn_node = node.children.first
369
- if asgn_node.lvasgn_type?
370
- VariableReference.new(asgn_node.children.first)
371
- end
361
+ VariableReference.new(asgn_node.children.first) if asgn_node.lvasgn_type?
372
362
  end
373
363
  end
374
364
 
375
365
  # Use Node#equal? for accurate check.
376
366
  def scanned_node?(node)
377
- scanned_nodes.any? do |scanned_node|
378
- scanned_node.equal?(node)
379
- end
367
+ scanned_nodes.any? { |scanned_node| scanned_node.equal?(node) }
380
368
  end
381
369
 
382
370
  def scanned_nodes
@@ -10,6 +10,7 @@ module RuboCop
10
10
  MULTIPLE_LEFT_HAND_SIDE_TYPE = :mlhs
11
11
 
12
12
  attr_reader :node, :variable, :referenced, :references
13
+
13
14
  alias referenced? referenced
14
15
 
15
16
  def initialize(node, variable)
@@ -65,8 +66,7 @@ module RuboCop
65
66
 
66
67
  def meta_assignment_node
67
68
  unless instance_variable_defined?(:@meta_assignment_node)
68
- @meta_assignment_node =
69
- operator_assignment_node || multiple_assignment_node
69
+ @meta_assignment_node = operator_assignment_node || multiple_assignment_node
70
70
  end
71
71
 
72
72
  @meta_assignment_node
@@ -20,8 +20,6 @@ module RuboCop
20
20
  nil
21
21
  end
22
22
 
23
- # rubocop:disable Metrics/BlockLength
24
-
25
23
  # Abstract base class for branch classes.
26
24
  # A branch represents a conditional branch in a scope.
27
25
  #
@@ -42,13 +40,12 @@ module RuboCop
42
40
  # do_something # no branch
43
41
  # end
44
42
  Base = Struct.new(:child_node, :scope) do
45
- # rubocop:enable Metrics/BlockLength
46
-
47
43
  def self.classes
48
44
  @classes ||= []
49
45
  end
50
46
 
51
47
  def self.inherited(subclass)
48
+ super
52
49
  classes << subclass
53
50
  end
54
51
 
@@ -81,9 +78,7 @@ module RuboCop
81
78
  end
82
79
 
83
80
  def each_ancestor(include_self: false, &block)
84
- unless block_given?
85
- return to_enum(__method__, include_self: include_self)
86
- end
81
+ return to_enum(__method__, include_self: include_self) unless block
87
82
 
88
83
  yield self if include_self
89
84
  scan_ancestors(&block)
@@ -126,8 +121,7 @@ module RuboCop
126
121
  def ==(other)
127
122
  return false unless other
128
123
 
129
- control_node.equal?(other.control_node) &&
130
- child_node.equal?(other.child_node)
124
+ control_node.equal?(other.control_node) && child_node.equal?(other.child_node)
131
125
  end
132
126
 
133
127
  alias_method :eql?, :==
@@ -8,9 +8,7 @@ module RuboCop
8
8
  include Branchable
9
9
 
10
10
  VARIABLE_REFERENCE_TYPES = (
11
- [VARIABLE_REFERENCE_TYPE] +
12
- OPERATOR_ASSIGNMENT_TYPES +
13
- [ZERO_ARITY_SUPER_TYPE, SEND_TYPE]
11
+ [VARIABLE_REFERENCE_TYPE] + OPERATOR_ASSIGNMENT_TYPES + [ZERO_ARITY_SUPER_TYPE, SEND_TYPE]
14
12
  ).freeze
15
13
 
16
14
  attr_reader :node, :scope
@@ -16,16 +16,16 @@ module RuboCop
16
16
  }.freeze
17
17
 
18
18
  attr_reader :node, :variables, :naked_top_level
19
+
19
20
  alias naked_top_level? naked_top_level
20
21
 
21
22
  def initialize(node)
22
23
  unless SCOPE_TYPES.include?(node.type)
23
24
  # Accept any node type for top level scope
24
25
  if node.parent
25
- raise ArgumentError,
26
- "Node type must be any of #{SCOPE_TYPES}, " \
27
- "passed #{node.type}"
26
+ raise ArgumentError, "Node type must be any of #{SCOPE_TYPES}, passed #{node.type}"
28
27
  end
28
+
29
29
  @naked_top_level = true
30
30
  end
31
31
  @node = node
@@ -55,12 +55,11 @@ module RuboCop
55
55
  end
56
56
 
57
57
  def include?(target_node)
58
- !belong_to_outer_scope?(target_node) &&
59
- !belong_to_inner_scope?(target_node)
58
+ !belong_to_outer_scope?(target_node) && !belong_to_inner_scope?(target_node)
60
59
  end
61
60
 
62
61
  def each_node(&block)
63
- return to_enum(__method__) unless block_given?
62
+ return to_enum(__method__) unless block
64
63
 
65
64
  yield node if naked_top_level?
66
65
  scan_node(node, &block)
@@ -99,9 +98,7 @@ module RuboCop
99
98
  end
100
99
 
101
100
  def ancestor_node?(target_node)
102
- node.each_ancestor.any? do |ancestor_node|
103
- ancestor_node.equal?(target_node)
104
- end
101
+ node.each_ancestor.any? { |ancestor_node| ancestor_node.equal?(target_node) }
105
102
  end
106
103
  end
107
104
  end
@@ -6,11 +6,10 @@ module RuboCop
6
6
  # A Variable represents existence of a local variable.
7
7
  # This holds a variable declaration node and some states of the variable.
8
8
  class Variable
9
- VARIABLE_DECLARATION_TYPES =
10
- (VARIABLE_ASSIGNMENT_TYPES + ARGUMENT_DECLARATION_TYPES).freeze
9
+ VARIABLE_DECLARATION_TYPES = (VARIABLE_ASSIGNMENT_TYPES + ARGUMENT_DECLARATION_TYPES).freeze
10
+
11
+ attr_reader :name, :declaration_node, :scope, :assignments, :references, :captured_by_block
11
12
 
12
- attr_reader :name, :declaration_node, :scope,
13
- :assignments, :references, :captured_by_block
14
13
  alias captured_by_block? captured_by_block
15
14
 
16
15
  def initialize(name, declaration_node, scope)
@@ -37,18 +36,16 @@ module RuboCop
37
36
  !@references.empty?
38
37
  end
39
38
 
40
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
39
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
41
40
  def reference!(node)
42
41
  reference = Reference.new(node, @scope)
43
42
  @references << reference
44
- consumed_branches = Set.new
43
+ consumed_branches = nil
45
44
 
46
45
  @assignments.reverse_each do |assignment|
47
- next if consumed_branches.include?(assignment.branch)
46
+ next if consumed_branches&.include?(assignment.branch)
48
47
 
49
- unless assignment.run_exclusively_with?(reference)
50
- assignment.reference!(node)
51
- end
48
+ assignment.reference!(node) unless assignment.run_exclusively_with?(reference)
52
49
 
53
50
  # Modifier if/unless conditions are special. Assignments made in
54
51
  # them do not put the assigned variable in scope to the left of the
@@ -60,11 +57,11 @@ module RuboCop
60
57
  break if !assignment.branch || assignment.branch == reference.branch
61
58
 
62
59
  unless assignment.branch.may_run_incompletely?
63
- consumed_branches << assignment.branch
60
+ (consumed_branches ||= Set.new) << assignment.branch
64
61
  end
65
62
  end
66
63
  end
67
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
64
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
68
65
 
69
66
  def in_modifier_if?(assignment)
70
67
  parent = assignment.node.parent
@@ -0,0 +1,270 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Class for generating documentation of all cops departments
4
+ # @api private
5
+ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
6
+ include ::RuboCop::Cop::Documentation
7
+ # This class will only generate documentation for cops that belong to one of
8
+ # the departments given in the `departments` array. E.g. if we only wanted
9
+ # documentation for Lint cops:
10
+ #
11
+ # CopsDocumentationGenerator.new(departments: ['Lint']).call
12
+ #
13
+ def initialize(departments: [])
14
+ @departments = departments.map(&:to_sym).sort!
15
+ @cops = RuboCop::Cop::Registry.global
16
+ @config = RuboCop::ConfigLoader.default_configuration
17
+ end
18
+
19
+ def call
20
+ YARD::Registry.load!
21
+ departments.each { |department| print_cops_of_department(department) }
22
+
23
+ print_table_of_contents
24
+ ensure
25
+ RuboCop::ConfigLoader.default_configuration = nil
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :departments, :cops, :config
31
+
32
+ def cops_of_department(department)
33
+ cops.with_department(department).sort!
34
+ end
35
+
36
+ def cops_body(cop, description, examples_objects, pars)
37
+ content = h2(cop.cop_name)
38
+ content << required_ruby_version(cop)
39
+ content << properties(cop)
40
+ content << "#{description}\n"
41
+ content << examples(examples_objects) if examples_objects.count.positive?
42
+ content << configurations(pars)
43
+ content << references(cop)
44
+ content
45
+ end
46
+
47
+ def examples(examples_object)
48
+ examples_object.each_with_object(h3('Examples').dup) do |example, content|
49
+ content << "\n" unless content.end_with?("\n\n")
50
+ content << h4(example.name) unless example.name == ''
51
+ content << code_example(example)
52
+ end
53
+ end
54
+
55
+ def required_ruby_version(cop)
56
+ return '' unless cop.respond_to?(:required_minimum_ruby_version)
57
+
58
+ "NOTE: Required Ruby version: #{cop.required_minimum_ruby_version}\n\n"
59
+ end
60
+
61
+ # rubocop:disable Metrics/MethodLength
62
+ def properties(cop)
63
+ header = [
64
+ 'Enabled by default', 'Safe', 'Supports autocorrection', 'VersionAdded',
65
+ 'VersionChanged'
66
+ ]
67
+ autocorrect = if cop.support_autocorrect?
68
+ "Yes#{' (Unsafe)' unless cop.new(config).safe_autocorrect?}"
69
+ else
70
+ 'No'
71
+ end
72
+ cop_config = config.for_cop(cop)
73
+ content = [[
74
+ cop_status(cop_config.fetch('Enabled')),
75
+ cop_config.fetch('Safe', true) ? 'Yes' : 'No',
76
+ autocorrect,
77
+ cop_config.fetch('VersionAdded', '-'),
78
+ cop_config.fetch('VersionChanged', '-')
79
+ ]]
80
+ "#{to_table(header, content)}\n"
81
+ end
82
+ # rubocop:enable Metrics/MethodLength
83
+
84
+ def h2(title)
85
+ content = +"\n"
86
+ content << "== #{title}\n"
87
+ content << "\n"
88
+ content
89
+ end
90
+
91
+ def h3(title)
92
+ content = +"\n"
93
+ content << "=== #{title}\n"
94
+ content << "\n"
95
+ content
96
+ end
97
+
98
+ def h4(title)
99
+ content = +"==== #{title}\n"
100
+ content << "\n"
101
+ content
102
+ end
103
+
104
+ def code_example(ruby_code)
105
+ content = +"[source,ruby]\n----\n"
106
+ content << ruby_code.text.gsub('@good', '# good').gsub('@bad', '# bad').strip
107
+ content << "\n----\n"
108
+ content
109
+ end
110
+
111
+ def configurations(pars)
112
+ return '' if pars.empty?
113
+
114
+ header = ['Name', 'Default value', 'Configurable values']
115
+ configs = pars
116
+ .each_key
117
+ .reject { |key| key.start_with?('Supported') }
118
+ .reject { |key| key.start_with?('AllowMultipleStyles') }
119
+ content = configs.map do |name|
120
+ configurable = configurable_values(pars, name)
121
+ default = format_table_value(pars[name])
122
+ [name, default, configurable]
123
+ end
124
+
125
+ h3('Configurable attributes') + to_table(header, content)
126
+ end
127
+
128
+ # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
129
+ def configurable_values(pars, name)
130
+ case name
131
+ when /^Enforced/
132
+ supported_style_name = RuboCop::Cop::Util.to_supported_styles(name)
133
+ format_table_value(pars[supported_style_name])
134
+ when 'IndentationWidth'
135
+ 'Integer'
136
+ when 'Database'
137
+ format_table_value(pars['SupportedDatabases'])
138
+ else
139
+ case pars[name]
140
+ when String
141
+ 'String'
142
+ when Integer
143
+ 'Integer'
144
+ when Float
145
+ 'Float'
146
+ when true, false
147
+ 'Boolean'
148
+ when Array
149
+ 'Array'
150
+ else
151
+ ''
152
+ end
153
+ end
154
+ end
155
+ # rubocop:enable Metrics/CyclomaticComplexity,Metrics/MethodLength
156
+
157
+ def to_table(header, content)
158
+ table = ['|===', "| #{header.join(' | ')}\n\n"].join("\n")
159
+ marked_contents = content.map do |plain_content|
160
+ plain_content.map { |c| "| #{c}" }.join("\n")
161
+ end
162
+ table << marked_contents.join("\n\n")
163
+ table << "\n|===\n"
164
+ end
165
+
166
+ def format_table_value(val)
167
+ value =
168
+ case val
169
+ when Array
170
+ if val.empty?
171
+ '`[]`'
172
+ else
173
+ val.map { |config| format_table_value(config) }.join(', ')
174
+ end
175
+ else
176
+ wrap_backtick(val.nil? ? '<none>' : val)
177
+ end
178
+ value.gsub("#{Dir.pwd}/", '').rstrip
179
+ end
180
+
181
+ def wrap_backtick(value)
182
+ if value.is_a?(String)
183
+ # Use `+` to prevent text like `**/*.gemspec` from being bold.
184
+ value.start_with?('*') ? "`+#{value}+`" : "`#{value}`"
185
+ else
186
+ "`#{value}`"
187
+ end
188
+ end
189
+
190
+ def references(cop)
191
+ cop_config = config.for_cop(cop)
192
+ urls = RuboCop::Cop::MessageAnnotator.new(config, cop.name, cop_config, {}).urls
193
+ return '' if urls.empty?
194
+
195
+ content = h3('References')
196
+ content << urls.map { |url| "* #{url}" }.join("\n")
197
+ content << "\n"
198
+ content
199
+ end
200
+
201
+ def print_cops_of_department(department)
202
+ selected_cops = cops_of_department(department)
203
+ content = +"= #{department}\n"
204
+ selected_cops.each { |cop| content << print_cop_with_doc(cop) }
205
+ file_name = "#{Dir.pwd}/docs/modules/ROOT/pages/#{department_to_basename(department)}.adoc"
206
+ File.open(file_name, 'w') do |file|
207
+ puts "* generated #{file_name}"
208
+ file.write("#{content.strip}\n")
209
+ end
210
+ end
211
+
212
+ def print_cop_with_doc(cop)
213
+ cop_config = config.for_cop(cop)
214
+ non_display_keys = %w[
215
+ Description Enabled StyleGuide Reference Safe SafeAutoCorrect VersionAdded
216
+ VersionChanged
217
+ ]
218
+ pars = cop_config.reject { |k| non_display_keys.include? k }
219
+ description = 'No documentation'
220
+ examples_object = []
221
+ cop_code(cop) do |code_object|
222
+ description = code_object.docstring unless code_object.docstring.blank?
223
+ examples_object = code_object.tags('example')
224
+ end
225
+ cops_body(cop, description, examples_object, pars)
226
+ end
227
+
228
+ def cop_code(cop)
229
+ YARD::Registry.all(:class).detect do |code_object|
230
+ next unless RuboCop::Cop::Badge.for(code_object.to_s) == cop.badge
231
+
232
+ yield code_object
233
+ end
234
+ end
235
+
236
+ def table_of_content_for_department(department)
237
+ type_title = department[0].upcase + department[1..-1]
238
+ filename = "#{department_to_basename(department)}.adoc"
239
+ content = +"=== Department xref:#{filename}[#{type_title}]\n\n"
240
+ cops_of_department(department).each do |cop|
241
+ anchor = cop.cop_name.sub('/', '').downcase
242
+ content << "* xref:#{filename}##{anchor}[#{cop.cop_name}]\n"
243
+ end
244
+
245
+ content
246
+ end
247
+
248
+ def print_table_of_contents
249
+ path = "#{Dir.pwd}/docs/modules/ROOT/pages/cops.adoc"
250
+ original = File.read(path)
251
+ content = +"// START_COP_LIST\n\n"
252
+
253
+ content << table_contents
254
+
255
+ content << "\n// END_COP_LIST"
256
+
257
+ content = original.sub(%r{// START_COP_LIST.+// END_COP_LIST}m, content)
258
+ File.write(path, content)
259
+ end
260
+
261
+ def table_contents
262
+ departments.map { |department| table_of_content_for_department(department) }.join("\n")
263
+ end
264
+
265
+ def cop_status(status)
266
+ return 'Disabled' unless status
267
+
268
+ status == 'pending' ? 'Pending' : 'Enabled'
269
+ end
270
+ end