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
|
@@ -44,16 +44,26 @@ module RuboCop
|
|
|
44
44
|
message = message(condition)
|
|
45
45
|
|
|
46
46
|
add_offense(condition, message: message) do |corrector|
|
|
47
|
-
range = range_by_whole_lines(condition.source_range, include_final_newline: true)
|
|
48
|
-
|
|
49
47
|
corrector.insert_after(condition.parent.loc.keyword, " #{condition.source}")
|
|
50
|
-
corrector.remove(
|
|
48
|
+
corrector.remove(removal_range(node, condition))
|
|
51
49
|
end
|
|
52
50
|
end
|
|
53
51
|
|
|
54
52
|
def message(condition)
|
|
55
53
|
format(MSG, keyword: condition.parent.keyword)
|
|
56
54
|
end
|
|
55
|
+
|
|
56
|
+
# When a body statement shares the condition's line (e.g. `while\n cond; body\nend`),
|
|
57
|
+
# removing the whole line would delete the body too. In that case only remove the
|
|
58
|
+
# condition and its trailing separator, preserving the body statement.
|
|
59
|
+
def removal_range(node, condition)
|
|
60
|
+
body = node.body
|
|
61
|
+
if body && body.source_range.line == condition.source_range.last_line
|
|
62
|
+
range_between(condition.source_range.begin_pos, body.source_range.begin_pos)
|
|
63
|
+
else
|
|
64
|
+
range_by_whole_lines(condition.source_range, include_final_newline: true)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
57
67
|
end
|
|
58
68
|
end
|
|
59
69
|
end
|
|
@@ -48,7 +48,11 @@ module RuboCop
|
|
|
48
48
|
def on_send(node)
|
|
49
49
|
return unless node.def_modifier?
|
|
50
50
|
|
|
51
|
-
method_def = node.each_descendant(:
|
|
51
|
+
method_def = node.each_descendant(:any_def).first
|
|
52
|
+
# A single-line `def` has nothing to align, even when a line
|
|
53
|
+
# continuation puts it on a later line than the modifier.
|
|
54
|
+
return if method_def.single_line?
|
|
55
|
+
|
|
52
56
|
expr = node.source_range
|
|
53
57
|
|
|
54
58
|
line_start = range_between(expr.begin_pos, method_def.loc.keyword.end_pos)
|
|
@@ -27,10 +27,6 @@ module RuboCop
|
|
|
27
27
|
include RangeHelp
|
|
28
28
|
extend AutoCorrector
|
|
29
29
|
|
|
30
|
-
def self.autocorrect_incompatible_with
|
|
31
|
-
[Style::RedundantSelf]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
30
|
def on_send(node)
|
|
35
31
|
return unless node.dot? || node.safe_navigation?
|
|
36
32
|
|
|
@@ -46,21 +42,35 @@ module RuboCop
|
|
|
46
42
|
|
|
47
43
|
private
|
|
48
44
|
|
|
45
|
+
# The dot and the gap it moves across are replaced in one action, so that another
|
|
46
|
+
# correction that rewrites a range spanning the dot clashes with this one instead of
|
|
47
|
+
# leaving the moved dot behind.
|
|
49
48
|
def autocorrect(corrector, dot, node)
|
|
50
|
-
dot_range =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
case style
|
|
57
|
-
when :leading
|
|
58
|
-
corrector.insert_before(selector_range(node), dot.source)
|
|
59
|
-
when :trailing
|
|
60
|
-
corrector.insert_after(node.receiver, dot.source)
|
|
49
|
+
dot_range = removed_dot_range(dot)
|
|
50
|
+
|
|
51
|
+
if style == :leading
|
|
52
|
+
move_dot_before_selector(corrector, dot, dot_range, selector_range(node))
|
|
53
|
+
else
|
|
54
|
+
move_dot_after_receiver(corrector, dot, dot_range, node.receiver)
|
|
61
55
|
end
|
|
62
56
|
end
|
|
63
57
|
|
|
58
|
+
def removed_dot_range(dot)
|
|
59
|
+
return dot unless processed_source[dot.line - 1].strip == '.'
|
|
60
|
+
|
|
61
|
+
range_by_whole_lines(dot, include_final_newline: true)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def move_dot_before_selector(corrector, dot, dot_range, selector)
|
|
65
|
+
gap = range_between(dot_range.end_pos, selector.begin_pos)
|
|
66
|
+
corrector.replace(dot_range.join(gap), "#{gap.source}#{dot.source}")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def move_dot_after_receiver(corrector, dot, dot_range, receiver)
|
|
70
|
+
gap = range_between(receiver.source_range.end_pos, dot_range.begin_pos)
|
|
71
|
+
corrector.replace(gap.join(dot_range), "#{dot.source}#{gap.source}")
|
|
72
|
+
end
|
|
73
|
+
|
|
64
74
|
def message(dot)
|
|
65
75
|
"Place the #{dot.source} on the " +
|
|
66
76
|
case style
|
|
@@ -112,7 +122,7 @@ module RuboCop
|
|
|
112
122
|
end
|
|
113
123
|
|
|
114
124
|
def last_heredoc_line(node)
|
|
115
|
-
if node.
|
|
125
|
+
if node.call_type?
|
|
116
126
|
node.arguments.select { |arg| heredoc?(arg) }.map { |arg| arg.loc.heredoc_end.line }.max
|
|
117
127
|
elsif heredoc?(node)
|
|
118
128
|
node.loc.heredoc_end.line
|
|
@@ -120,7 +130,7 @@ module RuboCop
|
|
|
120
130
|
end
|
|
121
131
|
|
|
122
132
|
def heredoc?(node)
|
|
123
|
-
node.
|
|
133
|
+
node.any_str_type? && node.heredoc?
|
|
124
134
|
end
|
|
125
135
|
|
|
126
136
|
def end_range(node)
|
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
def on_rescue(node)
|
|
52
|
-
return unless node.loc
|
|
52
|
+
return unless node.loc?(:else)
|
|
53
53
|
|
|
54
54
|
check_alignment(base_range_of_rescue(node), node.loc.else)
|
|
55
55
|
end
|
|
@@ -92,13 +92,8 @@ module RuboCop
|
|
|
92
92
|
case parent.type
|
|
93
93
|
when :def, :defs then base_for_method_definition(parent)
|
|
94
94
|
when :kwbegin then parent.loc.begin
|
|
95
|
-
when :block
|
|
96
|
-
|
|
97
|
-
if same_line?(parent, assignment_node)
|
|
98
|
-
assignment_node.source_range
|
|
99
|
-
else
|
|
100
|
-
parent.send_node.source_range
|
|
101
|
-
end
|
|
95
|
+
when :block, :numblock, :itblock then start_line_range(parent)
|
|
96
|
+
when :class, :module, :sclass then parent.loc.keyword
|
|
102
97
|
else node.loc.keyword
|
|
103
98
|
end
|
|
104
99
|
end
|
|
@@ -143,13 +138,6 @@ module RuboCop
|
|
|
143
138
|
autocorrect(corrector, else_range)
|
|
144
139
|
end
|
|
145
140
|
end
|
|
146
|
-
|
|
147
|
-
def assignment_node(node)
|
|
148
|
-
assignment_node = node.ancestors.first
|
|
149
|
-
return unless assignment_node&.assignment?
|
|
150
|
-
|
|
151
|
-
assignment_node
|
|
152
|
-
end
|
|
153
141
|
end
|
|
154
142
|
end
|
|
155
143
|
end
|
|
@@ -95,8 +95,7 @@ module RuboCop
|
|
|
95
95
|
end
|
|
96
96
|
|
|
97
97
|
def autocorrect(corrector, node)
|
|
98
|
-
|
|
99
|
-
range = if previous_token && same_line?(node, previous_token)
|
|
98
|
+
range = if inline_comment?(node)
|
|
100
99
|
range_with_surrounding_space(node.source_range, newlines: false)
|
|
101
100
|
else
|
|
102
101
|
range_by_whole_lines(node.source_range, include_final_newline: true)
|
|
@@ -138,14 +137,13 @@ module RuboCop
|
|
|
138
137
|
cop_config['AllowMarginComment']
|
|
139
138
|
end
|
|
140
139
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
index.zero? ? nil : processed_source.tokens[index - 1]
|
|
140
|
+
# A comment is inline when code precedes it on the same line. Detecting this
|
|
141
|
+
# from the source (rather than the token stream) is required because, for a
|
|
142
|
+
# comment trailing a heredoc opener, the preceding token is the heredoc end on
|
|
143
|
+
# a later line, which would wrongly trigger whole-line removal of the opener.
|
|
144
|
+
def inline_comment?(comment)
|
|
145
|
+
preceding_source = processed_source.lines[comment.loc.line - 1][0...comment.loc.column]
|
|
146
|
+
!preceding_source.strip.empty?
|
|
149
147
|
end
|
|
150
148
|
end
|
|
151
149
|
end
|
|
@@ -5,8 +5,10 @@ module RuboCop
|
|
|
5
5
|
module Layout
|
|
6
6
|
# Enforces empty line after guard clause.
|
|
7
7
|
#
|
|
8
|
-
# This cop allows
|
|
9
|
-
# SimpleCov excludes code from the coverage report by wrapping it in
|
|
8
|
+
# This cop allows a SimpleCov directive comment after guard clause because
|
|
9
|
+
# SimpleCov excludes code from the coverage report by wrapping it in such directives.
|
|
10
|
+
# Both the legacy `# :nocov:` comment and the newer `# simplecov:disable` /
|
|
11
|
+
# `# simplecov:enable` comments are recognized:
|
|
10
12
|
#
|
|
11
13
|
# [source,ruby]
|
|
12
14
|
# ----
|
|
@@ -16,6 +18,13 @@ module RuboCop
|
|
|
16
18
|
# # :nocov:
|
|
17
19
|
# bar
|
|
18
20
|
# end
|
|
21
|
+
#
|
|
22
|
+
# def foo
|
|
23
|
+
# # simplecov:disable
|
|
24
|
+
# return if condition
|
|
25
|
+
# # simplecov:enable
|
|
26
|
+
# bar
|
|
27
|
+
# end
|
|
19
28
|
# ----
|
|
20
29
|
#
|
|
21
30
|
# Refer to SimpleCov's documentation for more details:
|
|
@@ -58,7 +67,12 @@ module RuboCop
|
|
|
58
67
|
|
|
59
68
|
MSG = 'Add empty line after guard clause.'
|
|
60
69
|
END_OF_HEREDOC_LINE = 1
|
|
61
|
-
|
|
70
|
+
SIMPLECOV_COMMENT_PATTERN = /\A#\s*(?::nocov:|simplecov\s*:\s*(?:disable|enable)\b)/.freeze
|
|
71
|
+
|
|
72
|
+
# @!method guard_clause_branch?(node)
|
|
73
|
+
def_node_matcher :guard_clause_branch?, <<~PATTERN
|
|
74
|
+
{(send nil? {:raise :fail} ...) return break next}
|
|
75
|
+
PATTERN
|
|
62
76
|
|
|
63
77
|
def on_if(node)
|
|
64
78
|
return if correct_style?(node)
|
|
@@ -97,14 +111,16 @@ module RuboCop
|
|
|
97
111
|
end
|
|
98
112
|
|
|
99
113
|
def correct_style?(node)
|
|
100
|
-
!
|
|
114
|
+
!node.if_branch&.guard_clause? ||
|
|
101
115
|
next_line_rescue_or_ensure?(node) ||
|
|
102
116
|
next_sibling_parent_empty_or_else?(node) ||
|
|
103
117
|
next_sibling_empty_or_guard_clause?(node)
|
|
104
118
|
end
|
|
105
119
|
|
|
106
120
|
def contains_guard_clause?(node)
|
|
107
|
-
node.if_branch
|
|
121
|
+
return false unless (branch = node.if_branch)
|
|
122
|
+
|
|
123
|
+
branch.guard_clause? || guard_clause_branch?(branch)
|
|
108
124
|
end
|
|
109
125
|
|
|
110
126
|
def next_line_empty_or_allowed_directive_comment?(line)
|
|
@@ -131,7 +147,7 @@ module RuboCop
|
|
|
131
147
|
|
|
132
148
|
def next_sibling_parent_empty_or_else?(node)
|
|
133
149
|
next_sibling = node.right_sibling
|
|
134
|
-
return true
|
|
150
|
+
return true unless next_sibling.is_a?(AST::Node)
|
|
135
151
|
|
|
136
152
|
parent = next_sibling.parent
|
|
137
153
|
|
|
@@ -145,8 +161,10 @@ module RuboCop
|
|
|
145
161
|
next_sibling.if_type? && contains_guard_clause?(next_sibling)
|
|
146
162
|
end
|
|
147
163
|
|
|
164
|
+
# rubocop:disable-next Metrics/CyclomaticComplexity
|
|
148
165
|
def last_heredoc_argument(node)
|
|
149
166
|
n = last_heredoc_argument_node(node)
|
|
167
|
+
n = n.children.first while n.respond_to?(:begin_type?) && n.begin_type?
|
|
150
168
|
|
|
151
169
|
return n if heredoc?(n)
|
|
152
170
|
return unless n.respond_to?(:arguments)
|
|
@@ -189,7 +207,7 @@ module RuboCop
|
|
|
189
207
|
end
|
|
190
208
|
|
|
191
209
|
def offense_location(node)
|
|
192
|
-
if node.loc
|
|
210
|
+
if node.loc?(:end)
|
|
193
211
|
node.loc.end
|
|
194
212
|
else
|
|
195
213
|
node
|
|
@@ -203,10 +221,10 @@ module RuboCop
|
|
|
203
221
|
parent.begin_type? && same_line?(node, node.right_sibling)
|
|
204
222
|
end
|
|
205
223
|
|
|
206
|
-
# SimpleCov excludes code from the coverage report by wrapping it in
|
|
224
|
+
# SimpleCov excludes code from the coverage report by wrapping it in directive comments:
|
|
207
225
|
# https://github.com/simplecov-ruby/simplecov#ignoringskipping-code
|
|
208
226
|
def simplecov_directive_comment?(comment)
|
|
209
|
-
|
|
227
|
+
SIMPLECOV_COMMENT_PATTERN.match?(comment.text)
|
|
210
228
|
end
|
|
211
229
|
end
|
|
212
230
|
end
|
|
@@ -5,6 +5,14 @@ module RuboCop
|
|
|
5
5
|
module Layout
|
|
6
6
|
# Checks for a newline after the final magic comment.
|
|
7
7
|
#
|
|
8
|
+
# `NumberOfEmptyLines` configures the minimum number of empty lines required. Set it
|
|
9
|
+
# to `2` when using YARD, which otherwise treats the magic comments as documentation
|
|
10
|
+
# for the first module or class in the file.
|
|
11
|
+
#
|
|
12
|
+
# NOTE: `Layout/EmptyLines` has to be disabled for values greater than `1`, as it
|
|
13
|
+
# removes the extra empty lines this cop adds, and autocorrecting with both enabled
|
|
14
|
+
# loops between them.
|
|
15
|
+
#
|
|
8
16
|
# @example
|
|
9
17
|
# # good
|
|
10
18
|
# # frozen_string_literal: true
|
|
@@ -20,30 +28,80 @@ module RuboCop
|
|
|
20
28
|
# class Person
|
|
21
29
|
# # Some code
|
|
22
30
|
# end
|
|
31
|
+
#
|
|
32
|
+
# @example NumberOfEmptyLines: 1 (default)
|
|
33
|
+
# # good
|
|
34
|
+
# # frozen_string_literal: true
|
|
35
|
+
#
|
|
36
|
+
# class Person
|
|
37
|
+
# end
|
|
38
|
+
#
|
|
39
|
+
# @example NumberOfEmptyLines: 2
|
|
40
|
+
# # bad
|
|
41
|
+
# # frozen_string_literal: true
|
|
42
|
+
#
|
|
43
|
+
# class Person
|
|
44
|
+
# end
|
|
45
|
+
#
|
|
46
|
+
# # good
|
|
47
|
+
# # frozen_string_literal: true
|
|
48
|
+
#
|
|
49
|
+
#
|
|
50
|
+
# class Person
|
|
51
|
+
# end
|
|
23
52
|
class EmptyLineAfterMagicComment < Base
|
|
24
53
|
include RangeHelp
|
|
25
54
|
extend AutoCorrector
|
|
26
55
|
|
|
27
|
-
MSG = '
|
|
56
|
+
MSG = 'Expected at least %<expected>d empty %<lines>s after magic comments; found ' \
|
|
57
|
+
'%<actual>d.'
|
|
58
|
+
|
|
59
|
+
def validate_config
|
|
60
|
+
return if number_of_empty_lines.is_a?(Integer) && number_of_empty_lines.positive?
|
|
61
|
+
|
|
62
|
+
raise ValidationError,
|
|
63
|
+
'The `Layout/EmptyLineAfterMagicComment` cop only accepts a positive ' \
|
|
64
|
+
'integer for its `NumberOfEmptyLines` configuration parameter, but ' \
|
|
65
|
+
"`#{number_of_empty_lines.inspect}` was given."
|
|
66
|
+
end
|
|
28
67
|
|
|
29
68
|
def on_new_investigation
|
|
30
69
|
return unless (last_magic_comment = last_magic_comment(processed_source))
|
|
31
|
-
|
|
32
|
-
|
|
70
|
+
|
|
71
|
+
actual = empty_lines_after(last_magic_comment)
|
|
72
|
+
# Trailing empty lines are `Layout/TrailingEmptyLines`' responsibility.
|
|
73
|
+
return unless processed_source[last_magic_comment.loc.line + actual]
|
|
74
|
+
return if actual >= number_of_empty_lines
|
|
33
75
|
|
|
34
76
|
offending_range = offending_range(last_magic_comment)
|
|
35
77
|
|
|
36
|
-
add_offense(offending_range) do |corrector|
|
|
37
|
-
corrector.insert_before(offending_range, "\n")
|
|
78
|
+
add_offense(offending_range, message: message(actual)) do |corrector|
|
|
79
|
+
corrector.insert_before(offending_range, "\n" * (number_of_empty_lines - actual))
|
|
38
80
|
end
|
|
39
81
|
end
|
|
40
82
|
|
|
41
83
|
private
|
|
42
84
|
|
|
85
|
+
def message(actual)
|
|
86
|
+
format(MSG, expected: number_of_empty_lines, actual: actual,
|
|
87
|
+
lines: number_of_empty_lines == 1 ? 'line' : 'lines')
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def empty_lines_after(last_magic_comment)
|
|
91
|
+
first_line = last_magic_comment.loc.line
|
|
92
|
+
count = 0
|
|
93
|
+
count += 1 while (line = processed_source[first_line + count]) && line.strip.empty?
|
|
94
|
+
count
|
|
95
|
+
end
|
|
96
|
+
|
|
43
97
|
def offending_range(last_magic_comment)
|
|
44
98
|
source_range(processed_source.buffer, last_magic_comment.loc.line + 1, 0)
|
|
45
99
|
end
|
|
46
100
|
|
|
101
|
+
def number_of_empty_lines
|
|
102
|
+
cop_config.fetch('NumberOfEmptyLines', 1)
|
|
103
|
+
end
|
|
104
|
+
|
|
47
105
|
# Find the last magic comment in the source file.
|
|
48
106
|
#
|
|
49
107
|
# Take all comments that precede the first line of code (or just take
|
|
@@ -61,21 +61,23 @@ module RuboCop
|
|
|
61
61
|
return if node.ternary?
|
|
62
62
|
|
|
63
63
|
if node.modifier_form?
|
|
64
|
-
check_condition(node.condition) if node
|
|
64
|
+
check_condition(node.condition, node.right_sibling) if followed_by_statement?(node)
|
|
65
65
|
else
|
|
66
|
-
check_condition(node.condition)
|
|
66
|
+
check_condition(node.condition, node.if_branch)
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
def on_while(node)
|
|
71
|
-
|
|
71
|
+
return if node.modifier_form? && !followed_by_statement?(node)
|
|
72
|
+
|
|
73
|
+
check_condition(node.condition, node.modifier_form? ? node.right_sibling : node.body)
|
|
72
74
|
end
|
|
73
75
|
alias on_until on_while
|
|
74
76
|
|
|
75
77
|
def on_while_post(node)
|
|
76
|
-
return unless node
|
|
78
|
+
return unless followed_by_statement?(node)
|
|
77
79
|
|
|
78
|
-
check_condition(node.condition)
|
|
80
|
+
check_condition(node.condition, node.right_sibling)
|
|
79
81
|
end
|
|
80
82
|
alias on_until_post on_while_post
|
|
81
83
|
|
|
@@ -84,7 +86,8 @@ module RuboCop
|
|
|
84
86
|
last_condition = when_node.conditions.last
|
|
85
87
|
|
|
86
88
|
next if !multiline_when_condition?(when_node) ||
|
|
87
|
-
next_line_empty?(last_condition.last_line)
|
|
89
|
+
next_line_empty?(last_condition.last_line) ||
|
|
90
|
+
body_on_line?(when_node.body, last_condition.last_line)
|
|
88
91
|
|
|
89
92
|
add_offense(when_node, &autocorrect(last_condition))
|
|
90
93
|
end
|
|
@@ -94,7 +97,8 @@ module RuboCop
|
|
|
94
97
|
node.resbody_branches.each do |resbody|
|
|
95
98
|
rescued_exceptions = resbody.exceptions
|
|
96
99
|
next if !multiline_rescue_exceptions?(rescued_exceptions) ||
|
|
97
|
-
next_line_empty?(rescued_exceptions.last.last_line)
|
|
100
|
+
next_line_empty?(rescued_exceptions.last.last_line) ||
|
|
101
|
+
body_on_line?(resbody.body, rescued_exceptions.last.last_line)
|
|
98
102
|
|
|
99
103
|
add_offense(resbody, &autocorrect(rescued_exceptions.last))
|
|
100
104
|
end
|
|
@@ -102,9 +106,14 @@ module RuboCop
|
|
|
102
106
|
|
|
103
107
|
private
|
|
104
108
|
|
|
105
|
-
def
|
|
109
|
+
def followed_by_statement?(node)
|
|
110
|
+
node.parent&.type?(:begin, :kwbegin) && node.right_sibling
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def check_condition(condition, following_node)
|
|
106
114
|
return unless condition.multiline?
|
|
107
115
|
return if next_line_empty?(condition.last_line)
|
|
116
|
+
return if body_on_line?(following_node, condition.last_line)
|
|
108
117
|
|
|
109
118
|
add_offense(condition, &autocorrect(condition))
|
|
110
119
|
end
|
|
@@ -113,6 +122,10 @@ module RuboCop
|
|
|
113
122
|
processed_source[line].blank?
|
|
114
123
|
end
|
|
115
124
|
|
|
125
|
+
def body_on_line?(body, line)
|
|
126
|
+
body&.first_line == line
|
|
127
|
+
end
|
|
128
|
+
|
|
116
129
|
def multiline_when_condition?(when_node)
|
|
117
130
|
when_node.conditions.first.first_line != when_node.conditions.last.last_line
|
|
118
131
|
end
|
|
@@ -22,8 +22,6 @@ module RuboCop
|
|
|
22
22
|
# def b
|
|
23
23
|
# end
|
|
24
24
|
#
|
|
25
|
-
# @example
|
|
26
|
-
#
|
|
27
25
|
# # good
|
|
28
26
|
# def a
|
|
29
27
|
# end
|
|
@@ -42,8 +40,6 @@ module RuboCop
|
|
|
42
40
|
# def b
|
|
43
41
|
# end
|
|
44
42
|
#
|
|
45
|
-
# @example
|
|
46
|
-
#
|
|
47
43
|
# # good
|
|
48
44
|
# class A
|
|
49
45
|
# end
|
|
@@ -65,8 +61,6 @@ module RuboCop
|
|
|
65
61
|
# def b
|
|
66
62
|
# end
|
|
67
63
|
#
|
|
68
|
-
# @example
|
|
69
|
-
#
|
|
70
64
|
# # good
|
|
71
65
|
# module A
|
|
72
66
|
# end
|
|
@@ -82,28 +76,40 @@ module RuboCop
|
|
|
82
76
|
# # good
|
|
83
77
|
# class ErrorA < BaseError; end
|
|
84
78
|
# class ErrorB < BaseError; end
|
|
85
|
-
# class ErrorC < BaseError; end
|
|
86
79
|
#
|
|
87
80
|
# # good
|
|
88
81
|
# class ErrorA < BaseError; end
|
|
89
82
|
#
|
|
90
83
|
# class ErrorB < BaseError; end
|
|
91
84
|
#
|
|
92
|
-
#
|
|
85
|
+
# # good - DefLikeMacros: [memoize]
|
|
86
|
+
# memoize :attribute_a
|
|
87
|
+
# memoize :attribute_b
|
|
88
|
+
#
|
|
89
|
+
# # good
|
|
90
|
+
# memoize :attribute_a
|
|
91
|
+
#
|
|
92
|
+
# memoize :attribute_b
|
|
93
93
|
#
|
|
94
94
|
# @example AllowAdjacentOneLineDefs: false
|
|
95
95
|
#
|
|
96
96
|
# # bad
|
|
97
97
|
# class ErrorA < BaseError; end
|
|
98
98
|
# class ErrorB < BaseError; end
|
|
99
|
-
# class ErrorC < BaseError; end
|
|
100
99
|
#
|
|
101
100
|
# # good
|
|
102
101
|
# class ErrorA < BaseError; end
|
|
103
102
|
#
|
|
104
103
|
# class ErrorB < BaseError; end
|
|
105
104
|
#
|
|
106
|
-
#
|
|
105
|
+
# # bad - DefLikeMacros: [memoize]
|
|
106
|
+
# memoize :attribute_a
|
|
107
|
+
# memoize :attribute_b
|
|
108
|
+
#
|
|
109
|
+
# # good
|
|
110
|
+
# memoize :attribute_a
|
|
111
|
+
#
|
|
112
|
+
# memoize :attribute_b
|
|
107
113
|
#
|
|
108
114
|
class EmptyLineBetweenDefs < Base
|
|
109
115
|
include RangeHelp
|
|
@@ -164,6 +170,8 @@ module RuboCop
|
|
|
164
170
|
def def_location(correction_node)
|
|
165
171
|
if correction_node.any_block_type?
|
|
166
172
|
correction_node.source_range.join(correction_node.children.first.source_range)
|
|
173
|
+
elsif correction_node.send_type?
|
|
174
|
+
correction_node.source_range
|
|
167
175
|
else
|
|
168
176
|
correction_node.loc.keyword.join(correction_node.loc.name)
|
|
169
177
|
end
|
|
@@ -177,16 +185,22 @@ module RuboCop
|
|
|
177
185
|
end
|
|
178
186
|
|
|
179
187
|
def empty_line_between_macros
|
|
180
|
-
cop_config.fetch('DefLikeMacros', []).map(&:to_sym)
|
|
188
|
+
@empty_line_between_macros ||= cop_config.fetch('DefLikeMacros', []).map(&:to_sym).freeze
|
|
181
189
|
end
|
|
182
190
|
|
|
183
191
|
def macro_candidate?(node)
|
|
184
|
-
|
|
185
|
-
|
|
192
|
+
macro_candidate = if node.any_block_type?
|
|
193
|
+
node.send_node
|
|
194
|
+
elsif node.send_type?
|
|
195
|
+
node
|
|
196
|
+
end
|
|
197
|
+
return false unless macro_candidate
|
|
198
|
+
|
|
199
|
+
macro_candidate.macro? && empty_line_between_macros.include?(macro_candidate.method_name)
|
|
186
200
|
end
|
|
187
201
|
|
|
188
202
|
def method_candidate?(node)
|
|
189
|
-
cop_config['EmptyLineBetweenMethodDefs'] && node.
|
|
203
|
+
cop_config['EmptyLineBetweenMethodDefs'] && node.any_def_type?
|
|
190
204
|
end
|
|
191
205
|
|
|
192
206
|
def class_candidate?(node)
|
|
@@ -246,7 +260,9 @@ module RuboCop
|
|
|
246
260
|
end
|
|
247
261
|
|
|
248
262
|
def def_start(node)
|
|
249
|
-
|
|
263
|
+
node = node.send_node if node.any_block_type?
|
|
264
|
+
|
|
265
|
+
if node.send_type?
|
|
250
266
|
node.source_range.line
|
|
251
267
|
else
|
|
252
268
|
node.loc.keyword.line
|
|
@@ -258,11 +274,20 @@ module RuboCop
|
|
|
258
274
|
end
|
|
259
275
|
|
|
260
276
|
def end_loc(node)
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
277
|
+
end_location = node.source_range.end
|
|
278
|
+
trailing_heredoc_end(node, end_location) || end_location
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
# For an endless method whose body is a heredoc (e.g. `def a = <<~TEXT`), the
|
|
282
|
+
# node's source range ends at the heredoc opening line, before the heredoc body.
|
|
283
|
+
# Use the heredoc's closing delimiter so the def's real end is located after the
|
|
284
|
+
# heredoc and blank-line insertion does not land inside the heredoc body.
|
|
285
|
+
def trailing_heredoc_end(node, end_location)
|
|
286
|
+
heredocs = node.each_descendant(:any_str).select(&:heredoc?)
|
|
287
|
+
return if heredocs.empty?
|
|
288
|
+
|
|
289
|
+
heredoc_end = heredocs.map { |heredoc| heredoc.loc.heredoc_end }.max_by(&:end_pos)
|
|
290
|
+
heredoc_end if heredoc_end.end_pos > end_location.end_pos
|
|
266
291
|
end
|
|
267
292
|
|
|
268
293
|
def autocorrect_remove_lines(corrector, newline_pos, count)
|
|
@@ -283,7 +308,7 @@ module RuboCop
|
|
|
283
308
|
case node.type
|
|
284
309
|
when :def, :defs
|
|
285
310
|
:method
|
|
286
|
-
when :numblock
|
|
311
|
+
when :numblock, :itblock
|
|
287
312
|
:block
|
|
288
313
|
else
|
|
289
314
|
node.type
|
|
@@ -27,8 +27,7 @@ module RuboCop
|
|
|
27
27
|
|
|
28
28
|
def on_new_investigation
|
|
29
29
|
return if processed_source.tokens.empty?
|
|
30
|
-
|
|
31
|
-
return unless processed_source.raw_source.include?("\n\n\n")
|
|
30
|
+
return unless consecutive_blank_lines_possible?
|
|
32
31
|
|
|
33
32
|
lines = Set.new
|
|
34
33
|
processed_source.tokens.each { |token| lines << token.line }
|
|
@@ -42,6 +41,10 @@ module RuboCop
|
|
|
42
41
|
|
|
43
42
|
private
|
|
44
43
|
|
|
44
|
+
def consecutive_blank_lines_possible?
|
|
45
|
+
processed_source.buffer.source.include?("\n\n\n")
|
|
46
|
+
end
|
|
47
|
+
|
|
45
48
|
def each_extra_empty_line(lines)
|
|
46
49
|
prev_line = 1
|
|
47
50
|
|