rubocop 1.88.2 → 1.89.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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.yml +67 -11
  3. data/lib/rubocop/comment_config.rb +35 -19
  4. data/lib/rubocop/config.rb +53 -0
  5. data/lib/rubocop/config_validator.rb +38 -1
  6. data/lib/rubocop/cop/badge.rb +8 -0
  7. data/lib/rubocop/cop/base.rb +6 -4
  8. data/lib/rubocop/cop/bundler.rb +19 -0
  9. data/lib/rubocop/cop/corrector.rb +1 -1
  10. data/lib/rubocop/cop/correctors/alignment_corrector.rb +55 -5
  11. data/lib/rubocop/cop/gemspec.rb +22 -0
  12. data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
  13. data/lib/rubocop/cop/generator.rb +4 -0
  14. data/lib/rubocop/cop/layout/class_structure.rb +8 -2
  15. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -1
  16. data/lib/rubocop/cop/layout/indentation_width.rb +3 -1
  17. data/lib/rubocop/cop/layout/leading_comment_space.rb +27 -0
  18. data/lib/rubocop/cop/layout/line_length.rb +85 -12
  19. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +12 -2
  20. data/lib/rubocop/cop/layout/redundant_line_break.rb +77 -0
  21. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +33 -34
  22. data/lib/rubocop/cop/layout.rb +114 -0
  23. data/lib/rubocop/cop/lazy_loader.rb +41 -0
  24. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -7
  25. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +71 -0
  26. data/lib/rubocop/cop/lint/constant_reassignment.rb +1 -10
  27. data/lib/rubocop/cop/lint/constant_resolution.rb +25 -0
  28. data/lib/rubocop/cop/lint/deprecated_reference.rb +185 -0
  29. data/lib/rubocop/cop/lint/duplicate_methods.rb +202 -22
  30. data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
  31. data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -0
  32. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  33. data/lib/rubocop/cop/lint/missing_super.rb +31 -1
  34. data/lib/rubocop/cop/lint/name_typo.rb +223 -0
  35. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +0 -4
  36. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +7 -0
  37. data/lib/rubocop/cop/lint/to_enum_arguments.rb +37 -1
  38. data/lib/rubocop/cop/lint/unused_private_method.rb +157 -0
  39. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -0
  40. data/lib/rubocop/cop/lint/void.rb +17 -6
  41. data/lib/rubocop/cop/lint.rb +176 -0
  42. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  43. data/lib/rubocop/cop/metrics.rb +31 -0
  44. data/lib/rubocop/cop/migration/department_name.rb +0 -4
  45. data/lib/rubocop/cop/migration.rb +13 -0
  46. data/lib/rubocop/cop/mixin/check_line_breakable.rb +23 -5
  47. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
  48. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +23 -6
  49. data/lib/rubocop/cop/mixin/project_index_help.rb +140 -0
  50. data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
  51. data/lib/rubocop/cop/mixin/statement_modifier.rb +42 -6
  52. data/lib/rubocop/cop/mixin.rb +78 -77
  53. data/lib/rubocop/cop/naming/accessor_method_name.rb +24 -0
  54. data/lib/rubocop/cop/naming/predicate_prefix.rb +33 -5
  55. data/lib/rubocop/cop/naming/variable_number.rb +3 -1
  56. data/lib/rubocop/cop/naming.rb +31 -0
  57. data/lib/rubocop/cop/offense.rb +10 -6
  58. data/lib/rubocop/cop/registry.rb +153 -43
  59. data/lib/rubocop/cop/security.rb +19 -0
  60. data/lib/rubocop/cop/style/array_intersect.rb +24 -5
  61. data/lib/rubocop/cop/style/class_and_module_children.rb +78 -18
  62. data/lib/rubocop/cop/style/conditional_assignment.rb +22 -0
  63. data/lib/rubocop/cop/style/copyright.rb +6 -1
  64. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +41 -3
  65. data/lib/rubocop/cop/style/documentation.rb +47 -0
  66. data/lib/rubocop/cop/style/endless_method.rb +0 -10
  67. data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -48
  68. data/lib/rubocop/cop/style/lambda.rb +4 -0
  69. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +20 -3
  70. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +30 -0
  71. data/lib/rubocop/cop/style/multiline_if_then.rb +7 -1
  72. data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
  73. data/lib/rubocop/cop/style/mutable_constant.rb +5 -0
  74. data/lib/rubocop/cop/style/negative_array_index.rb +3 -1
  75. data/lib/rubocop/cop/style/redundant_assignment.rb +11 -0
  76. data/lib/rubocop/cop/style/redundant_constant_base.rb +37 -1
  77. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
  78. data/lib/rubocop/cop/style/redundant_format.rb +12 -3
  79. data/lib/rubocop/cop/style/redundant_line_continuation.rb +78 -135
  80. data/lib/rubocop/cop/style/redundant_parentheses.rb +63 -63
  81. data/lib/rubocop/cop/style/safe_navigation.rb +10 -0
  82. data/lib/rubocop/cop/style/sole_nested_conditional.rb +20 -3
  83. data/lib/rubocop/cop/style/static_class.rb +21 -0
  84. data/lib/rubocop/cop/style.rb +310 -0
  85. data/lib/rubocop/cop/team.rb +48 -3
  86. data/lib/rubocop/cop/variable_force/variable.rb +18 -6
  87. data/lib/rubocop/cops_documentation_generator.rb +1 -1
  88. data/lib/rubocop/directive_comment.rb +2 -0
  89. data/lib/rubocop/feature_loader.rb +0 -6
  90. data/lib/rubocop/lsp/routes.rb +41 -3
  91. data/lib/rubocop/lsp/runtime.rb +4 -0
  92. data/lib/rubocop/lsp/server.rb +4 -0
  93. data/lib/rubocop/lsp/stdin_runner.rb +20 -0
  94. data/lib/rubocop/pending_cops_reporter.rb +1 -6
  95. data/lib/rubocop/project_index_loader.rb +16 -0
  96. data/lib/rubocop/result_cache.rb +6 -4
  97. data/lib/rubocop/rspec/shared_contexts.rb +14 -2
  98. data/lib/rubocop/runner.rb +45 -20
  99. data/lib/rubocop/server/cache.rb +10 -5
  100. data/lib/rubocop/target_ruby.rb +1 -1
  101. data/lib/rubocop/version.rb +1 -1
  102. data/lib/rubocop.rb +17 -626
  103. metadata +18 -3
