rubocop 0.87.0 → 0.90.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 (508) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +232 -33
  5. data/lib/rubocop.rb +36 -4
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli.rb +2 -2
  8. data/lib/rubocop/cli/command.rb +1 -0
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +4 -3
  10. data/lib/rubocop/cli/command/base.rb +2 -0
  11. data/lib/rubocop/cli/command/execute_runner.rb +2 -1
  12. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  14. data/lib/rubocop/cli/command/version.rb +3 -2
  15. data/lib/rubocop/cli/environment.rb +1 -0
  16. data/lib/rubocop/comment_config.rb +10 -7
  17. data/lib/rubocop/config.rb +20 -3
  18. data/lib/rubocop/config_loader.rb +39 -16
  19. data/lib/rubocop/config_loader_resolver.rb +4 -3
  20. data/lib/rubocop/config_obsoletion.rb +7 -1
  21. data/lib/rubocop/config_store.rb +4 -0
  22. data/lib/rubocop/config_validator.rb +5 -4
  23. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  24. data/lib/rubocop/cop/badge.rb +1 -1
  25. data/lib/rubocop/cop/base.rb +37 -6
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
  27. data/lib/rubocop/cop/commissioner.rb +47 -8
  28. data/lib/rubocop/cop/cop.rb +1 -1
  29. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  30. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  31. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +6 -6
  33. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -3
  34. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  36. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  37. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  38. data/lib/rubocop/cop/documentation.rb +22 -0
  39. data/lib/rubocop/cop/force.rb +1 -0
  40. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  41. data/lib/rubocop/cop/generator.rb +1 -0
  42. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  43. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  44. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  45. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  46. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  47. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  48. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  49. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  50. data/lib/rubocop/cop/layout/class_structure.rb +15 -53
  51. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  52. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  53. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  54. data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
  55. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  56. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  57. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  58. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  59. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
  60. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  61. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  62. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -6
  63. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  64. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  65. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  68. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  69. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/end_alignment.rb +9 -9
  72. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  73. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  74. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  75. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  76. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  77. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  78. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  79. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  80. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  81. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  82. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  83. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  86. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  87. data/lib/rubocop/cop/layout/multiline_block_layout.rb +37 -24
  88. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  89. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  91. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  92. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -23
  94. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  95. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  96. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  97. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  98. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  99. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  102. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  103. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  104. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  105. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  106. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  107. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  108. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  109. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  110. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +16 -18
  111. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  112. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  113. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
  114. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  115. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  116. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  117. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
  118. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  119. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  120. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  121. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  122. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  123. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  124. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  125. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  126. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  127. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  128. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  129. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  130. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  131. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  132. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  133. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  134. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  135. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  136. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  137. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  138. data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
  139. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +49 -0
  140. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  141. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  142. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  143. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  144. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  145. data/lib/rubocop/cop/lint/empty_file.rb +53 -0
  146. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  147. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  148. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  149. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  150. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  151. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  152. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  153. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  154. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  155. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  156. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  157. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  158. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  159. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  160. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  161. data/lib/rubocop/cop/lint/loop.rb +23 -2
  162. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  163. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  164. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  165. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  166. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  167. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  168. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  169. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  170. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  171. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  172. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  173. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +80 -0
  174. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  175. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  176. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  177. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  178. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  179. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  180. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  181. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  182. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  183. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  184. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  185. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  186. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  187. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  188. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  189. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  190. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  191. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  192. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  193. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  194. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  195. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  196. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  197. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  198. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  199. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  200. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  201. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  202. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  203. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  204. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  205. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  206. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  207. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  208. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  209. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  210. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  211. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  212. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  213. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  214. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  215. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  216. data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
  217. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  218. data/lib/rubocop/cop/lint/void.rb +3 -7
  219. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  220. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  221. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  222. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  223. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  224. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  225. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  226. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  227. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  228. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +50 -5
  229. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  230. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  231. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  232. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  233. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  234. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  235. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  236. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  237. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  238. data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
  239. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  240. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  241. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
  242. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  243. data/lib/rubocop/cop/mixin/hash_transform_method.rb +22 -11
  244. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  245. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  246. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  247. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  248. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  249. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  250. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  251. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  252. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  253. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  254. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  255. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  256. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  257. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  258. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  259. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  260. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  261. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  262. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  263. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  264. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  265. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  266. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  267. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  268. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  269. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  270. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  272. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  273. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  274. data/lib/rubocop/cop/offense.rb +1 -0
  275. data/lib/rubocop/cop/registry.rb +3 -3
  276. data/lib/rubocop/cop/security/eval.rb +2 -2
  277. data/lib/rubocop/cop/security/json_load.rb +6 -8
  278. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  279. data/lib/rubocop/cop/security/open.rb +2 -2
  280. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  281. data/lib/rubocop/cop/severity.rb +0 -8
  282. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  283. data/lib/rubocop/cop/style/accessor_grouping.rb +33 -20
  284. data/lib/rubocop/cop/style/alias.rb +41 -36
  285. data/lib/rubocop/cop/style/and_or.rb +9 -11
  286. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  287. data/lib/rubocop/cop/style/array_join.rb +6 -8
  288. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  289. data/lib/rubocop/cop/style/attr.rb +11 -9
  290. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  291. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  292. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  293. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +58 -38
  294. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  295. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  296. data/lib/rubocop/cop/style/case_equality.rb +29 -5
  297. data/lib/rubocop/cop/style/case_like_if.rb +236 -0
  298. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  299. data/lib/rubocop/cop/style/class_check.rb +7 -9
  300. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  301. data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
  302. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  303. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  304. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  305. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  306. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  307. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  308. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  309. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  310. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  311. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  312. data/lib/rubocop/cop/style/copyright.rb +12 -12
  313. data/lib/rubocop/cop/style/date_time.rb +1 -1
  314. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  315. data/lib/rubocop/cop/style/dir.rb +7 -10
  316. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  317. data/lib/rubocop/cop/style/documentation.rb +6 -8
  318. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  319. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  320. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  321. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  322. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  323. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  324. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  325. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  326. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  327. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  328. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  329. data/lib/rubocop/cop/style/encoding.rb +5 -9
  330. data/lib/rubocop/cop/style/end_block.rb +4 -6
  331. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  332. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  333. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  334. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  335. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  336. data/lib/rubocop/cop/style/float_division.rb +8 -11
  337. data/lib/rubocop/cop/style/for.rb +11 -15
  338. data/lib/rubocop/cop/style/format_string.rb +21 -19
  339. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  340. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  341. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  342. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  343. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  344. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  345. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  346. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  347. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  348. data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -3
  349. data/lib/rubocop/cop/style/hash_transform_values.rb +16 -2
  350. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  351. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  352. data/lib/rubocop/cop/style/if_unless_modifier.rb +19 -41
  353. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  354. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  355. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  356. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  357. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  358. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  359. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  360. data/lib/rubocop/cop/style/lambda.rb +7 -12
  361. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  362. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  363. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  364. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  365. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  366. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  367. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  368. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  369. data/lib/rubocop/cop/style/min_max.rb +8 -12
  370. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  371. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  372. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  373. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  374. data/lib/rubocop/cop/style/module_function.rb +10 -13
  375. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  376. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  377. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  378. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  379. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  380. data/lib/rubocop/cop/style/multiline_when_then.rb +9 -11
  381. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  382. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  383. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  384. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  385. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  386. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  387. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  388. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  389. data/lib/rubocop/cop/style/next.rb +10 -14
  390. data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
  391. data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
  392. data/lib/rubocop/cop/style/not.rb +19 -26
  393. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  394. data/lib/rubocop/cop/style/numeric_predicate.rb +11 -15
  395. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  396. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  397. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  398. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  399. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  400. data/lib/rubocop/cop/style/parallel_assignment.rb +18 -18
  401. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  402. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -20
  403. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  404. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  405. data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
  406. data/lib/rubocop/cop/style/proc.rb +6 -6
  407. data/lib/rubocop/cop/style/raise_args.rb +13 -24
  408. data/lib/rubocop/cop/style/random_with_offset.rb +16 -16
  409. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  410. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  411. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  412. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  413. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  414. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  415. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  416. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
  417. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  418. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
  419. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  420. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -25
  421. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  422. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  423. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  424. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  426. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  427. data/lib/rubocop/cop/style/safe_navigation.rb +17 -16
  428. data/lib/rubocop/cop/style/sample.rb +10 -13
  429. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  430. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  431. data/lib/rubocop/cop/style/send.rb +2 -2
  432. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  433. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  434. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  435. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  436. data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
  437. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  438. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  439. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -20
  440. data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
  441. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  442. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  443. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  444. data/lib/rubocop/cop/style/strip.rb +8 -14
  445. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -7
  446. data/lib/rubocop/cop/style/symbol_array.rb +6 -17
  447. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  448. data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
  449. data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
  450. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  451. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  452. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  453. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  454. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  455. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
  456. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  457. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  458. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  459. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  460. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  461. data/lib/rubocop/cop/style/unpack_first.rb +4 -8
  462. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  463. data/lib/rubocop/cop/style/when_then.rb +4 -6
  464. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  465. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  466. data/lib/rubocop/cop/style/word_array.rb +5 -23
  467. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  468. data/lib/rubocop/cop/style/zero_length_predicate.rb +19 -17
  469. data/lib/rubocop/cop/team.rb +2 -1
  470. data/lib/rubocop/cop/tokens_util.rb +84 -0
  471. data/lib/rubocop/cop/util.rb +3 -13
  472. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  473. data/lib/rubocop/cop/variable_force.rb +2 -2
  474. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  475. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  476. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  477. data/lib/rubocop/core_ext/string.rb +1 -1
  478. data/lib/rubocop/error.rb +1 -0
  479. data/lib/rubocop/ext/regexp_node.rb +46 -0
  480. data/lib/rubocop/file_finder.rb +13 -12
  481. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  482. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  483. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  484. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  485. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  486. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  487. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  488. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  489. data/lib/rubocop/name_similarity.rb +1 -0
  490. data/lib/rubocop/options.rb +9 -6
  491. data/lib/rubocop/path_util.rb +17 -17
  492. data/lib/rubocop/rake_task.rb +1 -0
  493. data/lib/rubocop/remote_config.rb +1 -0
  494. data/lib/rubocop/result_cache.rb +13 -8
  495. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  496. data/lib/rubocop/rspec/expect_offense.rb +49 -7
  497. data/lib/rubocop/rspec/shared_contexts.rb +25 -14
  498. data/lib/rubocop/runner.rb +7 -7
  499. data/lib/rubocop/string_interpreter.rb +3 -0
  500. data/lib/rubocop/target_finder.rb +14 -10
  501. data/lib/rubocop/target_ruby.rb +6 -0
  502. data/lib/rubocop/version.rb +3 -2
  503. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  504. metadata +42 -8
  505. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  506. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  507. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  508. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -27,11 +27,12 @@ module RuboCop
