rubocop 1.88.2 → 1.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 (227) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.yml +139 -16
  3. data/exe/rubocop +1 -1
  4. data/lib/rubocop/cached_data.rb +7 -2
  5. data/lib/rubocop/cli/command/execute_runner.rb +31 -0
  6. data/lib/rubocop/cli.rb +2 -4
  7. data/lib/rubocop/comment_config/directive_range.rb +32 -0
  8. data/lib/rubocop/comment_config/disable_next.rb +97 -0
  9. data/lib/rubocop/comment_config.rb +81 -49
  10. data/lib/rubocop/config.rb +76 -5
  11. data/lib/rubocop/config_loader.rb +1 -2
  12. data/lib/rubocop/config_loader_resolver.rb +1 -2
  13. data/lib/rubocop/config_validator.rb +39 -3
  14. data/lib/rubocop/cop/autocorrect_logic.rb +8 -0
  15. data/lib/rubocop/cop/badge.rb +8 -0
  16. data/lib/rubocop/cop/base.rb +40 -6
  17. data/lib/rubocop/cop/bundler.rb +19 -0
  18. data/lib/rubocop/cop/corrector.rb +4 -4
  19. data/lib/rubocop/cop/correctors/alignment_corrector.rb +55 -5
  20. data/lib/rubocop/cop/gemspec.rb +22 -0
  21. data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
  22. data/lib/rubocop/cop/generator.rb +4 -0
  23. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -2
  24. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
  25. data/lib/rubocop/cop/layout/block_alignment.rb +1 -2
  26. data/lib/rubocop/cop/layout/class_structure.rb +108 -26
  27. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -2
  28. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
  29. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  30. data/lib/rubocop/cop/layout/extra_spacing.rb +105 -3
  31. data/lib/rubocop/cop/layout/first_argument_indentation.rb +21 -1
  32. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -1
  33. data/lib/rubocop/cop/layout/indentation_width.rb +3 -1
  34. data/lib/rubocop/cop/layout/leading_comment_space.rb +27 -0
  35. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -2
  36. data/lib/rubocop/cop/layout/line_length.rb +84 -12
  37. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -2
  38. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +12 -2
  39. data/lib/rubocop/cop/layout/redundant_line_break.rb +77 -0
  40. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -2
  41. data/lib/rubocop/cop/layout/space_around_operators.rb +7 -0
  42. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +31 -34
  43. data/lib/rubocop/cop/layout.rb +114 -0
  44. data/lib/rubocop/cop/lazy_loader.rb +41 -0
  45. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -7
  46. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +71 -0
  47. data/lib/rubocop/cop/lint/ambiguous_range.rb +1 -2
  48. data/lib/rubocop/cop/lint/argument_mismatch.rb +89 -0
  49. data/lib/rubocop/cop/lint/constant_reassignment.rb +18 -21
  50. data/lib/rubocop/cop/lint/constant_resolution.rb +25 -0
  51. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -8
  52. data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
  53. data/lib/rubocop/cop/lint/duplicate_methods.rb +300 -22
  54. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  55. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
  56. data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
  57. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -2
  58. data/lib/rubocop/cop/lint/literal_as_condition.rb +8 -6
  59. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +4 -7
  60. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +25 -12
  61. data/lib/rubocop/cop/lint/missing_super.rb +31 -1
  62. data/lib/rubocop/cop/lint/name_typo.rb +270 -0
  63. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
  64. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +98 -19
  65. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +47 -7
  66. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -2
  67. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -2
  68. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -2
  69. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +1 -2
  70. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -2
  71. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -2
  72. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +2 -4
  73. data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
  74. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +1 -2
  75. data/lib/rubocop/cop/lint/to_enum_arguments.rb +38 -3
  76. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -2
  77. data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
  78. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -2
  79. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -2
  80. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +36 -0
  81. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  82. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -2
  83. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -0
  84. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +61 -7
  85. data/lib/rubocop/cop/lint/void.rb +18 -8
  86. data/lib/rubocop/cop/lint.rb +178 -0
  87. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  88. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  89. data/lib/rubocop/cop/metrics.rb +31 -0
  90. data/lib/rubocop/cop/migration/department_name.rb +1 -6
  91. data/lib/rubocop/cop/migration.rb +13 -0
  92. data/lib/rubocop/cop/mixin/check_line_breakable.rb +23 -5
  93. data/lib/rubocop/cop/mixin/comments_help.rb +1 -2
  94. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
  95. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
  96. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +23 -6
  97. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +1 -2
  98. data/lib/rubocop/cop/mixin/hash_subset.rb +1 -2
  99. data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
  100. data/lib/rubocop/cop/mixin/line_length_help.rb +7 -1
  101. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +51 -6
  102. data/lib/rubocop/cop/mixin/project_index_help.rb +140 -0
  103. data/lib/rubocop/cop/mixin/range_help.rb +1 -2
  104. data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
  105. data/lib/rubocop/cop/mixin/statement_modifier.rb +46 -4
  106. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  107. data/lib/rubocop/cop/mixin.rb +82 -77
  108. data/lib/rubocop/cop/naming/accessor_method_name.rb +24 -0
  109. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +16 -0
  110. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -4
  111. data/lib/rubocop/cop/naming/method_name.rb +5 -2
  112. data/lib/rubocop/cop/naming/predicate_prefix.rb +33 -5
  113. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -2
  114. data/lib/rubocop/cop/naming/variable_number.rb +3 -1
  115. data/lib/rubocop/cop/naming.rb +31 -0
  116. data/lib/rubocop/cop/offense.rb +37 -10
  117. data/lib/rubocop/cop/registry.rb +180 -46
  118. data/lib/rubocop/cop/security.rb +19 -0
  119. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -2
  120. data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -6
  121. data/lib/rubocop/cop/style/array_first_last.rb +1 -2
  122. data/lib/rubocop/cop/style/array_intersect.rb +24 -5
  123. data/lib/rubocop/cop/style/bitwise_predicate.rb +1 -2
  124. data/lib/rubocop/cop/style/block_delimiters.rb +3 -6
  125. data/lib/rubocop/cop/style/case_like_if.rb +2 -4
  126. data/lib/rubocop/cop/style/class_and_module_children.rb +79 -20
  127. data/lib/rubocop/cop/style/combinable_loops.rb +1 -2
  128. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -2
  129. data/lib/rubocop/cop/style/conditional_assignment.rb +23 -2
  130. data/lib/rubocop/cop/style/constant_visibility.rb +1 -2
  131. data/lib/rubocop/cop/style/copyright.rb +5 -1
  132. data/lib/rubocop/cop/style/directive_scope.rb +171 -0
  133. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +76 -12
  134. data/lib/rubocop/cop/style/documentation.rb +47 -0
  135. data/lib/rubocop/cop/style/empty_case_condition.rb +1 -2
  136. data/lib/rubocop/cop/style/endless_method.rb +0 -10
  137. data/lib/rubocop/cop/style/format_string_token.rb +1 -2
  138. data/lib/rubocop/cop/style/guard_clause.rb +1 -2
  139. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
  140. data/lib/rubocop/cop/style/hash_syntax.rb +1 -2
  141. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -4
  142. data/lib/rubocop/cop/style/if_inside_else.rb +1 -2
  143. data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -50
  144. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +1 -2
  145. data/lib/rubocop/cop/style/lambda.rb +4 -0
  146. data/lib/rubocop/cop/style/map_to_hash.rb +1 -2
  147. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +22 -7
  148. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  149. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +30 -0
  150. data/lib/rubocop/cop/style/multiline_if_then.rb +7 -1
  151. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -2
  152. data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
  153. data/lib/rubocop/cop/style/mutable_constant.rb +5 -0
  154. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -2
  155. data/lib/rubocop/cop/style/negative_array_index.rb +3 -3
  156. data/lib/rubocop/cop/style/nil_comparison.rb +1 -2
  157. data/lib/rubocop/cop/style/operator_method_call.rb +1 -2
  158. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -2
  159. data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
  160. data/lib/rubocop/cop/style/redundant_condition.rb +2 -4
  161. data/lib/rubocop/cop/style/redundant_constant_base.rb +37 -1
  162. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +1 -2
  163. data/lib/rubocop/cop/style/redundant_each.rb +1 -2
  164. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
  165. data/lib/rubocop/cop/style/redundant_format.rb +14 -7
  166. data/lib/rubocop/cop/style/redundant_line_continuation.rb +78 -135
  167. data/lib/rubocop/cop/style/redundant_parentheses.rb +65 -67
  168. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +1 -2
  169. data/lib/rubocop/cop/style/redundant_return.rb +1 -2
  170. data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -2
  171. data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
  172. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -2
  173. data/lib/rubocop/cop/style/safe_navigation.rb +11 -2
  174. data/lib/rubocop/cop/style/sample.rb +11 -6
  175. data/lib/rubocop/cop/style/select_by_regexp.rb +1 -2
  176. data/lib/rubocop/cop/style/semicolon.rb +2 -4
  177. data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -2
  178. data/lib/rubocop/cop/style/sole_nested_conditional.rb +21 -5
  179. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +2 -0
  180. data/lib/rubocop/cop/style/static_class.rb +21 -0
  181. data/lib/rubocop/cop/style/string_concatenation.rb +18 -5
  182. data/lib/rubocop/cop/style/super_arguments.rb +1 -2
  183. data/lib/rubocop/cop/style/symbol_proc.rb +1 -2
  184. data/lib/rubocop/cop/style/time_now.rb +41 -0
  185. data/lib/rubocop/cop/style/yoda_condition.rb +1 -2
  186. data/lib/rubocop/cop/style.rb +312 -0
  187. data/lib/rubocop/cop/team.rb +59 -6
  188. data/lib/rubocop/cop/util.rb +2 -4
  189. data/lib/rubocop/cop/variable_force/variable.rb +19 -8
  190. data/lib/rubocop/cops_documentation_generator.rb +4 -7
  191. data/lib/rubocop/directive_comment.rb +39 -3
  192. data/lib/rubocop/feature_loader.rb +0 -6
  193. data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
  194. data/lib/rubocop/formatter/html_formatter.rb +2 -4
  195. data/lib/rubocop/formatter/json_formatter.rb +11 -6
  196. data/lib/rubocop/formatter/junit_formatter.rb +26 -9
  197. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -2
  198. data/lib/rubocop/formatter/simple_text_formatter.rb +4 -3
  199. data/lib/rubocop/formatter/tap_formatter.rb +3 -1
  200. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -2
  201. data/lib/rubocop/lockfile.rb +18 -0
  202. data/lib/rubocop/lsp/diagnostic.rb +4 -8
  203. data/lib/rubocop/lsp/routes.rb +89 -22
  204. data/lib/rubocop/lsp/runtime.rb +4 -0
  205. data/lib/rubocop/lsp/server.rb +4 -0
  206. data/lib/rubocop/lsp/stdin_runner.rb +20 -0
  207. data/lib/rubocop/mcp/server.rb +1 -2
  208. data/lib/rubocop/options.rb +10 -6
  209. data/lib/rubocop/path_util.rb +1 -2
  210. data/lib/rubocop/pending_cops_reporter.rb +1 -6
  211. data/lib/rubocop/plugin/configuration_integrator.rb +6 -3
  212. data/lib/rubocop/project_index_loader.rb +16 -0
  213. data/lib/rubocop/rake_task.rb +1 -2
  214. data/lib/rubocop/result_cache.rb +6 -4
  215. data/lib/rubocop/rspec/expect_offense.rb +2 -4
  216. data/lib/rubocop/rspec/shared_contexts.rb +16 -2
  217. data/lib/rubocop/runner.rb +71 -43
  218. data/lib/rubocop/server/cache.rb +11 -7
  219. data/lib/rubocop/server/cli.rb +2 -4
  220. data/lib/rubocop/server.rb +14 -0
  221. data/lib/rubocop/target_finder.rb +4 -1
  222. data/lib/rubocop/target_ruby.rb +1 -1
  223. data/lib/rubocop/todo_audit.rb +111 -0
  224. data/lib/rubocop/version.rb +3 -5
  225. data/lib/rubocop.rb +20 -626
  226. data/lib/ruby_lsp/rubocop/addon.rb +1 -2
  227. metadata +28 -5
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for `Time.new` without arguments, which is an implicit way
7
+ # to retrieve the current system time. Prefer the more explicit `Time.now`.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # Time.new
12
+ #
13
+ # # good
14
+ # Time.now
15
+ #
16
+ # # good - `Time.new` with arguments constructs a specific time
17
+ # Time.new(2026, 8, 19)
18
+ #
19
+ class TimeNow < Base
20
+ extend AutoCorrector
21
+
22
+ MSG = 'Prefer `Time.now` over `Time.new` to retrieve the current time.'
23
+ RESTRICT_ON_SEND = %i[new].freeze
24
+
25
+ # @!method time_new?(node)
26
+ def_node_matcher :time_new?, <<~PATTERN
27
+ (call (const {nil? cbase} :Time) :new)
28
+ PATTERN
29
+
30
+ def on_send(node)
31
+ return unless time_new?(node)
32
+
33
+ add_offense(node) do |corrector|
34
+ corrector.replace(node.loc.selector.join(node.source_range.end), 'now')
35
+ end
36
+ end
37
+ alias on_csend on_send
38
+ end
39
+ end
40
+ end
41
+ end
@@ -122,7 +122,7 @@ module RuboCop
122
122
  node.comparison_method? && !noncommutative_operator?(node)
