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
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Verifies that a candidate correction of the inspected source is a
|
|
6
|
+
# syntactic no-op: the corrected source must parse successfully and produce
|
|
7
|
+
# the same AST as the original.
|
|
8
|
+
#
|
|
9
|
+
# This turns "is this piece of syntax redundant?" questions into a
|
|
10
|
+
# parser-backed check instead of a hand-maintained enumeration of grammar
|
|
11
|
+
# rules: instead of modeling which constructs make (for example) a line
|
|
12
|
+
# continuation or a pair of parentheses significant, a cop can apply the
|
|
13
|
+
# correction and let the parser answer.
|
|
14
|
+
#
|
|
15
|
+
# Cops implement `#apply_reparse_correction(corrector, item)` and call
|
|
16
|
+
# `verified_by_reparse(items)`, which returns the items whose corrections
|
|
17
|
+
# are verified. Items sharing a reparse scope (the innermost method
|
|
18
|
+
# definition or class/module body, which parse standalone and cannot
|
|
19
|
+
# capture outer local variables) are verified together with a single
|
|
20
|
+
# reparse, falling back to per-item verification when the batch does not
|
|
21
|
+
# hold. Scope groups are keyed by node identity, since structurally
|
|
22
|
+
# identical definitions in different places must not share a group.
|
|
23
|
+
#
|
|
24
|
+
# Two hooks customize the comparison:
|
|
25
|
+
#
|
|
26
|
+
# * `normalize_reparsed_ast(node)` - loosen strict tree equality where a
|
|
27
|
+
# cop's correction is equivalence-preserving beyond parse identity (such
|
|
28
|
+
# laws must be justified per cop; the default compares trees as-is).
|
|
29
|
+
# * `preprocess_reparsed_source(source)` - rewrite both sides before
|
|
30
|
+
# parsing (e.g. to neutralize `__LINE__` when a correction legitimately
|
|
31
|
+
# shifts line numbers).
|
|
32
|
+
#
|
|
33
|
+
# `__FILE__` is handled by parsing with the original path, and fragments
|
|
34
|
+
# containing `__LINE__` are verified by reparsing both sides so that
|
|
35
|
+
# fragment line offsets cancel out.
|
|
36
|
+
#
|
|
37
|
+
# Note that comments are invisible to the AST, so corrections that may
|
|
38
|
+
# touch comment text must be guarded separately by the caller.
|
|
39
|
+
module ReparsedEquivalence
|
|
40
|
+
# Above this size, verification does not reparse. What happens to such
|
|
41
|
+
# items depends on `oversized`; in practice only machine-generated files
|
|
42
|
+
# come near the limit.
|
|
43
|
+
MAX_VERIFICATION_FRAGMENT_SIZE = 64 * 1024
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# Returns the items whose corrections are verified. `oversized` controls
|
|
48
|
+
# items whose reparse scope exceeds `MAX_VERIFICATION_FRAGMENT_SIZE`:
|
|
49
|
+
# `:report` accepts them unverified (for cops whose offense logic stands
|
|
50
|
+
# on its own and uses verification as a safety gate), `:verify` reparses
|
|
51
|
+
# regardless of size (for cops where verification is the offense logic).
|
|
52
|
+
def verified_by_reparse(items, oversized: :report)
|
|
53
|
+
scope_groups(items).flat_map do |scope, group|
|
|
54
|
+
if oversized == :report && verification_too_large?(scope)
|
|
55
|
+
group
|
|
56
|
+
else
|
|
57
|
+
verified_subset(scope, group)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Verifies a group with a single reparse and bisects it when that fails,
|
|
63
|
+
# so a few significant items among many cost a logarithmic number of
|
|
64
|
+
# reparses rather than one each.
|
|
65
|
+
def verified_subset(scope, group)
|
|
66
|
+
return group if corrections_verify?(scope, group)
|
|
67
|
+
return [] if group.one?
|
|
68
|
+
|
|
69
|
+
half = group.size / 2
|
|
70
|
+
verified_subset(scope, group.take(half)) + verified_subset(scope, group.drop(half))
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Whether the exact correction for `item` produces source that still
|
|
74
|
+
# parses, without requiring an equivalent AST. For corrections that
|
|
75
|
+
# intentionally change the tree.
|
|
76
|
+
def correction_parses?(item)
|
|
77
|
+
corrector = Corrector.new(processed_source)
|
|
78
|
+
apply_reparse_correction(corrector, item)
|
|
79
|
+
|
|
80
|
+
parse(corrector.process, processed_source.path).valid_syntax?
|
|
81
|
+
rescue ::Parser::ClobberingError
|
|
82
|
+
false
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Hook: loosen strict tree equality for corrections that are
|
|
86
|
+
# equivalence-preserving beyond parse identity.
|
|
87
|
+
def normalize_reparsed_ast(node)
|
|
88
|
+
node
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Hook: rewrite both sides before parsing.
|
|
92
|
+
def preprocess_reparsed_source(source)
|
|
93
|
+
source
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def scope_groups(items)
|
|
97
|
+
groups = {}.compare_by_identity
|
|
98
|
+
items.each { |item| (groups[reparse_scope(item_range(item))] ||= []) << item }
|
|
99
|
+
|
|
100
|
+
groups
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def item_range(item)
|
|
104
|
+
item.respond_to?(:source_range) ? item.source_range : item
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# The innermost scope that both contains `range` and parses standalone.
|
|
108
|
+
# Method definitions and class/module bodies neither capture outer local
|
|
109
|
+
# variables nor continue an outer expression; blocks and single
|
|
110
|
+
# statements do not qualify, since an outer local would reparse as a
|
|
111
|
+
# method call.
|
|
112
|
+
def reparse_scope(range)
|
|
113
|
+
node = processed_source.ast
|
|
114
|
+
scope = nil
|
|
115
|
+
|
|
116
|
+
while node.is_a?(::Parser::AST::Node)
|
|
117
|
+
scope = node if node.type?(:any_def, :class, :module, :sclass)
|
|
118
|
+
node = node.children.find do |child|
|
|
119
|
+
child.is_a?(::Parser::AST::Node) && child.source_range&.contains?(range)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
scope
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def verification_too_large?(scope)
|
|
127
|
+
(scope ? scope.source_range.size : processed_source.raw_source.size) >
|
|
128
|
+
MAX_VERIFICATION_FRAGMENT_SIZE
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def corrections_verify?(scope, items)
|
|
132
|
+
corrector = Corrector.new(processed_source)
|
|
133
|
+
items.each { |item| apply_reparse_correction(corrector, item) }
|
|
134
|
+
corrected = corrector.process
|
|
135
|
+
|
|
136
|
+
if scope
|
|
137
|
+
fragment = corrected_scope_fragment(scope, corrected)
|
|
138
|
+
parses_equivalently?(scope.source, scope, fragment)
|
|
139
|
+
else
|
|
140
|
+
parses_equivalently?(processed_source.raw_source, processed_source.ast, corrected)
|
|
141
|
+
end
|
|
142
|
+
rescue ::Parser::ClobberingError
|
|
143
|
+
false
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# The corrections' edits are all contained within the scope, so the
|
|
147
|
+
# corrected fragment can be cut out of the corrected source by adjusting
|
|
148
|
+
# for the edits' length delta.
|
|
149
|
+
def corrected_scope_fragment(scope, corrected)
|
|
150
|
+
delta = corrected.length - processed_source.raw_source.length
|
|
151
|
+
scope_range = scope.source_range
|
|
152
|
+
|
|
153
|
+
corrected[scope_range.begin_pos...(scope_range.end_pos + delta)]
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Both sides are parsed with the original path so that `__FILE__`
|
|
157
|
+
# resolves identically. The original side is reparsed (instead of using
|
|
158
|
+
# the already parsed node) when preprocessing altered it or it contains
|
|
159
|
+
# `__LINE__`, whose values would otherwise differ from a fragment parsed
|
|
160
|
+
# at a different line offset.
|
|
161
|
+
def parses_equivalently?(original_source, original_ast, corrected_source)
|
|
162
|
+
original_normalized = normalized_original(original_source, original_ast)
|
|
163
|
+
return false unless original_normalized
|
|
164
|
+
|
|
165
|
+
rewritten = parse(preprocess_reparsed_source(corrected_source), processed_source.path)
|
|
166
|
+
rewritten.valid_syntax? && normalize_reparsed_ast(rewritten.ast) == original_normalized
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def normalized_original(original_source, original_ast)
|
|
170
|
+
original = preprocess_reparsed_source(original_source)
|
|
171
|
+
if original != original_source || original_source.include?('__LINE__')
|
|
172
|
+
reparsed = parse(original, processed_source.path).ast
|
|
173
|
+
reparsed && normalize_reparsed_ast(reparsed)
|
|
174
|
+
else
|
|
175
|
+
@normalized_originals ||= {}.compare_by_identity
|
|
176
|
+
@normalized_originals[original_ast] ||= normalize_reparsed_ast(original_ast)
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
@@ -8,8 +8,8 @@ module RuboCop
|
|
|
8
8
|
MSG = 'Space missing after %<token>s.'
|
|
9
9
|
|
|
10
10
|
def on_new_investigation
|
|
11
|
-
each_missing_space(processed_source.tokens) do |token|
|
|
12
|
-
add_offense(token.pos, message: format(MSG, token: kind
|
|
11
|
+
each_missing_space(processed_source.tokens) do |token, kind|
|
|
12
|
+
add_offense(token.pos, message: format(MSG, token: kind)) do |corrector|
|
|
13
13
|
PunctuationCorrector.add_space(corrector, token)
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -19,11 +19,12 @@ module RuboCop
|
|
|
19
19
|
|
|
20
20
|
def each_missing_space(tokens)
|
|
21
21
|
tokens.each_cons(2) do |token1, token2|
|
|
22
|
-
|
|
22
|
+
kind = kind(token1, token2)
|
|
23
|
+
next unless kind
|
|
23
24
|
next unless space_missing?(token1, token2)
|
|
24
25
|
next unless space_required_before?(token2)
|
|
25
26
|
|
|
26
|
-
yield token1
|
|
27
|
+
yield token1, kind
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
30
|
|
|
@@ -5,6 +5,7 @@ module RuboCop
|
|
|
5
5
|
# Common functionality for modifier cops.
|
|
6
6
|
module StatementModifier
|
|
7
7
|
include LineLengthHelp
|
|
8
|
+
include AllowedPattern
|
|
8
9
|
|
|
9
10
|
private
|
|
10
11
|
|
|
@@ -34,17 +35,58 @@ module RuboCop
|
|
|
34
35
|
condition.each_node.any?(&:lvasgn_type?)
|
|
35
36
|
end
|
|
36
37
|
|
|
38
|
+
# The rendered modifier form is compared against the bare maximum, not
|
|
39
|
+
# `acceptable_line_length?`: `Layout/LineLength`'s exemptions describe
|
|
40
|
+
# long lines the user tolerates, not permission to manufacture new ones,
|
|
41
|
+
# so collapsing to modifier form must never push a line past the maximum.
|
|
37
42
|
def modifier_fits_on_single_line?(node)
|
|
38
43
|
return true unless max_line_length
|
|
39
44
|
|
|
40
|
-
|
|
45
|
+
line_length(line_in_modifier_form(node)) <= max_line_length
|
|
41
46
|
end
|
|
42
47
|
|
|
43
|
-
def
|
|
48
|
+
def line_in_modifier_form(node)
|
|
44
49
|
keyword_element = node.loc.keyword
|
|
45
50
|
code_before = keyword_element.source_line[0...keyword_element.column]
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
|
|
52
|
+
"#{code_before}#{to_modifier_form(node)}#{code_after(node)}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Whether an existing line is acceptable to `Layout/LineLength`,
|
|
56
|
+
# exemptions (the cop disabled at that line, an allowed pattern, an
|
|
57
|
+
# allowed cop directive, an allowed URI) included. Only for judging
|
|
58
|
+
# lines already in the source as too long - see
|
|
59
|
+
# `modifier_fits_on_single_line?` for why the exemptions must not apply
|
|
60
|
+
# when deciding whether a modifier line may be created.
|
|
61
|
+
def acceptable_line_length?(line, line_number)
|
|
62
|
+
return true unless max_line_length
|
|
63
|
+
return true if line_length(line) <= max_line_length
|
|
64
|
+
return true unless line_length_enabled_at_line?(line_number)
|
|
65
|
+
return true if matches_allowed_pattern?(line)
|
|
66
|
+
|
|
67
|
+
if allow_cop_directives? && directive_on_source_line?(line_number - 1)
|
|
68
|
+
return line_length_without_directive(line) <= max_line_length
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
allowed_by_uri?(line)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def allowed_by_uri?(line)
|
|
75
|
+
return false unless allow_uri?
|
|
76
|
+
|
|
77
|
+
uri_range = find_excessive_range(line, :uri)
|
|
78
|
+
!uri_range.nil? && allowed_position?(line, uri_range)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def line_length_enabled_at_line?(line)
|
|
82
|
+
processed_source.comment_config.cop_enabled_at_line?('Layout/LineLength', line)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# `Layout/LineLength`'s allowed patterns, so a modifier line that the
|
|
86
|
+
# user has configured that cop to accept is not flagged for length here.
|
|
87
|
+
def allowed_patterns
|
|
88
|
+
line_length_config = config.for_cop('Layout/LineLength')
|
|
89
|
+
line_length_config['AllowedPatterns'] || line_length_config['IgnoredPatterns'] || []
|
|
48
90
|
end
|
|
49
91
|
|
|
50
92
|
def to_modifier_form(node)
|
|
@@ -54,15 +96,22 @@ module RuboCop
|
|
|
54
96
|
[parenthesized, first_line_comment(node)].compact.join(' ')
|
|
55
97
|
end
|
|
56
98
|
|
|
99
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
57
100
|
def if_body_source(if_body)
|
|
58
|
-
if
|
|
101
|
+
if unparenthesized_call_with_omitted_value?(if_body)
|
|
59
102
|
"#{method_source(if_body)}(#{if_body.arguments.map(&:source).join(', ')})"
|
|
103
|
+
elsif (value = wrapped_value(if_body))
|
|
104
|
+
prefix = if_body.source_range.begin.join(value.source_range.begin).source
|
|
105
|
+
suffix = value.source_range.end.join(if_body.source_range.end).source
|
|
106
|
+
|
|
107
|
+
"#{prefix}#{if_body_source(value)}#{suffix}"
|
|
60
108
|
else
|
|
61
109
|
if_body.source
|
|
62
110
|
end
|
|
63
111
|
end
|
|
64
112
|
|
|
65
|
-
def
|
|
113
|
+
def unparenthesized_call_with_omitted_value?(if_body)
|
|
114
|
+
return false if !if_body.call_type? || if_body.method?(:[]=) || if_body.parenthesized?
|
|
66
115
|
return false unless (last_argument = if_body.last_argument)
|
|
67
116
|
|
|
68
117
|
last_argument.hash_type? && last_argument.pairs.last&.value_omission?
|
|
@@ -74,8 +123,16 @@ module RuboCop
|
|
|
74
123
|
if_body.source_range.begin.join(end_range).source
|
|
75
124
|
end
|
|
76
125
|
|
|
126
|
+
def wrapped_value(if_body)
|
|
127
|
+
if if_body.type?(:return, :next, :break)
|
|
128
|
+
if_body.first_argument if if_body.arguments.one?
|
|
129
|
+
elsif if_body.type?(:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn)
|
|
130
|
+
if_body.expression
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
77
134
|
def first_line_comment(node)
|
|
78
|
-
comment = processed_source.
|
|
135
|
+
comment = processed_source.comment_at_line(node.first_line)
|
|
79
136
|
return unless comment
|
|
80
137
|
|
|
81
138
|
comment_source = comment.source
|
|
@@ -95,15 +152,15 @@ module RuboCop
|
|
|
95
152
|
parent = node.parent
|
|
96
153
|
return false if parent.nil?
|
|
97
154
|
return true if parent.assignment? || parent.operator_keyword?
|
|
98
|
-
return true if
|
|
155
|
+
return true if parent.type?(:array, :pair, :call, :yield, :super)
|
|
99
156
|
|
|
100
|
-
|
|
157
|
+
ternary_branch_or_endless_method_body?(parent)
|
|
101
158
|
end
|
|
102
159
|
|
|
103
|
-
def
|
|
104
|
-
return
|
|
160
|
+
def ternary_branch_or_endless_method_body?(parent)
|
|
161
|
+
return parent.ternary? if parent.if_type?
|
|
105
162
|
|
|
106
|
-
|
|
163
|
+
parent.any_def_type? && parent.endless?
|
|
107
164
|
end
|
|
108
165
|
|
|
109
166
|
def comment_disables_cop?(comment)
|
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
|
10
10
|
def on_str(node)
|
|
11
11
|
# Constants like __FILE__ are handled as strings,
|
|
12
12
|
# but don't respond to begin.
|
|
13
|
-
return unless node.loc
|
|
13
|
+
return unless node.loc?(:begin)
|
|
14
14
|
return if part_of_ignored_node?(node)
|
|
15
15
|
|
|
16
16
|
if offense?(node)
|
|
@@ -4,6 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
# Common methods shared by Style/TrailingCommaInArguments,
|
|
6
6
|
# Style/TrailingCommaInArrayLiteral and Style/TrailingCommaInHashLiteral
|
|
7
|
+
# rubocop:disable-next Metrics/ModuleLength
|
|
7
8
|
module TrailingComma
|
|
8
9
|
include ConfigurableEnforcedStyle
|
|
9
10
|
include RangeHelp
|
|
@@ -57,6 +58,8 @@ module RuboCop
|
|
|
57
58
|
', unless each item is on its own line'
|
|
58
59
|
when :consistent_comma
|
|
59
60
|
', unless items are split onto multiple lines'
|
|
61
|
+
when :diff_comma
|
|
62
|
+
', unless that item immediately precedes a newline'
|
|
60
63
|
else
|
|
61
64
|
''
|
|
62
65
|
end
|
|
@@ -68,6 +71,8 @@ module RuboCop
|
|
|
68
71
|
multiline?(node) && no_elements_on_same_line?(node)
|
|
69
72
|
when :consistent_comma
|
|
70
73
|
multiline?(node) && !method_name_and_arguments_on_same_line?(node)
|
|
74
|
+
when :diff_comma
|
|
75
|
+
multiline?(node) && last_item_precedes_newline?(node)
|
|
71
76
|
else
|
|
72
77
|
false
|
|
73
78
|
end
|
|
@@ -90,19 +95,21 @@ module RuboCop
|
|
|
90
95
|
node.multiline? && !allowed_multiline_argument?(node)
|
|
91
96
|
end
|
|
92
97
|
|
|
98
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
93
99
|
def method_name_and_arguments_on_same_line?(node)
|
|
94
|
-
return false
|
|
100
|
+
return false if !node.call_type? || node.last_line != node.last_argument.last_line
|
|
101
|
+
return true if node.last_argument.hash_type? && node.last_argument.braces?
|
|
95
102
|
|
|
96
|
-
line = node.loc.selector
|
|
103
|
+
line = node.loc.selector&.line || node.loc.line
|
|
97
104
|
|
|
98
|
-
line == node.last_argument.last_line
|
|
105
|
+
line == node.last_argument.last_line
|
|
99
106
|
end
|
|
100
107
|
|
|
101
108
|
# A single argument with the closing bracket on the same line as the end
|
|
102
109
|
# of the argument is not considered multiline, even if the argument
|
|
103
110
|
# itself might span multiple lines.
|
|
104
111
|
def allowed_multiline_argument?(node)
|
|
105
|
-
elements(node).one? && !Util.begins_its_line?(node
|
|
112
|
+
elements(node).one? && !Util.begins_its_line?(node_end_location(node))
|
|
106
113
|
end
|
|
107
114
|
|
|
108
115
|
def elements(node)
|
|
@@ -122,14 +129,24 @@ module RuboCop
|
|
|
122
129
|
|
|
123
130
|
def no_elements_on_same_line?(node)
|
|
124
131
|
items = elements(node).map(&:source_range)
|
|
125
|
-
items << node
|
|
132
|
+
items << node_end_location(node)
|
|
126
133
|
items.each_cons(2).none? { |a, b| on_same_line?(a, b) }
|
|
127
134
|
end
|
|
128
135
|
|
|
136
|
+
def node_end_location(node)
|
|
137
|
+
node.loc.end || node.source_range.end.adjust(begin_pos: -1)
|
|
138
|
+
end
|
|
139
|
+
|
|
129
140
|
def on_same_line?(range1, range2)
|
|
130
141
|
range1.last_line == range2.line
|
|
131
142
|
end
|
|
132
143
|
|
|
144
|
+
def last_item_precedes_newline?(node)
|
|
145
|
+
after_last_item = node.children.last.source_range.end.join(node.source_range.end)
|
|
146
|
+
|
|
147
|
+
after_last_item.source.start_with?(/,?\s*(#.*)?\n/)
|
|
148
|
+
end
|
|
149
|
+
|
|
133
150
|
def avoid_comma(kind, comma_begin_pos, extra_info)
|
|
134
151
|
range = range_between(comma_begin_pos, comma_begin_pos + 1)
|
|
135
152
|
article = kind.include?('array') ? 'an' : 'a'
|
|
@@ -170,7 +187,7 @@ module RuboCop
|
|
|
170
187
|
|
|
171
188
|
def heredoc?(node)
|
|
172
189
|
return false unless node.is_a?(RuboCop::AST::Node)
|
|
173
|
-
return true if node.loc
|
|
190
|
+
return true if node.loc?(:heredoc_body)
|
|
174
191
|
|
|
175
192
|
return heredoc_send?(node) if node.send_type?
|
|
176
193
|
|
|
@@ -63,9 +63,10 @@ module RuboCop
|
|
|
63
63
|
(send nil? VISIBILITY_SCOPES def)
|
|
64
64
|
PATTERN
|
|
65
65
|
|
|
66
|
+
# A modifier applies to every symbol it is given, not only to a sole argument.
|
|
66
67
|
# @!method visibility_inline_on_method_name?(node, method_name:)
|
|
67
68
|
def_node_matcher :visibility_inline_on_method_name?, <<~PATTERN
|
|
68
|
-
(send nil? VISIBILITY_SCOPES (sym %method_name))
|
|
69
|
+
(send nil? VISIBILITY_SCOPES <(sym %method_name) ...>)
|
|
69
70
|
PATTERN
|
|
70
71
|
end
|
|
71
72
|
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop # rubocop:disable Style/Documentation -- a namespace that only autoloads the mixins below
|
|
5
|
+
# Autoloads mixin modules included by cops. Mixins are autoloaded to reduce the number of
|
|
6
|
+
# requires because they're used only when the relevant cop class is loaded.
|
|
7
|
+
|
|
8
|
+
autoload :ArrayMinSize, "#{__dir__}/mixin/array_min_size"
|
|
9
|
+
autoload :ArraySyntax, "#{__dir__}/mixin/array_syntax"
|
|
10
|
+
autoload :Alignment, "#{__dir__}/mixin/alignment"
|
|
11
|
+
autoload :AllowedIdentifiers, "#{__dir__}/mixin/allowed_identifiers"
|
|
12
|
+
autoload :AllowedMethods, "#{__dir__}/mixin/allowed_methods"
|
|
13
|
+
autoload :AllowedPattern, "#{__dir__}/mixin/allowed_pattern"
|
|
14
|
+
autoload :AllowedReceivers, "#{__dir__}/mixin/allowed_receivers"
|
|
15
|
+
autoload :ForbiddenIdentifiers, "#{__dir__}/mixin/forbidden_identifiers"
|
|
16
|
+
autoload :ForbiddenPattern, "#{__dir__}/mixin/forbidden_pattern"
|
|
17
|
+
autoload :AutoCorrector, "#{__dir__}/mixin/auto_corrector" # rubocop:todo Naming/InclusiveLanguage -- the file is named `auto_corrector.rb`
|
|
18
|
+
autoload :CheckAssignment, "#{__dir__}/mixin/check_assignment"
|
|
19
|
+
autoload :CheckLineBreakable, "#{__dir__}/mixin/check_line_breakable"
|
|
20
|
+
autoload :CheckSingleLineSuitability, "#{__dir__}/mixin/check_single_line_suitability"
|
|
21
|
+
autoload :ConfigurableMax, "#{__dir__}/mixin/configurable_max"
|
|
22
|
+
autoload :CodeLength, "#{__dir__}/mixin/code_length"
|
|
23
|
+
autoload :ConfigurableEnforcedStyle, "#{__dir__}/mixin/configurable_enforced_style"
|
|
24
|
+
autoload :ConfigurableFormatting, "#{__dir__}/mixin/configurable_formatting"
|
|
25
|
+
autoload :ConfigurableNaming, "#{__dir__}/mixin/configurable_naming"
|
|
26
|
+
autoload :ConfigurableNumbering, "#{__dir__}/mixin/configurable_numbering"
|
|
27
|
+
autoload :DigHelp, "#{__dir__}/mixin/dig_help"
|
|
28
|
+
autoload :DocumentationComment, "#{__dir__}/mixin/documentation_comment"
|
|
29
|
+
autoload :Duplication, "#{__dir__}/mixin/duplication"
|
|
30
|
+
autoload :RangeHelp, "#{__dir__}/mixin/range_help"
|
|
31
|
+
autoload :ProjectIndexHelp, "#{__dir__}/mixin/project_index_help"
|
|
32
|
+
autoload :AnnotationComment, "#{__dir__}/mixin/annotation_comment"
|
|
33
|
+
autoload :EmptyParameter, "#{__dir__}/mixin/empty_parameter"
|
|
34
|
+
autoload :EndKeywordAlignment, "#{__dir__}/mixin/end_keyword_alignment"
|
|
35
|
+
autoload :EndlessMethodBodyHelp, "#{__dir__}/mixin/endless_method_body_help"
|
|
36
|
+
autoload :EndlessMethodRewriter, "#{__dir__}/mixin/endless_method_rewriter"
|
|
37
|
+
autoload :EnforceSuperclass, "#{__dir__}/mixin/enforce_superclass"
|
|
38
|
+
autoload :FirstElementLineBreak, "#{__dir__}/mixin/first_element_line_break"
|
|
39
|
+
autoload :FrozenStringLiteral, "#{__dir__}/mixin/frozen_string_literal"
|
|
40
|
+
autoload :GemDeclaration, "#{__dir__}/mixin/gem_declaration"
|
|
41
|
+
autoload :GemspecHelp, "#{__dir__}/mixin/gemspec_help"
|
|
42
|
+
autoload :HashAlignmentStyles, "#{__dir__}/mixin/hash_alignment_styles"
|
|
43
|
+
autoload :HashSubset, "#{__dir__}/mixin/hash_subset"
|
|
44
|
+
autoload :HashTransformMethod, "#{__dir__}/mixin/hash_transform_method"
|
|
45
|
+
# Deprecated aliases of `AllowedMethods` and `AllowedPattern`, defined in those files.
|
|
46
|
+
autoload :IgnoredMethods, "#{__dir__}/mixin/allowed_methods"
|
|
47
|
+
autoload :IgnoredPattern, "#{__dir__}/mixin/allowed_pattern"
|
|
48
|
+
autoload :IndexedMethodArity, "#{__dir__}/mixin/indexed_method_arity"
|
|
49
|
+
autoload :IntegerNode, "#{__dir__}/mixin/integer_node"
|
|
50
|
+
autoload :Interpolation, "#{__dir__}/mixin/interpolation"
|
|
51
|
+
autoload :LineLengthHelp, "#{__dir__}/mixin/line_length_help"
|
|
52
|
+
autoload :MatchRange, "#{__dir__}/mixin/match_range"
|
|
53
|
+
autoload :HashShorthandSyntax, "#{__dir__}/mixin/hash_shorthand_syntax"
|
|
54
|
+
autoload :MethodComplexity, "#{__dir__}/mixin/method_complexity"
|
|
55
|
+
autoload :MethodPreference, "#{__dir__}/mixin/method_preference"
|
|
56
|
+
autoload :MinBodyLength, "#{__dir__}/mixin/min_body_length"
|
|
57
|
+
autoload :MinBranchesCount, "#{__dir__}/mixin/min_branches_count"
|
|
58
|
+
autoload :MultilineElementIndentation, "#{__dir__}/mixin/multiline_element_indentation"
|
|
59
|
+
autoload :MultilineElementLineBreaks, "#{__dir__}/mixin/multiline_element_line_breaks"
|
|
60
|
+
autoload :MultilineExpressionIndentation, "#{__dir__}/mixin/multiline_expression_indentation"
|
|
61
|
+
autoload :MultilineLiteralBraceLayout, "#{__dir__}/mixin/multiline_literal_brace_layout"
|
|
62
|
+
autoload :NegativeConditional, "#{__dir__}/mixin/negative_conditional"
|
|
63
|
+
autoload :Heredoc, "#{__dir__}/mixin/heredoc"
|
|
64
|
+
autoload :NilMethods, "#{__dir__}/mixin/nil_methods"
|
|
65
|
+
autoload :OnNormalIfUnless, "#{__dir__}/mixin/on_normal_if_unless"
|
|
66
|
+
autoload :OrderedGemNode, "#{__dir__}/mixin/ordered_gem_node"
|
|
67
|
+
autoload :Parentheses, "#{__dir__}/mixin/parentheses"
|
|
68
|
+
autoload :PatternMatchingHelp, "#{__dir__}/mixin/pattern_matching_help"
|
|
69
|
+
autoload :PercentArray, "#{__dir__}/mixin/percent_array"
|
|
70
|
+
autoload :PercentLiteral, "#{__dir__}/mixin/percent_literal"
|
|
71
|
+
autoload :PrecedingFollowingAlignment, "#{__dir__}/mixin/preceding_following_alignment"
|
|
72
|
+
autoload :PreferredDelimiters, "#{__dir__}/mixin/preferred_delimiters"
|
|
73
|
+
autoload :RationalLiteral, "#{__dir__}/mixin/rational_literal"
|
|
74
|
+
autoload :ReparsedEquivalence, "#{__dir__}/mixin/reparsed_equivalence"
|
|
75
|
+
autoload :RequireLibrary, "#{__dir__}/mixin/require_library"
|
|
76
|
+
autoload :RescueNode, "#{__dir__}/mixin/rescue_node"
|
|
77
|
+
autoload :SafeAssignment, "#{__dir__}/mixin/safe_assignment"
|
|
78
|
+
autoload :SpaceAfterPunctuation, "#{__dir__}/mixin/space_after_punctuation"
|
|
79
|
+
autoload :SpaceBeforePunctuation, "#{__dir__}/mixin/space_before_punctuation"
|
|
80
|
+
autoload :SurroundingSpace, "#{__dir__}/mixin/surrounding_space"
|
|
81
|
+
autoload :StatementModifier, "#{__dir__}/mixin/statement_modifier"
|
|
82
|
+
autoload :StringHelp, "#{__dir__}/mixin/string_help"
|
|
83
|
+
autoload :StringLiteralsHelp, "#{__dir__}/mixin/string_literals_help"
|
|
84
|
+
autoload :SymbolHelp, "#{__dir__}/mixin/symbol_help"
|
|
85
|
+
autoload :TargetRubyVersion, "#{__dir__}/mixin/target_ruby_version"
|
|
86
|
+
autoload :TrailingBody, "#{__dir__}/mixin/trailing_body"
|
|
87
|
+
autoload :TrailingComma, "#{__dir__}/mixin/trailing_comma"
|
|
88
|
+
autoload :UncommunicativeName, "#{__dir__}/mixin/uncommunicative_name"
|
|
89
|
+
autoload :VisibilityHelp, "#{__dir__}/mixin/visibility_help"
|
|
90
|
+
autoload :CommentsHelp, "#{__dir__}/mixin/comments_help"
|
|
91
|
+
autoload :DefNode, "#{__dir__}/mixin/def_node"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -11,6 +11,11 @@ module RuboCop
|
|
|
11
11
|
# Getters (`get_attribute`) must have no arguments to be registered,
|
|
12
12
|
# and setters (`set_attribute(value)`) must have exactly one.
|
|
13
13
|
#
|
|
14
|
+
# When `AllCops/UseProjectIndex` is enabled and the `rubydex` gem is
|
|
15
|
+
# installed, methods that override a method defined by an ancestor
|
|
16
|
+
# elsewhere in the project are not reported, since renaming an override
|
|
17
|
+
# breaks the inherited contract.
|
|
18
|
+
#
|
|
14
19
|
# @example
|
|
15
20
|
# # bad
|
|
16
21
|
# def set_attribute(value)
|
|
@@ -36,12 +41,15 @@ module RuboCop
|
|
|
36
41
|
# def set_value
|
|
37
42
|
# end
|
|
38
43
|
class AccessorMethodName < Base
|
|
44
|
+
include ProjectIndexHelp
|
|
45
|
+
|
|
39
46
|
MSG_READER = 'Do not prefix reader method names with `get_`.'
|
|
40
47
|
MSG_WRITER = 'Do not prefix writer method names with `set_`.'
|
|
41
48
|
|
|
42
49
|
def on_def(node)
|
|
43
50
|
return unless proper_attribute_name?(node)
|
|
44
51
|
return unless bad_reader_name?(node) || bad_writer_name?(node)
|
|
52
|
+
return if overrides_inherited_method?(node)
|
|
45
53
|
|
|
46
54
|
message = message(node)
|
|
47
55
|
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Naming
|
|
6
6
|
# Makes sure that certain binary operator methods have their
|
|
7
|
-
# sole
|
|
7
|
+
# sole parameter named `other`.
|
|
8
8
|
#
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
@@ -33,6 +33,7 @@ module RuboCop
|
|
|
33
33
|
node.each_descendant(:lvar, :lvasgn) do |lvar|
|
|
34
34
|
lvar_location = lvar.loc.name
|
|
35
35
|
next unless lvar_location.source == arg.source
|
|
36
|
+
next if shadowed?(lvar, arg.source, node)
|
|
36
37
|
|
|
37
38
|
corrector.replace(lvar_location, 'other')
|
|
38
39
|
end
|
|
@@ -47,6 +48,21 @@ module RuboCop
|
|
|
47
48
|
|
|
48
49
|
!/\A[[:word:]]/.match?(name) || OP_LIKE_METHODS.include?(name)
|
|
49
50
|
end
|
|
51
|
+
|
|
52
|
+
# A reference is shadowed when an enclosing block within the method redeclares the
|
|
53
|
+
# parameter name (as a block parameter or block-local). Such a reference points to
|
|
54
|
+
# the block's variable, not the operator's parameter, so it must not be renamed.
|
|
55
|
+
def shadowed?(node, name, def_node)
|
|
56
|
+
node.each_ancestor(:block).any? do |block|
|
|
57
|
+
def_node.source_range.contains?(block.source_range) && redeclares?(block, name)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def redeclares?(block, name)
|
|
62
|
+
block.arguments.any? do |argument|
|
|
63
|
+
argument.respond_to?(:name) && argument.name.to_s == name
|
|
64
|
+
end
|
|
65
|
+
end
|
|
50
66
|
end
|
|
51
67
|
end
|
|
52
68
|
end
|
|
@@ -14,10 +14,10 @@ module RuboCop
|
|
|
14
14
|
# autocorrected.
|
|
15
15
|
#
|
|
16
16
|
# [NOTE]
|
|
17
|
-
#
|
|
17
|
+
# ====
|
|
18
18
|
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
|
19
19
|
# no offense will be registered until Ruby 3.4:
|
|
20
|
-
|
|
20
|
+
#
|
|
21
21
|
# [source,ruby]
|
|
22
22
|
# ----
|
|
23
23
|
# def foo(&block)
|
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
|
25
25
|
# block_method { bar(&block) }
|
|
26
26
|
# end
|
|
27
27
|
# ----
|
|
28
|
-
#
|
|
28
|
+
# ====
|
|
29
29
|
#
|
|
30
30
|
# @example EnforcedStyle: anonymous (default)
|
|
31
31
|
#
|
|
@@ -62,7 +62,10 @@ module RuboCop
|
|
|
62
62
|
MSG = 'Use %<style>s block forwarding.'
|
|
63
63
|
|
|
64
64
|
def self.autocorrect_incompatible_with
|
|
65
|
-
[
|
|
65
|
+
[
|
|
66
|
+
Lint::AmbiguousOperator, Style::ArgumentsForwarding, Style::EndlessMethod,
|
|
67
|
+
Style::ExplicitBlockArgument, Style::MethodDefParentheses
|
|
68
|
+
]
|
|
66
69
|
end
|
|
67
70
|
|
|
68
71
|
def on_def(node)
|
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
|
38
38
|
class BlockParameterName < Base
|
|
39
39
|
include UncommunicativeName
|
|
40
40
|
|
|
41
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
41
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler -- there are no parameter names to check
|
|
42
42
|
return unless node.arguments?
|
|
43
43
|
|
|
44
44
|
check(node, node.arguments)
|