27
27
  #
28
28
  # # bad
29
29
  # %w[foo bar baz]
30
- class WordArray < Cop
30
+ class WordArray < Base
31
31
  include ArrayMinSize
32
32
  include ArraySyntax
33
33
  include ConfigurableEnforcedStyle
34
34
  include PercentArray
35
+ extend AutoCorrector
35
36
 
36
37
  PERCENT_MSG = 'Use `%w` or `%W` for an array of words.'
37
38
  ARRAY_MSG = 'Use `[]` for an array of words.'
@@ -44,31 +45,14 @@ module RuboCop
44
45
  if bracketed_array_of?(:str, node)
45
46
  return if complex_content?(node.values)
46
47
 
47
- check_bracketed_array(node)
48
+ check_bracketed_array(node, 'w')
48
49
  elsif node.percent_literal?(:string)
49
50
  check_percent_array(node)
50
51
  end
51
52
  end
52
53
 
53
- def autocorrect(node)
54
- if style == :percent
55
- PercentLiteralCorrector
56
- .new(@config, @preferred_delimiters)
57
- .correct(node, 'w')
58
- else
59
- correct_bracketed(node)
60
- end
61
- end
62
-
63
54
  private
64
55
 
65
- def check_bracketed_array(node)
66
- return if allowed_bracket_array?(node)
67
-
68
- array_style_detected(:brackets, node.values.size)
69
- add_offense(node) if style == :percent
70
- end
71
-
72
56
  def complex_content?(strings)