@@ -0,0 +1,310 @@
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 :DisableCopsWithinSourceCodeDirective, "#{__dir__}/style/disable_cops_within_source_code_directive"
62
+ register_cop :DocumentationMethod, "#{__dir__}/style/documentation_method"
63
+ register_cop :Documentation, "#{__dir__}/style/documentation"
64
+ register_cop :DocumentDynamicEvalDefinition, "#{__dir__}/style/document_dynamic_eval_definition"
65
+ register_cop :DoubleCopDisableDirective, "#{__dir__}/style/double_cop_disable_directive"
66
+ register_cop :DoubleNegation, "#{__dir__}/style/double_negation"
67
+ register_cop :EachForSimpleLoop, "#{__dir__}/style/each_for_simple_loop"
68
+ register_cop :EachWithObject, "#{__dir__}/style/each_with_object"
69
+ register_cop :EmptyBlockParameter, "#{__dir__}/style/empty_block_parameter"
70
+ register_cop :EmptyCaseCondition, "#{__dir__}/style/empty_case_condition"
71
+ register_cop :EmptyClassDefinition, "#{__dir__}/style/empty_class_definition"
72
+ register_cop :EmptyElse, "#{__dir__}/style/empty_else"
73
+ register_cop :EmptyHeredoc, "#{__dir__}/style/empty_heredoc"
74
+ register_cop :EmptyLambdaParameter, "#{__dir__}/style/empty_lambda_parameter"
75
+ register_cop :EmptyLiteral, "#{__dir__}/style/empty_literal"
76
+ register_cop :EmptyMethod, "#{__dir__}/style/empty_method"
77
+ register_cop :EmptyStringInsideInterpolation, "#{__dir__}/style/empty_string_inside_interpolation"
78
+ register_cop :EndlessMethod, "#{__dir__}/style/endless_method"
79
+ register_cop :Encoding, "#{__dir__}/style/encoding"
80
+ register_cop :EndBlock, "#{__dir__}/style/end_block"
81
+ register_cop :EnvHome, "#{__dir__}/style/env_home"
82
+ register_cop :EvalWithLocation, "#{__dir__}/style/eval_with_location"
83
+ register_cop :EvenOdd, "#{__dir__}/style/even_odd"
84
+ register_cop :ExactRegexpMatch, "#{__dir__}/style/exact_regexp_match"
85
+ register_cop :ExpandPathArguments, "#{__dir__}/style/expand_path_arguments"
86
+ register_cop :ExplicitBlockArgument, "#{__dir__}/style/explicit_block_argument"
87
+ register_cop :ExponentialNotation, "#{__dir__}/style/exponential_notation"
88
+ register_cop :FetchEnvVar, "#{__dir__}/style/fetch_env_var"
89
+ register_cop :FileEmpty, "#{__dir__}/style/file_empty"
90
+ register_cop :FileNull, "#{__dir__}/style/file_null"
91
+ register_cop :FileOpen, "#{__dir__}/style/file_open"
92
+ register_cop :FileRead, "#{__dir__}/style/file_read"
93
+ register_cop :FileTouch, "#{__dir__}/style/file_touch"
94
+ register_cop :FileWrite, "#{__dir__}/style/file_write"
95
+ register_cop :FloatDivision, "#{__dir__}/style/float_division"
96
+ register_cop :For, "#{__dir__}/style/for"
97
+ register_cop :FormatString, "#{__dir__}/style/format_string"
98
+ register_cop :FormatStringToken, "#{__dir__}/style/format_string_token"
99
+ register_cop :FrozenStringLiteralComment, "#{__dir__}/style/frozen_string_literal_comment"
100
+ register_cop :GlobalStdStream, "#{__dir__}/style/global_std_stream"
101
+ register_cop :GlobalVars, "#{__dir__}/style/global_vars"
102
+ register_cop :GuardClause, "#{__dir__}/style/guard_clause"
103
+ register_cop :HashAsLastArrayItem, "#{__dir__}/style/hash_as_last_array_item"
104
+ register_cop :HashConversion, "#{__dir__}/style/hash_conversion"
105
+ register_cop :HashEachMethods, "#{__dir__}/style/hash_each_methods"
106
+ register_cop :HashExcept, "#{__dir__}/style/hash_except"
107
+ register_cop :HashFetchChain, "#{__dir__}/style/hash_fetch_chain"
108
+ register_cop :HashLikeCase, "#{__dir__}/style/hash_like_case"
109
+ register_cop :HashLookupMethod, "#{__dir__}/style/hash_lookup_method"
110
+ register_cop :HashSlice, "#{__dir__}/style/hash_slice"
111
+ register_cop :HashSyntax, "#{__dir__}/style/hash_syntax"
112
+ register_cop :HashTransformKeys, "#{__dir__}/style/hash_transform_keys"
113
+ register_cop :HashTransformValues, "#{__dir__}/style/hash_transform_values"
114
+ register_cop :IdenticalConditionalBranches, "#{__dir__}/style/identical_conditional_branches"
115
+ register_cop :IfInsideElse, "#{__dir__}/style/if_inside_else"
116
+ register_cop :IfUnlessModifier, "#{__dir__}/style/if_unless_modifier"
117
+ register_cop :IfUnlessModifierOfIfUnless, "#{__dir__}/style/if_unless_modifier_of_if_unless"
118
+ register_cop :IfWithBooleanLiteralBranches, "#{__dir__}/style/if_with_boolean_literal_branches"
119
+ register_cop :IfWithSemicolon, "#{__dir__}/style/if_with_semicolon"
120
+ register_cop :ImplicitRuntimeError, "#{__dir__}/style/implicit_runtime_error"
121
+ register_cop :InPatternThen, "#{__dir__}/style/in_pattern_then"
122
+ register_cop :InfiniteLoop, "#{__dir__}/style/infinite_loop"
123
+ register_cop :ReduceToHash, "#{__dir__}/style/reduce_to_hash"
124
+ register_cop :InverseMethods, "#{__dir__}/style/inverse_methods"
125
+ register_cop :InlineComment, "#{__dir__}/style/inline_comment"
126
+ register_cop :InvertibleUnlessCondition, "#{__dir__}/style/invertible_unless_condition"
127
+ register_cop :IpAddresses, "#{__dir__}/style/ip_addresses"
128
+ register_cop :ItAssignment, "#{__dir__}/style/it_assignment"
129
+ register_cop :ItBlockParameter, "#{__dir__}/style/it_block_parameter"
130
+ register_cop :KeywordArgumentsMerging, "#{__dir__}/style/keyword_arguments_merging"
131
+ register_cop :KeywordParametersOrder, "#{__dir__}/style/keyword_parameters_order"
132
+ register_cop :Lambda, "#{__dir__}/style/lambda"
133
+ register_cop :LambdaCall, "#{__dir__}/style/lambda_call"
134
+ register_cop :LineEndConcatenation, "#{__dir__}/style/line_end_concatenation"
135
+ register_cop :MagicCommentFormat, "#{__dir__}/style/magic_comment_format"
136
+ register_cop :MapIntoArray, "#{__dir__}/style/map_into_array"
137
+ register_cop :MapJoin, "#{__dir__}/style/map_join"
138
+ register_cop :MapToHash, "#{__dir__}/style/map_to_hash"
139
+ register_cop :MapToSet, "#{__dir__}/style/map_to_set"
140
+ register_cop :MethodCallWithoutArgsParentheses, "#{__dir__}/style/method_call_without_args_parentheses"
141
+ register_cop :MethodCallWithArgsParentheses, "#{__dir__}/style/method_call_with_args_parentheses"
142
+ register_cop :MinMaxComparison, "#{__dir__}/style/min_max_comparison"
143
+ register_cop :ModuleMemberExistenceCheck, "#{__dir__}/style/module_member_existence_check"
144
+ register_cop :MultilineInPatternThen, "#{__dir__}/style/multiline_in_pattern_then"
145
+ register_cop :NumberedParameters, "#{__dir__}/style/numbered_parameters"
146
+ register_cop :OneClassPerFile, "#{__dir__}/style/one_class_per_file"
147
+ register_cop :OpenStructUse, "#{__dir__}/style/open_struct_use"
148
+ register_cop :OperatorMethodCall, "#{__dir__}/style/operator_method_call"
149
+ register_cop :PartitionInsteadOfDoubleSelect, "#{__dir__}/style/partition_instead_of_double_select"
150
+ register_cop :RedundantArrayConstructor, "#{__dir__}/style/redundant_array_constructor"
151
+ register_cop :RedundantArrayFlatten, "#{__dir__}/style/redundant_array_flatten"
152
+ register_cop :RedundantAssignment, "#{__dir__}/style/redundant_assignment"
153
+ register_cop :RedundantConstantBase, "#{__dir__}/style/redundant_constant_base"
154
+ register_cop :RedundantCurrentDirectoryInPath, "#{__dir__}/style/redundant_current_directory_in_path"
155
+ register_cop :RedundantDoubleSplatHashBraces, "#{__dir__}/style/redundant_double_splat_hash_braces"
156
+ register_cop :RedundantEach, "#{__dir__}/style/redundant_each"
157
+ register_cop :RedundantFetchBlock, "#{__dir__}/style/redundant_fetch_block"
158
+ register_cop :RedundantFileExtensionInRequire, "#{__dir__}/style/redundant_file_extension_in_require"
159
+ register_cop :RedundantFilterChain, "#{__dir__}/style/redundant_filter_chain"
160
+ register_cop :RedundantFormat, "#{__dir__}/style/redundant_format"
161
+ register_cop :RedundantHeredocDelimiterQuotes, "#{__dir__}/style/redundant_heredoc_delimiter_quotes"
162
+ register_cop :RedundantInitialize, "#{__dir__}/style/redundant_initialize"
163
+ register_cop :RedundantInterpolationUnfreeze, "#{__dir__}/style/redundant_interpolation_unfreeze"
164
+ register_cop :RedundantLineContinuation, "#{__dir__}/style/redundant_line_continuation"
165
+ register_cop :RedundantMinMaxBy, "#{__dir__}/style/redundant_min_max_by"
166
+ register_cop :RedundantRegexpArgument, "#{__dir__}/style/redundant_regexp_argument"
167
+ register_cop :RedundantRegexpConstructor, "#{__dir__}/style/redundant_regexp_constructor"
168
+ register_cop :RedundantSelfAssignment, "#{__dir__}/style/redundant_self_assignment"
169
+ register_cop :RedundantSelfAssignmentBranch, "#{__dir__}/style/redundant_self_assignment_branch"
170
+ register_cop :RedundantStructKeywordInit, "#{__dir__}/style/redundant_struct_keyword_init"
171
+ register_cop :RequireOrder, "#{__dir__}/style/require_order"
172
+ register_cop :ReverseFind, "#{__dir__}/style/reverse_find"
173
+ register_cop :SafeNavigationChainLength, "#{__dir__}/style/safe_navigation_chain_length"
174
+ register_cop :SingleLineDoEndBlock, "#{__dir__}/style/single_line_do_end_block"
175
+ register_cop :SoleNestedConditional, "#{__dir__}/style/sole_nested_conditional"
176
+ register_cop :StaticClass, "#{__dir__}/style/static_class"
177
+ register_cop :MapCompactWithConditionalBlock, "#{__dir__}/style/map_compact_with_conditional_block"
178
+ register_cop :MethodCalledOnDoEndBlock, "#{__dir__}/style/method_called_on_do_end_block"
179
+ register_cop :MethodDefParentheses, "#{__dir__}/style/method_def_parentheses"
180
+ register_cop :MinMax, "#{__dir__}/style/min_max"
181
+ register_cop :MissingElse, "#{__dir__}/style/missing_else"
182
+ register_cop :MissingRespondToMissing, "#{__dir__}/style/missing_respond_to_missing"
183
+ register_cop :MixinGrouping, "#{__dir__}/style/mixin_grouping"
184
+ register_cop :MixinUsage, "#{__dir__}/style/mixin_usage"
185
+ register_cop :ModuleFunction, "#{__dir__}/style/module_function"
186
+ register_cop :MultilineBlockChain, "#{__dir__}/style/multiline_block_chain"
187
+ register_cop :MultilineIfThen, "#{__dir__}/style/multiline_if_then"
188
+ register_cop :MultilineIfModifier, "#{__dir__}/style/multiline_if_modifier"
189
+ register_cop :MultilineMethodSignature, "#{__dir__}/style/multiline_method_signature"
190
+ register_cop :MultilineMemoization, "#{__dir__}/style/multiline_memoization"
191
+ register_cop :MultilineTernaryOperator, "#{__dir__}/style/multiline_ternary_operator"
192
+ register_cop :MultilineWhenThen, "#{__dir__}/style/multiline_when_then"
193
+ register_cop :MultipleComparison, "#{__dir__}/style/multiple_comparison"
194
+ register_cop :MutableConstant, "#{__dir__}/style/mutable_constant"
195
+ register_cop :NegatedIf, "#{__dir__}/style/negated_if"
196
+ register_cop :NegatedIfElseCondition, "#{__dir__}/style/negated_if_else_condition"
197
+ register_cop :NegatedUnless, "#{__dir__}/style/negated_unless"
198
+ register_cop :NegatedWhile, "#{__dir__}/style/negated_while"
199
+ register_cop :NegativeArrayIndex, "#{__dir__}/style/negative_array_index"
200
+ register_cop :NestedFileDirname, "#{__dir__}/style/nested_file_dirname"
201
+ register_cop :NestedModifier, "#{__dir__}/style/nested_modifier"
202
+ register_cop :NestedParenthesizedCalls, "#{__dir__}/style/nested_parenthesized_calls"
203
+ register_cop :NestedTernaryOperator, "#{__dir__}/style/nested_ternary_operator"
204
+ register_cop :Next, "#{__dir__}/style/next"
205
+ register_cop :NilComparison, "#{__dir__}/style/nil_comparison"
206
+ register_cop :NilLambda, "#{__dir__}/style/nil_lambda"
207
+ register_cop :NonNilCheck, "#{__dir__}/style/non_nil_check"
208
+ register_cop :Not, "#{__dir__}/style/not"
209
+ register_cop :NumberedParametersLimit, "#{__dir__}/style/numbered_parameters_limit"
210
+ register_cop :NumericLiterals, "#{__dir__}/style/numeric_literals"
211
+ register_cop :NumericLiteralPrefix, "#{__dir__}/style/numeric_literal_prefix"
212
+ register_cop :NumericPredicate, "#{__dir__}/style/numeric_predicate"
213
+ register_cop :ObjectThen, "#{__dir__}/style/object_then"
214
+ register_cop :OneLineConditional, "#{__dir__}/style/one_line_conditional"
215
+ register_cop :OrAssignment, "#{__dir__}/style/or_assignment"
216
+ register_cop :OptionHash, "#{__dir__}/style/option_hash"
217
+ register_cop :OptionalArguments, "#{__dir__}/style/optional_arguments"
218
+ register_cop :OptionalBooleanParameter, "#{__dir__}/style/optional_boolean_parameter"
219
+ register_cop :ParallelAssignment, "#{__dir__}/style/parallel_assignment"
220
+ register_cop :ParenthesesAroundCondition, "#{__dir__}/style/parentheses_around_condition"
221
+ register_cop :PercentLiteralDelimiters, "#{__dir__}/style/percent_literal_delimiters"
222
+ register_cop :PercentQLiterals, "#{__dir__}/style/percent_q_literals"
223
+ register_cop :PerlBackrefs, "#{__dir__}/style/perl_backrefs"
224
+ register_cop :PredicateWithKind, "#{__dir__}/style/predicate_with_kind"
225
+ register_cop :PreferredHashMethods, "#{__dir__}/style/preferred_hash_methods"
226
+ register_cop :Proc, "#{__dir__}/style/proc"
227
+ register_cop :QuotedSymbols, "#{__dir__}/style/quoted_symbols"
228
+ register_cop :RaiseArgs, "#{__dir__}/style/raise_args"
229
+ register_cop :RandomWithOffset, "#{__dir__}/style/random_with_offset"
230
+ register_cop :RedundantArgument, "#{__dir__}/style/redundant_argument"
231
+ register_cop :RedundantBegin, "#{__dir__}/style/redundant_begin"
232
+ register_cop :RedundantCapitalW, "#{__dir__}/style/redundant_capital_w"
233
+ register_cop :RedundantCondition, "#{__dir__}/style/redundant_condition"
234
+ register_cop :RedundantConditional, "#{__dir__}/style/redundant_conditional"
235
+ register_cop :RedundantException, "#{__dir__}/style/redundant_exception"
236
+ register_cop :RedundantFreeze, "#{__dir__}/style/redundant_freeze"
237
+ register_cop :RedundantInterpolation, "#{__dir__}/style/redundant_interpolation"
238
+ register_cop :RedundantParentheses, "#{__dir__}/style/redundant_parentheses"
239
+ register_cop :RedundantPercentQ, "#{__dir__}/style/redundant_percent_q"
240
+ register_cop :RedundantRegexpCharacterClass, "#{__dir__}/style/redundant_regexp_character_class"
241
+ register_cop :RedundantRegexpEscape, "#{__dir__}/style/redundant_regexp_escape"
242
+ register_cop :RedundantReturn, "#{__dir__}/style/redundant_return"
243
+ register_cop :RedundantSelf, "#{__dir__}/style/redundant_self"
244
+ register_cop :RedundantSort, "#{__dir__}/style/redundant_sort"
245
+ register_cop :RedundantSortBy, "#{__dir__}/style/redundant_sort_by"
246
+ register_cop :RedundantStringEscape, "#{__dir__}/style/redundant_string_escape"
247
+ register_cop :RegexpLiteral, "#{__dir__}/style/regexp_literal"
248
+ register_cop :RescueModifier, "#{__dir__}/style/rescue_modifier"
249
+ register_cop :RescueStandardError, "#{__dir__}/style/rescue_standard_error"
250
+ register_cop :ReturnNil, "#{__dir__}/style/return_nil"
251
+ register_cop :ReturnNilInPredicateMethodDefinition, "#{__dir__}/style/return_nil_in_predicate_method_definition"
252
+ register_cop :SafeNavigation, "#{__dir__}/style/safe_navigation"
253
+ register_cop :Sample, "#{__dir__}/style/sample"
254
+ register_cop :SelectByKind, "#{__dir__}/style/select_by_kind"
255
+ register_cop :SelectByRange, "#{__dir__}/style/select_by_range"
256
+ register_cop :SelectByRegexp, "#{__dir__}/style/select_by_regexp"
257
+ register_cop :SelfAssignment, "#{__dir__}/style/self_assignment"
258
+ register_cop :Semicolon, "#{__dir__}/style/semicolon"
259
+ register_cop :Send, "#{__dir__}/style/send"
260
+ register_cop :SendWithLiteralMethodName, "#{__dir__}/style/send_with_literal_method_name"
261
+ register_cop :SignalException, "#{__dir__}/style/signal_exception"
262
+ register_cop :SingleArgumentDig, "#{__dir__}/style/single_argument_dig"
263
+ register_cop :SingleLineBlockParams, "#{__dir__}/style/single_line_block_params"
264
+ register_cop :SingleLineMethods, "#{__dir__}/style/single_line_methods"
265
+ register_cop :SlicingWithRange, "#{__dir__}/style/slicing_with_range"
266
+ register_cop :SpecialGlobalVars, "#{__dir__}/style/special_global_vars"
267
+ register_cop :StabbyLambdaParentheses, "#{__dir__}/style/stabby_lambda_parentheses"
268
+ register_cop :StderrPuts, "#{__dir__}/style/stderr_puts"
269
+ register_cop :StringChars, "#{__dir__}/style/string_chars"
270
+ register_cop :StringConcatenation, "#{__dir__}/style/string_concatenation"
271
+ register_cop :StringHashKeys, "#{__dir__}/style/string_hash_keys"
272
+ register_cop :StringLiterals, "#{__dir__}/style/string_literals"
273
+ register_cop :StringLiteralsInInterpolation, "#{__dir__}/style/string_literals_in_interpolation"
274
+ register_cop :StringMethods, "#{__dir__}/style/string_methods"
275
+ register_cop :Strip, "#{__dir__}/style/strip"
276
+ register_cop :StructInheritance, "#{__dir__}/style/struct_inheritance"
277
+ register_cop :SuperArguments, "#{__dir__}/style/super_arguments"
278
+ register_cop :SuperWithArgsParentheses, "#{__dir__}/style/super_with_args_parentheses"
279
+ register_cop :SwapValues, "#{__dir__}/style/swap_values"
280
+ register_cop :SymbolArray, "#{__dir__}/style/symbol_array"
281
+ register_cop :SymbolLiteral, "#{__dir__}/style/symbol_literal"
282
+ register_cop :SymbolProc, "#{__dir__}/style/symbol_proc"
283
+ register_cop :TallyMethod, "#{__dir__}/style/tally_method"
284
+ register_cop :TernaryParentheses, "#{__dir__}/style/ternary_parentheses"
285
+ register_cop :TopLevelMethodDefinition, "#{__dir__}/style/top_level_method_definition"
286
+ register_cop :TrailingBodyOnClass, "#{__dir__}/style/trailing_body_on_class"
287
+ register_cop :TrailingBodyOnMethodDefinition, "#{__dir__}/style/trailing_body_on_method_definition"
288
+ register_cop :TrailingBodyOnModule, "#{__dir__}/style/trailing_body_on_module"
289
+ register_cop :TrailingCommaInArguments, "#{__dir__}/style/trailing_comma_in_arguments"
290
+ register_cop :TrailingCommaInArrayLiteral, "#{__dir__}/style/trailing_comma_in_array_literal"
291
+ register_cop :TrailingCommaInBlockArgs, "#{__dir__}/style/trailing_comma_in_block_args"
292
+ register_cop :TrailingCommaInHashLiteral, "#{__dir__}/style/trailing_comma_in_hash_literal"
293
+ register_cop :TrailingMethodEndStatement, "#{__dir__}/style/trailing_method_end_statement"
294
+ register_cop :TrailingUnderscoreVariable, "#{__dir__}/style/trailing_underscore_variable"
295
+ register_cop :TrivialAccessors, "#{__dir__}/style/trivial_accessors"
296
+ register_cop :UnlessElse, "#{__dir__}/style/unless_else"
297
+ register_cop :UnlessLogicalOperators, "#{__dir__}/style/unless_logical_operators"
298
+ register_cop :UnpackFirst, "#{__dir__}/style/unpack_first"
299
+ register_cop :VariableInterpolation, "#{__dir__}/style/variable_interpolation"
300
+ register_cop :WhenThen, "#{__dir__}/style/when_then"
301
+ register_cop :WhileUntilDo, "#{__dir__}/style/while_until_do"
302
+ register_cop :WhileUntilModifier, "#{__dir__}/style/while_until_modifier"
303
+ register_cop :WordArray, "#{__dir__}/style/word_array"
304
+ register_cop :YAMLFileRead, "#{__dir__}/style/yaml_file_read"
305
+ register_cop :YodaCondition, "#{__dir__}/style/yoda_condition"
306
+ register_cop :YodaExpression, "#{__dir__}/style/yoda_expression"
307
+ register_cop :ZeroLengthPredicate, "#{__dir__}/style/zero_length_predicate"
308
+ end
309
+ end
310
+ end
@@ -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
 