123
123
  end
124
124
 
125
- # rubocop:disable Metrics/CyclomaticComplexity
125
+ # rubocop:disable-next Metrics/CyclomaticComplexity
126
126
  def valid_yoda?(node)
127
127
  return true unless (rhs = node.first_argument)
128
128
 
@@ -133,7 +133,6 @@ module RuboCop
133
133
 
134
134
  enforce_yoda? ? constant_portion?(lhs) : constant_portion?(rhs)
135
135
  end
136
- # rubocop:enable Metrics/CyclomaticComplexity
137
136
 
138
137
  def message(node)
139
138
  format(MSG, source: node.source)
@@ -0,0 +1,312 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Cops for the `Style` department. The department's cops are registered for lazy loading
6
+ # and their files are loaded on demand.
7
+ module Style
8
+ extend LazyLoader
9
+
10
+ register_cop :AccessModifierDeclarations, "#{__dir__}/style/access_modifier_declarations"
11
+ register_cop :AccessorGrouping, "#{__dir__}/style/accessor_grouping"
12
+ register_cop :Alias, "#{__dir__}/style/alias"
13
+ register_cop :AmbiguousEndlessMethodDefinition, "#{__dir__}/style/ambiguous_endless_method_definition"
14
+ register_cop :AndOr, "#{__dir__}/style/and_or"
15
+ register_cop :ArgumentsForwarding, "#{__dir__}/style/arguments_forwarding"
16
+ register_cop :ArrayCoercion, "#{__dir__}/style/array_coercion"
17
+ register_cop :ArrayFirstLast, "#{__dir__}/style/array_first_last"
18
+ register_cop :ArrayIntersect, "#{__dir__}/style/array_intersect"
19
+ register_cop :ArrayIntersectWithSingleElement, "#{__dir__}/style/array_intersect_with_single_element"
20
+ register_cop :ArrayJoin, "#{__dir__}/style/array_join"
21
+ register_cop :AsciiComments, "#{__dir__}/style/ascii_comments"
22
+ register_cop :Attr, "#{__dir__}/style/attr"
23
+ register_cop :AutoResourceCleanup, "#{__dir__}/style/auto_resource_cleanup"
24
+ register_cop :BarePercentLiterals, "#{__dir__}/style/bare_percent_literals"
25
+ register_cop :BeginBlock, "#{__dir__}/style/begin_block"
26
+ register_cop :BisectedAttrAccessor, "#{__dir__}/style/bisected_attr_accessor"
27
+ register_cop :BitwisePredicate, "#{__dir__}/style/bitwise_predicate"
28
+ register_cop :BlockComments, "#{__dir__}/style/block_comments"
29
+ register_cop :BlockDelimiters, "#{__dir__}/style/block_delimiters"
30
+ register_cop :CaseEquality, "#{__dir__}/style/case_equality"
31
+ register_cop :CaseLikeIf, "#{__dir__}/style/case_like_if"
32
+ register_cop :CharacterLiteral, "#{__dir__}/style/character_literal"
33
+ register_cop :ClassAndModuleChildren, "#{__dir__}/style/class_and_module_children"
34
+ register_cop :ClassCheck, "#{__dir__}/style/class_check"
35
+ register_cop :ClassEqualityComparison, "#{__dir__}/style/class_equality_comparison"
36
+ register_cop :ClassMethods, "#{__dir__}/style/class_methods"
37
+ register_cop :ClassMethodsDefinitions, "#{__dir__}/style/class_methods_definitions"
38
+ register_cop :ClassVars, "#{__dir__}/style/class_vars"
39
+ register_cop :CollectionCompact, "#{__dir__}/style/collection_compact"
40
+ register_cop :CollectionMethods, "#{__dir__}/style/collection_methods"
41
+ register_cop :CollectionQuerying, "#{__dir__}/style/collection_querying"
42
+ register_cop :ColonMethodCall, "#{__dir__}/style/colon_method_call"
43
+ register_cop :ColonMethodDefinition, "#{__dir__}/style/colon_method_definition"
44
+ register_cop :CombinableDefined, "#{__dir__}/style/combinable_defined"
45
+ register_cop :CombinableLoops, "#{__dir__}/style/combinable_loops"
46
+ register_cop :CommandLiteral, "#{__dir__}/style/command_literal"
47
+ register_cop :CommentAnnotation, "#{__dir__}/style/comment_annotation"
48
+ register_cop :CommentedKeyword, "#{__dir__}/style/commented_keyword"
49
+ register_cop :ComparableBetween, "#{__dir__}/style/comparable_between"
50
+ register_cop :ComparableClamp, "#{__dir__}/style/comparable_clamp"
51
+ register_cop :ConcatArrayLiterals, "#{__dir__}/style/concat_array_literals"
52
+ register_cop :ConditionalAssignment, "#{__dir__}/style/conditional_assignment"
53
+ register_cop :ConstantVisibility, "#{__dir__}/style/constant_visibility"
54
+ register_cop :Copyright, "#{__dir__}/style/copyright"
55
+ register_cop :DataInheritance, "#{__dir__}/style/data_inheritance"
56
+ register_cop :DateTime, "#{__dir__}/style/date_time"
57
+ register_cop :DefWithParentheses, "#{__dir__}/style/def_with_parentheses"
58
+ register_cop :DigChain, "#{__dir__}/style/dig_chain"
59
+ register_cop :Dir, "#{__dir__}/style/dir"
60
+ register_cop :DirEmpty, "#{__dir__}/style/dir_empty"
61
+ register_cop :DirectiveScope, "#{__dir__}/style/directive_scope"
62
+ register_cop :DisableCopsWithinSourceCodeDirective, "#{__dir__}/style/disable_cops_within_source_code_directive"
63
+ register_cop :DocumentationMethod, "#{__dir__}/style/documentation_method"
64
+ register_cop :Documentation, "#{__dir__}/style/documentation"
65
+ register_cop :DocumentDynamicEvalDefinition, "#{__dir__}/style/document_dynamic_eval_definition"
66
+ register_cop :DoubleCopDisableDirective, "#{__dir__}/style/double_cop_disable_directive"
67
+ register_cop :DoubleNegation, "#{__dir__}/style/double_negation"
68
+ register_cop :EachForSimpleLoop, "#{__dir__}/style/each_for_simple_loop"
69
+ register_cop :EachWithObject, "#{__dir__}/style/each_with_object"
70
+ register_cop :EmptyBlockParameter, "#{__dir__}/style/empty_block_parameter"
71
+ register_cop :EmptyCaseCondition, "#{__dir__}/style/empty_case_condition"
72
+ register_cop :EmptyClassDefinition, "#{__dir__}/style/empty_class_definition"
73
+ register_cop :EmptyElse, "#{__dir__}/style/empty_else"
74
+ register_cop :EmptyHeredoc, "#{__dir__}/style/empty_heredoc"
75
+ register_cop :EmptyLambdaParameter, "#{__dir__}/style/empty_lambda_parameter"
76
+ register_cop :EmptyLiteral, "#{__dir__}/style/empty_literal"
77
+ register_cop :EmptyMethod, "#{__dir__}/style/empty_method"
78
+ register_cop :EmptyStringInsideInterpolation, "#{__dir__}/style/empty_string_inside_interpolation"
79
+ register_cop :EndlessMethod, "#{__dir__}/style/endless_method"
80
+ register_cop :Encoding, "#{__dir__}/style/encoding"
81
+ register_cop :EndBlock, "#{__dir__}/style/end_block"
82
+ register_cop :EnvHome, "#{__dir__}/style/env_home"
83
+ register_cop :EvalWithLocation, "#{__dir__}/style/eval_with_location"
84
+ register_cop :EvenOdd, "#{__dir__}/style/even_odd"
85
+ register_cop :ExactRegexpMatch, "#{__dir__}/style/exact_regexp_match"
86
+ register_cop :ExpandPathArguments, "#{__dir__}/style/expand_path_arguments"
87
+ register_cop :ExplicitBlockArgument, "#{__dir__}/style/explicit_block_argument"
88
+ register_cop :ExponentialNotation, "#{__dir__}/style/exponential_notation"
89
+ register_cop :FetchEnvVar, "#{__dir__}/style/fetch_env_var"
90
+ register_cop :FileEmpty, "#{__dir__}/style/file_empty"
91
+ register_cop :FileNull, "#{__dir__}/style/file_null"
92
+ register_cop :FileOpen, "#{__dir__}/style/file_open"
93
+ register_cop :FileRead, "#{__dir__}/style/file_read"
94
+ register_cop :FileTouch, "#{__dir__}/style/file_touch"
95
+ register_cop :FileWrite, "#{__dir__}/style/file_write"
96
+ register_cop :FloatDivision, "#{__dir__}/style/float_division"
97
+ register_cop :For, "#{__dir__}/style/for"
98
+ register_cop :FormatString, "#{__dir__}/style/format_string"
99
+ register_cop :FormatStringToken, "#{__dir__}/style/format_string_token"
100
+ register_cop :FrozenStringLiteralComment, "#{__dir__}/style/frozen_string_literal_comment"
101
+ register_cop :GlobalStdStream, "#{__dir__}/style/global_std_stream"
102
+ register_cop :GlobalVars, "#{__dir__}/style/global_vars"
103
+ register_cop :GuardClause, "#{__dir__}/style/guard_clause"
104
+ register_cop :HashAsLastArrayItem, "#{__dir__}/style/hash_as_last_array_item"
105
+ register_cop :HashConversion, "#{__dir__}/style/hash_conversion"
106
+ register_cop :HashEachMethods, "#{__dir__}/style/hash_each_methods"
107
+ register_cop :HashExcept, "#{__dir__}/style/hash_except"
108
+ register_cop :HashFetchChain, "#{__dir__}/style/hash_fetch_chain"
109
+ register_cop :HashLikeCase, "#{__dir__}/style/hash_like_case"
110
+ register_cop :HashLookupMethod, "#{__dir__}/style/hash_lookup_method"
111
+ register_cop :HashSlice, "#{__dir__}/style/hash_slice"
112
+ register_cop :HashSyntax, "#{__dir__}/style/hash_syntax"
113
+ register_cop :HashTransformKeys, "#{__dir__}/style/hash_transform_keys"
114
+ register_cop :HashTransformValues, "#{__dir__}/style/hash_transform_values"
115
+ register_cop :IdenticalConditionalBranches, "#{__dir__}/style/identical_conditional_branches"
116
+ register_cop :IfInsideElse, "#{__dir__}/style/if_inside_else"
117
+ register_cop :IfUnlessModifier, "#{__dir__}/style/if_unless_modifier"
118
+ register_cop :IfUnlessModifierOfIfUnless, "#{__dir__}/style/if_unless_modifier_of_if_unless"
119
+ register_cop :IfWithBooleanLiteralBranches, "#{__dir__}/style/if_with_boolean_literal_branches"
120
+ register_cop :IfWithSemicolon, "#{__dir__}/style/if_with_semicolon"
121
+ register_cop :ImplicitRuntimeError, "#{__dir__}/style/implicit_runtime_error"
122
+ register_cop :InPatternThen, "#{__dir__}/style/in_pattern_then"
123
+ register_cop :InfiniteLoop, "#{__dir__}/style/infinite_loop"
124
+ register_cop :ReduceToHash, "#{__dir__}/style/reduce_to_hash"
125
+ register_cop :InverseMethods, "#{__dir__}/style/inverse_methods"
126
+ register_cop :InlineComment, "#{__dir__}/style/inline_comment"
127
+ register_cop :InvertibleUnlessCondition, "#{__dir__}/style/invertible_unless_condition"
128
+ register_cop :IpAddresses, "#{__dir__}/style/ip_addresses"
129
+ register_cop :ItAssignment, "#{__dir__}/style/it_assignment"
130
+ register_cop :ItBlockParameter, "#{__dir__}/style/it_block_parameter"
131
+ register_cop :KeywordArgumentsMerging, "#{__dir__}/style/keyword_arguments_merging"
132
+ register_cop :KeywordParametersOrder, "#{__dir__}/style/keyword_parameters_order"
133
+ register_cop :Lambda, "#{__dir__}/style/lambda"
134
+ register_cop :LambdaCall, "#{__dir__}/style/lambda_call"
135
+ register_cop :LineEndConcatenation, "#{__dir__}/style/line_end_concatenation"
136
+ register_cop :MagicCommentFormat, "#{__dir__}/style/magic_comment_format"
137
+ register_cop :MapIntoArray, "#{__dir__}/style/map_into_array"
138
+ register_cop :MapJoin, "#{__dir__}/style/map_join"
139
+ register_cop :MapToHash, "#{__dir__}/style/map_to_hash"
140
+ register_cop :MapToSet, "#{__dir__}/style/map_to_set"
141
+ register_cop :MethodCallWithoutArgsParentheses, "#{__dir__}/style/method_call_without_args_parentheses"
142
+ register_cop :MethodCallWithArgsParentheses, "#{__dir__}/style/method_call_with_args_parentheses"
143
+ register_cop :MinMaxComparison, "#{__dir__}/style/min_max_comparison"
144
+ register_cop :ModuleMemberExistenceCheck, "#{__dir__}/style/module_member_existence_check"
145
+ register_cop :MultilineInPatternThen, "#{__dir__}/style/multiline_in_pattern_then"
146
+ register_cop :NumberedParameters, "#{__dir__}/style/numbered_parameters"
147
+ register_cop :OneClassPerFile, "#{__dir__}/style/one_class_per_file"
148
+ register_cop :OpenStructUse, "#{__dir__}/style/open_struct_use"
149
+ register_cop :OperatorMethodCall, "#{__dir__}/style/operator_method_call"
150
+ register_cop :PartitionInsteadOfDoubleSelect, "#{__dir__}/style/partition_instead_of_double_select"
151
+ register_cop :RedundantArrayConstructor, "#{__dir__}/style/redundant_array_constructor"
152
+ register_cop :RedundantArrayFlatten, "#{__dir__}/style/redundant_array_flatten"
153
+ register_cop :RedundantAssignment, "#{__dir__}/style/redundant_assignment"
154
+ register_cop :RedundantConstantBase, "#{__dir__}/style/redundant_constant_base"
155
+ register_cop :RedundantCurrentDirectoryInPath, "#{__dir__}/style/redundant_current_directory_in_path"
156
+ register_cop :RedundantDoubleSplatHashBraces, "#{__dir__}/style/redundant_double_splat_hash_braces"
157
+ register_cop :RedundantEach, "#{__dir__}/style/redundant_each"
158
+ register_cop :RedundantFetchBlock, "#{__dir__}/style/redundant_fetch_block"
159
+ register_cop :RedundantFileExtensionInRequire, "#{__dir__}/style/redundant_file_extension_in_require"
160
+ register_cop :RedundantFilterChain, "#{__dir__}/style/redundant_filter_chain"
161
+ register_cop :RedundantFormat, "#{__dir__}/style/redundant_format"
162
+ register_cop :RedundantHeredocDelimiterQuotes, "#{__dir__}/style/redundant_heredoc_delimiter_quotes"
163
+ register_cop :RedundantInitialize, "#{__dir__}/style/redundant_initialize"
164
+ register_cop :RedundantInterpolationUnfreeze, "#{__dir__}/style/redundant_interpolation_unfreeze"
165
+ register_cop :RedundantLineContinuation, "#{__dir__}/style/redundant_line_continuation"
166
+ register_cop :RedundantMinMaxBy, "#{__dir__}/style/redundant_min_max_by"
167
+ register_cop :RedundantRegexpArgument, "#{__dir__}/style/redundant_regexp_argument"
168
+ register_cop :RedundantRegexpConstructor, "#{__dir__}/style/redundant_regexp_constructor"
169
+ register_cop :RedundantSelfAssignment, "#{__dir__}/style/redundant_self_assignment"
170
+ register_cop :RedundantSelfAssignmentBranch, "#{__dir__}/style/redundant_self_assignment_branch"
171
+ register_cop :RedundantStructKeywordInit, "#{__dir__}/style/redundant_struct_keyword_init"
172
+ register_cop :RequireOrder, "#{__dir__}/style/require_order"
173
+ register_cop :ReverseFind, "#{__dir__}/style/reverse_find"
174
+ register_cop :SafeNavigationChainLength, "#{__dir__}/style/safe_navigation_chain_length"
175
+ register_cop :SingleLineDoEndBlock, "#{__dir__}/style/single_line_do_end_block"
176
+ register_cop :SoleNestedConditional, "#{__dir__}/style/sole_nested_conditional"
177
+ register_cop :StaticClass, "#{__dir__}/style/static_class"
178
+ register_cop :MapCompactWithConditionalBlock, "#{__dir__}/style/map_compact_with_conditional_block"
179
+ register_cop :MethodCalledOnDoEndBlock, "#{__dir__}/style/method_called_on_do_end_block"
180
+ register_cop :MethodDefParentheses, "#{__dir__}/style/method_def_parentheses"
181
+ register_cop :MinMax, "#{__dir__}/style/min_max"
182
+ register_cop :MissingElse, "#{__dir__}/style/missing_else"
183
+ register_cop :MissingRespondToMissing, "#{__dir__}/style/missing_respond_to_missing"
184
+ register_cop :MixinGrouping, "#{__dir__}/style/mixin_grouping"
185
+ register_cop :MixinUsage, "#{__dir__}/style/mixin_usage"
186
+ register_cop :ModuleFunction, "#{__dir__}/style/module_function"
187
+ register_cop :MultilineBlockChain, "#{__dir__}/style/multiline_block_chain"
188
+ register_cop :MultilineIfThen, "#{__dir__}/style/multiline_if_then"
189
+ register_cop :MultilineIfModifier, "#{__dir__}/style/multiline_if_modifier"
190
+ register_cop :MultilineMethodSignature, "#{__dir__}/style/multiline_method_signature"
191
+ register_cop :MultilineMemoization, "#{__dir__}/style/multiline_memoization"
192
+ register_cop :MultilineTernaryOperator, "#{__dir__}/style/multiline_ternary_operator"
193
+ register_cop :MultilineWhenThen, "#{__dir__}/style/multiline_when_then"
194
+ register_cop :MultipleComparison, "#{__dir__}/style/multiple_comparison"
195
+ register_cop :MutableConstant, "#{__dir__}/style/mutable_constant"
196
+ register_cop :NegatedIf, "#{__dir__}/style/negated_if"
197
+ register_cop :NegatedIfElseCondition, "#{__dir__}/style/negated_if_else_condition"
198
+ register_cop :NegatedUnless, "#{__dir__}/style/negated_unless"
199
+ register_cop :NegatedWhile, "#{__dir__}/style/negated_while"
200
+ register_cop :NegativeArrayIndex, "#{__dir__}/style/negative_array_index"
201
+ register_cop :NestedFileDirname, "#{__dir__}/style/nested_file_dirname"
202
+ register_cop :NestedModifier, "#{__dir__}/style/nested_modifier"
203
+ register_cop :NestedParenthesizedCalls, "#{__dir__}/style/nested_parenthesized_calls"
204
+ register_cop :NestedTernaryOperator, "#{__dir__}/style/nested_ternary_operator"
205
+ register_cop :Next, "#{__dir__}/style/next"
206
+ register_cop :NilComparison, "#{__dir__}/style/nil_comparison"
207
+ register_cop :NilLambda, "#{__dir__}/style/nil_lambda"
208
+ register_cop :NonNilCheck, "#{__dir__}/style/non_nil_check"
209
+ register_cop :Not, "#{__dir__}/style/not"
210
+ register_cop :NumberedParametersLimit, "#{__dir__}/style/numbered_parameters_limit"
211
+ register_cop :NumericLiterals, "#{__dir__}/style/numeric_literals"
212
+ register_cop :NumericLiteralPrefix, "#{__dir__}/style/numeric_literal_prefix"
213
+ register_cop :NumericPredicate, "#{__dir__}/style/numeric_predicate"
214
+ register_cop :ObjectThen, "#{__dir__}/style/object_then"
215
+ register_cop :OneLineConditional, "#{__dir__}/style/one_line_conditional"
216
+ register_cop :OrAssignment, "#{__dir__}/style/or_assignment"
217
+ register_cop :OptionHash, "#{__dir__}/style/option_hash"
218
+ register_cop :OptionalArguments, "#{__dir__}/style/optional_arguments"
219
+ register_cop :OptionalBooleanParameter, "#{__dir__}/style/optional_boolean_parameter"
220
+ register_cop :ParallelAssignment, "#{__dir__}/style/parallel_assignment"
221
+ register_cop :ParenthesesAroundCondition, "#{__dir__}/style/parentheses_around_condition"
222
+ register_cop :PercentLiteralDelimiters, "#{__dir__}/style/percent_literal_delimiters"
223
+ register_cop :PercentQLiterals, "#{__dir__}/style/percent_q_literals"
224
+ register_cop :PerlBackrefs, "#{__dir__}/style/perl_backrefs"
225
+ register_cop :PredicateWithKind, "#{__dir__}/style/predicate_with_kind"
226
+ register_cop :PreferredHashMethods, "#{__dir__}/style/preferred_hash_methods"
227
+ register_cop :Proc, "#{__dir__}/style/proc"
228
+ register_cop :QuotedSymbols, "#{__dir__}/style/quoted_symbols"
229
+ register_cop :RaiseArgs, "#{__dir__}/style/raise_args"
230
+ register_cop :RandomWithOffset, "#{__dir__}/style/random_with_offset"
231
+ register_cop :RedundantArgument, "#{__dir__}/style/redundant_argument"
232
+ register_cop :RedundantBegin, "#{__dir__}/style/redundant_begin"
233
+ register_cop :RedundantCapitalW, "#{__dir__}/style/redundant_capital_w"
234
+ register_cop :RedundantCondition, "#{__dir__}/style/redundant_condition"
235
+ register_cop :RedundantConditional, "#{__dir__}/style/redundant_conditional"
236
+ register_cop :RedundantException, "#{__dir__}/style/redundant_exception"
237
+ register_cop :RedundantFreeze, "#{__dir__}/style/redundant_freeze"
238
+ register_cop :RedundantInterpolation, "#{__dir__}/style/redundant_interpolation"
239
+ register_cop :RedundantParentheses, "#{__dir__}/style/redundant_parentheses"
240
+ register_cop :RedundantPercentQ, "#{__dir__}/style/redundant_percent_q"
241
+ register_cop :RedundantRegexpCharacterClass, "#{__dir__}/style/redundant_regexp_character_class"
242
+ register_cop :RedundantRegexpEscape, "#{__dir__}/style/redundant_regexp_escape"
243
+ register_cop :RedundantReturn, "#{__dir__}/style/redundant_return"
244
+ register_cop :RedundantSelf, "#{__dir__}/style/redundant_self"
245
+ register_cop :RedundantSort, "#{__dir__}/style/redundant_sort"
246
+ register_cop :RedundantSortBy, "#{__dir__}/style/redundant_sort_by"
247
+ register_cop :RedundantStringEscape, "#{__dir__}/style/redundant_string_escape"
248
+ register_cop :RegexpLiteral, "#{__dir__}/style/regexp_literal"
249
+ register_cop :RescueModifier, "#{__dir__}/style/rescue_modifier"
250
+ register_cop :RescueStandardError, "#{__dir__}/style/rescue_standard_error"
251
+ register_cop :ReturnNil, "#{__dir__}/style/return_nil"
252
+ register_cop :ReturnNilInPredicateMethodDefinition, "#{__dir__}/style/return_nil_in_predicate_method_definition"
253
+ register_cop :SafeNavigation, "#{__dir__}/style/safe_navigation"
254
+ register_cop :Sample, "#{__dir__}/style/sample"
255
+ register_cop :SelectByKind, "#{__dir__}/style/select_by_kind"
256
+ register_cop :SelectByRange, "#{__dir__}/style/select_by_range"
257
+ register_cop :SelectByRegexp, "#{__dir__}/style/select_by_regexp"
258
+ register_cop :SelfAssignment, "#{__dir__}/style/self_assignment"
259
+ register_cop :Semicolon, "#{__dir__}/style/semicolon"
260
+ register_cop :Send, "#{__dir__}/style/send"
261
+ register_cop :SendWithLiteralMethodName, "#{__dir__}/style/send_with_literal_method_name"
262
+ register_cop :SignalException, "#{__dir__}/style/signal_exception"
263
+ register_cop :SingleArgumentDig, "#{__dir__}/style/single_argument_dig"
264
+ register_cop :SingleLineBlockParams, "#{__dir__}/style/single_line_block_params"
265
+ register_cop :SingleLineMethods, "#{__dir__}/style/single_line_methods"
266
+ register_cop :SlicingWithRange, "#{__dir__}/style/slicing_with_range"
267
+ register_cop :SpecialGlobalVars, "#{__dir__}/style/special_global_vars"
268
+ register_cop :StabbyLambdaParentheses, "#{__dir__}/style/stabby_lambda_parentheses"
269
+ register_cop :StderrPuts, "#{__dir__}/style/stderr_puts"
270
+ register_cop :StringChars, "#{__dir__}/style/string_chars"
271
+ register_cop :StringConcatenation, "#{__dir__}/style/string_concatenation"
272
+ register_cop :StringHashKeys, "#{__dir__}/style/string_hash_keys"
273
+ register_cop :StringLiterals, "#{__dir__}/style/string_literals"
274
+ register_cop :StringLiteralsInInterpolation, "#{__dir__}/style/string_literals_in_interpolation"
275
+ register_cop :StringMethods, "#{__dir__}/style/string_methods"
276
+ register_cop :Strip, "#{__dir__}/style/strip"
277
+ register_cop :StructInheritance, "#{__dir__}/style/struct_inheritance"
278
+ register_cop :SuperArguments, "#{__dir__}/style/super_arguments"
279
+ register_cop :SuperWithArgsParentheses, "#{__dir__}/style/super_with_args_parentheses"
280
+ register_cop :SwapValues, "#{__dir__}/style/swap_values"
281
+ register_cop :SymbolArray, "#{__dir__}/style/symbol_array"
282
+ register_cop :SymbolLiteral, "#{__dir__}/style/symbol_literal"
283
+ register_cop :SymbolProc, "#{__dir__}/style/symbol_proc"
284
+ register_cop :TallyMethod, "#{__dir__}/style/tally_method"
285
+ register_cop :TernaryParentheses, "#{__dir__}/style/ternary_parentheses"
286
+ register_cop :TimeNow, "#{__dir__}/style/time_now"
287
+ register_cop :TopLevelMethodDefinition, "#{__dir__}/style/top_level_method_definition"
288
+ register_cop :TrailingBodyOnClass, "#{__dir__}/style/trailing_body_on_class"
289
+ register_cop :TrailingBodyOnMethodDefinition, "#{__dir__}/style/trailing_body_on_method_definition"
290
+ register_cop :TrailingBodyOnModule, "#{__dir__}/style/trailing_body_on_module"
291
+ register_cop :TrailingCommaInArguments, "#{__dir__}/style/trailing_comma_in_arguments"
292
+ register_cop :TrailingCommaInArrayLiteral, "#{__dir__}/style/trailing_comma_in_array_literal"
293
+ register_cop :TrailingCommaInBlockArgs, "#{__dir__}/style/trailing_comma_in_block_args"
294
+ register_cop :TrailingCommaInHashLiteral, "#{__dir__}/style/trailing_comma_in_hash_literal"
295
+ register_cop :TrailingMethodEndStatement, "#{__dir__}/style/trailing_method_end_statement"
296
+ register_cop :TrailingUnderscoreVariable, "#{__dir__}/style/trailing_underscore_variable"
297
+ register_cop :TrivialAccessors, "#{__dir__}/style/trivial_accessors"
298
+ register_cop :UnlessElse, "#{__dir__}/style/unless_else"
299
+ register_cop :UnlessLogicalOperators, "#{__dir__}/style/unless_logical_operators"
300
+ register_cop :UnpackFirst, "#{__dir__}/style/unpack_first"
301
+ register_cop :VariableInterpolation, "#{__dir__}/style/variable_interpolation"
302
+ register_cop :WhenThen, "#{__dir__}/style/when_then"
303
+ register_cop :WhileUntilDo, "#{__dir__}/style/while_until_do"
304
+ register_cop :WhileUntilModifier, "#{__dir__}/style/while_until_modifier"
305
+ register_cop :WordArray, "#{__dir__}/style/word_array"
306
+ register_cop :YAMLFileRead, "#{__dir__}/style/yaml_file_read"
307
+ register_cop :YodaCondition, "#{__dir__}/style/yoda_condition"
308
+ register_cop :YodaExpression, "#{__dir__}/style/yoda_expression"
309
+ register_cop :ZeroLengthPredicate, "#{__dir__}/style/zero_length_predicate"
310
+ end
311
+ end
312
+ end
@@ -9,7 +9,7 @@ module RuboCop
9
9
  # For performance reasons, Team will first dispatch cops & forces in two groups,
