rubocop 1.71.1 → 1.92.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.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +885 -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 +9 -1
- 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 +22 -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 +29 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -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 +4 -2
- 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 +172 -36
- 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 +2 -2
- 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 +14 -5
- 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 +14 -3
- 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 +20 -8
- data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +57 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +25 -18
- 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 +5 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
- 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 +201 -30
- 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 +63 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +259 -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/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/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/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 +20 -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 +9 -5
- 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 +21 -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 +4 -1
- 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 +44 -23
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +10 -8
- 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 +69 -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 +59 -17
- 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 +66 -10
- 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.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 +11 -6
- 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 +54 -13
- 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 +6 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +52 -37
- 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 +71 -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 +179 -27
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +19 -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 +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +88 -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 +53 -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 +110 -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 +252 -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 +48 -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 +41 -24
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -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 +90 -66
- 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 +150 -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 +30 -1
- 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 +75 -24
- 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_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 +139 -13
- 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 +6 -1
- 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 +9 -9
- 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 +58 -6
- 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 +12 -3
- 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 +26 -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 +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- 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 +9 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +10 -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/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 +28 -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 +38 -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 +34 -14
- 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 +136 -33
- 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 +31 -14
- 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
|
@@ -5,6 +5,7 @@ module RuboCop
|
|
|
5
5
|
# Common functionality for modifier cops.
|
|
6
6
|
module StatementModifier
|
|
7
7
|
include LineLengthHelp
|
|
8
|
+
include AllowedPattern
|
|
8
9
|
|
|
9
10
|
private
|
|
10
11
|
|
|
@@ -34,17 +35,58 @@ module RuboCop
|
|
|
34
35
|
condition.each_node.any?(&:lvasgn_type?)
|
|
35
36
|
end
|
|
36
37
|
|
|
38
|
+
# The rendered modifier form is compared against the bare maximum, not
|
|
39
|
+
# `acceptable_line_length?`: `Layout/LineLength`'s exemptions describe
|
|
40
|
+
# long lines the user tolerates, not permission to manufacture new ones,
|
|
41
|
+
# so collapsing to modifier form must never push a line past the maximum.
|
|
37
42
|
def modifier_fits_on_single_line?(node)
|
|
38
43
|
return true unless max_line_length
|
|
39
44
|
|
|
40
|
-
|
|
45
|
+
line_length(line_in_modifier_form(node)) <= max_line_length
|
|
41
46
|
end
|
|
42
47
|
|
|
43
|
-
def
|
|
48
|
+
def line_in_modifier_form(node)
|
|
44
49
|
keyword_element = node.loc.keyword
|
|
45
50
|
code_before = keyword_element.source_line[0...keyword_element.column]
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
|
|
52
|
+
"#{code_before}#{to_modifier_form(node)}#{code_after(node)}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Whether an existing line is acceptable to `Layout/LineLength`,
|
|
56
|
+
# exemptions (the cop disabled at that line, an allowed pattern, an
|
|
57
|
+
# allowed cop directive, an allowed URI) included. Only for judging
|
|
58
|
+
# lines already in the source as too long - see
|
|
59
|
+
# `modifier_fits_on_single_line?` for why the exemptions must not apply
|
|
60
|
+
# when deciding whether a modifier line may be created.
|
|
61
|
+
def acceptable_line_length?(line, line_number)
|
|
62
|
+
return true unless max_line_length
|
|
63
|
+
return true if line_length(line) <= max_line_length
|
|
64
|
+
return true unless line_length_enabled_at_line?(line_number)
|
|
65
|
+
return true if matches_allowed_pattern?(line)
|
|
66
|
+
|
|
67
|
+
if allow_cop_directives? && directive_on_source_line?(line_number - 1)
|
|
68
|
+
return line_length_without_directive(line) <= max_line_length
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
allowed_by_uri?(line)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def allowed_by_uri?(line)
|
|
75
|
+
return false unless allow_uri?
|
|
76
|
+
|
|
77
|
+
uri_range = find_excessive_range(line, :uri)
|
|
78
|
+
!uri_range.nil? && allowed_position?(line, uri_range)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def line_length_enabled_at_line?(line)
|
|
82
|
+
processed_source.comment_config.cop_enabled_at_line?('Layout/LineLength', line)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# `Layout/LineLength`'s allowed patterns, so a modifier line that the
|
|
86
|
+
# user has configured that cop to accept is not flagged for length here.
|
|
87
|
+
def allowed_patterns
|
|
88
|
+
line_length_config = config.for_cop('Layout/LineLength')
|
|
89
|
+
line_length_config['AllowedPatterns'] || line_length_config['IgnoredPatterns'] || []
|
|
48
90
|
end
|
|
49
91
|
|
|
50
92
|
def to_modifier_form(node)
|
|
@@ -54,9 +96,15 @@ module RuboCop
|
|
|
54
96
|
[parenthesized, first_line_comment(node)].compact.join(' ')
|
|
55
97
|
end
|
|
56
98
|
|
|
99
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
57
100
|
def if_body_source(if_body)
|
|
58
101
|
if if_body.call_type? && !if_body.method?(:[]=) && omitted_value_in_last_hash_arg?(if_body)
|
|
59
102
|
"#{method_source(if_body)}(#{if_body.arguments.map(&:source).join(', ')})"
|
|
103
|
+
elsif (value = wrapped_value(if_body))
|
|
104
|
+
prefix = if_body.source_range.begin.join(value.source_range.begin).source
|
|
105
|
+
suffix = value.source_range.end.join(if_body.source_range.end).source
|
|
106
|
+
|
|
107
|
+
"#{prefix}#{if_body_source(value)}#{suffix}"
|
|
60
108
|
else
|
|
61
109
|
if_body.source
|
|
62
110
|
end
|
|
@@ -74,8 +122,16 @@ module RuboCop
|
|
|
74
122
|
if_body.source_range.begin.join(end_range).source
|
|
75
123
|
end
|
|
76
124
|
|
|
125
|
+
def wrapped_value(if_body)
|
|
126
|
+
if if_body.type?(:return, :next, :break)
|
|
127
|
+
if_body.first_argument if if_body.arguments.one?
|
|
128
|
+
elsif if_body.type?(:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn)
|
|
129
|
+
if_body.expression
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
77
133
|
def first_line_comment(node)
|
|
78
|
-
comment = processed_source.
|
|
134
|
+
comment = processed_source.comment_at_line(node.first_line)
|
|
79
135
|
return unless comment
|
|
80
136
|
|
|
81
137
|
comment_source = comment.source
|
|
@@ -95,15 +151,15 @@ module RuboCop
|
|
|
95
151
|
parent = node.parent
|
|
96
152
|
return false if parent.nil?
|
|
97
153
|
return true if parent.assignment? || parent.operator_keyword?
|
|
98
|
-
return true if
|
|
154
|
+
return true if parent.type?(:array, :pair, :call, :yield, :super)
|
|
99
155
|
|
|
100
|
-
|
|
156
|
+
ternary_branch_or_endless_method_body?(parent)
|
|
101
157
|
end
|
|
102
158
|
|
|
103
|
-
def
|
|
104
|
-
return
|
|
159
|
+
def ternary_branch_or_endless_method_body?(parent)
|
|
160
|
+
return parent.ternary? if parent.if_type?
|
|
105
161
|
|
|
106
|
-
|
|
162
|
+
parent.any_def_type? && parent.endless?
|
|
107
163
|
end
|
|
108
164
|
|
|
109
165
|
def comment_disables_cop?(comment)
|
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
|
10
10
|
def on_str(node)
|
|
11
11
|
# Constants like __FILE__ are handled as strings,
|
|
12
12
|
# but don't respond to begin.
|
|
13
|
-
return unless node.loc
|
|
13
|
+
return unless node.loc?(:begin)
|
|
14
14
|
return if part_of_ignored_node?(node)
|
|
15
15
|
|
|
16
16
|
if offense?(node)
|
|
@@ -4,6 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
# Common methods shared by Style/TrailingCommaInArguments,
|
|
6
6
|
# Style/TrailingCommaInArrayLiteral and Style/TrailingCommaInHashLiteral
|
|
7
|
+
# rubocop:disable-next Metrics/ModuleLength
|
|
7
8
|
module TrailingComma
|
|
8
9
|
include ConfigurableEnforcedStyle
|
|
9
10
|
include RangeHelp
|
|
@@ -57,6 +58,8 @@ module RuboCop
|
|
|
57
58
|
', unless each item is on its own line'
|
|
58
59
|
when :consistent_comma
|
|
59
60
|
', unless items are split onto multiple lines'
|
|
61
|
+
when :diff_comma
|
|
62
|
+
', unless that item immediately precedes a newline'
|
|
60
63
|
else
|
|
61
64
|
''
|
|
62
65
|
end
|
|
@@ -68,6 +71,8 @@ module RuboCop
|
|
|
68
71
|
multiline?(node) && no_elements_on_same_line?(node)
|
|
69
72
|
when :consistent_comma
|
|
70
73
|
multiline?(node) && !method_name_and_arguments_on_same_line?(node)
|
|
74
|
+
when :diff_comma
|
|
75
|
+
multiline?(node) && last_item_precedes_newline?(node)
|
|
71
76
|
else
|
|
72
77
|
false
|
|
73
78
|
end
|
|
@@ -90,19 +95,21 @@ module RuboCop
|
|
|
90
95
|
node.multiline? && !allowed_multiline_argument?(node)
|
|
91
96
|
end
|
|
92
97
|
|
|
98
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
93
99
|
def method_name_and_arguments_on_same_line?(node)
|
|
94
|
-
return false
|
|
100
|
+
return false if !node.call_type? || node.last_line != node.last_argument.last_line
|
|
101
|
+
return true if node.last_argument.hash_type? && node.last_argument.braces?
|
|
95
102
|
|
|
96
|
-
line = node.loc.selector
|
|
103
|
+
line = node.loc.selector&.line || node.loc.line
|
|
97
104
|
|
|
98
|
-
line == node.last_argument.last_line
|
|
105
|
+
line == node.last_argument.last_line
|
|
99
106
|
end
|
|
100
107
|
|
|
101
108
|
# A single argument with the closing bracket on the same line as the end
|
|
102
109
|
# of the argument is not considered multiline, even if the argument
|
|
103
110
|
# itself might span multiple lines.
|
|
104
111
|
def allowed_multiline_argument?(node)
|
|
105
|
-
elements(node).one? && !Util.begins_its_line?(node
|
|
112
|
+
elements(node).one? && !Util.begins_its_line?(node_end_location(node))
|
|
106
113
|
end
|
|
107
114
|
|
|
108
115
|
def elements(node)
|
|
@@ -122,14 +129,24 @@ module RuboCop
|
|
|
122
129
|
|
|
123
130
|
def no_elements_on_same_line?(node)
|
|
124
131
|
items = elements(node).map(&:source_range)
|
|
125
|
-
items << node
|
|
132
|
+
items << node_end_location(node)
|
|
126
133
|
items.each_cons(2).none? { |a, b| on_same_line?(a, b) }
|
|
127
134
|
end
|
|
128
135
|
|
|
136
|
+
def node_end_location(node)
|
|
137
|
+
node.loc.end || node.source_range.end.adjust(begin_pos: -1)
|
|
138
|
+
end
|
|
139
|
+
|
|
129
140
|
def on_same_line?(range1, range2)
|
|
130
141
|
range1.last_line == range2.line
|
|
131
142
|
end
|
|
132
143
|
|
|
144
|
+
def last_item_precedes_newline?(node)
|
|
145
|
+
after_last_item = node.children.last.source_range.end.join(node.source_range.end)
|
|
146
|
+
|
|
147
|
+
after_last_item.source.start_with?(/,?\s*(#.*)?\n/)
|
|
148
|
+
end
|
|
149
|
+
|
|
133
150
|
def avoid_comma(kind, comma_begin_pos, extra_info)
|
|
134
151
|
range = range_between(comma_begin_pos, comma_begin_pos + 1)
|
|
135
152
|
article = kind.include?('array') ? 'an' : 'a'
|
|
@@ -170,7 +187,7 @@ module RuboCop
|
|
|
170
187
|
|
|
171
188
|
def heredoc?(node)
|
|
172
189
|
return false unless node.is_a?(RuboCop::AST::Node)
|
|
173
|
-
return true if node.loc
|
|
190
|
+
return true if node.loc?(:heredoc_body)
|
|
174
191
|
|
|
175
192
|
return heredoc_send?(node) if node.send_type?
|
|
176
193
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop # rubocop:disable Style/Documentation -- a namespace that only autoloads the mixins below
|
|
5
|
+
# Autoloads mixin modules included by cops. Mixins are autoloaded to reduce the number of
|
|
6
|
+
# requires because they're used only when the relevant cop class is loaded.
|
|
7
|
+
|
|
8
|
+
autoload :ArrayMinSize, "#{__dir__}/mixin/array_min_size"
|
|
9
|
+
autoload :ArraySyntax, "#{__dir__}/mixin/array_syntax"
|
|
10
|
+
autoload :Alignment, "#{__dir__}/mixin/alignment"
|
|
11
|
+
autoload :AllowedIdentifiers, "#{__dir__}/mixin/allowed_identifiers"
|
|
12
|
+
autoload :AllowedMethods, "#{__dir__}/mixin/allowed_methods"
|
|
13
|
+
autoload :AllowedPattern, "#{__dir__}/mixin/allowed_pattern"
|
|
14
|
+
autoload :AllowedReceivers, "#{__dir__}/mixin/allowed_receivers"
|
|
15
|
+
autoload :ForbiddenIdentifiers, "#{__dir__}/mixin/forbidden_identifiers"
|
|
16
|
+
autoload :ForbiddenPattern, "#{__dir__}/mixin/forbidden_pattern"
|
|
17
|
+
autoload :AutoCorrector, "#{__dir__}/mixin/auto_corrector" # rubocop:todo Naming/InclusiveLanguage -- the file is named `auto_corrector.rb`
|
|
18
|
+
autoload :CheckAssignment, "#{__dir__}/mixin/check_assignment"
|
|
19
|
+
autoload :CheckLineBreakable, "#{__dir__}/mixin/check_line_breakable"
|
|
20
|
+
autoload :CheckSingleLineSuitability, "#{__dir__}/mixin/check_single_line_suitability"
|
|
21
|
+
autoload :ConfigurableMax, "#{__dir__}/mixin/configurable_max"
|
|
22
|
+
autoload :CodeLength, "#{__dir__}/mixin/code_length"
|
|
23
|
+
autoload :ConfigurableEnforcedStyle, "#{__dir__}/mixin/configurable_enforced_style"
|
|
24
|
+
autoload :ConfigurableFormatting, "#{__dir__}/mixin/configurable_formatting"
|
|
25
|
+
autoload :ConfigurableNaming, "#{__dir__}/mixin/configurable_naming"
|
|
26
|
+
autoload :ConfigurableNumbering, "#{__dir__}/mixin/configurable_numbering"
|
|
27
|
+
autoload :DigHelp, "#{__dir__}/mixin/dig_help"
|
|
28
|
+
autoload :DocumentationComment, "#{__dir__}/mixin/documentation_comment"
|
|
29
|
+
autoload :Duplication, "#{__dir__}/mixin/duplication"
|
|
30
|
+
autoload :RangeHelp, "#{__dir__}/mixin/range_help"
|
|
31
|
+
autoload :ProjectIndexHelp, "#{__dir__}/mixin/project_index_help"
|
|
32
|
+
autoload :AnnotationComment, "#{__dir__}/mixin/annotation_comment"
|
|
33
|
+
autoload :EmptyParameter, "#{__dir__}/mixin/empty_parameter"
|
|
34
|
+
autoload :EndKeywordAlignment, "#{__dir__}/mixin/end_keyword_alignment"
|
|
35
|
+
autoload :EndlessMethodBodyHelp, "#{__dir__}/mixin/endless_method_body_help"
|
|
36
|
+
autoload :EndlessMethodRewriter, "#{__dir__}/mixin/endless_method_rewriter"
|
|
37
|
+
autoload :EnforceSuperclass, "#{__dir__}/mixin/enforce_superclass"
|
|
38
|
+
autoload :FirstElementLineBreak, "#{__dir__}/mixin/first_element_line_break"
|
|
39
|
+
autoload :FrozenStringLiteral, "#{__dir__}/mixin/frozen_string_literal"
|
|
40
|
+
autoload :GemDeclaration, "#{__dir__}/mixin/gem_declaration"
|
|
41
|
+
autoload :GemspecHelp, "#{__dir__}/mixin/gemspec_help"
|
|
42
|
+
autoload :HashAlignmentStyles, "#{__dir__}/mixin/hash_alignment_styles"
|
|
43
|
+
autoload :HashSubset, "#{__dir__}/mixin/hash_subset"
|
|
44
|
+
autoload :HashTransformMethod, "#{__dir__}/mixin/hash_transform_method"
|
|
45
|
+
# Deprecated aliases of `AllowedMethods` and `AllowedPattern`, defined in those files.
|
|
46
|
+
autoload :IgnoredMethods, "#{__dir__}/mixin/allowed_methods"
|
|
47
|
+
autoload :IgnoredPattern, "#{__dir__}/mixin/allowed_pattern"
|
|
48
|
+
autoload :IndexedMethodArity, "#{__dir__}/mixin/indexed_method_arity"
|
|
49
|
+
autoload :IntegerNode, "#{__dir__}/mixin/integer_node"
|
|
50
|
+
autoload :Interpolation, "#{__dir__}/mixin/interpolation"
|
|
51
|
+
autoload :LineLengthHelp, "#{__dir__}/mixin/line_length_help"
|
|
52
|
+
autoload :MatchRange, "#{__dir__}/mixin/match_range"
|
|
53
|
+
autoload :HashShorthandSyntax, "#{__dir__}/mixin/hash_shorthand_syntax"
|
|
54
|
+
autoload :MethodComplexity, "#{__dir__}/mixin/method_complexity"
|
|
55
|
+
autoload :MethodPreference, "#{__dir__}/mixin/method_preference"
|
|
56
|
+
autoload :MinBodyLength, "#{__dir__}/mixin/min_body_length"
|
|
57
|
+
autoload :MinBranchesCount, "#{__dir__}/mixin/min_branches_count"
|
|
58
|
+
autoload :MultilineElementIndentation, "#{__dir__}/mixin/multiline_element_indentation"
|
|
59
|
+
autoload :MultilineElementLineBreaks, "#{__dir__}/mixin/multiline_element_line_breaks"
|
|
60
|
+
autoload :MultilineExpressionIndentation, "#{__dir__}/mixin/multiline_expression_indentation"
|
|
61
|
+
autoload :MultilineLiteralBraceLayout, "#{__dir__}/mixin/multiline_literal_brace_layout"
|
|
62
|
+
autoload :NegativeConditional, "#{__dir__}/mixin/negative_conditional"
|
|
63
|
+
autoload :Heredoc, "#{__dir__}/mixin/heredoc"
|
|
64
|
+
autoload :NilMethods, "#{__dir__}/mixin/nil_methods"
|
|
65
|
+
autoload :OnNormalIfUnless, "#{__dir__}/mixin/on_normal_if_unless"
|
|
66
|
+
autoload :OrderedGemNode, "#{__dir__}/mixin/ordered_gem_node"
|
|
67
|
+
autoload :Parentheses, "#{__dir__}/mixin/parentheses"
|
|
68
|
+
autoload :PatternMatchingHelp, "#{__dir__}/mixin/pattern_matching_help"
|
|
69
|
+
autoload :PercentArray, "#{__dir__}/mixin/percent_array"
|
|
70
|
+
autoload :PercentLiteral, "#{__dir__}/mixin/percent_literal"
|
|
71
|
+
autoload :PrecedingFollowingAlignment, "#{__dir__}/mixin/preceding_following_alignment"
|
|
72
|
+
autoload :PreferredDelimiters, "#{__dir__}/mixin/preferred_delimiters"
|
|
73
|
+
autoload :RationalLiteral, "#{__dir__}/mixin/rational_literal"
|
|
74
|
+
autoload :ReparsedEquivalence, "#{__dir__}/mixin/reparsed_equivalence"
|
|
75
|
+
autoload :RequireLibrary, "#{__dir__}/mixin/require_library"
|
|
76
|
+
autoload :RescueNode, "#{__dir__}/mixin/rescue_node"
|
|
77
|
+
autoload :SafeAssignment, "#{__dir__}/mixin/safe_assignment"
|
|
78
|
+
autoload :SpaceAfterPunctuation, "#{__dir__}/mixin/space_after_punctuation"
|
|
79
|
+
autoload :SpaceBeforePunctuation, "#{__dir__}/mixin/space_before_punctuation"
|
|
80
|
+
autoload :SurroundingSpace, "#{__dir__}/mixin/surrounding_space"
|
|
81
|
+
autoload :StatementModifier, "#{__dir__}/mixin/statement_modifier"
|
|
82
|
+
autoload :StringHelp, "#{__dir__}/mixin/string_help"
|
|
83
|
+
autoload :StringLiteralsHelp, "#{__dir__}/mixin/string_literals_help"
|
|
84
|
+
autoload :SymbolHelp, "#{__dir__}/mixin/symbol_help"
|
|
85
|
+
autoload :TargetRubyVersion, "#{__dir__}/mixin/target_ruby_version"
|
|
86
|
+
autoload :TrailingBody, "#{__dir__}/mixin/trailing_body"
|
|
87
|
+
autoload :TrailingComma, "#{__dir__}/mixin/trailing_comma"
|
|
88
|
+
autoload :UncommunicativeName, "#{__dir__}/mixin/uncommunicative_name"
|
|
89
|
+
autoload :VisibilityHelp, "#{__dir__}/mixin/visibility_help"
|
|
90
|
+
autoload :CommentsHelp, "#{__dir__}/mixin/comments_help"
|
|
91
|
+
autoload :DefNode, "#{__dir__}/mixin/def_node"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -11,6 +11,11 @@ module RuboCop
|
|
|
11
11
|
# Getters (`get_attribute`) must have no arguments to be registered,
|
|
12
12
|
# and setters (`set_attribute(value)`) must have exactly one.
|
|
13
13
|
#
|
|
14
|
+
# When `AllCops/UseProjectIndex` is enabled and the `rubydex` gem is
|
|
15
|
+
# installed, methods that override a method defined by an ancestor
|
|
16
|
+
# elsewhere in the project are not reported, since renaming an override
|
|
17
|
+
# breaks the inherited contract.
|
|
18
|
+
#
|
|
14
19
|
# @example
|
|
15
20
|
# # bad
|
|
16
21
|
# def set_attribute(value)
|
|
@@ -36,12 +41,15 @@ module RuboCop
|
|
|
36
41
|
# def set_value
|
|
37
42
|
# end
|
|
38
43
|
class AccessorMethodName < Base
|
|
44
|
+
include ProjectIndexHelp
|
|
45
|
+
|
|
39
46
|
MSG_READER = 'Do not prefix reader method names with `get_`.'
|
|
40
47
|
MSG_WRITER = 'Do not prefix writer method names with `set_`.'
|
|
41
48
|
|
|
42
49
|
def on_def(node)
|
|
43
50
|
return unless proper_attribute_name?(node)
|
|
44
51
|
return unless bad_reader_name?(node) || bad_writer_name?(node)
|
|
52
|
+
return if overrides_inherited_method?(node)
|
|
45
53
|
|
|
46
54
|
message = message(node)
|
|
47
55
|
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Naming
|
|
6
6
|
# Makes sure that certain binary operator methods have their
|
|
7
|
-
# sole
|
|
7
|
+
# sole parameter named `other`.
|
|
8
8
|
#
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
@@ -33,6 +33,7 @@ module RuboCop
|
|
|
33
33
|
node.each_descendant(:lvar, :lvasgn) do |lvar|
|
|
34
34
|
lvar_location = lvar.loc.name
|
|
35
35
|
next unless lvar_location.source == arg.source
|
|
36
|
+
next if shadowed?(lvar, arg.source, node)
|
|
36
37
|
|
|
37
38
|
corrector.replace(lvar_location, 'other')
|
|
38
39
|
end
|
|
@@ -47,6 +48,21 @@ module RuboCop
|
|
|
47
48
|
|
|
48
49
|
!/\A[[:word:]]/.match?(name) || OP_LIKE_METHODS.include?(name)
|
|
49
50
|
end
|
|
51
|
+
|
|
52
|
+
# A reference is shadowed when an enclosing block within the method redeclares the
|
|
53
|
+
# parameter name (as a block parameter or block-local). Such a reference points to
|
|
54
|
+
# the block's variable, not the operator's parameter, so it must not be renamed.
|
|
55
|
+
def shadowed?(node, name, def_node)
|
|
56
|
+
node.each_ancestor(:block).any? do |block|
|
|
57
|
+
def_node.source_range.contains?(block.source_range) && redeclares?(block, name)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def redeclares?(block, name)
|
|
62
|
+
block.arguments.any? do |argument|
|
|
63
|
+
argument.respond_to?(:name) && argument.name.to_s == name
|
|
64
|
+
end
|
|
65
|
+
end
|
|
50
66
|
end
|
|
51
67
|
end
|
|
52
68
|
end
|
|
@@ -14,10 +14,10 @@ module RuboCop
|
|
|
14
14
|
# autocorrected.
|
|
15
15
|
#
|
|
16
16
|
# [NOTE]
|
|
17
|
-
#
|
|
17
|
+
# ====
|
|
18
18
|
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
|
19
19
|
# no offense will be registered until Ruby 3.4:
|
|
20
|
-
|
|
20
|
+
#
|
|
21
21
|
# [source,ruby]
|
|
22
22
|
# ----
|
|
23
23
|
# def foo(&block)
|
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
|
25
25
|
# block_method { bar(&block) }
|
|
26
26
|
# end
|
|
27
27
|
# ----
|
|
28
|
-
#
|
|
28
|
+
# ====
|
|
29
29
|
#
|
|
30
30
|
# @example EnforcedStyle: anonymous (default)
|
|
31
31
|
#
|
|
@@ -62,7 +62,10 @@ module RuboCop
|
|
|
62
62
|
MSG = 'Use %<style>s block forwarding.'
|
|
63
63
|
|
|
64
64
|
def self.autocorrect_incompatible_with
|
|
65
|
-
[
|
|
65
|
+
[
|
|
66
|
+
Lint::AmbiguousOperator, Style::ArgumentsForwarding, Style::EndlessMethod,
|
|
67
|
+
Style::ExplicitBlockArgument, Style::MethodDefParentheses
|
|
68
|
+
]
|
|
66
69
|
end
|
|
67
70
|
|
|
68
71
|
def on_def(node)
|
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
|
38
38
|
class BlockParameterName < Base
|
|
39
39
|
include UncommunicativeName
|
|
40
40
|
|
|
41
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
41
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler -- there are no parameter names to check
|
|
42
42
|
return unless node.arguments?
|
|
43
43
|
|
|
44
44
|
check(node, node.arguments)
|
|
@@ -152,7 +152,7 @@ module RuboCop
|
|
|
152
152
|
|
|
153
153
|
const_namespace, const_name = *const
|
|
154
154
|
next if name != const_name && !match_acronym?(name, const_name)
|
|
155
|
-
next unless namespace.empty? ||
|
|
155
|
+
next unless namespace.empty? || namespace_matches?(child, const_namespace, namespace)
|
|
156
156
|
|
|
157
157
|
return node
|
|
158
158
|
end
|
|
@@ -169,7 +169,7 @@ module RuboCop
|
|
|
169
169
|
s(:const, namespace, name) if name
|
|
170
170
|
end
|
|
171
171
|
|
|
172
|
-
def
|
|
172
|
+
def namespace_matches?(node, namespace, expected)
|
|
173
173
|
match_partial = partial_matcher!(expected)
|
|
174
174
|
|
|
175
175
|
match_partial.call(namespace)
|
|
@@ -203,9 +203,10 @@ module RuboCop
|
|
|
203
203
|
|
|
204
204
|
def match_acronym?(expected, name)
|
|
205
205
|
expected = expected.to_s
|
|
206
|
-
name = name.to_s
|
|
207
|
-
|
|
208
|
-
|
|
206
|
+
name = allowed_acronyms.reduce(name.to_s) do |result, acronym|
|
|
207
|
+
result.gsub(acronym, acronym.capitalize)
|
|
208
|
+
end
|
|
209
|
+
expected == name
|
|
209
210
|
end
|
|
210
211
|
|
|
211
212
|
def to_namespace(path) # rubocop:disable Metrics/AbcSize
|
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
|
35
35
|
MSG = 'Use %<style>s heredoc delimiters.'
|
|
36
36
|
|
|
37
37
|
def on_heredoc(node)
|
|
38
|
-
return if correct_case_delimiters?(node)
|
|
38
|
+
return if correct_case_delimiters?(node) || corrected_delimiter_in_body?(node)
|
|
39
39
|
|
|
40
40
|
add_offense(node.loc.heredoc_end) do |corrector|
|
|
41
41
|
expr = node.source_range
|
|
@@ -52,7 +52,14 @@ module RuboCop
|
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
def correct_case_delimiters?(node)
|
|
55
|
-
|
|
55
|
+
delimiters = delimiter_string(node)
|
|
56
|
+
delimiters == correct_delimiters(delimiters)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def corrected_delimiter_in_body?(node)
|
|
60
|
+
corrected = correct_delimiters(delimiter_string(node))
|
|
61
|
+
|
|
62
|
+
node.loc.heredoc_body.source.each_line.any? { |line| line.strip == corrected }
|
|
56
63
|
end
|
|
57
64
|
|
|
58
65
|
def correct_delimiters(source)
|
|
@@ -43,9 +43,11 @@ module RuboCop
|
|
|
43
43
|
|
|
44
44
|
return false unless /\w/.match?(delimiters)
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
forbidden_delimiter_regexps.none? { |regexp| regexp.match?(delimiters) }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def forbidden_delimiter_regexps
|
|
50
|
+
@forbidden_delimiter_regexps ||= forbidden_delimiters.map { |d| Regexp.new(d) }
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
def forbidden_delimiters
|
|
@@ -91,6 +91,8 @@ module RuboCop
|
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
def on_new_investigation
|
|
94
|
+
return unless @flagged_terms_regex
|
|
95
|
+
|
|
94
96
|
investigate_filepath if cop_config['CheckFilepaths']
|
|
95
97
|
investigate_tokens
|
|
96
98
|
end
|
|
@@ -144,7 +146,7 @@ module RuboCop
|
|
|
144
146
|
def preprocess_flagged_terms
|
|
145
147
|
allowed_strings = []
|
|
146
148
|
flagged_term_strings = []
|
|
147
|
-
cop_config['FlaggedTerms'].each do |term, term_definition|
|
|
149
|
+
(cop_config['FlaggedTerms'] || {}).each do |term, term_definition|
|
|
148
150
|
next if term_definition.nil?
|
|
149
151
|
|
|
150
152
|
allowed_strings.concat(process_allowed_regex(term_definition['AllowedRegex']))
|
|
@@ -181,7 +183,11 @@ module RuboCop
|
|
|
181
183
|
end
|
|
182
184
|
|
|
183
185
|
def set_regexes(flagged_term_strings, allowed_strings)
|
|
184
|
-
|
|
186
|
+
# With no flagged terms an empty regex would match everything, so leave the
|
|
187
|
+
# regex nil and let `on_new_investigation` treat the cop as a no-op.
|
|
188
|
+
unless flagged_term_strings.empty?
|
|
189
|
+
@flagged_terms_regex = array_to_ignorecase_regex(flagged_term_strings)
|
|
190
|
+
end
|
|
185
191
|
@allowed_regex = array_to_ignorecase_regex(allowed_strings) unless allowed_strings.empty?
|
|
186
192
|
end
|
|
187
193
|
|
|
@@ -109,7 +109,7 @@ module RuboCop
|
|
|
109
109
|
# @_foo = calculate_expensive_thing
|
|
110
110
|
# end
|
|
111
111
|
#
|
|
112
|
-
# @example EnforcedStyleForLeadingUnderscores
|
|
112
|
+
# @example EnforcedStyleForLeadingUnderscores: optional
|
|
113
113
|
# # bad
|
|
114
114
|
# def foo
|
|
115
115
|
# @something ||= calculate_expensive_thing
|
|
@@ -167,13 +167,14 @@ module RuboCop
|
|
|
167
167
|
PATTERN
|
|
168
168
|
|
|
169
169
|
# rubocop:disable Metrics/AbcSize
|
|
170
|
-
# rubocop:disable Metrics/MethodLength
|
|
170
|
+
# rubocop:disable-next Metrics/MethodLength
|
|
171
171
|
def on_or_asgn(node)
|
|
172
172
|
lhs = node.lhs
|
|
173
173
|
return unless lhs.ivasgn_type?
|
|
174
174
|
|
|
175
175
|
method_node, method_name = find_definition(node)
|
|
176
176
|
return unless method_node
|
|
177
|
+
return unless nameable_method?(method_name)
|
|
177
178
|
|
|
178
179
|
body = method_node.body
|
|
179
180
|
return unless body == node || body.children.last == node
|
|
@@ -191,7 +192,6 @@ module RuboCop
|
|
|
191
192
|
corrector.replace(lhs.loc.name, "@#{suggested_var}")
|
|
192
193
|
end
|
|
193
194
|
end
|
|
194
|
-
# rubocop:enable Metrics/MethodLength
|
|
195
195
|
# rubocop:enable Metrics/AbcSize
|
|
196
196
|
|
|
197
197
|
# @!method defined_memoized?(node, ivar)
|
|
@@ -202,13 +202,14 @@ module RuboCop
|
|
|
202
202
|
$(ivasgn %1 _))
|
|
203
203
|
PATTERN
|
|
204
204
|
|
|
205
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
205
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/MethodLength
|
|
206
206
|
def on_defined?(node)
|
|
207
207
|
arg = node.first_argument
|
|
208
208
|
return false unless arg.ivar_type?
|
|
209
209
|
|
|
210
210
|
method_node, method_name = find_definition(node)
|
|
211
211
|
return false unless method_node
|
|
212
|
+
return false unless nameable_method?(method_name)
|
|
212
213
|
|
|
213
214
|
defined_memoized?(method_node.body, arg.name) do |defined_ivar, return_ivar, ivar_assign|
|
|
214
215
|
return false if matches?(method_name, ivar_assign)
|
|
@@ -231,7 +232,6 @@ module RuboCop
|
|
|
231
232
|
end
|
|
232
233
|
end
|
|
233
234
|
end
|
|
234
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
235
235
|
|
|
236
236
|
private
|
|
237
237
|
|
|
@@ -242,7 +242,7 @@ module RuboCop
|
|
|
242
242
|
def find_definition(node)
|
|
243
243
|
# Methods can be defined in a `def` or `defs`,
|
|
244
244
|
# or dynamically via a `block` node.
|
|
245
|
-
node.each_ancestor(:
|
|
245
|
+
node.each_ancestor(:any_def, :block).each do |ancestor|
|
|
246
246
|
method_node, method_name = method_definition?(ancestor)
|
|
247
247
|
return [method_node, method_name] if method_node
|
|
248
248
|
end
|
|
@@ -250,6 +250,13 @@ module RuboCop
|
|
|
250
250
|
nil
|
|
251
251
|
end
|
|
252
252
|
|
|
253
|
+
# Operator and other non-word method names (e.g. `[]`, `+`, `<=>`) cannot form a
|
|
254
|
+
# valid instance variable name, so there is no matching ivar to enforce and a
|
|
255
|
+
# suggested correction like `@[]` would be invalid Ruby.
|
|
256
|
+
def nameable_method?(method_name)
|
|
257
|
+
/\A[a-zA-Z_]\w*\z/.match?(method_name.to_s.delete('!?='))
|
|
258
|
+
end
|
|
259
|
+
|
|
253
260
|
def matches?(method_name, ivar_assign)
|
|
254
261
|
return true if ivar_assign.nil? || INITIALIZE_METHODS.include?(method_name)
|
|
255
262
|
|