@@ -234,7 +252,7 @@ module RuboCop
234
252
 
235
253
  # @return [Array<cop>]
236
254
  def roundup_relevant_cops(processed_source)
237
- cops.select do |cop|
255
+ (cops + opted_in_standby_cops(processed_source)).select do |cop|
238
256
  next false if cop.excluded_file?(processed_source.file_path)
239
257
  next true if processed_source.comment_config.cop_opted_in?(cop)
240
258
  next false unless @registry.enabled?(cop, @config)
@@ -243,6 +261,33 @@ module RuboCop
243
261
  end
244
262
  end
245
263
 
264
+ # Cops that were not mobilized because they are disabled in the config,
265
+ # but are opted back in for the given file by an `enable` comment directive.
266
+ # Their classes are loaded on demand.
267
+ #
268
+ # @return [Array<cop>]
269
+ def opted_in_standby_cops(processed_source)
270
+ return [] unless @standby_registry
271
+
272
+ opted_in_names = processed_source.comment_config.opt_in_cops
273
+ return [] if opted_in_names.empty?
274
+
275
+ @mobilized_cop_names ||= Set.new(cops.map(&:cop_name))
276
+ opted_in_names.filter_map do |cop_name|
277
+ next if @mobilized_cop_names.include?(cop_name)
278
+
279
+ standby_cop(cop_name)
280
+ end
281
+ end
282
+
283
+ def standby_cop(cop_name)
284
+ return @standby_cops[cop_name] if @standby_cops.key?(cop_name)
285
+
286
+ cop_class = @standby_registry.find_by_cop_name(cop_name)
287
+
288
+ @standby_cops[cop_name] = cop_class&.new(@config, @options)
289
+ end
290
+
246
291
  def support_target_ruby_version?(cop)