10
10
  # first the ones needed for autocorrection (if any), then the rest
11
11
  # (unless autocorrections happened).
12
- # rubocop:disable Metrics/ClassLength
12
+ # rubocop:disable-next Metrics/ClassLength
13
13
  class Team
14
14
  InvestigationResult = Struct.new(:report, :corrector)
15
15
  private_constant :InvestigationResult
@@ -29,8 +29,17 @@ module RuboCop
29
29
 
30
30
  # @return [Team] with cops assembled from the given `cop_classes`
31
31
  def self.mobilize(cop_classes, config, options = {})
32
- cops = mobilize_cops(cop_classes, config, options)
33
- new(cops, config, options)
32
+ if cop_classes.is_a?(Registry)
33
+ # Instantiate only the enabled cops so that disabled lazy-loaded cops are not loaded.
34
+ # The registry is kept on standby to mobilize a disabled cop when a comment directive
35
+ # opts it back in.
36
+ cops = cop_classes.enabled(config).map { |cop_class| cop_class.new(config, options) }
37
+ team = new(cops, config, options)
38
+ team.standby_registry = cop_classes
39
+ team
40
+ else
41
+ new(mobilize_cops(cop_classes, config, options), config, options)
42
+ end
34
43
  end
35
44
 
36
45
  # @return [Array<Cop::Base>]