73
57
  strings.any? do |s|
74
58
  string = s.str_content.dup.force_encoding(::Encoding::UTF_8)
@@ -81,7 +65,7 @@ module RuboCop
81
65
  Regexp.new(cop_config['WordRegex'])
82
66
  end
83
67
 
84
- def correct_bracketed(node)
68
+ def correct_bracketed(corrector, node)
85
69
  words = node.children.map do |word|
86
70
  if word.dstr_type?
87
71
  string_literal = to_string_literal(word.source)
@@ -92,9 +76,7 @@ module RuboCop
92
76
  end
93
77
  end
94
78
 
95
- lambda do |corrector|
96
- corrector.replace(node, "[#{words.join(', ')}]")
97
- end
79
+ corrector.replace(node, "[#{words.join(', ')}]")
98
80
  end
99
81
  end
100
82
  end
@@ -52,9 +52,10 @@ module RuboCop
52
52
  # # good
53
53
  # 99 == foo
54
54
  # "bar" != foo
55
- class YodaCondition < Cop
55
+ class YodaCondition < Base
56
56
  include ConfigurableEnforcedStyle
57
57
  include RangeHelp
58
+ extend AutoCorrector
58
59
 
59
60
  MSG = 'Reverse the order of the operands `%<source>s`.'
60
61
 