247
292
  return true unless cop.class.respond_to?(:support_target_ruby_version?)
248
293
 
@@ -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
 
@@ -74,12 +74,24 @@ module RuboCop
74
74
  end
75
75
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
76
76
 
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?
77
+ def in_modifier_conditional?(assignment, reference_node)
78
+ conditional = modifier_conditional_of(assignment.node)
79
+ return false unless conditional
81
80
 
82
- parent.basic_conditional? && parent.modifier_form?
81
+ # The out-of-scope problem only affects a reference in the modifier body (to the
82
+ # left of the keyword); a reference after the modifier is put in scope by the
83
+ # condition's assignment, so an earlier assignment there is genuinely useless.
84
+ covers?(conditional, reference_node) && !covers?(conditional.condition, reference_node)
85
+ end
86
+
87
+ def modifier_conditional_of(node)
88
+ node.each_ancestor(:if, :while, :until).find do |conditional|
89
+ conditional.modifier_form? && covers?(conditional.condition, node)
90
+ end
91
+ end
92
+
93
+ def covers?(container, node)
94
+ container.equal?(node) || container.source_range.contains?(node.source_range)
83
95
  end
84
96
 
85
97
  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
@@ -12,6 +12,8 @@ module RuboCop
12
12
  # @api private
13
13
  LINT_SYNTAX_COP = "#{LINT_DEPARTMENT}/Syntax"