@@ -69,12 +78,20 @@ module RuboCop
69
78
  # @api private
70
79
  attr_reader :updated_source
71
80
 
81
+ # Registry used to mobilize cops that were not instantiated because they are disabled in
82
+ # the config, when a comment directive opts them back in for a file.
83
+ #
84
+ # @api private
85
+ attr_writer :standby_registry
86
+
72
87
  alias updated_source_file? updated_source_file
73
88
 
74
89
  def initialize(cops, config = nil, options = {})
75
90
  @cops = cops
76
91
  @config = config
77
92
  @options = options
93
+ @standby_registry = nil
94
+ @standby_cops = {}
78
95
  reset
79
96
  @ready = true
80
97
  @registry = Registry.new(cops, options.dup)
@@ -170,6 +187,7 @@ module RuboCop
170
187
 
171
188
  reset
172
189
  @cops.map!(&:ready)
190
+ @standby_cops.transform_values! { |cop| cop&.ready }
173
191
  @ready = true
174
192
  end
175
193
 
@@ -193,7 +211,7 @@ module RuboCop
193
211
  # run the other cops when no corrections are left
194
212
  on_duty = roundup_relevant_cops(processed_source)
195
213
 
196
- autocorrect_cops, other_cops = on_duty.partition(&:autocorrect?)
214
+ autocorrect_cops, other_cops = partition_by_correcting(on_duty)
197
215
  report = investigate_partial(autocorrect_cops, processed_source,
198
216
  offset: offset, original: original)