@@ -80,11 +81,7 @@ module RuboCop
80
81
  return if equality_only? && non_equality_operator?(node) ||
81
82
  file_constant_equal_program_name?(node)
82
83
 
83
- valid_yoda?(node) || add_offense(node)
84
- end
85
-
86
- def autocorrect(node)
87
- lambda do |corrector|
84
+ valid_yoda?(node) || add_offense(node) do |corrector|
88
85
  corrector.replace(actual_code_range(node), corrected_code(node))
89
86
  end
90
87
  end
@@ -157,15 +154,7 @@ module RuboCop
157
154
  def interpolation?(node)
158
155
  return true if node.dstr_type?
159
156
 
160
- # TODO: Use `RegexpNode#interpolation?` when the following is released.
161
- # https://github.com/rubocop-hq/rubocop-ast/pull/18
162
- if node.regexp_type?
163
- return true if node.children.any? do |child|
164
- child.respond_to?(:begin_type?) && child.begin_type?
165
- end
166
- end
167
-
168
- false
157
+ node.regexp_type? && node.interpolation?
169
158
  end
170
159
  end
171
160
  end
@@ -25,52 +25,54 @@ module RuboCop
25
25
  # !{a: 1, b: 2}.empty?
26
26
  # !string.empty?
27
27
  # !hash.empty?
28
- class ZeroLengthPredicate < Cop
28
+ class ZeroLengthPredicate < Base
29
+ extend AutoCorrector
30
+
29
31
  ZERO_MSG = 'Use `empty?` instead of `%<lhs>s %<opr>s %<rhs>s`.'
30
32
  NONZERO_MSG = 'Use `!empty?` instead of ' \
31
33
  '`%<lhs>s %<opr>s %<rhs>s`.'
32
34
 
35
+ LENGTH_METHODS = %i[size length].freeze
36
+
33
37
  def on_send(node)
34
38
  check_zero_length_predicate(node)
35
39
  check_nonzero_length_predicate(node)
36
40
  end
37
41
 
38
- def autocorrect(node)
39
- lambda do |corrector|
40
- corrector.replace(node, replacement(node))
41
- end
42
- end
43
-
44
42
  private
45
43
 
46
44
  def check_zero_length_predicate(node)
47
- zero_length_predicate = zero_length_predicate(node)
45
+ return unless LENGTH_METHODS.include?(node.method_name)
48
46
 
47
+ zero_length_predicate = zero_length_predicate(node.parent)
49
48
  return unless zero_length_predicate
50
49
 
51
50
  lhs, opr, rhs = zero_length_predicate
52
51
 
53
- return if non_polymorphic_collection?(node)
52
+ return if non_polymorphic_collection?(node.parent)
54
53
 