14
14
  # @api private
15
+ STYLE_DISABLE_COPS_DIRECTIVE_COP = 'Style/DisableCopsWithinSourceCodeDirective'
16
+ # @api private
15
17
  COP_NAME_PATTERN = '([A-Za-z]\w+/)*(?:[A-Za-z]\w+)'
16
18
  # @api private
17
19
  COP_NAME_PATTERN_NC = '(?:[A-Za-z]\w+/)*[A-Za-z]\w+'
@@ -76,12 +76,6 @@ module RuboCop
76
76
  @feature.start_with?('.')
77
77
  end
78
78
 
79
- # @param [LoadError] error
80
- # @return [Boolean]
81
- def seems_cannot_load_such_file_error?(error)
82
- error.path == target
83
- end
84
-
85
79
  # @return [String]
86
80
  def target
87
81
  if relative?
@@ -21,6 +21,10 @@ module RuboCop
21
21
  RuboCop::CLI::Command::AutoGenerateConfig::AUTO_GENERATED_FILE
22
22
  ].freeze
23
23
 
24
+ # Commands handled by `workspace/executeCommand`. Advertised to the client
25
+ # via `executeCommandProvider` so it knows which commands it can invoke.
26
+ EXECUTE_COMMANDS = %w[rubocop.formatAutocorrects rubocop.formatAutocorrectsAll].freeze
27
+
24
28
  def self.handle(name, &block)