199
217
 
@@ -233,8 +251,17 @@ module RuboCop
233
251
  end
234
252
 
235
253
  # @return [Array<cop>]
254
+ # A cop whose unsafe correction is skipped still inserts todo comments
255
+ # under `--disable-uncorrectable`, so it must run with the correcting
256
+ # cops - correctors of the later `other_cops` round are never applied.
257
+ def partition_by_correcting(cops)
258
+ cops.partition do |cop|
259
+ cop.autocorrect? || cop.skipped_unsafe_correction_with_disable_uncorrectable?
260
+ end
261
+ end
262
+
236
263
  def roundup_relevant_cops(processed_source)
237
- cops.select do |cop|
264
+ (cops + opted_in_standby_cops(processed_source)).select do |cop|
238
265
  next false if cop.excluded_file?(processed_source.file_path)
239
266
  next true if processed_source.comment_config.cop_opted_in?(cop)
240
267
  next false unless @registry.enabled?(cop, @config)
@@ -243,6 +270,33 @@ module RuboCop
243
270
  end
244
271
  end
245
272
 
273
+ # Cops that were not mobilized because they are disabled in the config,
274
+ # but are opted back in for the given file by an `enable` comment directive.
275
+ # Their classes are loaded on demand.
276
+ #
277
+ # @return [Array<cop>]
278
+ def opted_in_standby_cops(processed_source)
279
+ return [] unless @standby_registry
280
+
281
+ opted_in_names = processed_source.comment_config.opt_in_cops
282
+ return [] if opted_in_names.empty?
283
+
284
+ @mobilized_cop_names ||= Set.new(cops.map(&:cop_name))
285
+ opted_in_names.filter_map do |cop_name|
286
+ next if @mobilized_cop_names.include?(cop_name)
287
+
288
+ standby_cop(cop_name)
289
+ end
290
+ end
291
+
292
+ def standby_cop(cop_name)
293
+ return @standby_cops[cop_name] if @standby_cops.key?(cop_name)
294
+
295
+ cop_class = @standby_registry.find_by_cop_name(cop_name)
296
+
297
+ @standby_cops[cop_name] = cop_class&.new(@config, @options)
298
+ end
299
+
246
300
  def support_target_ruby_version?(cop)
