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
|
@@ -18,6 +18,10 @@ module RuboCop
|
|
|
18
18
|
# `either` (which is the default) : the `end` is allowed to be in either
|
|
19
19
|
# location. The autocorrect will default to `start_of_line`.
|
|
20
20
|
#
|
|
21
|
+
# When the `do` or `{` appears on a continuation line of multiline
|
|
22
|
+
# method arguments, the start of the line where the method is called
|
|
23
|
+
# is used as the alignment target instead of that continuation line.
|
|
24
|
+
#
|
|
21
25
|
# @example EnforcedStyleAlignWith: either (default)
|
|
22
26
|
# # bad
|
|
23
27
|
#
|
|
@@ -64,6 +68,7 @@ module RuboCop
|
|
|
64
68
|
# end
|
|
65
69
|
#
|
|
66
70
|
class BlockAlignment < Base
|
|
71
|
+
include Alignment
|
|
67
72
|
include ConfigurableEnforcedStyle
|
|
68
73
|
include RangeHelp
|
|
69
74
|
extend AutoCorrector
|
|
@@ -73,6 +78,7 @@ module RuboCop
|
|
|
73
78
|
# @!method block_end_align_target?(node, child)
|
|
74
79
|
def_node_matcher :block_end_align_target?, <<~PATTERN
|
|
75
80
|
{assignment?
|
|
81
|
+
any_def
|
|
76
82
|
splat
|
|
77
83
|
and
|
|
78
84
|
or
|
|
@@ -85,6 +91,7 @@ module RuboCop
|
|
|
85
91
|
end
|
|
86
92
|
|
|
87
93
|
alias on_numblock on_block
|
|
94
|
+
alias on_itblock on_block
|
|
88
95
|
|
|
89
96
|
def style_parameter_name
|
|
90
97
|
'EnforcedStyleAlignWith'
|
|
@@ -114,6 +121,7 @@ module RuboCop
|
|
|
114
121
|
end_loc = block_node.loc.end
|
|
115
122
|
return unless begins_its_line?(end_loc)
|
|
116
123
|
|
|
124
|
+
start_node = start_for_line_node(block_node) if style == :start_of_line
|
|
117
125
|
start_loc = start_node.source_range
|
|
118
126
|
return unless start_loc.column != end_loc.column || style == :start_of_block
|
|
119
127
|
|
|
@@ -147,6 +155,32 @@ module RuboCop
|
|
|
147
155
|
else
|
|
148
156
|
start_for_line_node(node)
|
|
149
157
|
end
|
|
158
|
+
|
|
159
|
+
if using_tabs? && (indentation = anchor_indentation(ancestor_node, node))
|
|
160
|
+
replace_end_indentation(corrector, node, indentation)
|
|
161
|
+
else
|
|
162
|
+
shift_end_to_start_col(corrector, ancestor_node, node)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def anchor_indentation(ancestor_node, node)
|
|
167
|
+
if style == :start_of_block
|
|
168
|
+
do_line_anchor_loc(node, node.loc.begin).source_line[/\A\s*/]
|
|
169
|
+
else
|
|
170
|
+
anchor_loc = (ancestor_node || node).source_range
|
|
171
|
+
anchor_loc.source_line[/\A\s*/] if begins_its_line?(anchor_loc)
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def replace_end_indentation(corrector, node, indentation)
|
|
176
|
+
loc_end = node.loc.end
|
|
177
|
+
whitespace = range_between(loc_end.begin_pos - loc_end.column, loc_end.begin_pos)
|
|
178
|
+
return if whitespace.source == indentation
|
|
179
|
+
|
|
180
|
+
corrector.replace(whitespace, indentation)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def shift_end_to_start_col(corrector, ancestor_node, node)
|
|
150
184
|
start_col = compute_start_col(ancestor_node, node)
|
|
151
185
|
loc_end = node.loc.end
|
|
152
186
|
delta = start_col - loc_end.column
|
|
@@ -194,23 +228,34 @@ module RuboCop
|
|
|
194
228
|
|
|
195
229
|
def compute_do_source_line_column(node, end_loc)
|
|
196
230
|
do_loc = node.loc.begin # Actually it's either do or {.
|
|
231
|
+
anchor_loc = do_line_anchor_loc(node, do_loc)
|
|
197
232
|
|
|
198
233
|
# We've found that "end" is not aligned with the start node (which
|
|
199
234
|
# can be a block, a variable assignment, etc). But we also allow
|
|
200
235
|
# the "end" to be aligned with the start of the line where the "do"
|
|
201
236
|
# is, which is a style some people use in multi-line chains of
|
|
202
237
|
# blocks.
|
|
203
|
-
match = /\S.*/.match(
|
|
238
|
+
match = /\S.*/.match(anchor_loc.source_line)
|
|
204
239
|
indentation_of_do_line = match.begin(0)
|
|
205
|
-
|
|
240
|
+
permitted_columns = permitted_do_line_columns(do_loc, indentation_of_do_line)
|
|
241
|
+
return if permitted_columns.include?(end_loc.column) && style != :start_of_line
|
|
206
242
|
|
|
207
243
|
{
|
|
208
244
|
source: match[0],
|
|
209
|
-
line:
|
|
245
|
+
line: anchor_loc.line,
|
|
210
246
|
column: indentation_of_do_line
|
|
211
247
|
}
|
|
212
248
|
end
|
|
213
249
|
|
|
250
|
+
# `end` aligned with an argument continuation line that holds the `do`
|
|
251
|
+
# was accepted before the anchor moved to the method dispatch line;
|
|
252
|
+
# keep accepting it so that such code does not become an offense.
|
|
253
|
+
def permitted_do_line_columns(do_loc, indentation_of_do_line)
|
|
254
|
+
columns = [indentation_of_do_line]
|
|
255
|
+
columns << (do_loc.source_line =~ /\S/) if style == :either
|
|
256
|
+
columns
|
|
257
|
+
end
|
|
258
|
+
|
|
214
259
|
def loc_to_source_line_column(loc)
|
|
215
260
|
{
|
|
216
261
|
source: loc.source.lines.to_a.first.chomp,
|
|
@@ -237,7 +282,7 @@ module RuboCop
|
|
|
237
282
|
def compute_start_col(ancestor_node, node)
|
|
238
283
|
if style == :start_of_block
|
|
239
284
|
do_loc = node.loc.begin
|
|
240
|
-
return do_loc.source_line =~ /\S/
|
|
285
|
+
return do_line_anchor_loc(node, do_loc).source_line =~ /\S/
|
|
241
286
|
end
|
|
242
287
|
(ancestor_node || node).source_range.column
|
|
243
288
|
end
|
|
@@ -251,6 +296,43 @@ module RuboCop
|
|
|
251
296
|
|
|
252
297
|
corrector.remove(range)
|
|
253
298
|
end
|
|
299
|
+
|
|
300
|
+
# When the `do` or `{` is on a continuation line of multiline method
|
|
301
|
+
# arguments, the indentation of that line is not a meaningful
|
|
302
|
+
# alignment target; anchor on the method dispatch position instead.
|
|
303
|
+
def do_line_anchor_loc(node, do_loc)
|
|
304
|
+
if do_line_begins_inside_argument?(node, do_loc)
|
|
305
|
+
node.send_node.selector || node.send_node.source_range
|
|
306
|
+
else
|
|
307
|
+
do_loc
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
312
|
+
def do_line_begins_inside_argument?(node, do_loc)
|
|
313
|
+
line_begin_pos = do_loc.begin_pos - do_loc.column
|
|
314
|
+
first_char_pos = line_begin_pos + (do_loc.source_line =~ /\S/)
|
|
315
|
+
return false unless inside_parentheses?(node, first_char_pos)
|
|
316
|
+
|
|
317
|
+
(node.send_node.arguments + node.arguments).any? do |argument|
|
|
318
|
+
argument.source_range.begin_pos <= first_char_pos &&
|
|
319
|
+
first_char_pos < argument.source_range.end_pos
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
# The continuation line indentation is only an unmeaningful alignment target when
|
|
324
|
+
# it is dictated by an opening delimiter, i.e. the line begins inside `(` or `[`.
|
|
325
|
+
# For a bare argument list without parentheses the indentation is the author's
|
|
326
|
+
# deliberate alignment, so the anchor must not move to the method dispatch line.
|
|
327
|
+
def inside_parentheses?(node, pos)
|
|
328
|
+
preceding_tokens = processed_source.tokens.select do |token|
|
|
329
|
+
token.begin_pos >= node.source_range.begin_pos && token.begin_pos < pos
|
|
330
|
+
end
|
|
331
|
+
opens = preceding_tokens.count { |token| token.left_parens? || token.left_bracket? }
|
|
332
|
+
closes = preceding_tokens.count { |token| token.right_parens? || token.right_bracket? }
|
|
333
|
+
|
|
334
|
+
opens > closes
|
|
335
|
+
end
|
|
254
336
|
end
|
|
255
337
|
end
|
|
256
338
|
end
|
|
@@ -128,7 +128,9 @@ module RuboCop
|
|
|
128
128
|
return if case_match_node.single_line?
|
|
129
129
|
return if enforced_style_end? && end_and_last_conditional_same_line?(case_match_node)
|
|
130
130
|
|
|
131
|
-
case_match_node.
|
|
131
|
+
case_match_node.in_pattern_branches.each do |in_pattern_node|
|
|
132
|
+
check_when(in_pattern_node, 'in')
|
|
133
|
+
end
|
|
132
134
|
end
|
|
133
135
|
|
|
134
136
|
private
|
|
@@ -162,8 +164,12 @@ module RuboCop
|
|
|
162
164
|
cop_config['IndentOneStep']
|
|
163
165
|
end
|
|
164
166
|
|
|
167
|
+
# Under tabs one step is a single tab character, which counts as one column
|
|
168
|
+
# regardless of the configured indentation width.
|
|
165
169
|
def indentation_width
|
|
166
|
-
|
|
170
|
+
return 0 unless indent_one_step?
|
|
171
|
+
|
|
172
|
+
using_tabs? ? 1 : configured_indentation_width
|
|
167
173
|
end
|
|
168
174
|
|
|
169
175
|
def incorrect_style(when_node, branch_type)
|
|
@@ -174,8 +180,10 @@ module RuboCop
|
|
|
174
180
|
detect_incorrect_style(when_node)
|
|
175
181
|
|
|
176
182
|
whitespace = whitespace_range(when_node)
|
|
183
|
+
next unless whitespace.source.strip.empty?
|
|
177
184
|
|
|
178
|
-
|
|
185
|
+
indentation = replacement(when_node)
|
|
186
|
+
corrector.replace(whitespace, indentation) if indentation
|
|
179
187
|
end
|
|
180
188
|
end
|
|
181
189
|
|
|
@@ -191,10 +199,7 @@ module RuboCop
|
|
|
191
199
|
end
|
|
192
200
|
|
|
193
201
|
def base_column(case_node, base)
|
|
194
|
-
|
|
195
|
-
when :case then case_node.location.keyword.column
|
|
196
|
-
when :end then case_node.location.end.column
|
|
197
|
-
end
|
|
202
|
+
base_location(case_node, base)&.column
|
|
198
203
|
end
|
|
199
204
|
|
|
200
205
|
def whitespace_range(node)
|
|
@@ -205,13 +210,26 @@ module RuboCop
|
|
|
205
210
|
end
|
|
206
211
|
|
|
207
212
|
def replacement(node)
|
|
213
|
+
base_loc = configured_base_location(node)
|
|
214
|
+
|
|
215
|
+
return ' ' * (base_loc.column + indentation_width) unless using_tabs?
|
|
216
|
+
return unless begins_its_line?(base_loc)
|
|
217
|
+
|
|
218
|
+
base_loc.source_line[/\A\s*/] + ("\t" * indentation_width)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def configured_base_location(node)
|
|
208
222
|
case_node = node.each_ancestor(:case, :case_match).first
|
|
209
223
|
base_type = cop_config[style_parameter_name] == 'end' ? :end : :case
|
|
210
224
|
|
|
211
|
-
|
|
212
|
-
|
|
225
|
+
base_location(case_node, base_type)
|
|
226
|
+
end
|
|
213
227
|
|
|
214
|
-
|
|
228
|
+
def base_location(case_node, base)
|
|
229
|
+
case base
|
|
230
|
+
when :case then case_node.location.keyword
|
|
231
|
+
when :end then case_node.location.end
|
|
232
|
+
end
|
|
215
233
|
end
|
|
216
234
|
end
|
|
217
235
|
end
|
|
@@ -22,6 +22,11 @@ module RuboCop
|
|
|
22
22
|
# * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
|
23
23
|
# * Private instance methods
|
|
24
24
|
#
|
|
25
|
+
# NOTE: Simply enabling the cop with `Enabled: true` will not use
|
|
26
|
+
# the example order shown below.
|
|
27
|
+
# To enforce the order of macros like `attr_reader`,
|
|
28
|
+
# you must define both `ExpectedOrder` *and* `Categories`.
|
|
29
|
+
#
|
|
25
30
|
# You can configure the following order:
|
|
26
31
|
#
|
|
27
32
|
# [source,yaml]
|
|
@@ -44,7 +49,7 @@ module RuboCop
|
|
|
44
49
|
# - private_methods
|
|
45
50
|
# ----
|
|
46
51
|
#
|
|
47
|
-
# Instead of putting all literals in the expected order, is also
|
|
52
|
+
# Instead of putting all literals in the expected order, it is also
|
|
48
53
|
# possible to group categories of macros. Visibility levels are handled
|
|
49
54
|
# automatically.
|
|
50
55
|
#
|
|
@@ -68,6 +73,36 @@ module RuboCop
|
|
|
68
73
|
# - extend
|
|
69
74
|
# ----
|
|
70
75
|
#
|
|
76
|
+
# If you only set `ExpectedOrder`
|
|
77
|
+
# without defining `Categories`,
|
|
78
|
+
# macros such as `attr_reader` or `has_many`
|
|
79
|
+
# will not be recognized as part of a category, and their order will not be validated.
|
|
80
|
+
# For example, the following will NOT raise any offenses, even if the order is incorrect:
|
|
81
|
+
#
|
|
82
|
+
# [source,yaml]
|
|
83
|
+
# ----
|
|
84
|
+
# Layout/ClassStructure:
|
|
85
|
+
# Enabled: true
|
|
86
|
+
# ExpectedOrder:
|
|
87
|
+
# - public_attribute_macros
|
|
88
|
+
# - initializer
|
|
89
|
+
# ----
|
|
90
|
+
#
|
|
91
|
+
# To make it work as expected, you must also specify `Categories` like this:
|
|
92
|
+
#
|
|
93
|
+
# [source,yaml]
|
|
94
|
+
# ----
|
|
95
|
+
# Layout/ClassStructure:
|
|
96
|
+
# ExpectedOrder:
|
|
97
|
+
# - public_attribute_macros
|
|
98
|
+
# - initializer
|
|
99
|
+
# Categories:
|
|
100
|
+
# attribute_macros:
|
|
101
|
+
# - attr_reader
|
|
102
|
+
# - attr_writer
|
|
103
|
+
# - attr_accessor
|
|
104
|
+
# ----
|
|
105
|
+
#
|
|
71
106
|
# @safety
|
|
72
107
|
# Autocorrection is unsafe because class methods and module inclusion
|
|
73
108
|
# can behave differently, based on which methods or constants have
|
|
@@ -153,42 +188,75 @@ module RuboCop
|
|
|
153
188
|
|
|
154
189
|
MSG = '`%<category>s` is supposed to appear before `%<previous>s`.'
|
|
155
190
|
|
|
191
|
+
# A moved element is inserted before the line break that precedes its anchor.
|
|
192
|
+
# When the anchor follows a blank line, `Layout/EmptyLines`,
|
|
193
|
+
# `Layout/EmptyLinesAroundAccessModifier` or `Layout/EmptyLinesAroundClassBody`
|
|
194
|
+
# may remove that line break in the same pass.
|
|
195
|
+
def self.autocorrect_incompatible_with
|
|
196
|
+
[Layout::EmptyLines, Layout::EmptyLinesAroundAccessModifier, Layout::EmptyLinesAroundClassBody]
|
|
197
|
+
end
|
|
198
|
+
|
|
156
199
|
# Validates code style on class declaration.
|
|
157
200
|
# Add offense when find a node out of expected order.
|
|
201
|
+
# A node is out of order when its category is expected earlier than
|
|
202
|
+
# the highest-priority category seen so far, so that a low-priority element
|
|
203
|
+
# (even an unmovable one) cannot mask disorder among the elements that follow it.
|
|
204
|
+
# Consecutive elements of the same category are reported only once,
|
|
205
|
+
# on the first element of the group.
|
|
158
206
|
def on_class(class_node)
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
207
|
+
# Corrections are registered in reverse source order because an insertion at
|
|
208
|
+
# a given position lands before any insertion already made there;
|
|
209
|
+
# this keeps the source order of nodes moved before the same anchor.
|
|
210
|
+
out_of_order_elements(class_node).reverse_each do |node, category, previous|
|
|
211
|
+
message = format(MSG, category: category, previous: previous)
|
|
212
|
+
|
|
213
|
+
add_offense(node, message: message) do |corrector|
|
|
214
|
+
autocorrect(corrector, node)
|
|
165
215
|
end
|
|
166
|
-
previous = index
|
|
167
216
|
end
|
|
168
217
|
end
|
|
169
218
|
alias on_sclass on_class
|
|
170
219
|
|
|
171
220
|
private
|
|
172
221
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
222
|
+
def out_of_order_elements(class_node)
|
|
223
|
+
out_of_order = []
|
|
224
|
+
max_index = -1
|
|
225
|
+
previous_category = nil
|
|
226
|
+
walk_over_nested_class_definition(class_node) do |node, category|
|
|
227
|
+
index = expected_order.index(category)
|
|
228
|
+
if index < max_index && category != previous_category
|
|
229
|
+
out_of_order << [node, category, expected_order[max_index]]
|
|
230
|
+
end
|
|
231
|
+
max_index = index if index > max_index
|
|
232
|
+
previous_category = category
|
|
177
233
|
end
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
current_range = source_range_with_comment(node)
|
|
181
|
-
previous_range = source_range_with_comment(previous)
|
|
234
|
+
out_of_order
|
|
235
|
+
end
|
|
182
236
|
|
|
183
|
-
|
|
184
|
-
|
|
237
|
+
# Autocorrect by moving the node, together with the contiguous group of
|
|
238
|
+
# same-category elements that follows it, to its expected position.
|
|
239
|
+
def autocorrect(corrector, node)
|
|
240
|
+
return if dynamic_constant?(node)
|
|
241
|
+
|
|
242
|
+
anchor = insertion_anchor(node)
|
|
243
|
+
return unless anchor
|
|
244
|
+
|
|
245
|
+
anchor_range = source_range_with_comment(anchor)
|
|
246
|
+
# Reversed for the same reason offenses are registered in reverse source order:
|
|
247
|
+
# the last insertion at a position comes first.
|
|
248
|
+
movable_group(node).reverse_each do |group_node|
|
|
249
|
+
current_range = source_range_with_comment(group_node)
|
|
250
|
+
corrector.insert_before(anchor_range, current_range.source)
|
|
251
|
+
corrector.remove(current_range)
|
|
252
|
+
end
|
|
185
253
|
end
|
|
186
254
|
|
|
187
255
|
# Classifies a node to match with something in the {expected_order}
|
|
188
256
|
# @param node to be analysed
|
|
189
257
|
# @return String when the node type is a `:block` then
|
|
190
258
|
# {classify} recursively with the first children
|
|
191
|
-
# @return String when the node type is a `:send` then {
|
|
259
|
+
# @return String when the node type is a `:send` then {find_send_node_category}
|
|
192
260
|
# by method name
|
|
193
261
|
# @return String otherwise trying to {humanize_node} of the current node
|
|
194
262
|
def classify(node)
|
|
@@ -198,9 +266,10 @@ module RuboCop
|
|
|
198
266
|
when :block
|
|
199
267
|
classify(node.send_node)
|
|
200
268
|
when :send
|
|
201
|
-
|
|
269
|
+
find_send_node_category(node)
|
|
202
270
|
else
|
|
203
|
-
humanize_node(node)
|
|
271
|
+
name = humanize_node(node)
|
|
272
|
+
find_category(name) || name
|
|
204
273
|
end.to_s
|
|
205
274
|
end
|
|
206
275
|
|
|
@@ -209,19 +278,25 @@ module RuboCop
|
|
|
209
278
|
# also its visibility.
|
|
210
279
|
# @param node to be analysed.
|
|
211
280
|
# @return [String] with the key category or the `method_name` as string
|
|
212
|
-
def
|
|
281
|
+
def find_send_node_category(node)
|
|
213
282
|
name = node.method_name.to_s
|
|
214
|
-
category
|
|
283
|
+
category = find_category(name)
|
|
215
284
|
key = category || name
|
|
216
285
|
visibility_key =
|
|
217
286
|
if node.def_modifier?
|
|
218
|
-
"#{name}_methods"
|
|
287
|
+
name.end_with?('_class_method') ? "#{name}s" : "#{name}_methods"
|
|
219
288
|
else
|
|
220
289
|
"#{node_visibility(node)}_#{key}"
|
|
221
290
|
end
|
|
222
291
|
expected_order.include?(visibility_key) ? visibility_key : key
|
|
223
292
|
end
|
|
224
293
|
|
|
294
|
+
def find_category(name)
|
|
295
|
+
name = name.to_s
|
|
296
|
+
category, = categories.find { |_, names| names.include?(name) }
|
|
297
|
+
category
|
|
298
|
+
end
|
|
299
|
+
|
|
225
300
|
def walk_over_nested_class_definition(class_node)
|
|
226
301
|
class_elements(class_node).each do |node|
|
|
227
302
|
classification = classify(node)
|
|
@@ -236,10 +311,14 @@ module RuboCop
|
|
|
236
311
|
|
|
237
312
|
return [] unless class_def
|
|
238
313
|
|
|
239
|
-
|
|
240
|
-
|
|
314
|
+
# Only a multi-statement body (`begin`/`kwbegin`) wraps several elements; any
|
|
315
|
+
# single statement (`def`, `send`, `csend`, `if`, ...) is itself the sole element.
|
|
316
|
+
# Exploding such a node into its children would yield non-node values (e.g. a
|
|
317
|
+
# method-name `Symbol` from a `csend`) and crash later checks.
|
|
318
|
+
if class_def.type?(:begin, :kwbegin)
|
|
319
|
+
flatten_class_elements(class_def)
|
|
241
320
|
else
|
|
242
|
-
class_def
|
|
321
|
+
[class_def]
|
|
243
322
|
end
|
|
244
323
|
end
|
|
245
324
|
|
|
@@ -250,13 +329,10 @@ module RuboCop
|
|
|
250
329
|
private_constant?(node)
|
|
251
330
|
end
|
|
252
331
|
|
|
253
|
-
def
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
ignore?(sibling, sibling_class) ||
|
|
258
|
-
classification == sibling_class ||
|
|
259
|
-
dynamic_constant?(node)
|
|
332
|
+
def flatten_class_elements(node)
|
|
333
|
+
node.children.compact.flat_map do |child|
|
|
334
|
+
child.kwbegin_type? ? flatten_class_elements(child) : [child]
|
|
335
|
+
end
|
|
260
336
|
end
|
|
261
337
|
|
|
262
338
|
def humanize_node(node)
|
|
@@ -265,9 +341,26 @@ module RuboCop
|
|
|
265
341
|
|
|
266
342
|
return "#{node_visibility(node)}_methods"
|
|
267
343
|
end
|
|
344
|
+
return class_method_category(node) if node.defs_type?
|
|
345
|
+
|
|
268
346
|
HUMANIZED_NODE_TYPE[node.type] || node.type
|
|
269
347
|
end
|
|
270
348
|
|
|
349
|
+
# Only `private_class_method` reaches a singleton method; a bare `private` does not.
|
|
350
|
+
# Such a call follows the definition it names, so only right siblings are searched.
|
|
351
|
+
def class_method_category(node)
|
|
352
|
+
modifier = node.right_siblings.reverse.find do |sibling|
|
|
353
|
+
class_method_visibility_modifier?(sibling, method_name: node.method_name)
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
modifier ? :"#{modifier.method_name}s" : HUMANIZED_NODE_TYPE[node.type]
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# @!method class_method_visibility_modifier?(node, method_name:)
|
|
360
|
+
def_node_matcher :class_method_visibility_modifier?, <<~PATTERN
|
|
361
|
+
(send nil? {:private_class_method :public_class_method} <(sym %method_name) ...>)
|
|
362
|
+
PATTERN
|
|
363
|
+
|
|
271
364
|
def dynamic_constant?(node)
|
|
272
365
|
return false unless node.casgn_type? && node.namespace.nil?
|
|
273
366
|
|
|
@@ -276,6 +369,66 @@ module RuboCop
|
|
|
276
369
|
!(expression.method?(:freeze) && expression.receiver&.recursive_basic_literal?)
|
|
277
370
|
end
|
|
278
371
|
|
|
372
|
+
# The expected position of the node: the first left sibling within its movable span
|
|
373
|
+
# whose category is expected to appear after the node's.
|
|
374
|
+
# Requiring a strictly later category keeps the order of elements sharing a category stable.
|
|
375
|
+
def insertion_anchor(node)
|
|
376
|
+
index = expected_order.index(classify(node))
|
|
377
|
+
|
|
378
|
+
movable_span(node).find do |sibling|
|
|
379
|
+
classification = classify(sibling)
|
|
380
|
+
|
|
381
|
+
!ignore?(sibling, classification) && expected_order.index(classification) > index
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
# The node together with the contiguous same-category right siblings,
|
|
386
|
+
# so that the whole group moves in a single pass while the offense is
|
|
387
|
+
# reported only on its first element.
|
|
388
|
+
def movable_group(node)
|
|
389
|
+
classification = classify(node)
|
|
390
|
+
group = [node]
|
|
391
|
+
|
|
392
|
+
node.right_siblings.each do |sibling|
|
|
393
|
+
break unless classify(sibling) == classification
|
|
394
|
+
break if ignore?(sibling, classification) || dynamic_constant?(sibling)
|
|
395
|
+
|
|
396
|
+
group << sibling
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
group
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
# Left siblings the node may be reordered with: those after the last barrier.
|
|
403
|
+
# Ignored elements within the span are simply jumped over.
|
|
404
|
+
def movable_span(node)
|
|
405
|
+
left_siblings = node.left_siblings
|
|
406
|
+
barrier_index = left_siblings.rindex { |sibling| barrier?(node, sibling) }
|
|
407
|
+
|
|
408
|
+
barrier_index ? left_siblings[(barrier_index + 1)..] : left_siblings
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
# A dynamic constant blocks every element: the cop does not move such constants,
|
|
412
|
+
# and letting other elements jump over one would change execution order just the same.
|
|
413
|
+
# A bare visibility modifier blocks only the elements whose meaning depends on
|
|
414
|
+
# the visibility section they appear in.
|
|
415
|
+
def barrier?(node, sibling)
|
|
416
|
+
dynamic_constant?(sibling) || (visibility_dependent?(node) && visibility_block?(sibling))
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
# Whether moving the node across a bare visibility modifier would change its meaning.
|
|
420
|
+
# This is the case for `def` nodes and for macros whose category is classified by visibility
|
|
421
|
+
# (e.g. `attr_accessor` when the expected order lists `private_attribute_macros`).
|
|
422
|
+
# Inline visibility (`private def foo`, `def self.foo`) travels with the node.
|
|
423
|
+
def visibility_dependent?(node)
|
|
424
|
+
return true if node.def_type?
|
|
425
|
+
return false if !node.send_type? || node.def_modifier?
|
|
426
|
+
|
|
427
|
+
key = find_category(node.method_name) || node.method_name.to_s
|
|
428
|
+
|
|
429
|
+
VISIBILITY_SCOPES.any? { |visibility| expected_order.include?("#{visibility}_#{key}") }
|
|
430
|
+
end
|
|
431
|
+
|
|
279
432
|
def private_constant?(node)
|
|
280
433
|
return false unless node.casgn_type? && node.namespace.nil?
|
|
281
434
|
return false unless (parent = node.parent)
|
|
@@ -293,12 +446,9 @@ module RuboCop
|
|
|
293
446
|
end
|
|
294
447
|
|
|
295
448
|
def end_position_for(node)
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
return heredoc.location.heredoc_end.end_pos + 1 if heredoc
|
|
299
|
-
end
|
|
449
|
+
heredoc_end_lines = heredocs(node).map { |heredoc| heredoc.loc.heredoc_end.line }
|
|
450
|
+
end_line = [node.last_line, *heredoc_end_lines].max
|
|
300
451
|
|
|
301
|
-
end_line = buffer.line_for_position(node.source_range.end_pos)
|
|
302
452
|
buffer.line_range(end_line).end_pos
|
|
303
453
|
end
|
|
304
454
|
|
|
@@ -321,8 +471,8 @@ module RuboCop
|
|
|
321
471
|
buffer.line_range(node.loc.line).begin_pos - 1
|
|
322
472
|
end
|
|
323
473
|
|
|
324
|
-
def
|
|
325
|
-
node.each_node(:
|
|
474
|
+
def heredocs(node)
|
|
475
|
+
node.each_node(:any_str).select(&:heredoc?)
|
|
326
476
|
end
|
|
327
477
|
|
|
328
478
|
def buffer
|
|
@@ -155,13 +155,13 @@ module RuboCop
|
|
|
155
155
|
end
|
|
156
156
|
|
|
157
157
|
def all_elements_aligned?(elements)
|
|
158
|
-
elements.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
if elements.first.hash_type?
|
|
159
|
+
elements.first.each_child_node.map { |child| child.loc.column }
|
|
160
|
+
else
|
|
161
|
+
elements.flat_map do |e|
|
|
162
162
|
e.loc.column
|
|
163
163
|
end
|
|
164
|
-
end.uniq.
|
|
164
|
+
end.uniq.one?
|
|
165
165
|
end
|
|
166
166
|
|
|
167
167
|
def first_argument_line(elements)
|
|
@@ -64,10 +64,10 @@ module RuboCop
|
|
|
64
64
|
autocorrect_one(corrector, comment)
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
# Corrects all comment lines that
|
|
68
|
-
#
|
|
69
|
-
# of correcting, saving the file, parsing
|
|
70
|
-
# then correcting one more line, and so on.
|
|
67
|
+
# Corrects all preceding comment lines that have the same indentation
|
|
68
|
+
# and are separated from the given comment by nothing but blank lines.
|
|
69
|
+
# This is to avoid a long chain of correcting, saving the file, parsing
|
|
70
|
+
# and inspecting again, and then correcting one more line, and so on.
|
|
71
71
|
def autocorrect_preceding_comments(corrector, comment)
|
|
72
72
|
comments = processed_source.comments
|
|
73
73
|
index = comments.index(comment)
|
|
@@ -82,7 +82,10 @@ module RuboCop
|
|
|
82
82
|
def should_correct?(preceding_comment, reference_comment)
|
|
83
83
|
loc = preceding_comment.loc
|
|
84
84
|
ref_loc = reference_comment.loc
|
|
85
|
-
|
|
85
|
+
return false unless loc.column == ref_loc.column
|
|
86
|
+
return false unless own_line_comment?(preceding_comment)
|
|
87
|
+
|
|
88
|
+
((loc.line + 1)...ref_loc.line).all? { |line| processed_source[line - 1].blank? }
|
|
86
89
|
end
|
|
87
90
|
|
|
88
91
|
def autocorrect_one(corrector, comment)
|
|
@@ -155,8 +158,15 @@ module RuboCop
|
|
|
155
158
|
|
|
156
159
|
def less_indented?(line)
|
|
157
160
|
rule = config.for_cop('Layout/AccessModifierIndentation')['EnforcedStyle'] == 'outdent'
|
|
158
|
-
|
|
159
|
-
|
|
161
|
+
/\A\s*(end\b|[)}\]])/.match?(line) || (rule && bare_access_modifier?(line))
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Only a bare access modifier (the keyword alone on its line) is outdented by
|
|
165
|
+
# `Layout/AccessModifierIndentation`. An inline modifier such as `private def foo`
|
|
166
|
+
# keeps the regular method indentation, so a comment above it must not be pushed
|
|
167
|
+
# one level deeper.
|
|
168
|
+
def bare_access_modifier?(line)
|
|
169
|
+
/\A\s*(private|protected|public)\s*(#.*)?\z/.match?(line)
|
|
160
170
|
end
|
|
161
171
|
|
|
162
172
|
def two_alternatives?(line)
|