55
54
  add_offense(
56
- node,
57
- message: format(ZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
58
- )
55
+ node.parent, message: format(ZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
56
+ ) do |corrector|
57
+ corrector.replace(node.parent, replacement(node.parent))
58
+ end
59
59
  end
60
60
 
61
61
  def check_nonzero_length_predicate(node)
62
- nonzero_length_predicate = nonzero_length_predicate(node)
62
+ return unless LENGTH_METHODS.include?(node.method_name)
63
63
 
64
+ nonzero_length_predicate = nonzero_length_predicate(node.parent)
64
65
  return unless nonzero_length_predicate
65
66
 
66
67
  lhs, opr, rhs = nonzero_length_predicate
67
68
 
68
- return if non_polymorphic_collection?(node)
69
+ return if non_polymorphic_collection?(node.parent)
69
70
 
70
71
  add_offense(
71
- node,
72
- message: format(NONZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
73
- )
72
+ node.parent, message: format(NONZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
73
+ ) do |corrector|
74
+ corrector.replace(node.parent, replacement(node.parent))
75
+ end
74
76
  end
75
77
 
76
78
  def_node_matcher :zero_length_predicate, <<~PATTERN
@@ -43,7 +43,7 @@ module RuboCop
43
43
  cop_classes = Registry.new(cop_classes.to_a) unless cop_classes.is_a?(Registry)
44
44
  only = options.fetch(:only, [])
45
45
  safe = options.fetch(:safe, false)
46
- cop_classes.enabled(config, only, safe).map do |cop_class|
46
+ cop_classes.enabled(config, only, only_safe: safe).map do |cop_class|
47
47
  cop_class.new(config, options)
48
48
  end
49
49
  end
@@ -117,6 +117,7 @@ module RuboCop
117
117
  def autocorrect(processed_source, report)
118
118
  @updated_source_file = false
119
119
  return unless autocorrect?
120
+ return if report.processed_source.parser_error
120
121
 
121
122
  new_source = autocorrect_report(report)
122
123
 
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # Common methods and behaviors for dealing with tokens.
5
+ module TokensUtil
6
+ module_function
7
+
8
+ # rubocop:disable Metrics/AbcSize
9
+ def tokens(node)
10
+ @tokens ||= {}
11
+ return @tokens[node.object_id] if @tokens[node.object_id]
12
+
13
+ @tokens[node.object_id] =
14
+ # The tokens list is always sorted by token position,
15
+ # except for cases when heredoc is passed as a method argument.
16
+ # In this case tokens are interleaved by heredoc contents' tokens.
17
+ # We can try a fast (binary) search, assuming the mentioned cases are rare,
18
+ # and fallback to linear search if failed.
19
+ if (tokens = fast_tokens(node))
20
+ tokens
21
+ else
22
+ begin_pos = node.source_range.begin_pos
23
+ end_pos = node.source_range.end_pos
24
+
25
+ processed_source.tokens.select do |token|
26
+ token.end_pos <= end_pos && token.begin_pos >= begin_pos
27
+ end
28
+ end
29
+ end
30
+ # rubocop:enable Metrics/AbcSize
31
+
32
+ def index_of_first_token(node)
33
+ index = fast_index_of_first_token(node)
34
+ return index if index
35
+
36
+ begin_pos = node.source_range.begin_pos
37
+ processed_source.tokens.index { |token| token.begin_pos == begin_pos }
38
+ end
39
+
40
+ def index_of_last_token(node)
41
+ index = fast_index_of_last_token(node)
42
+ return index if index
43
+
44
+ end_pos = node.source_range.end_pos
45
+ processed_source.tokens.index { |token| token.end_pos == end_pos }
46
+ end
47
+
48
+ private
49
+
50
+ def fast_index_of_first_token(node)
51
+ begin_pos = node.source_range.begin_pos
52
+ tokens = processed_source.tokens
53
+
54
+ index = tokens.bsearch_index { |token| token.begin_pos >= begin_pos }
55
+ index if index && tokens[index].begin_pos == begin_pos
56
+ end
57
+
58
+ def fast_index_of_last_token(node)
59
+ end_pos = node.source_range.end_pos
60
+ tokens = processed_source.tokens
61
+
62
+ index = tokens.bsearch_index { |token| token.end_pos >= end_pos }
63
+ index if index && tokens[index].end_pos == end_pos
64
+ end
65
+
66
+ def fast_tokens(node)
67
+ begin_index = index_of_first_token(node)
68
+ end_index = index_of_last_token(node)
69
+
70
+ tokens = processed_source.tokens[begin_index..end_index]
71
+ tokens if sorted_tokens?(tokens)
72
+ end
73
+
74
+ def sorted_tokens?(tokens)
75
+ prev_begin_pos = -1
76
+ tokens.each do |token|
77
+ return false if token.begin_pos < prev_begin_pos
78
+
79
+ prev_begin_pos = token.begin_pos
80
+ end
81
+ true
82
+ end
83
+ end
84
+ end
@@ -5,6 +5,7 @@ module RuboCop
5
5
  # This module contains a collection of useful utility methods.
6
6
  module Util
7
7
  include PathUtil
8
+ include TokensUtil
8
9
 
9
10
  # Match literal regex characters, not including anchors, character
10
11
  # classes, alternatives, groups, repetitions, references, etc
@@ -13,10 +14,12 @@ module RuboCop
13
14
 
14
15
  module_function
15
16
 
17
+ # This is a bad API
16
18
  def comment_line?(line_source)
17
19
  /^\s*#/.match?(line_source)
18
20
  end
19
21
 
22
+ # @deprecated Use `ProcessedSource#line_with_comment?`, `contains_comment?` or similar
20
23
  def comment_lines?(node)
21
24
  processed_source[line_range(node)].any? { |line| comment_line?(line) }
22
25
  end
@@ -127,19 +130,6 @@ module RuboCop
127
130
  .sub('Style', 'Styles')
128
131
  end
129
132
 
130
- def tokens(node)
131
- @tokens ||= {}
132
- return @tokens[node.object_id] if @tokens[node.object_id]
133
-
134
- source_range = node.source_range
135
- begin_pos = source_range.begin_pos
136
- end_pos = source_range.end_pos
137
-
138
- @tokens[node.object_id] = processed_source.tokens.select do |token|
139
- token.end_pos <= end_pos && token.begin_pos >= begin_pos
140
- end
141
- end
142
-
143
133
  private
144
134
 
145
135
  def compatible_external_encoding_for?(src)
@@ -111,11 +111,9 @@ module RuboCop
111
111
  private
112
112
 
113
113
  def parse
114
- @source.to_enum(:scan, SEQUENCE).map do
115
- FormatSequence.new(
116
- Regexp.last_match
117
- )
118
- end
114
+ matches = []
115
+ @source.scan(SEQUENCE) { matches << FormatSequence.new(Regexp.last_match) }
116
+ matches
119
117
  end
120
118
 
121
119
  def mixed_formats?
@@ -22,6 +22,8 @@ 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
@@ -197,7 +199,6 @@ module RuboCop
197
199
  regexp.named_captures.keys
198
200
  end
199
201
 
200
- # rubocop:disable Metrics/AbcSize
201
202
  def process_variable_operator_assignment(node)
202
203
  if LOGICAL_OPERATOR_ASSIGNMENT_TYPES.include?(node.type)
203
204
  asgn_node, rhs_node = *node
@@ -232,7 +233,6 @@ module RuboCop
232
233
 
233
234
  skip_children!
234
235
  end
235
- # rubocop:enable Metrics/AbcSize
236
236
 
237
237
  def process_variable_multiple_assignment(node)
238
238
  lhs_node, rhs_node = *node
@@ -49,6 +49,7 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def self.inherited(subclass)
52
+ super
52
53
  classes << subclass
53
54
  end
54
55
 
@@ -38,14 +38,14 @@ module RuboCop
38
38
  !@references.empty?
39
39
  end
40
40
 
41
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
41
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
42
42
  def reference!(node)
43
43
  reference = Reference.new(node, @scope)
44
44
  @references << reference
45
- consumed_branches = Set.new
45
+ consumed_branches = nil
46
46
 
47
47
  @assignments.reverse_each do |assignment|
48
- next if consumed_branches.include?(assignment.branch)
48
+ next if consumed_branches&.include?(assignment.branch)
49
49
 
50
50
  assignment.reference!(node) unless assignment.run_exclusively_with?(reference)
51
51
 
@@ -58,10 +58,12 @@ module RuboCop
58
58
 
59
59
  break if !assignment.branch || assignment.branch == reference.branch
60
60
 
61
- consumed_branches << assignment.branch unless assignment.branch.may_run_incompletely?
61
+ unless assignment.branch.may_run_incompletely?
62
+ (consumed_branches ||= Set.new) << assignment.branch
63
+ end
62
64
  end
63
65
  end
64
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
66
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
65
67
 
66
68
  def in_modifier_if?(assignment)
67
69
  parent = assignment.node.parent
@@ -0,0 +1,284 @@
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 do |department|
22
+ print_cops_of_department(department)
23
+ end
24
+
25
+ print_table_of_contents
26
+ ensure
27
+ RuboCop::ConfigLoader.default_configuration = nil
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :departments, :cops, :config
33
+
34
+ def cops_of_department(department)
35
+ cops.with_department(department).sort!
36
+ end
37
+
38
+ def cops_body(cop, description, examples_objects, pars)
39
+ content = h2(cop.cop_name)
40
+ content << required_ruby_version(cop)
41
+ content << properties(cop)
42
+ content << "#{description}\n"
43
+ content << examples(examples_objects) if examples_objects.count.positive?
44
+ content << configurations(pars)
45
+ content << references(cop)
46
+ content
47
+ end
48
+
49
+ def examples(examples_object)
50
+ examples_object.each_with_object(h3('Examples').dup) do |example, content|
51
+ content << "\n" unless content.end_with?("\n\n")
52
+ content << h4(example.name) unless example.name == ''
53
+ content << code_example(example)
54
+ end
55
+ end
56
+
57
+ def required_ruby_version(cop)
58
+ return '' unless cop.respond_to?(:required_minimum_ruby_version)
59
+
60
+ "NOTE: Required Ruby version: #{cop.required_minimum_ruby_version}\n\n"
61
+ end
62
+
63
+ # rubocop:disable Metrics/MethodLength
64
+ def properties(cop)
65
+ header = [
66
+ 'Enabled by default', 'Safe', 'Supports autocorrection', 'VersionAdded',
67
+ 'VersionChanged'
68
+ ]
69
+ autocorrect = if cop.support_autocorrect?
70
+ "Yes#{' (Unsafe)' unless cop.new(config).safe_autocorrect?}"
71
+ else
72
+ 'No'
73
+ end
74
+ cop_config = config.for_cop(cop)
75
+ content = [[
76
+ cop_status(cop_config.fetch('Enabled')),
77
+ cop_config.fetch('Safe', true) ? 'Yes' : 'No',
78
+ autocorrect,
79
+ cop_config.fetch('VersionAdded', '-'),
80
+ cop_config.fetch('VersionChanged', '-')
81
+ ]]
82
+ "#{to_table(header, content)}\n"
83
+ end
84
+ # rubocop:enable Metrics/MethodLength
85
+
86
+ def h2(title)
87
+ content = +"\n"
88
+ content << "== #{title}\n"
89
+ content << "\n"
90
+ content
91
+ end
92
+
93
+ def h3(title)
94
+ content = +"\n"
95
+ content << "=== #{title}\n"
96
+ content << "\n"
97
+ content
98
+ end
99
+
100
+ def h4(title)
101
+ content = +"==== #{title}\n"
102
+ content << "\n"
103
+ content
104
+ end
105
+
106
+ def code_example(ruby_code)
107
+ content = +"[source,ruby]\n----\n"
108
+ content << ruby_code.text.gsub('@good', '# good')
109
+ .gsub('@bad', '# bad').strip
110
+ content << "\n----\n"
111
+ content
112
+ end
113
+
114
+ def configurations(pars)
115
+ return '' if pars.empty?
116
+
117
+ header = ['Name', 'Default value', 'Configurable values']
118
+ configs = pars
119
+ .each_key
120
+ .reject { |key| key.start_with?('Supported') }
121
+ .reject { |key| key.start_with?('AllowMultipleStyles') }
122
+ content = configs.map do |name|
123
+ configurable = configurable_values(pars, name)
124
+ default = format_table_value(pars[name])
125
+ [name, default, configurable]
126
+ end
127
+
128
+ h3('Configurable attributes') + to_table(header, content)
129
+ end
130
+
131
+ # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
132
+ def configurable_values(pars, name)
133
+ case name
134
+ when /^Enforced/
135
+ supported_style_name = RuboCop::Cop::Util.to_supported_styles(name)
136
+ format_table_value(pars[supported_style_name])
137
+ when 'IndentationWidth'
138
+ 'Integer'
139
+ when 'Database'
140
+ format_table_value(pars['SupportedDatabases'])
141
+ else
142
+ case pars[name]
143
+ when String
144
+ 'String'
145
+ when Integer
146
+ 'Integer'
147
+ when Float
148
+ 'Float'
149
+ when true, false
150
+ 'Boolean'
151
+ when Array
152
+ 'Array'
153
+ else
154
+ ''
155
+ end
156
+ end
157
+ end
158
+ # rubocop:enable Metrics/CyclomaticComplexity,Metrics/MethodLength
159
+
160
+ def to_table(header, content)
161
+ table = [
162
+ '|===',
163
+ "| #{header.join(' | ')}\n\n"
164
+ ].join("\n")
165
+ marked_contents = content.map do |plain_content|
166
+ plain_content.map { |c| "| #{c}" }.join("\n")
167
+ end
168
+ table << marked_contents.join("\n\n")
169
+ table << "\n|===\n"
170
+ end
171
+
172
+ def format_table_value(val)
173
+ value =
174
+ case val
175
+ when Array
176
+ if val.empty?
177
+ '`[]`'
178
+ else
179
+ val.map { |config| format_table_value(config) }.join(', ')
180
+ end
181
+ else
182
+ wrap_backtick(val.nil? ? '<none>' : val)
183
+ end
184
+ value.gsub("#{Dir.pwd}/", '').rstrip
185
+ end
186
+
187
+ def wrap_backtick(value)
188
+ if value.is_a?(String)
189
+ # Use `+` to prevent text like `**/*.gemspec` from being bold.
190
+ value.start_with?('*') ? "`+#{value}+`" : "`#{value}`"
191
+ else
192
+ "`#{value}`"
193
+ end
194
+ end
195
+
196
+ def references(cop)
197
+ cop_config = config.for_cop(cop)
198
+ urls = RuboCop::Cop::MessageAnnotator.new(
199
+ config, cop.name, cop_config, {}
200
+ ).urls
201
+ return '' if urls.empty?
202
+
203
+ content = h3('References')
204
+ content << urls.map { |url| "* #{url}" }.join("\n")
205
+ content << "\n"
206
+ content
207
+ end
208
+
209
+ def print_cops_of_department(department)
210
+ selected_cops = cops_of_department(department)
211
+ content = +"= #{department}\n"
212
+ selected_cops.each do |cop|
213
+ content << print_cop_with_doc(cop)
214
+ end
215
+ file_name = "#{Dir.pwd}/docs/modules/ROOT/pages/#{department_to_basename(department)}.adoc"
216
+ File.open(file_name, 'w') do |file|
217
+ puts "* generated #{file_name}"
218
+ file.write("#{content.strip}\n")
219
+ end
220
+ end
221
+
222
+ def print_cop_with_doc(cop)
223
+ cop_config = config.for_cop(cop)
224
+ non_display_keys = %w[
225
+ Description Enabled StyleGuide Reference Safe SafeAutoCorrect VersionAdded
226
+ VersionChanged
227
+ ]
228
+ pars = cop_config.reject { |k| non_display_keys.include? k }
229
+ description = 'No documentation'
230
+ examples_object = []
231
+ cop_code(cop) do |code_object|
232
+ description = code_object.docstring unless code_object.docstring.blank?
233
+ examples_object = code_object.tags('example')
234
+ end
235
+ cops_body(cop, description, examples_object, pars)
236
+ end
237
+
238
+ def cop_code(cop)
239
+ YARD::Registry.all(:class).detect do |code_object|
240
+ next unless RuboCop::Cop::Badge.for(code_object.to_s) == cop.badge
241
+
242
+ yield code_object
243
+ end
244
+ end
245
+
246
+ def table_of_content_for_department(department)
247
+ type_title = department[0].upcase + department[1..-1]
248
+ filename = "#{department_to_basename(department)}.adoc"
249
+ content = +"=== Department xref:#{filename}[#{type_title}]\n\n"
250
+ cops_of_department(department).each do |cop|
251
+ anchor = cop.cop_name.sub('/', '').downcase
252
+ content << "* xref:#{filename}##{anchor}[#{cop.cop_name}]\n"
253
+ end
254
+
255
+ content
256
+ end
257
+
258
+ def print_table_of_contents
259
+ path = "#{Dir.pwd}/docs/modules/ROOT/pages/cops.adoc"
260
+ original = File.read(path)
261
+ content = +"// START_COP_LIST\n\n"
262
+
263
+ content << table_contents
264
+
265
+ content << "\n// END_COP_LIST"
266
+
267
+ content = original.sub(
268
+ %r{// START_COP_LIST.+// END_COP_LIST}m, content
269
+ )
270
+ File.write(path, content)
271
+ end
272
+
273
+ def table_contents
274
+ departments
275
+ .map { |department| table_of_content_for_department(department) }
276
+ .join("\n")
277
+ end
278
+
279
+ def cop_status(status)
280
+ return 'Disabled' unless status
281
+
282
+ status == 'pending' ? 'Pending' : 'Enabled'
283
+ end
284
+ end