247
301
  return true unless cop.class.respond_to?(:support_target_ruby_version?)
248
302
 
@@ -350,6 +404,5 @@ module RuboCop
350
404
  end
351
405
  end
352
406
  end
353
- # rubocop:enable Metrics/ClassLength
354
407
  end
355
408
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  # This module contains a collection of useful utility methods.
6
- # rubocop:disable Metrics/ModuleLength
6
+ # rubocop:disable-next Metrics/ModuleLength
7
7
  module Util
8
8
  include PathUtil
9
9
 
@@ -35,7 +35,7 @@ module RuboCop
35
35
  node.loc_is?(:end, ')')
36
36
  end
37
37
 
38
- # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
38
+ # rubocop:disable-next Metrics/AbcSize, Metrics/MethodLength
39
39
  def add_parentheses(node, corrector)
40
40
  if node.args_type?
41
41
  arguments_range = node.source_range
@@ -55,7 +55,6 @@ module RuboCop
55
55
  corrector.insert_after(args_end(node), ')')
56
56
  end
57
57
  end
58
- # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
59
58
 
60
59
  def any_descendant?(node, *types)
61
60
  if block_given?
@@ -210,6 +209,5 @@ module RuboCop
210
209
  source == target || (source.is_a?(Array) && source.include?(target))
