rubocop 1.71.1 → 1.92.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +886 -168
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +47 -4
- data/exe/rubocop +2 -9
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +50 -5
- data/lib/rubocop/changed_files.rb +134 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/cop_names.rb +57 -0
- data/lib/rubocop/cli/command/execute_runner.rb +54 -3
- data/lib/rubocop/cli/command/explain.rb +34 -0
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +8 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +59 -17
- data/lib/rubocop/comment_config/directive_range.rb +34 -0
- data/lib/rubocop/comment_config/disable_next.rb +143 -0
- data/lib/rubocop/comment_config/push_pop.rb +55 -0
- data/lib/rubocop/comment_config.rb +98 -45
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +75 -49
- data/lib/rubocop/config_loader_resolver.rb +124 -33
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +47 -3
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +75 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +43 -17
- data/lib/rubocop/cop/badge.rb +10 -2
- data/lib/rubocop/cop/base.rb +128 -35
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -11
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop_documentation.rb +81 -0
- data/lib/rubocop/cop/cop_explanation.rb +140 -0
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +92 -11
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +37 -7
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +31 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +73 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +3 -4
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -9
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +16 -20
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +9 -3
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +86 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
- data/lib/rubocop/cop/layout/class_structure.rb +191 -41
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/dot_position.rb +27 -17
- data/lib/rubocop/cop/layout/else_alignment.rb +3 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +27 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +21 -8
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +22 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +23 -15
- data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +82 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +41 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -23
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +20 -18
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +9 -5
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
- data/lib/rubocop/cop/layout/indentation_consistency.rb +22 -5
- data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +159 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
- data/lib/rubocop/cop/layout/line_length.rb +300 -31
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +11 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +65 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +270 -40
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +111 -7
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +29 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +20 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +30 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +55 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +32 -8
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -12
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
- data/lib/rubocop/cop/lint/ambiguous_range.rb +6 -2
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +6 -1
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +240 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +506 -41
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +22 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +4 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +152 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
- data/lib/rubocop/cop/lint/loop.rb +24 -2
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +60 -23
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +22 -11
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -25
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +5 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +28 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +56 -6
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +22 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +73 -5
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +54 -11
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +16 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +31 -6
- data/lib/rubocop/cop/lint/useless_assignment.rb +63 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +13 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +11 -5
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +68 -22
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/class_length.rb +4 -2
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
- data/lib/rubocop/cop/metrics/method_length.rb +3 -2
- data/lib/rubocop/cop/metrics/module_length.rb +4 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +7 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +50 -28
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +13 -9
- data/lib/rubocop/cop/mixin/code_length.rb +10 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +2 -3
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +13 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_body_help.rb +105 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +68 -21
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +52 -25
- data/lib/rubocop/cop/mixin/hash_subset.rb +28 -6
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +52 -11
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
- data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
- data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -5
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +69 -12
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +23 -6
- data/lib/rubocop/cop/mixin/visibility_help.rb +2 -1
- data/lib/rubocop/cop/mixin.rb +93 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +7 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -6
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +65 -8
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -7
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +108 -9
- data/lib/rubocop/cop/registry.rb +234 -65
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +45 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/severity.rb +12 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +83 -14
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- data/lib/rubocop/cop/style/alias.rb +33 -8
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/and_or.rb +8 -3
- data/lib/rubocop/cop/style/arguments_forwarding.rb +80 -39
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +136 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +8 -6
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +13 -5
- data/lib/rubocop/cop/style/block_delimiters.rb +77 -40
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +12 -11
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +181 -27
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +26 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +200 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +92 -9
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +65 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +58 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +23 -12
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +25 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +304 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +184 -20
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +53 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -12
- data/lib/rubocop/cop/style/double_negation.rb +14 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +12 -3
- data/lib/rubocop/cop/style/empty_method.rb +15 -9
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +152 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +256 -19
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +62 -9
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +6 -4
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +43 -15
- data/lib/rubocop/cop/style/for.rb +61 -1
- data/lib/rubocop/cop/style/format_string.rb +44 -9
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +5 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +58 -40
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +31 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +52 -16
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +23 -6
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +39 -11
- data/lib/rubocop/cop/style/if_inside_else.rb +46 -21
- data/lib/rubocop/cop/style/if_unless_modifier.rb +101 -70
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +19 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +34 -8
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +211 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +23 -11
- data/lib/rubocop/cop/style/lambda.rb +46 -2
- data/lib/rubocop/cop/style/lambda_call.rb +31 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +6 -4
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -5
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +110 -27
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +58 -6
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_else.rb +7 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_grouping.rb +12 -3
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +47 -5
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +15 -22
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +158 -14
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
- data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
- data/lib/rubocop/cop/style/next.rb +68 -10
- data/lib/rubocop/cop/style/nil_comparison.rb +53 -13
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
- data/lib/rubocop/cop/style/not.rb +12 -3
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +22 -6
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +35 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +58 -27
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -2
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +28 -18
- data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +60 -7
- data/lib/rubocop/cop/style/redundant_condition.rb +93 -18
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +22 -4
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +11 -11
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +13 -5
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +49 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +83 -119
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +176 -83
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +15 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -0
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +27 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +45 -11
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +107 -29
- data/lib/rubocop/cop/style/require_order.rb +25 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +16 -12
- data/lib/rubocop/cop/style/return_nil.rb +19 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +76 -20
- data/lib/rubocop/cop/style/sample.rb +19 -13
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +54 -22
- data/lib/rubocop/cop/style/self_assignment.rb +13 -16
- data/lib/rubocop/cop/style/semicolon.rb +56 -14
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +4 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +22 -8
- data/lib/rubocop/cop/style/single_line_methods.rb +33 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -104
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +32 -6
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +38 -16
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +44 -2
- data/lib/rubocop/cop/style/super_arguments.rb +7 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +35 -15
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/style.rb +311 -0
- data/lib/rubocop/cop/team.rb +172 -49
- data/lib/rubocop/cop/util.rb +7 -10
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +8 -4
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +42 -11
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +49 -15
- data/lib/rubocop/directive_comment.rb +147 -5
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/base_formatter.rb +22 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +57 -14
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +7 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +3 -5
- data/lib/rubocop/formatter/json_formatter.rb +82 -7
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +5 -4
- data/lib/rubocop/formatter/pacman_formatter.rb +5 -2
- data/lib/rubocop/formatter/sarif_formatter.rb +186 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +8 -3
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +5 -4
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -41
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +158 -55
- data/lib/rubocop/lsp/runtime.rb +66 -15
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +38 -19
- data/lib/rubocop/lsp.rb +5 -2
- data/lib/rubocop/magic_comment.rb +55 -0
- data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
- data/lib/rubocop/mcp/explain_tool.rb +68 -0
- data/lib/rubocop/mcp/scope.rb +65 -0
- data/lib/rubocop/mcp/server.rb +307 -0
- data/lib/rubocop/mcp/source_files.rb +35 -0
- data/lib/rubocop/offense_limit.rb +30 -0
- data/lib/rubocop/options.rb +166 -23
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +153 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +6 -4
- data/lib/rubocop/remote_config.rb +18 -13
- data/lib/rubocop/result_cache.rb +110 -65
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +11 -7
- data/lib/rubocop/rspec/shared_contexts.rb +85 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +368 -106
- data/lib/rubocop/server/cache.rb +67 -48
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +25 -11
- data/lib/rubocop/target_ruby.rb +52 -23
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/util.rb +69 -0
- data/lib/rubocop/version.rb +48 -10
- data/lib/rubocop.rb +35 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +129 -21
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
|
@@ -16,26 +16,26 @@ module RuboCop
|
|
|
16
16
|
#
|
|
17
17
|
# In Ruby 3.2, anonymous args/kwargs forwarding has been added.
|
|
18
18
|
#
|
|
19
|
-
# This cop also identifies places where
|
|
20
|
-
# replaced by
|
|
21
|
-
# by setting `UseAnonymousForwarding: false`.
|
|
19
|
+
# This cop also identifies places where `+use_args(*args)+`/`+use_kwargs(**kwargs)+` can be
|
|
20
|
+
# replaced by `+use_args(*)+`/`+use_kwargs(**)+`; if desired, this functionality can be
|
|
21
|
+
# disabled by setting `UseAnonymousForwarding: false`.
|
|
22
22
|
#
|
|
23
23
|
# And this cop has `RedundantRestArgumentNames`, `RedundantKeywordRestArgumentNames`,
|
|
24
24
|
# and `RedundantBlockArgumentNames` options. This configuration is a list of redundant names
|
|
25
25
|
# that are sufficient for anonymizing meaningless naming.
|
|
26
26
|
#
|
|
27
27
|
# Meaningless names that are commonly used can be anonymized by default:
|
|
28
|
-
# e.g.,
|
|
28
|
+
# e.g., `+*args+`, `+**options+`, `&block`, and so on.
|
|
29
29
|
#
|
|
30
30
|
# Names not on this list are likely to be meaningful and are allowed by default.
|
|
31
31
|
#
|
|
32
32
|
# This cop handles not only method forwarding but also forwarding to `super`.
|
|
33
33
|
#
|
|
34
34
|
# [NOTE]
|
|
35
|
-
#
|
|
35
|
+
# ====
|
|
36
36
|
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
|
37
37
|
# no offense will be registered until Ruby 3.4:
|
|
38
|
-
|
|
38
|
+
#
|
|
39
39
|
# [source,ruby]
|
|
40
40
|
# ----
|
|
41
41
|
# def foo(&block)
|
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
|
43
43
|
# block_method { bar(&block) }
|
|
44
44
|
# end
|
|
45
45
|
# ----
|
|
46
|
-
#
|
|
46
|
+
# ====
|
|
47
47
|
#
|
|
48
48
|
# @example
|
|
49
49
|
# # bad
|
|
@@ -146,7 +146,6 @@ module RuboCop
|
|
|
146
146
|
minimum_target_ruby_version 2.7
|
|
147
147
|
|
|
148
148
|
FORWARDING_LVAR_TYPES = %i[splat kwsplat block_pass].freeze
|
|
149
|
-
ADDITIONAL_ARG_TYPES = %i[lvar arg].freeze
|
|
150
149
|
|
|
151
150
|
FORWARDING_MSG = 'Use shorthand syntax `...` for arguments forwarding.'
|
|
152
151
|
ARGS_MSG = 'Use anonymous positional arguments forwarding (`*`).'
|
|
@@ -154,7 +153,7 @@ module RuboCop
|
|
|
154
153
|
BLOCK_MSG = 'Use anonymous block arguments forwarding (`&`).'
|
|
155
154
|
|
|
156
155
|
def self.autocorrect_incompatible_with
|
|
157
|
-
[Naming::BlockForwarding]
|
|
156
|
+
[Naming::BlockForwarding, Style::EndlessMethod, Style::MethodDefParentheses]
|
|
158
157
|
end
|
|
159
158
|
|
|
160
159
|
def on_def(node)
|
|
@@ -170,7 +169,7 @@ module RuboCop
|
|
|
170
169
|
|
|
171
170
|
return if send_classifications.empty?
|
|
172
171
|
|
|
173
|
-
if
|
|
172
|
+
if forward_all?(send_nodes, send_classifications)
|
|
174
173
|
add_forward_all_offenses(node, send_classifications, forwardable_args)
|
|
175
174
|
elsif target_ruby_version >= 3.2
|
|
176
175
|
add_post_ruby_32_offenses(node, send_classifications, forwardable_args)
|
|
@@ -193,17 +192,39 @@ module RuboCop
|
|
|
193
192
|
[restarg_node, kwrestarg_node, blockarg_node]
|
|
194
193
|
end
|
|
195
194
|
|
|
195
|
+
def forward_all?(send_nodes, send_classifications)
|
|
196
|
+
only_forwards_all?(send_classifications) &&
|
|
197
|
+
!anonymous_forwarding_elsewhere?(send_nodes, send_classifications)
|
|
198
|
+
end
|
|
199
|
+
|
|
196
200
|
def only_forwards_all?(send_classifications)
|
|
197
201
|
all_classifications = %i[all all_anonymous].freeze
|
|
198
202
|
send_classifications.all? { |_, c, _, _| all_classifications.include?(c) }
|
|
199
203
|
end
|
|
200
204
|
|
|
201
|
-
|
|
205
|
+
def anonymous_forwarding_elsewhere?(send_nodes, send_classifications)
|
|
206
|
+
classified = send_classifications.map(&:first)
|
|
207
|
+
|
|
208
|
+
send_nodes.any? do |send_node|
|
|
209
|
+
classified.none? { |node| node.equal?(send_node) } &&
|
|
210
|
+
forwards_anonymous_args?(send_node)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def forwards_anonymous_args?(send_node)
|
|
215
|
+
send_node.arguments.any? do |arg|
|
|
216
|
+
next arg.children.any?(&:forwarded_kwrestarg_type?) if arg.hash_type?
|
|
217
|
+
|
|
218
|
+
arg.forwarded_restarg_type?
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
202
223
|
def add_forward_all_offenses(node, send_classifications, forwardable_args)
|
|
203
|
-
|
|
224
|
+
rest_arg, kwrest_arg, block_arg = *forwardable_args
|
|
204
225
|
registered_block_arg_offense = false
|
|
205
226
|
|
|
206
|
-
send_classifications.each do |send_node, c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
|
|
227
|
+
send_classifications.each do |send_node, c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength -- the block parameter list does not wrap
|
|
207
228
|
if !forward_rest && !forward_kwrest && c != :all_anonymous
|
|
208
229
|
if allow_anonymous_forwarding_in_block?(forward_block_arg)
|
|
209
230
|
register_forward_block_arg_offense(!forward_rest, node.arguments, block_arg)
|
|
@@ -212,25 +233,28 @@ module RuboCop
|
|
|
212
233
|
registered_block_arg_offense = true
|
|
213
234
|
break
|
|
214
235
|
else
|
|
215
|
-
|
|
236
|
+
first_arg = forward_rest || forward_kwrest || forward_all_first_argument(send_node)
|
|
237
|
+
register_forward_all_offense(send_node, send_node, first_arg)
|
|
216
238
|
end
|
|
217
239
|
end
|
|
218
240
|
|
|
219
241
|
return if registered_block_arg_offense
|
|
220
242
|
|
|
221
|
-
|
|
222
|
-
|
|
243
|
+
register_forward_all_offense(node, node.arguments, rest_arg || kwrest_arg)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def forward_all_first_argument(node)
|
|
247
|
+
node.arguments.reverse_each.find(&:forwarded_restarg_type?)
|
|
223
248
|
end
|
|
224
|
-
# rubocop:enable Metrics/MethodLength
|
|
225
249
|
|
|
226
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
250
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/MethodLength
|
|
227
251
|
def add_post_ruby_32_offenses(def_node, send_classifications, forwardable_args)
|
|
228
252
|
return unless use_anonymous_forwarding?
|
|
229
253
|
return unless all_forwarding_offenses_correctable?(send_classifications)
|
|
230
254
|
|
|
231
255
|
rest_arg, kwrest_arg, block_arg = *forwardable_args
|
|
232
256
|
|
|
233
|
-
send_classifications.each do |send_node, _c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
|
|
257
|
+
send_classifications.each do |send_node, _c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength -- the block parameter list does not wrap
|
|
234
258
|
if allow_anonymous_forwarding_in_block?(forward_rest)
|
|
235
259
|
register_forward_args_offense(def_node.arguments, rest_arg)
|
|
236
260
|
register_forward_args_offense(send_node, forward_rest)
|
|
@@ -247,7 +271,6 @@ module RuboCop
|
|
|
247
271
|
end
|
|
248
272
|
end
|
|
249
273
|
end
|
|
250
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
251
274
|
|
|
252
275
|
def non_splat_or_block_pass_lvar_references(body)
|
|
253
276
|
body.each_descendant(:lvar, :lvasgn).filter_map do |lvar|
|
|
@@ -361,18 +384,9 @@ module RuboCop
|
|
|
361
384
|
end
|
|
362
385
|
end
|
|
363
386
|
|
|
364
|
-
# rubocop:disable Metrics/AbcSize
|
|
365
387
|
def arguments_range(node, first_node)
|
|
366
|
-
|
|
367
|
-
next true if ADDITIONAL_ARG_TYPES.include?(arg.type) || arg.variable? || arg.call_type?
|
|
368
|
-
|
|
369
|
-
arg.literal? && arg.each_descendant(:kwsplat).none?
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
start_node = first_node || arguments.first
|
|
373
|
-
start_node.source_range.begin.join(arguments.last.source_range.end)
|
|
388
|
+
first_node.source_range.begin.join(node.last_argument.source_range.end)
|
|
374
389
|
end
|
|
375
|
-
# rubocop:enable Metrics/AbcSize
|
|
376
390
|
|
|
377
391
|
def allow_only_rest_arguments?
|
|
378
392
|
cop_config.fetch('AllowOnlyRestArgument', true)
|
|
@@ -384,11 +398,16 @@ module RuboCop
|
|
|
384
398
|
|
|
385
399
|
def add_parens_if_missing(node, corrector)
|
|
386
400
|
return if parentheses?(node)
|
|
387
|
-
return if node.
|
|
401
|
+
return if node.call_type? && operator_or_setter_call?(node)
|
|
402
|
+
return unless (@parenthesized_nodes ||= Set.new.compare_by_identity).add?(node)
|
|
388
403
|
|
|
389
404
|
add_parentheses(node, corrector)
|
|
390
405
|
end
|
|
391
406
|
|
|
407
|
+
def operator_or_setter_call?(node)
|
|
408
|
+
node.setter_method? || (node.operator_method? && !node.loc.dot)
|
|
409
|
+
end
|
|
410
|
+
|
|
392
411
|
# Classifies send nodes for possible rest/kwrest/all (including block) forwarding.
|
|
393
412
|
class SendNodeClassifier
|
|
394
413
|
extend NodePattern::Macros
|
|
@@ -430,21 +449,39 @@ module RuboCop
|
|
|
430
449
|
end
|
|
431
450
|
|
|
432
451
|
def forwarded_rest_arg
|
|
433
|
-
return
|
|
452
|
+
return @forwarded_rest_arg if defined?(@forwarded_rest_arg)
|
|
434
453
|
|
|
435
|
-
|
|
454
|
+
@forwarded_rest_arg = if referenced_rest_arg?
|
|
455
|
+
nil
|
|
456
|
+
else
|
|
457
|
+
arguments.find do |arg|
|
|
458
|
+
forwarded_rest_arg?(arg, @rest_arg_name)
|
|
459
|
+
end
|
|
460
|
+
end
|
|
436
461
|
end
|
|
437
462
|
|
|
438
463
|
def forwarded_kwrest_arg
|
|
439
|
-
return
|
|
464
|
+
return @forwarded_kwrest_arg if defined?(@forwarded_kwrest_arg)
|
|
440
465
|
|
|
441
|
-
|
|
466
|
+
@forwarded_kwrest_arg = if referenced_kwrest_arg?
|
|
467
|
+
nil
|
|
468
|
+
else
|
|
469
|
+
arguments.filter_map do |arg|
|
|
470
|
+
extract_forwarded_kwrest_arg(arg, @kwrest_arg_name)
|
|
471
|
+
end.first
|
|
472
|
+
end
|
|
442
473
|
end
|
|
443
474
|
|
|
444
475
|
def forwarded_block_arg
|
|
445
|
-
return
|
|
476
|
+
return @forwarded_block_arg if defined?(@forwarded_block_arg)
|
|
446
477
|
|
|
447
|
-
|
|
478
|
+
@forwarded_block_arg = if referenced_block_arg?
|
|
479
|
+
nil
|
|
480
|
+
else
|
|
481
|
+
arguments.find do |arg|
|
|
482
|
+
forwarded_block_arg?(arg, @block_arg_name)
|
|
483
|
+
end
|
|
484
|
+
end
|
|
448
485
|
end
|
|
449
486
|
|
|
450
487
|
def classification
|
|
@@ -461,7 +498,7 @@ module RuboCop
|
|
|
461
498
|
|
|
462
499
|
private
|
|
463
500
|
|
|
464
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
501
|
+
# rubocop:disable-next Metrics/CyclomaticComplexity
|
|
465
502
|
def can_forward_all?
|
|
466
503
|
return false if any_arg_referenced?
|
|
467
504
|
return false if ruby_30_or_lower_optarg?
|
|
@@ -471,7 +508,6 @@ module RuboCop
|
|
|
471
508
|
|
|
472
509
|
no_additional_args? || (target_ruby_version >= 3.0 && no_post_splat_args?)
|
|
473
510
|
end
|
|
474
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
475
511
|
|
|
476
512
|
# def foo(a = 41, ...) is a syntax error in 3.0.
|
|
477
513
|
def ruby_30_or_lower_optarg?
|
|
@@ -479,6 +515,9 @@ module RuboCop
|
|
|
479
515
|
end
|
|
480
516
|
|
|
481
517
|
def ruby_32_only_anonymous_forwarding?
|
|
518
|
+
# A block argument and an anonymous block argument are never passed together.
|
|
519
|
+
return false if @send_node.each_ancestor(:any_block).any?
|
|
520
|
+
|
|
482
521
|
def_all_anonymous_args?(@def_node) && send_all_anonymous_args?(@send_node)
|
|
483
522
|
end
|
|
484
523
|
|
|
@@ -487,6 +526,8 @@ module RuboCop
|
|
|
487
526
|
end
|
|
488
527
|
|
|
489
528
|
def offensive_block_forwarding?
|
|
529
|
+
return false if @send_node.block_literal?
|
|
530
|
+
|
|
490
531
|
@block_arg ? forwarded_block_arg : allow_offense_for_no_block?
|
|
491
532
|
end
|
|
492
533
|
|
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
|
31
31
|
MSG = 'Use `%<preferred>s`.'
|
|
32
32
|
RESTRICT_ON_SEND = %i[[]].freeze
|
|
33
33
|
|
|
34
|
-
# rubocop:disable Metrics/AbcSize
|
|
34
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
35
35
|
def on_send(node)
|
|
36
36
|
return unless node.arguments.size == 1 && node.first_argument.int_type?
|
|
37
37
|
|
|
@@ -40,19 +40,23 @@ module RuboCop
|
|
|
40
40
|
|
|
41
41
|
node = innermost_braces_node(node)
|
|
42
42
|
return if node.parent && brace_method?(node.parent)
|
|
43
|
+
return if compound_assignment_target?(node)
|
|
43
44
|
|
|
44
|
-
preferred = (value
|
|
45
|
+
preferred = preferred_name(value)
|
|
45
46
|
offense_range = find_offense_range(node)
|
|
46
47
|
|
|
47
48
|
add_offense(offense_range, message: format(MSG, preferred: preferred)) do |corrector|
|
|
48
49
|
corrector.replace(offense_range, preferred_value(node, preferred))
|
|
49
50
|
end
|
|
50
51
|
end
|
|
51
|
-
# rubocop:enable Metrics/AbcSize
|
|
52
52
|
alias on_csend on_send
|
|
53
53
|
|
|
54
54
|
private
|
|
55
55
|
|
|
56
|
+
def preferred_name(value)
|
|
57
|
+
value.zero? ? 'first' : 'last'
|
|
58
|
+
end
|
|
59
|
+
|
|
56
60
|
def preferred_value(node, value)
|
|
57
61
|
value = ".#{value}" unless node.loc.dot
|
|
58
62
|
value
|
|
@@ -74,6 +78,12 @@ module RuboCop
|
|
|
74
78
|
def brace_method?(node)
|
|
75
79
|
node.send_type? && (node.method?(:[]) || node.method?(:[]=))
|
|
76
80
|
end
|
|
81
|
+
|
|
82
|
+
# `arr[0] += 1` etc. would autocorrect to `arr.first += 1`, which calls the
|
|
83
|
+
# nonexistent `first=`/`last=` setter and raises `NoMethodError`.
|
|
84
|
+
def compound_assignment_target?(node)
|
|
85
|
+
node.parent&.type?(:op_asgn, :or_asgn, :and_asgn) && node.parent.children.first == node
|
|
86
|
+
end
|
|
77
87
|
end
|
|
78
88
|
end
|
|
79
89
|
end
|
|
@@ -5,11 +5,17 @@ module RuboCop
|
|
|
5
5
|
module Style
|
|
6
6
|
# In Ruby 3.1, `Array#intersect?` has been added.
|
|
7
7
|
#
|
|
8
|
-
# This cop identifies places where
|
|
9
|
-
# can be replaced by `array1.intersect?(array2)`.
|
|
8
|
+
# This cop identifies places where:
|
|
10
9
|
#
|
|
11
|
-
#
|
|
12
|
-
# `(array1
|
|
10
|
+
# * `(array1 & array2).any?`
|
|
11
|
+
# * `(array1.intersection(array2)).any?`
|
|
12
|
+
# * `array1.any? { |elem| array2.member?(elem) }`
|
|
13
|
+
# * `(array1 & array2).count > 0`
|
|
14
|
+
# * `(array1 & array2).size > 0`
|
|
15
|
+
#
|
|
16
|
+
# can be replaced with `array1.intersect?(array2)`.
|
|
17
|
+
#
|
|
18
|
+
# `array1.intersect?(array2)` is faster and more readable.
|
|
13
19
|
#
|
|
14
20
|
# In cases like the following, compatibility is not ensured,
|
|
15
21
|
# so it will not be detected when using block argument.
|
|
@@ -20,6 +26,15 @@ module RuboCop
|
|
|
20
26
|
# [1].intersect?([1,2]) { |x| false } # => true
|
|
21
27
|
# ----
|
|
22
28
|
#
|
|
29
|
+
# NOTE: Although `Array#intersection` can take zero or multiple arguments,
|
|
30
|
+
# only cases where exactly one argument is provided can be replaced with
|
|
31
|
+
# `Array#intersect?` and are handled by this cop.
|
|
32
|
+
#
|
|
33
|
+
# NOTE: In the block form, `include?` is only detected when its receiver is
|
|
34
|
+
# an array literal, because `include?` is defined with different semantics
|
|
35
|
+
# on many non-array classes (e.g. `String#include?` checks for substrings).
|
|
36
|
+
# `member?` does not have this restriction.
|
|
37
|
+
#
|
|
23
38
|
# @safety
|
|
24
39
|
# This cop cannot guarantee that `array1` and `array2` are
|
|
25
40
|
# actually arrays while method `intersect?` is for arrays only.
|
|
@@ -30,8 +45,30 @@ module RuboCop
|
|
|
30
45
|
# (array1 & array2).empty?
|
|
31
46
|
# (array1 & array2).none?
|
|
32
47
|
#
|
|
48
|
+
# # bad
|
|
49
|
+
# array1.intersection(array2).any?
|
|
50
|
+
# array1.intersection(array2).empty?
|
|
51
|
+
# array1.intersection(array2).none?
|
|
52
|
+
#
|
|
53
|
+
# # bad
|
|
54
|
+
# array1.any? { |elem| array2.member?(elem) }
|
|
55
|
+
# array1.none? { |elem| [1, 2].include?(elem) }
|
|
56
|
+
#
|
|
57
|
+
# # good
|
|
58
|
+
# array1.intersect?(array2)
|
|
59
|
+
# !array1.intersect?(array2)
|
|
60
|
+
#
|
|
61
|
+
# # bad
|
|
62
|
+
# (array1 & array2).count > 0
|
|
63
|
+
# (array1 & array2).count.positive?
|
|
64
|
+
# (array1 & array2).count != 0
|
|
65
|
+
#
|
|
66
|
+
# (array1 & array2).count == 0
|
|
67
|
+
# (array1 & array2).count.zero?
|
|
68
|
+
#
|
|
33
69
|
# # good
|
|
34
70
|
# array1.intersect?(array2)
|
|
71
|
+
#
|
|
35
72
|
# !array1.intersect?(array2)
|
|
36
73
|
#
|
|
37
74
|
# @example AllCops:ActiveSupportExtensionsEnabled: false (default)
|
|
@@ -53,50 +90,103 @@ module RuboCop
|
|
|
53
90
|
|
|
54
91
|
minimum_target_ruby_version 3.1
|
|
55
92
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
93
|
+
PREDICATES = %i[any? empty? none?].to_set.freeze
|
|
94
|
+
ACTIVE_SUPPORT_PREDICATES = (PREDICATES + %i[present? blank?]).freeze
|
|
95
|
+
|
|
96
|
+
ARRAY_SIZE_METHODS = %i[count length size].to_set.freeze
|
|
97
|
+
|
|
98
|
+
# @!method bad_intersection_check?(node, predicates)
|
|
99
|
+
def_node_matcher :bad_intersection_check?, <<~PATTERN
|
|
100
|
+
$(call
|
|
101
|
+
{
|
|
102
|
+
(begin (send $_ :& $_))
|
|
103
|
+
(call $!nil? :intersection $_)
|
|
104
|
+
}
|
|
105
|
+
$%1
|
|
62
106
|
)
|
|
63
107
|
PATTERN
|
|
64
108
|
|
|
65
|
-
# @!method
|
|
66
|
-
def_node_matcher :
|
|
67
|
-
(
|
|
68
|
-
(
|
|
69
|
-
|
|
70
|
-
|
|
109
|
+
# @!method intersection_size_check?(node, predicates)
|
|
110
|
+
def_node_matcher :intersection_size_check?, <<~PATTERN
|
|
111
|
+
(call
|
|
112
|
+
$(call
|
|
113
|
+
{
|
|
114
|
+
(begin (send $_ :& $_))
|
|
115
|
+
(call $!nil? :intersection $_)
|
|
116
|
+
}
|
|
117
|
+
%ARRAY_SIZE_METHODS
|
|
118
|
+
)
|
|
119
|
+
{$:> (int 0) | $:positive? | $:!= (int 0) | $:== (int 0) | $:zero?}
|
|
71
120
|
)
|
|
72
121
|
PATTERN
|
|
73
122
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
123
|
+
# @!method any_none_block_intersection(node)
|
|
124
|
+
def_node_matcher :any_none_block_intersection, <<~PATTERN
|
|
125
|
+
{
|
|
126
|
+
(block
|
|
127
|
+
(call $_receiver ${:any? :none?})
|
|
128
|
+
(args (arg _key))
|
|
129
|
+
(send $!nil? ${:member? :include?} (lvar _key))
|
|
130
|
+
)
|
|
131
|
+
(numblock
|
|
132
|
+
(call $_receiver ${:any? :none?}) 1
|
|
133
|
+
(send $!nil? ${:member? :include?} (lvar :_1))
|
|
134
|
+
)
|
|
135
|
+
(itblock
|
|
136
|
+
(call $_receiver ${:any? :none?}) :it
|
|
137
|
+
(send $!nil? ${:member? :include?} (lvar :it))
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
PATTERN
|
|
141
|
+
|
|
142
|
+
MSG = 'Use `%<replacement>s` instead of `%<existing>s`.'
|
|
143
|
+
STRAIGHT_METHODS = %i[present? any? > positive? !=].freeze
|
|
144
|
+
NEGATED_METHODS = %i[blank? empty? none? == zero?].freeze
|
|
78
145
|
RESTRICT_ON_SEND = (STRAIGHT_METHODS + NEGATED_METHODS).freeze
|
|
79
146
|
|
|
80
147
|
def on_send(node)
|
|
81
148
|
return if node.block_literal?
|
|
82
|
-
return unless (receiver, argument, method_name =
|
|
149
|
+
return unless (dot_node, receiver, argument, method_name = bad_intersection?(node))
|
|
83
150
|
|
|
84
|
-
|
|
151
|
+
dot = dot_node.loc.dot.source
|
|
152
|
+
bang = straight?(method_name) ? '' : '!'
|
|
153
|
+
# `a&.intersection(b)&.none?` returns `nil` when `a` is `nil`, but the negated
|
|
154
|
+
# rewrite `!a&.intersect?(b)` returns `true` there, flipping the result.
|
|
155
|
+
return if bang == '!' && dot == '&.'
|
|
85
156
|
|
|
86
|
-
|
|
87
|
-
bang = straight?(method_name) ? '' : '!'
|
|
157
|
+
replacement = "#{bang}#{receiver.source}#{dot}intersect?(#{argument.source})"
|
|
88
158
|
|
|
89
|
-
|
|
90
|
-
|
|
159
|
+
register_offense(node, replacement)
|
|
160
|
+
end
|
|
161
|
+
alias on_csend on_send
|
|
162
|
+
|
|
163
|
+
def on_block(node)
|
|
164
|
+
return unless (captures = any_none_block_intersection(node))
|
|
165
|
+
|
|
166
|
+
receiver, method_name, argument, block_method = captures
|
|
167
|
+
return if uncorrectable_block_intersection?(node, method_name, argument, block_method)
|
|
168
|
+
|
|
169
|
+
dot = node.send_node.loc.dot.source
|
|
170
|
+
bang = method_name == :any? ? '' : '!'
|
|
171
|
+
replacement = "#{bang}#{receiver.source}#{dot}intersect?(#{argument.source})"
|
|
172
|
+
|
|
173
|
+
register_offense(node, replacement)
|
|
91
174
|
end
|
|
175
|
+
alias on_numblock on_block
|
|
176
|
+
alias on_itblock on_block
|
|
92
177
|
|
|
93
178
|
private
|
|
94
179
|
|
|
95
|
-
def
|
|
180
|
+
def bad_intersection?(node)
|
|
181
|
+
bad_intersection_check?(node, bad_intersection_predicates) ||
|
|
182
|
+
intersection_size_check?(node)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def bad_intersection_predicates
|
|
96
186
|
if active_support_extensions_enabled?
|
|
97
|
-
|
|
187
|
+
ACTIVE_SUPPORT_PREDICATES
|
|
98
188
|
else
|
|
99
|
-
|
|
189
|
+
PREDICATES
|
|
100
190
|
end
|
|
101
191
|
end
|
|
102
192
|
|
|
@@ -104,15 +194,23 @@ module RuboCop
|
|
|
104
194
|
STRAIGHT_METHODS.include?(method_name.to_sym)
|
|
105
195
|
end
|
|
106
196
|
|
|
107
|
-
def
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
197
|
+
def uncorrectable_block_intersection?(node, method_name, argument, block_method)
|
|
198
|
+
# `a&.none? { |elem| b.include?(elem) }` returns `nil` when `a` is `nil`,
|
|
199
|
+
# but the negated rewrite `!a&.intersect?(b)` returns `true` there, flipping the result.
|
|
200
|
+
return true if method_name == :none? && node.send_node.safe_navigation?
|
|
201
|
+
|
|
202
|
+
# `include?` is defined with different semantics on many non-array classes
|
|
203
|
+
# (e.g. `String#include?` checks for substrings), so it is only a reliable
|
|
204
|
+
# signal of an intersection check when the receiver is an array literal.
|
|
205
|
+
block_method == :include? && !argument.array_type?
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def register_offense(node, replacement)
|
|
209
|
+
message = format(MSG, replacement: replacement, existing: node.source)
|
|
210
|
+
|
|
211
|
+
add_offense(node, message: message) do |corrector|
|
|
212
|
+
corrector.replace(node, replacement)
|
|
213
|
+
end
|
|
116
214
|
end
|
|
117
215
|
end
|
|
118
216
|
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Use `include?(element)` instead of `intersect?([element])`.
|
|
7
|
+
#
|
|
8
|
+
# @safety
|
|
9
|
+
# The receiver might not be an array.
|
|
10
|
+
#
|
|
11
|
+
# @example
|
|
12
|
+
# # bad
|
|
13
|
+
# array.intersect?([element])
|
|
14
|
+
#
|
|
15
|
+
# # good
|
|
16
|
+
# array.include?(element)
|
|
17
|
+
class ArrayIntersectWithSingleElement < Base
|
|
18
|
+
extend AutoCorrector
|
|
19
|
+
|
|
20
|
+
MSG = 'Use `include?(element)` instead of `intersect?([element])`.'
|
|
21
|
+
|
|
22
|
+
RESTRICT_ON_SEND = %i[intersect?].freeze
|
|
23
|
+
|
|
24
|
+
# @!method single_element(node)
|
|
25
|
+
def_node_matcher :single_element, <<~PATTERN
|
|
26
|
+
(send _ _ $(array $_))
|
|
27
|
+
PATTERN
|
|
28
|
+
|
|
29
|
+
def on_send(node)
|
|
30
|
+
array, element = single_element(node)
|
|
31
|
+
return unless array
|
|
32
|
+
# `[*foo]` is not a single element: the splat can expand to any number of
|
|
33
|
+
# elements, so `intersect?([*foo])` is not equivalent to `include?(*foo)`.
|
|
34
|
+
return if element.splat_type?
|
|
35
|
+
|
|
36
|
+
add_offense(
|
|
37
|
+
node.source_range.with(begin_pos: node.loc.selector.begin_pos)
|
|
38
|
+
) do |corrector|
|
|
39
|
+
corrector.replace(node.loc.selector, 'include?')
|
|
40
|
+
corrector.replace(
|
|
41
|
+
array,
|
|
42
|
+
array.percent_literal? ? element.value.inspect : element.source
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
alias on_csend on_send
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for uses of
|
|
6
|
+
# Checks for uses of `*` as a substitute for `Array#join`.
|
|
7
|
+
# Using `join` is clearer about intent and more readable than
|
|
8
|
+
# overloading the `*` operator for string conversion.
|
|
7
9
|
#
|
|
8
|
-
# Not all cases can reliably checked, due to Ruby's dynamic
|
|
10
|
+
# Not all cases can be reliably checked, due to Ruby's dynamic
|
|
9
11
|
# types, so we consider only cases when the first argument is an
|
|
10
12
|
# array literal or the second is a string literal.
|
|
11
13
|
#
|
|
@@ -4,8 +4,11 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for non-ascii (non-English) characters
|
|
7
|
-
# in comments.
|
|
8
|
-
#
|
|
7
|
+
# in comments. Non-ascii characters can cause issues with
|
|
8
|
+
# portability and encoding across different environments
|
|
9
|
+
# and editors. You could set an array of allowed non-ascii
|
|
10
|
+
# chars in `AllowedChars` attribute (copyright notice "©"
|
|
11
|
+
# by default).
|
|
9
12
|
#
|
|
10
13
|
# @example
|
|
11
14
|
# # bad
|
|
@@ -49,7 +52,7 @@ module RuboCop
|
|
|
49
52
|
end
|
|
50
53
|
|
|
51
54
|
def allowed_non_ascii_chars
|
|
52
|
-
cop_config['AllowedChars'] || []
|
|
55
|
+
@allowed_non_ascii_chars ||= (cop_config['AllowedChars'] || []).freeze
|
|
53
56
|
end
|
|
54
57
|
end
|
|
55
58
|
end
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for uses of Module#attr
|
|
6
|
+
# Checks for uses of `Module#attr`. The `attr` method has confusing
|
|
7
|
+
# behavior: with a single argument it creates a reader (like `attr_reader`),
|
|
8
|
+
# but with a second boolean argument it creates an accessor (deprecated in
|
|
9
|
+
# Ruby 1.9). Use `attr_reader` or `attr_accessor` to make intent explicit.
|
|
7
10
|
#
|
|
8
11
|
# @example
|
|
9
|
-
# # bad
|
|
12
|
+
# # bad
|
|
10
13
|
# attr :something, true
|
|
11
14
|
# attr :one, :two, :three # behaves as attr_reader
|
|
12
15
|
#
|
|
@@ -47,10 +50,9 @@ module RuboCop
|
|
|
47
50
|
def autocorrect(corrector, node)
|
|
48
51
|
attr_name, setter = *node.arguments
|
|
49
52
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
remove = range_between(attr_expr.end_pos, node_expr.end_pos) if setter&.boolean_type?
|
|
53
|
+
if setter&.boolean_type?
|
|
54
|
+
remove = range_between(attr_name.source_range.end_pos, setter.source_range.end_pos)
|
|
55
|
+
end
|
|
54
56
|
|
|
55
57
|
corrector.replace(node.loc.selector, replacement_method(node))
|
|
56
58
|
corrector.remove(remove) if remove
|