25
29
  define_method(:"handle_#{name}", &block)
26
30
  end
@@ -50,6 +54,12 @@ module RuboCop
50
54
  result: LanguageServer::Protocol::Interface::InitializeResult.new(
51
55
  capabilities: LanguageServer::Protocol::Interface::ServerCapabilities.new(
52
56
  document_formatting_provider: true,
57
+ code_action_provider: LanguageServer::Protocol::Interface::CodeActionOptions.new(
58
+ code_action_kinds: [LanguageServer::Protocol::Constant::CodeActionKind::QUICK_FIX]
59
+ ),
60
+ execute_command_provider: LanguageServer::Protocol::Interface::ExecuteCommandOptions.new(
61
+ commands: EXECUTE_COMMANDS
62
+ ),
53
63
  text_document_sync: LanguageServer::Protocol::Interface::TextDocumentSyncOptions.new(
54
64
  change: LanguageServer::Protocol::Constant::TextDocumentSyncKind::INCREMENTAL,
55
65
  open_close: true
@@ -107,18 +117,26 @@ module RuboCop
107
117
  @server.write(id: request[:id], result: format_file(uri))
108
118
  end
109
119
 
120
+ handle 'textDocument/codeAction' do |request|
121
+ @server.write(id: request[:id], result: code_actions_for(request[:params]))
122
+ end
123
+
110
124
  handle 'workspace/didChangeConfiguration' do |_request|
111
125
  Logger.log('Ignoring workspace/didChangeConfiguration')
112
126
  end
113
127
 
114
128
  handle 'workspace/didChangeWatchedFiles' do |request|
115
- changed = request[:params][:changes].any? do |change|
129
+ config_changed = request[:params][:changes].any? do |change|
116
130
  CONFIGURATION_FILE_PATTERNS.any? { |path| change[:uri].end_with?(path) }
117
131
  end
118
132
 
119
- if changed
133
+ if config_changed
120
134
  Logger.log('Configuration file changed; restart required')
121
135
  @server.stop
136
+ else
137
+ # A watched source file changed on disk, so the project index may be
138
+ # stale; drop it so the next diagnostics run rebuilds it.
139
+ @server.reset_project_index
122
140
  end
123
141
  end
124
142
 
@@ -159,7 +177,9 @@ module RuboCop
159
177
  end
160
178
 
161
179
  handle 'textDocument/didSave' do |_request|
162
- # Nothing to do
180
+ # The buffer's contents are now on disk, so the project index may be
181
+ # stale; drop it so the next diagnostics run rebuilds it.
182
+ @server.reset_project_index
163
183
  end
164
184
 
165
185
  handle '$/cancelRequest' do |_request|
@@ -219,6 +239,24 @@ module RuboCop
219
239
  }]
220
240
  end
221
241
 
242
+ # Returns the quickfix code actions for a `textDocument/codeAction` request.
243
+ #
244
+ # RuboCop attaches each offense's autocorrect and disable-line actions to
245
+ # the diagnostic it publishes, under the diagnostic's `data` (see
246
+ # `Diagnostic#to_lsp_diagnostic`). The LSP spec preserves that `data`
247
+ # between `textDocument/publishDiagnostics` and `textDocument/codeAction`,
248
+ # so the client hands the diagnostics back in the request's context and we
249
+ # can surface their actions without re-analyzing the file. This makes the
250
+ # actions available to clients that request code actions rather than
251
+ # reading them off the diagnostic (Eglot, Helix, Flycheck, ...).
252
+ def code_actions_for(params)
253
+ diagnostics = params.dig(:context, :diagnostics) || []
254
+ only = params.dig(:context, :only)
255
+
256
+ diagnostics.flat_map { |diagnostic| diagnostic.dig(:data, :code_actions) || [] }
257
+ .select { |action| only.nil? || only.include?(action[:kind]) }
258
+ end
259
+
222
260
  def diagnostic(file_uri, text)
223
261
  @text_cache[file_uri] = text
224
262
 
@@ -43,6 +43,10 @@ module RuboCop
43
43
  @runner.formatted_source
44
44
  end
45
45
 
46
+ def reset_project_index
47
+ @runner.reset_project_index
48
+ end
49
+
46
50
  def offenses(path, text, document_encoding = nil, prism_result: nil)
47
51
  diagnostic_options = {}
48
52
  diagnostic_options[:only] = config_only_options if @lint_mode || @layout_mode
@@ -61,6 +61,10 @@ module RuboCop
61
61
  @runtime.layout_mode = options[:layout_mode]
62
62
  end
63
63
 
64
+ def reset_project_index
65
+ @runtime.reset_project_index
66
+ end
67
+
64
68
  def stop(&block)
65
69
  at_exit(&block) if block
66
70
  exit
@@ -60,8 +60,28 @@ module RuboCop
60
60
  @options[:stdin]
61
61
  end
62
62
 
63
+ # Drop the cached project index so the next run rebuilds it. Called when a
64
+ # file is saved or a watched file changes, i.e. when the on-disk state the
65
+ # index is derived from may have changed.
66
+ def reset_project_index
67
+ @project_index = nil
68
+ @project_index_built = false
69
+ end
70
+
63
71
  private
64
72
 
73
+ # The project index is built from files on disk, not from the in-memory
74
+ # buffer, so it does not change while the user is typing. Build it once and
75
+ # reuse it across runs instead of re-walking and re-indexing the whole
76
+ # project on every request; `reset_project_index` drops the cache when the
77
+ # on-disk state changes.
78
+ def build_project_index(target_files)
79
+ return if @project_index_built
80
+
81
+ super
82
+ @project_index_built = true
83
+ end
84
+
65
85
  def file_finished(_file, offenses)
66
86
  @offenses = offenses
67
87
  end
@@ -20,7 +20,7 @@ module RuboCop
20
20
  attr_accessor :disable_pending_cops, :enable_pending_cops
21
21
 
22
22
  def warn_if_needed(config)
23
- return if possible_new_cops?(config)
23
+ return if disable_pending_cops || enable_pending_cops
24
24
 
25
25
  pending_cops = pending_cops_only_qualified(config.pending_cops)
26
26
  warn_on_pending_cops(pending_cops) unless pending_cops.empty?
@@ -32,11 +32,6 @@ module RuboCop
32
32
  pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
33
33
  end
34
34
 
35
- def possible_new_cops?(config)
36
- disable_pending_cops || enable_pending_cops ||
37
- config.disabled_new_cops? || config.enabled_new_cops?
38
- end
39
-
40
35
  def warn_on_pending_cops(pending_cops)
41
36
  warn Rainbow(PENDING_BANNER).yellow
42
37