211
210
  end
212
211
  end
213
- # rubocop:enable Metrics/ModuleLength
214
212
  end
215
213
  end
@@ -47,7 +47,7 @@ module RuboCop
47
47
  !@references.empty?
48
48
  end
49
49
 
50
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
50
+ # rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
51
51
  def reference!(node)
52
52
  reference = Reference.new(node, @scope)
53
53
  @references << reference
@@ -63,7 +63,7 @@ module RuboCop
63
63
  # if/unless keyword. A preceding assignment is needed to put the
64
64
  # variable in scope. For this reason we skip to the next assignment
65
65
  # here.
66
- next if in_modifier_conditional?(assignment)
66
+ next if in_modifier_conditional?(assignment, node)
67
67
 
68
68
  break if !assignment.branch || assignment.branch == reference.branch
69
69
 
@@ -72,14 +72,25 @@ module RuboCop
72
72
  end
73
73
  end
74
74
  end
75
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
76
75
 
77
- def in_modifier_conditional?(assignment)
78
- parent = assignment.node.parent
79
- parent = parent.parent if parent&.begin_type?
80
- return false if parent.nil?
76
+ def in_modifier_conditional?(assignment, reference_node)
77
+ conditional = modifier_conditional_of(assignment.node)
78
+ return false unless conditional
81
79
 
82
- parent.basic_conditional? && parent.modifier_form?
80
+ # The out-of-scope problem only affects a reference in the modifier body (to the
81
+ # left of the keyword); a reference after the modifier is put in scope by the
82
+ # condition's assignment, so an earlier assignment there is genuinely useless.
83
+ covers?(conditional, reference_node) && !covers?(conditional.condition, reference_node)
84
+ end
85
+
86
+ def modifier_conditional_of(node)
87
+ node.each_ancestor(:if, :while, :until).find do |conditional|
88
+ conditional.modifier_form? && covers?(conditional.condition, node)
89
+ end
90
+ end
91
+
92
+ def covers?(container, node)
93
+ container.equal?(node) || container.source_range.contains?(node.source_range)
83
94
  end
84
95
 
85
96
  def capture_with_block!
@@ -6,7 +6,7 @@ require 'yard'
6
6
  # Class for generating documentation of all cops departments
7
7
  # @api private
8
8
  class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
9
- include ::RuboCop::Cop::Documentation
9
+ include RuboCop::Cop::Documentation
10
10
 
11
11
  CopData = Struct.new(
12
12
  :cop, :description, :example_objects, :safety_objects, :see_objects, :config, keyword_init: true
@@ -137,7 +137,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
137
137
  "NOTE: Requires Ruby version #{requirement}\n\n"
138
138
  end
139
139
 
140
- # rubocop:disable Metrics/MethodLength
140
+ # rubocop:disable-next Metrics/MethodLength
141
141
  def properties(cop)
142
142
  header = [
143
143
  'Enabled by default', 'Safe', 'Supports autocorrection', 'Version Added',
@@ -160,7 +160,6 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
160
160
  ]]
161
161
  "#{to_table(header, content)}\n"
162
162
  end
163
- # rubocop:enable Metrics/MethodLength
164
163
 
165
164
  def cop_header(cop)
166
165
  content = +"\n"
@@ -217,7 +216,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
217
216
  "xref:#{filename}#allowmultilinefinalelement[AllowMultilineFinalElement]"
218
217
  end
219
218
 
220
- # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
219
+ # rubocop:disable-next Metrics/CyclomaticComplexity,Metrics/MethodLength
221
220
  def configurable_values(cop_config, name)
222
221
  case name
223
222
  when /^Enforced/
@@ -244,7 +243,6 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
244
243
  end
245
244
  end
246
245
  end
247
- # rubocop:enable Metrics/CyclomaticComplexity,Metrics/MethodLength
248
246
 
249
247
  def to_table(header, content)
250
248
  table = ['|===', "| #{header.join(' | ')}\n\n"].join("\n")
@@ -303,7 +301,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
303
301
  "\ninclude::../partials/#{filename}[]\n"
304
302
  end
305
303
 
306
- # rubocop:disable Metrics/MethodLength
304
+ # rubocop:disable-next Metrics/MethodLength
307
305
  def print_cops_of_department(department)
308
306
  selected_cops = cops_of_department(department)
309
307
  content = +<<~HEADER
@@ -323,7 +321,6 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
323
321
  file.write("#{content.strip}\n")
324
322
  end
325
323
  end
326
- # rubocop:enable Metrics/MethodLength
327
324
 
328
325
  def print_cop_with_doc(cop) # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
329
326
  cop_config = config.for_cop(cop)