rubocop 1.53.0 → 1.90.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +93 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +949 -185
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +43 -4
- data/exe/rubocop +2 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +28 -7
- data/lib/rubocop/cli/command/auto_generate_config.rb +63 -18
- data/lib/rubocop/cli/command/execute_runner.rb +35 -4
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +26 -4
- data/lib/rubocop/cli/command/show_docs_url.rb +5 -9
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +60 -16
- data/lib/rubocop/comment_config/directive_range.rb +32 -0
- data/lib/rubocop/comment_config/disable_next.rb +97 -0
- data/lib/rubocop/comment_config.rb +123 -49
- data/lib/rubocop/config.rb +180 -35
- data/lib/rubocop/config_finder.rb +15 -5
- data/lib/rubocop/config_loader.rb +83 -59
- data/lib/rubocop/config_loader_resolver.rb +65 -25
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +76 -21
- data/lib/rubocop/cop/autocorrect_logic.rb +70 -25
- data/lib/rubocop/cop/badge.rb +8 -0
- data/lib/rubocop/cop/base.rb +151 -30
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -2
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +6 -4
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +32 -33
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +11 -4
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +80 -22
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +5 -9
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +14 -5
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +37 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +31 -5
- data/lib/rubocop/cop/exclude_limit.rb +32 -6
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +51 -19
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +11 -4
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +15 -10
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +10 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +51 -25
- 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_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +7 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +132 -39
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +130 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +6 -9
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +10 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -11
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +89 -17
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/class_structure.rb +171 -43
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +10 -3
- data/lib/rubocop/cop/layout/condition_position.rb +13 -7
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +3 -7
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +11 -11
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +66 -15
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +75 -10
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +71 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- 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 +12 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +24 -6
- data/lib/rubocop/cop/layout/extra_spacing.rb +110 -14
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +59 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +20 -11
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +22 -22
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +26 -26
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +11 -12
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +6 -5
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +38 -5
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +168 -22
- data/lib/rubocop/cop/layout/leading_comment_space.rb +111 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +28 -11
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +9 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/line_length.rb +271 -37
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +3 -2
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +252 -32
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +117 -42
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +17 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -2
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -4
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +94 -38
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +8 -41
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +48 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +73 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +8 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +89 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +20 -10
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +49 -17
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +227 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +166 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +53 -9
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +5 -5
- data/lib/rubocop/cop/lint/duplicate_methods.rb +504 -49
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +19 -2
- data/lib/rubocop/cop/lint/empty_block.rb +5 -5
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +33 -57
- data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
- data/lib/rubocop/cop/lint/empty_when.rb +9 -4
- data/lib/rubocop/cop/lint/ensure_return.rb +20 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +28 -25
- data/lib/rubocop/cop/lint/float_comparison.rb +59 -15
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +22 -12
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -9
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +30 -6
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +133 -12
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +95 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +61 -30
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +44 -22
- data/lib/rubocop/cop/lint/missing_super.rb +33 -3
- data/lib/rubocop/cop/lint/mixed_case_range.rb +16 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- 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 +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +8 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +22 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +22 -10
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +10 -10
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +28 -15
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +104 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +18 -6
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +9 -24
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -5
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +126 -30
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +57 -21
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +206 -15
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +20 -10
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +10 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +9 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -2
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -8
- 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 +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +6 -12
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +55 -13
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +113 -41
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +7 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +103 -10
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +40 -12
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +78 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +29 -13
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +26 -4
- data/lib/rubocop/cop/lint/syntax.rb +35 -5
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +77 -9
- 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 +114 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +68 -15
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +28 -2
- 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/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +37 -12
- data/lib/rubocop/cop/lint/useless_assignment.rb +92 -34
- 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_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +3 -4
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +14 -8
- data/lib/rubocop/cop/lint/useless_setter_call.rb +17 -29
- data/lib/rubocop/cop/lint/useless_times.rb +24 -3
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +127 -29
- data/lib/rubocop/cop/lint.rb +178 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
- data/lib/rubocop/cop/metrics/block_length.rb +9 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +43 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -17
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +8 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +17 -8
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +38 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +5 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +39 -12
- 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 +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +12 -6
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +20 -4
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +46 -18
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +47 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +22 -14
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +11 -6
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +32 -0
- 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 +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +33 -15
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +49 -40
- data/lib/rubocop/cop/mixin/hash_subset.rb +210 -0
- 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/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +61 -14
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -12
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +120 -39
- data/lib/rubocop/cop/mixin/project_index_help.rb +188 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -6
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +57 -15
- data/lib/rubocop/cop/mixin/string_help.rb +5 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +27 -10
- data/lib/rubocop/cop/mixin.rb +91 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +35 -6
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +9 -10
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +21 -7
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +25 -19
- 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_prefix.rb +232 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +23 -17
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +5 -4
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +56 -14
- data/lib/rubocop/cop/registry.rb +225 -64
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- 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 +33 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +184 -33
- data/lib/rubocop/cop/style/accessor_grouping.rb +56 -11
- data/lib/rubocop/cop/style/alias.rb +26 -12
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +3 -2
- data/lib/rubocop/cop/style/arguments_forwarding.rb +487 -63
- data/lib/rubocop/cop/style/array_first_last.rb +90 -0
- data/lib/rubocop/cop/style/array_intersect.rb +148 -41
- 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 +5 -2
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- 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/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +106 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +89 -53
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +16 -21
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +139 -22
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +29 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +53 -23
- data/lib/rubocop/cop/style/collection_methods.rb +4 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +29 -9
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
- 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 +11 -5
- data/lib/rubocop/cop/style/conditional_assignment.rb +85 -56
- data/lib/rubocop/cop/style/constant_visibility.rb +21 -23
- data/lib/rubocop/cop/style/copyright.rb +49 -24
- data/lib/rubocop/cop/style/data_inheritance.rb +12 -1
- data/lib/rubocop/cop/style/date_time.rb +8 -7
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -7
- data/lib/rubocop/cop/style/dig_chain.rb +94 -0
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +171 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +77 -13
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +76 -29
- data/lib/rubocop/cop/style/documentation_method.rb +24 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +12 -16
- data/lib/rubocop/cop/style/each_with_object.rb +5 -4
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +16 -2
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +5 -14
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +43 -25
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +164 -24
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +13 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +35 -8
- data/lib/rubocop/cop/style/file_null.rb +91 -0
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +23 -21
- data/lib/rubocop/cop/style/float_division.rb +23 -5
- data/lib/rubocop/cop/style/for.rb +7 -2
- data/lib/rubocop/cop/style/format_string.rb +47 -13
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +6 -5
- data/lib/rubocop/cop/style/guard_clause.rb +67 -21
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +38 -13
- data/lib/rubocop/cop/style/hash_each_methods.rb +109 -12
- data/lib/rubocop/cop/style/hash_except.rb +38 -146
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +102 -0
- data/lib/rubocop/cop/style/hash_slice.rb +96 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +36 -7
- 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 +62 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +26 -22
- data/lib/rubocop/cop/style/if_unless_modifier.rb +72 -47
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +15 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +12 -9
- data/lib/rubocop/cop/style/if_with_semicolon.rb +75 -11
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- 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 +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +71 -9
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +71 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +16 -5
- data/lib/rubocop/cop/style/lambda_call.rb +33 -11
- 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 +93 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +28 -10
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +77 -28
- 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 +38 -9
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +37 -15
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +8 -6
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +75 -12
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- 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 +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +9 -3
- data/lib/rubocop/cop/style/multiline_method_signature.rb +18 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +6 -4
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +63 -59
- data/lib/rubocop/cop/style/mutable_constant.rb +117 -19
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +6 -5
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +8 -15
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +12 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +3 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +13 -5
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +50 -16
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +40 -8
- 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/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +69 -48
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +5 -1
- 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 +5 -4
- data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +37 -4
- 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 +21 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +53 -6
- data/lib/rubocop/cop/style/redundant_condition.rb +98 -25
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -9
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +31 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +88 -5
- data/lib/rubocop/cop/style/redundant_each.rb +11 -9
- data/lib/rubocop/cop/style/redundant_exception.rb +39 -13
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +5 -13
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +10 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +23 -6
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +62 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +92 -72
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +203 -84
- data/lib/rubocop/cop/style/redundant_percent_q.rb +6 -4
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +33 -4
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +20 -24
- data/lib/rubocop/cop/style/redundant_return.rb +20 -8
- data/lib/rubocop/cop/style/redundant_self.rb +43 -22
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +19 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +9 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +17 -16
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +4 -5
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +20 -7
- data/lib/rubocop/cop/style/return_nil.rb +8 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +67 -11
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +176 -66
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +14 -10
- 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 +62 -26
- data/lib/rubocop/cop/style/self_assignment.rb +13 -19
- data/lib/rubocop/cop/style/semicolon.rb +53 -17
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +3 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +90 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +16 -12
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +103 -91
- data/lib/rubocop/cop/style/special_global_vars.rb +8 -4
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -1
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +34 -17
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +25 -3
- data/lib/rubocop/cop/style/super_arguments.rb +220 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +86 -14
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +37 -5
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- 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 +21 -22
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -3
- 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/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_do.rb +7 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -2
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +12 -7
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -9
- data/lib/rubocop/cop/style/zero_length_predicate.rb +38 -27
- data/lib/rubocop/cop/style.rb +312 -0
- data/lib/rubocop/cop/team.rb +188 -46
- data/lib/rubocop/cop/util.rb +23 -13
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +35 -7
- data/lib/rubocop/cop/variable_force/branch.rb +31 -7
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +32 -10
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +137 -63
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +135 -19
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_finder.rb +11 -9
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +8 -9
- data/lib/rubocop/formatter/disabled_config_formatter.rb +62 -22
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +10 -4
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -17
- data/lib/rubocop/formatter/json_formatter.rb +11 -7
- data/lib/rubocop/formatter/junit_formatter.rb +94 -30
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +14 -5
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +11 -10
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -3
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lockfile.rb +76 -7
- data/lib/rubocop/lsp/diagnostic.rb +170 -0
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +163 -56
- data/lib/rubocop/lsp/runtime.rb +47 -44
- data/lib/rubocop/lsp/server.rb +18 -6
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +96 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +44 -14
- data/lib/rubocop/mcp/server.rb +199 -0
- data/lib/rubocop/options.rb +88 -32
- data/lib/rubocop/path_util.rb +33 -11
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +146 -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 +7 -5
- data/lib/rubocop/remote_config.rb +15 -9
- data/lib/rubocop/result_cache.rb +85 -61
- data/lib/rubocop/rspec/cop_helper.rb +28 -2
- data/lib/rubocop/rspec/expect_offense.rb +29 -12
- data/lib/rubocop/rspec/shared_contexts.rb +165 -24
- data/lib/rubocop/rspec/support.rb +8 -2
- data/lib/rubocop/runner.rb +273 -99
- data/lib/rubocop/server/cache.rb +76 -42
- 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 +4 -4
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +13 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +111 -86
- data/lib/rubocop/target_ruby.rb +131 -89
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/version.rb +84 -10
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +33 -648
- data/lib/ruby_lsp/rubocop/addon.rb +89 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +169 -50
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -100
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Cops for the `Security` department. The department's cops are registered for lazy loading
|
|
6
|
+
# and their files are loaded on demand.
|
|
7
|
+
module Security
|
|
8
|
+
extend LazyLoader
|
|
9
|
+
|
|
10
|
+
register_cop :CompoundHash, "#{__dir__}/security/compound_hash"
|
|
11
|
+
register_cop :Eval, "#{__dir__}/security/eval"
|
|
12
|
+
register_cop :IoMethods, "#{__dir__}/security/io_methods"
|
|
13
|
+
register_cop :JSONLoad, "#{__dir__}/security/json_load"
|
|
14
|
+
register_cop :MarshalLoad, "#{__dir__}/security/marshal_load"
|
|
15
|
+
register_cop :Open, "#{__dir__}/security/open"
|
|
16
|
+
register_cop :YAMLLoad, "#{__dir__}/security/yaml_load"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -8,6 +8,17 @@ module RuboCop
|
|
|
8
8
|
# EnforcedStyle config covers only method definitions.
|
|
9
9
|
# Applications of visibility methods to symbols can be controlled
|
|
10
10
|
# using AllowModifiersOnSymbols config.
|
|
11
|
+
# Also, the visibility of `attr*` methods can be controlled using
|
|
12
|
+
# AllowModifiersOnAttrs config.
|
|
13
|
+
#
|
|
14
|
+
# In Ruby 3.0, `attr*` methods now return an array of defined method names
|
|
15
|
+
# as symbols. So we can write the modifier and `attr*` in inline style.
|
|
16
|
+
# AllowModifiersOnAttrs config allows `attr*` methods to be written in
|
|
17
|
+
# inline style without modifying applications that have been maintained
|
|
18
|
+
# for a long time in group style. Furthermore, developers who are not very
|
|
19
|
+
# familiar with Ruby may know that the modifier applies to `def`, but they
|
|
20
|
+
# may not know that it also applies to `attr*` methods. It would be easier
|
|
21
|
+
# to understand if we could write `attr*` methods in inline style.
|
|
11
22
|
#
|
|
12
23
|
# @safety
|
|
13
24
|
# Autocorrection is not safe, because the visibility of dynamically
|
|
@@ -57,6 +68,9 @@ module RuboCop
|
|
|
57
68
|
# class Foo
|
|
58
69
|
#
|
|
59
70
|
# private :bar, :baz
|
|
71
|
+
# private *%i[qux quux]
|
|
72
|
+
# private *METHOD_NAMES
|
|
73
|
+
# private *private_methods
|
|
60
74
|
#
|
|
61
75
|
# end
|
|
62
76
|
#
|
|
@@ -65,6 +79,57 @@ module RuboCop
|
|
|
65
79
|
# class Foo
|
|
66
80
|
#
|
|
67
81
|
# private :bar, :baz
|
|
82
|
+
# private *%i[qux quux]
|
|
83
|
+
# private *METHOD_NAMES
|
|
84
|
+
# private *private_methods
|
|
85
|
+
#
|
|
86
|
+
# end
|
|
87
|
+
#
|
|
88
|
+
# @example AllowModifiersOnAttrs: true (default)
|
|
89
|
+
# # good
|
|
90
|
+
# class Foo
|
|
91
|
+
#
|
|
92
|
+
# public attr_reader :bar
|
|
93
|
+
# protected attr_writer :baz
|
|
94
|
+
# private attr_accessor :qux
|
|
95
|
+
# private attr :quux
|
|
96
|
+
#
|
|
97
|
+
# def public_method; end
|
|
98
|
+
#
|
|
99
|
+
# private
|
|
100
|
+
#
|
|
101
|
+
# def private_method; end
|
|
102
|
+
#
|
|
103
|
+
# end
|
|
104
|
+
#
|
|
105
|
+
# @example AllowModifiersOnAttrs: false
|
|
106
|
+
# # bad
|
|
107
|
+
# class Foo
|
|
108
|
+
#
|
|
109
|
+
# public attr_reader :bar
|
|
110
|
+
# protected attr_writer :baz
|
|
111
|
+
# private attr_accessor :qux
|
|
112
|
+
# private attr :quux
|
|
113
|
+
#
|
|
114
|
+
# end
|
|
115
|
+
#
|
|
116
|
+
# @example AllowModifiersOnAliasMethod: true (default)
|
|
117
|
+
# # good
|
|
118
|
+
# class Foo
|
|
119
|
+
#
|
|
120
|
+
# public alias_method :bar, :foo
|
|
121
|
+
# protected alias_method :baz, :foo
|
|
122
|
+
# private alias_method :qux, :foo
|
|
123
|
+
#
|
|
124
|
+
# end
|
|
125
|
+
#
|
|
126
|
+
# @example AllowModifiersOnAliasMethod: false
|
|
127
|
+
# # bad
|
|
128
|
+
# class Foo
|
|
129
|
+
#
|
|
130
|
+
# public alias_method :bar, :foo
|
|
131
|
+
# protected alias_method :baz, :foo
|
|
132
|
+
# private alias_method :qux, :foo
|
|
68
133
|
#
|
|
69
134
|
# end
|
|
70
135
|
class AccessModifierDeclarations < Base
|
|
@@ -85,17 +150,27 @@ module RuboCop
|
|
|
85
150
|
|
|
86
151
|
RESTRICT_ON_SEND = %i[private protected public module_function].freeze
|
|
87
152
|
|
|
88
|
-
ALLOWED_NODE_TYPES = %i[pair block].freeze
|
|
89
|
-
|
|
90
153
|
# @!method access_modifier_with_symbol?(node)
|
|
91
154
|
def_node_matcher :access_modifier_with_symbol?, <<~PATTERN
|
|
92
|
-
(send nil? {:private :protected :public :module_function}
|
|
155
|
+
(send nil? {:private :protected :public :module_function}
|
|
156
|
+
{(sym _)+ (splat {#percent_symbol_array? const send})}
|
|
157
|
+
)
|
|
158
|
+
PATTERN
|
|
159
|
+
|
|
160
|
+
# @!method access_modifier_with_attr?(node)
|
|
161
|
+
def_node_matcher :access_modifier_with_attr?, <<~PATTERN
|
|
162
|
+
(send nil? {:private :protected :public :module_function}
|
|
163
|
+
(send nil? {:attr :attr_reader :attr_writer :attr_accessor} _+))
|
|
164
|
+
PATTERN
|
|
165
|
+
|
|
166
|
+
# @!method access_modifier_with_alias_method?, <<~PATTERN
|
|
167
|
+
def_node_matcher :access_modifier_with_alias_method?, <<~PATTERN
|
|
168
|
+
(send nil? {:private :protected :public :module_function}
|
|
169
|
+
(send nil? :alias_method _ _))
|
|
93
170
|
PATTERN
|
|
94
171
|
|
|
95
172
|
def on_send(node)
|
|
96
|
-
return
|
|
97
|
-
return if ALLOWED_NODE_TYPES.include?(node.parent&.type)
|
|
98
|
-
return if allow_modifiers_on_symbols?(node)
|
|
173
|
+
return if allowed?(node)
|
|
99
174
|
|
|
100
175
|
if offense?(node)
|
|
101
176
|
add_offense(node.loc.selector) do |corrector|
|
|
@@ -109,29 +184,72 @@ module RuboCop
|
|
|
109
184
|
|
|
110
185
|
private
|
|
111
186
|
|
|
187
|
+
def allowed?(node)
|
|
188
|
+
!node.access_modifier? ||
|
|
189
|
+
node.parent&.type?(:pair, :any_block) ||
|
|
190
|
+
allow_modifiers_on_symbols?(node) ||
|
|
191
|
+
allow_modifiers_on_attrs?(node) ||
|
|
192
|
+
allow_modifiers_on_alias_method?(node)
|
|
193
|
+
end
|
|
194
|
+
|
|
112
195
|
def autocorrect(corrector, node)
|
|
113
196
|
case style
|
|
114
197
|
when :group
|
|
115
|
-
|
|
116
|
-
return unless def_node
|
|
117
|
-
|
|
118
|
-
replace_def(corrector, node, def_node)
|
|
198
|
+
autocorrect_group_style(corrector, node)
|
|
119
199
|
when :inline
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
200
|
+
autocorrect_inline_style(corrector, node)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def autocorrect_group_style(corrector, node)
|
|
205
|
+
def_nodes = find_corresponding_def_nodes(node)
|
|
206
|
+
return unless def_nodes.any?
|
|
207
|
+
|
|
208
|
+
replace_defs(corrector, node, def_nodes)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def autocorrect_inline_style(corrector, node)
|
|
212
|
+
if node.parent&.begin_type?
|
|
213
|
+
remove_modifier_node_within_begin(corrector, node, node.parent)
|
|
214
|
+
else
|
|
215
|
+
remove_nodes(corrector, node)
|
|
124
216
|
end
|
|
217
|
+
select_grouped_def_nodes(node).each do |grouped_def_node|
|
|
218
|
+
insert_inline_modifier(corrector, grouped_def_node, node.method_name)
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def percent_symbol_array?(node)
|
|
223
|
+
node.array_type? && node.percent_literal?(:symbol)
|
|
125
224
|
end
|
|
126
225
|
|
|
127
226
|
def allow_modifiers_on_symbols?(node)
|
|
128
227
|
cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node)
|
|
129
228
|
end
|
|
130
229
|
|
|
230
|
+
def allow_modifiers_on_attrs?(node)
|
|
231
|
+
cop_config['AllowModifiersOnAttrs'] && access_modifier_with_attr?(node)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def allow_modifiers_on_alias_method?(node)
|
|
235
|
+
cop_config['AllowModifiersOnAliasMethod'] && access_modifier_with_alias_method?(node)
|
|
236
|
+
end
|
|
237
|
+
|
|
131
238
|
def offense?(node)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
239
|
+
if group_style?
|
|
240
|
+
return false if node.parent ? node.parent.if_type? : access_modifier_with_symbol?(node)
|
|
241
|
+
|
|
242
|
+
access_modifier_is_inlined?(node) && !right_siblings_same_inline_method?(node)
|
|
243
|
+
else
|
|
244
|
+
access_modifier_is_not_inlined?(node) && select_grouped_def_nodes(node).any?
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def correctable_group_offense?(node)
|
|
249
|
+
return false unless group_style?
|
|
250
|
+
return false if allowed?(node)
|
|
251
|
+
|
|
252
|
+
access_modifier_is_inlined?(node) && find_corresponding_def_nodes(node).any?
|
|
135
253
|
end
|
|
136
254
|
|
|
137
255
|
def group_style?
|
|
@@ -152,7 +270,11 @@ module RuboCop
|
|
|
152
270
|
|
|
153
271
|
def right_siblings_same_inline_method?(node)
|
|
154
272
|
node.right_siblings.any? do |sibling|
|
|
155
|
-
sibling.send_type? &&
|
|
273
|
+
sibling.send_type? &&
|
|
274
|
+
correctable_group_offense?(sibling) &&
|
|
275
|
+
sibling.method?(node.method_name) &&
|
|
276
|
+
!sibling.arguments.empty? &&
|
|
277
|
+
find_corresponding_def_nodes(sibling).any?
|
|
156
278
|
end
|
|
157
279
|
end
|
|
158
280
|
|
|
@@ -166,14 +288,22 @@ module RuboCop
|
|
|
166
288
|
end
|
|
167
289
|
end
|
|
168
290
|
|
|
169
|
-
def
|
|
291
|
+
def find_corresponding_def_nodes(node)
|
|
170
292
|
if access_modifier_with_symbol?(node)
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
293
|
+
method_names = node.arguments.filter_map do |argument|
|
|
294
|
+
next unless argument.sym_type?
|
|
295
|
+
|
|
296
|
+
argument.respond_to?(:value) && argument.value
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def_nodes = node.parent.each_child_node(:def).select do |child|
|
|
300
|
+
method_names.include?(child.method_name)
|
|
174
301
|
end
|
|
302
|
+
|
|
303
|
+
# If there isn't a `def` node for each symbol, we will skip autocorrection.
|
|
304
|
+
def_nodes.size == method_names.size ? def_nodes : []
|
|
175
305
|
else
|
|
176
|
-
node.
|
|
306
|
+
[node.first_argument]
|
|
177
307
|
end
|
|
178
308
|
end
|
|
179
309
|
|
|
@@ -191,33 +321,54 @@ module RuboCop
|
|
|
191
321
|
end.select(&:def_type?)
|
|
192
322
|
end
|
|
193
323
|
|
|
194
|
-
def
|
|
195
|
-
source = def_source(node,
|
|
324
|
+
def replace_defs(corrector, node, def_nodes)
|
|
325
|
+
source = def_source(node, def_nodes)
|
|
196
326
|
argument_less_modifier_node = find_argument_less_modifier_node(node)
|
|
197
327
|
if argument_less_modifier_node
|
|
198
328
|
corrector.insert_after(argument_less_modifier_node, "\n\n#{source}")
|
|
199
|
-
elsif (ancestor = node.each_ancestor(:
|
|
200
|
-
|
|
329
|
+
elsif (ancestor = node.each_ancestor(:class, :module, :sclass).first)
|
|
201
330
|
corrector.insert_before(ancestor.loc.end, "#{node.method_name}\n\n#{source}\n")
|
|
202
331
|
else
|
|
203
332
|
corrector.replace(node, "#{node.method_name}\n\n#{source}")
|
|
204
333
|
return
|
|
205
334
|
end
|
|
206
335
|
|
|
207
|
-
|
|
208
|
-
remove_node(corrector, node)
|
|
336
|
+
remove_nodes(corrector, *def_nodes, node)
|
|
209
337
|
end
|
|
210
338
|
|
|
211
339
|
def insert_inline_modifier(corrector, node, modifier_name)
|
|
212
340
|
corrector.insert_before(node, "#{modifier_name} ")
|
|
213
341
|
end
|
|
214
342
|
|
|
215
|
-
def
|
|
216
|
-
|
|
343
|
+
def remove_nodes(corrector, *nodes)
|
|
344
|
+
nodes.each do |node|
|
|
345
|
+
corrector.remove(range_with_comments_and_lines(node))
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def remove_modifier_node_within_begin(corrector, modifier_node, begin_node)
|
|
350
|
+
def_node = begin_node.children[begin_node.children.index(modifier_node) + 1]
|
|
351
|
+
# Stop the removal range at the first comment that precedes the def, if
|
|
352
|
+
# any exist. Without this, comments between the modifier and the def are
|
|
353
|
+
# dropped because they fall inside the removed range.
|
|
354
|
+
end_pos = first_comment_or_node_start(def_node)
|
|
355
|
+
corrector.remove(modifier_node.source_range.begin.join(end_pos))
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def first_comment_or_node_start(node)
|
|
359
|
+
preceding = processed_source.ast_with_comments[node].select do |comment|
|
|
360
|
+
comment.loc.line < node.loc.line
|
|
361
|
+
end
|
|
362
|
+
return node.source_range.begin if preceding.empty?
|
|
363
|
+
|
|
364
|
+
preceding.first.source_range.begin
|
|
217
365
|
end
|
|
218
366
|
|
|
219
|
-
def def_source(node,
|
|
220
|
-
[
|
|
367
|
+
def def_source(node, def_nodes)
|
|
368
|
+
[
|
|
369
|
+
*processed_source.ast_with_comments[node].map(&:text),
|
|
370
|
+
*def_nodes.map(&:source)
|
|
371
|
+
].join("\n")
|
|
221
372
|
end
|
|
222
373
|
end
|
|
223
374
|
end
|
|
@@ -4,12 +4,17 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for grouping of accessors in `class` and `module` bodies.
|
|
7
|
-
# By default it enforces accessors to be placed in grouped
|
|
8
|
-
#
|
|
7
|
+
# By default it enforces accessors to be placed in grouped
|
|
8
|
+
# declarations, reducing boilerplate. It can also be configured
|
|
9
|
+
# to enforce separating them into individual declarations for
|
|
10
|
+
# easier diffing and per-attribute documentation.
|
|
9
11
|
#
|
|
10
12
|
# NOTE: If there is a method call before the accessor method it is always allowed
|
|
11
13
|
# as it might be intended like Sorbet.
|
|
12
14
|
#
|
|
15
|
+
# NOTE: If there is a RBS::Inline annotation comment just after the accessor method
|
|
16
|
+
# it is always allowed.
|
|
17
|
+
#
|
|
13
18
|
# @example EnforcedStyle: grouped (default)
|
|
14
19
|
# # bad
|
|
15
20
|
# class Foo
|
|
@@ -81,7 +86,10 @@ module RuboCop
|
|
|
81
86
|
|
|
82
87
|
def autocorrect(corrector, node)
|
|
83
88
|
if (preferred_accessors = preferred_accessors(node))
|
|
84
|
-
corrector.replace(
|
|
89
|
+
corrector.replace(
|
|
90
|
+
grouped_style? ? node : range_with_trailing_argument_comment(node),
|
|
91
|
+
preferred_accessors
|
|
92
|
+
)
|
|
85
93
|
else
|
|
86
94
|
range = range_with_surrounding_space(node.source_range, side: :left)
|
|
87
95
|
corrector.remove(range)
|
|
@@ -92,7 +100,7 @@ module RuboCop
|
|
|
92
100
|
comment_line?(processed_source[node.first_line - 2])
|
|
93
101
|
end
|
|
94
102
|
|
|
95
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
103
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
96
104
|
def groupable_accessor?(node)
|
|
97
105
|
return true unless (previous_expression = node.left_siblings.last)
|
|
98
106
|
|
|
@@ -105,11 +113,15 @@ module RuboCop
|
|
|
105
113
|
|
|
106
114
|
return true unless previous_expression.send_type?
|
|
107
115
|
|
|
116
|
+
# Accessors with RBS::Inline annotations shouldn't be groupable.
|
|
117
|
+
return false if processed_source.comments.any? do |c|
|
|
118
|
+
same_line?(c, previous_expression) && c.text.start_with?('#:')
|
|
119
|
+
end
|
|
120
|
+
|
|
108
121
|
previous_expression.attribute_accessor? ||
|
|
109
122
|
previous_expression.access_modifier? ||
|
|
110
123
|
node.first_line - previous_expression.last_line > 1 # there is a space between nodes
|
|
111
124
|
end
|
|
112
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
113
125
|
|
|
114
126
|
def class_send_elements(class_node)
|
|
115
127
|
class_def = class_node.body
|
|
@@ -131,12 +143,16 @@ module RuboCop
|
|
|
131
143
|
style == :separated
|
|
132
144
|
end
|
|
133
145
|
|
|
146
|
+
def groupable_sibling_accessor?(node, sibling)
|
|
147
|
+
sibling.attribute_accessor? &&
|
|
148
|
+
sibling.method?(node.method_name) &&
|
|
149
|
+
node_visibility(sibling) == node_visibility(node) &&
|
|
150
|
+
groupable_accessor?(sibling) && !previous_line_comment?(sibling)
|
|
151
|
+
end
|
|
152
|
+
|
|
134
153
|
def groupable_sibling_accessors(send_node)
|
|
135
154
|
send_node.parent.each_child_node(:send).select do |sibling|
|
|
136
|
-
|
|
137
|
-
sibling.method?(send_node.method_name) &&
|
|
138
|
-
node_visibility(sibling) == node_visibility(send_node) &&
|
|
139
|
-
groupable_accessor?(sibling) && !previous_line_comment?(sibling)
|
|
155
|
+
groupable_sibling_accessor?(send_node, sibling)
|
|
140
156
|
end
|
|
141
157
|
end
|
|
142
158
|
|
|
@@ -147,13 +163,23 @@ module RuboCop
|
|
|
147
163
|
|
|
148
164
|
def preferred_accessors(node)
|
|
149
165
|
if grouped_style?
|
|
166
|
+
return if skip_for_grouping?(node)
|
|
167
|
+
|
|
150
168
|
accessors = groupable_sibling_accessors(node)
|
|
151
|
-
|
|
169
|
+
if node.loc == accessors.first.loc || skip_for_grouping?(accessors.first)
|
|
170
|
+
group_accessors(node, accessors)
|
|
171
|
+
end
|
|
152
172
|
else
|
|
153
173
|
separate_accessors(node)
|
|
154
174
|
end
|
|
155
175
|
end
|
|
156
176
|
|
|
177
|
+
# Group after constants
|
|
178
|
+
def skip_for_grouping?(node)
|
|
179
|
+
node.right_siblings.any?(&:casgn_type?) &&
|
|
180
|
+
node.right_siblings.any? { |n| n.send_type? && groupable_sibling_accessor?(node, n) }
|
|
181
|
+
end
|
|
182
|
+
|
|
157
183
|
def group_accessors(node, accessors)
|
|
158
184
|
accessor_names = accessors.flat_map { |accessor| accessor.arguments.map(&:source) }.uniq
|
|
159
185
|
|
|
@@ -166,7 +192,7 @@ module RuboCop
|
|
|
166
192
|
*processed_source.ast_with_comments[arg].map(&:text),
|
|
167
193
|
"#{node.method_name} #{arg.source}"
|
|
168
194
|
]
|
|
169
|
-
if arg == node.
|
|
195
|
+
if arg == node.first_argument
|
|
170
196
|
lines
|
|
171
197
|
else
|
|
172
198
|
indent = ' ' * node.loc.column
|
|
@@ -174,6 +200,25 @@ module RuboCop
|
|
|
174
200
|
end
|
|
175
201
|
end.join("\n")
|
|
176
202
|
end
|
|
203
|
+
|
|
204
|
+
def range_with_trailing_argument_comment(node)
|
|
205
|
+
comment = trailing_argument_comment(node)
|
|
206
|
+
if comment
|
|
207
|
+
add_range(node.source_range, comment.source_range)
|
|
208
|
+
else
|
|
209
|
+
node
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# For a single-line declaration the parser associates the trailing
|
|
214
|
+
# comment with the first argument, not `last_argument`, so look through
|
|
215
|
+
# all arguments for a comment that trails the whole node.
|
|
216
|
+
def trailing_argument_comment(node)
|
|
217
|
+
comments = node.arguments.filter_map do |argument|
|
|
218
|
+
processed_source.ast_with_comments[argument].last
|
|
219
|
+
end
|
|
220
|
+
comments.find { |comment| comment.source_range.begin_pos >= node.source_range.end_pos }
|
|
221
|
+
end
|
|
177
222
|
end
|
|
178
223
|
end
|
|
179
224
|
end
|
|
@@ -4,10 +4,13 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Enforces the use of either `#alias` or `#alias_method`
|
|
7
|
-
# depending on configuration.
|
|
7
|
+
# depending on configuration. Consistent use of one or the
|
|
8
|
+
# other prevents confusion about their different semantics
|
|
9
|
+
# (e.g., `alias` is resolved at parse time, while `alias_method`
|
|
10
|
+
# is resolved at runtime).
|
|
8
11
|
# It also flags uses of `alias :symbol` rather than `alias bareword`.
|
|
9
12
|
#
|
|
10
|
-
# However, it will always enforce `
|
|
13
|
+
# However, it will always enforce `alias_method` when `alias` is used
|
|
11
14
|
# in an instance method definition and in a singleton method definition.
|
|
12
15
|
# If used in a block, always enforce `alias_method`
|
|
13
16
|
# unless it is an `instance_eval` block.
|
|
@@ -41,6 +44,8 @@ module RuboCop
|
|
|
41
44
|
def on_send(node)
|
|
42
45
|
return unless node.command?(:alias_method)
|
|
43
46
|
return unless style == :prefer_alias && alias_keyword_possible?(node)
|
|
47
|
+
return unless node.arguments.count == 2
|
|
48
|
+
return if alias_method_value_used?(node)
|
|
44
49
|
|
|
45
50
|
msg = format(MSG_ALIAS_METHOD, current: lexical_scope_type(node))
|
|
46
51
|
add_offense(node.loc.selector, message: msg) do |corrector|
|
|
@@ -76,10 +81,18 @@ module RuboCop
|
|
|
76
81
|
scope_type(node) != :dynamic && node.arguments.all?(&:sym_type?)
|
|
77
82
|
end
|
|
78
83
|
|
|
84
|
+
# `alias_method` is a method call whose return value can be used
|
|
85
|
+
# (e.g., as an argument to `public`/`module_function`, or as an assignment),
|
|
86
|
+
# but `alias` is a keyword statement that cannot appear in such positions.
|
|
87
|
+
# Detect these positions so the conversion does not produce a syntax error.
|
|
88
|
+
def alias_method_value_used?(node)
|
|
89
|
+
node.argument? || node.parent&.assignment?
|
|
90
|
+
end
|
|
91
|
+
|
|
79
92
|
def alias_method_possible?(node)
|
|
80
93
|
scope_type(node) != :instance_eval &&
|
|
81
94
|
node.children.none?(&:gvar_type?) &&
|
|
82
|
-
node
|
|
95
|
+
node.each_ancestor(:def).none?
|
|
83
96
|
end
|
|
84
97
|
|
|
85
98
|
def add_offense_for_args(node, &block)
|
|
@@ -100,7 +113,7 @@ module RuboCop
|
|
|
100
113
|
return :lexical
|
|
101
114
|
when :def, :defs
|
|
102
115
|
return :dynamic
|
|
103
|
-
when :block
|
|
116
|
+
when :block, :numblock, :itblock
|
|
104
117
|
return :instance_eval if parent.method?(:instance_eval)
|
|
105
118
|
|
|
106
119
|
return :dynamic
|
|
@@ -122,7 +135,7 @@ module RuboCop
|
|
|
122
135
|
end
|
|
123
136
|
|
|
124
137
|
def bareword?(sym_node)
|
|
125
|
-
!sym_node.source.start_with?(':')
|
|
138
|
+
!sym_node.source.start_with?(':') || sym_node.dsym_type?
|
|
126
139
|
end
|
|
127
140
|
|
|
128
141
|
def correct_alias_method_to_alias(corrector, send_node)
|
|
@@ -134,9 +147,7 @@ module RuboCop
|
|
|
134
147
|
|
|
135
148
|
def correct_alias_to_alias_method(corrector, node)
|
|
136
149
|
replacement =
|
|
137
|
-
|
|
138
|
-
":#{identifier(node.new_identifier)}, " \
|
|
139
|
-
":#{identifier(node.old_identifier)}"
|
|
150
|
+
"alias_method #{identifier(node.new_identifier)}, #{identifier(node.old_identifier)}"
|
|
140
151
|
|
|
141
152
|
corrector.replace(node, replacement)
|
|
142
153
|
end
|
|
@@ -146,10 +157,13 @@ module RuboCop
|
|
|
146
157
|
corrector.replace(node.old_identifier, node.old_identifier.source[1..])
|
|
147
158
|
end
|
|
148
159
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
160
|
+
def identifier(node)
|
|
161
|
+
if node.sym_type?
|
|
162
|
+
":#{node.children.first}"
|
|
163
|
+
else
|
|
164
|
+
node.source
|
|
165
|
+
end
|
|
166
|
+
end
|
|
153
167
|
end
|
|
154
168
|
end
|
|
155
169
|
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Looks for endless methods inside operations of lower precedence (`and`, `or`, and
|
|
7
|
+
# modifier forms of `if`, `unless`, `while`, `until`) that are ambiguous due to
|
|
8
|
+
# lack of parentheses. This may lead to unexpected behavior as the code may appear
|
|
9
|
+
# to use these keywords as part of the method but in fact they modify
|
|
10
|
+
# the method definition itself.
|
|
11
|
+
#
|
|
12
|
+
# In these cases, using a normal method definition is more clear.
|
|
13
|
+
#
|
|
14
|
+
# @example
|
|
15
|
+
#
|
|
16
|
+
# # bad
|
|
17
|
+
# def foo = true if bar
|
|
18
|
+
#
|
|
19
|
+
# # good - using a non-endless method is more explicit
|
|
20
|
+
# def foo
|
|
21
|
+
# true
|
|
22
|
+
# end if bar
|
|
23
|
+
#
|
|
24
|
+
# # ok - method body is explicit
|
|
25
|
+
# def foo = (true if bar)
|
|
26
|
+
#
|
|
27
|
+
# # ok - method definition is explicit
|
|
28
|
+
# (def foo = true) if bar
|
|
29
|
+
class AmbiguousEndlessMethodDefinition < Base
|
|
30
|
+
extend TargetRubyVersion
|
|
31
|
+
extend AutoCorrector
|
|
32
|
+
include EndlessMethodRewriter
|
|
33
|
+
include RangeHelp
|
|
34
|
+
|
|
35
|
+
minimum_target_ruby_version 3.0
|
|
36
|
+
|
|
37
|
+
MSG = 'Avoid using `%<keyword>s` statements with endless methods.'
|
|
38
|
+
|
|
39
|
+
# @!method ambiguous_endless_method_body(node)
|
|
40
|
+
def_node_matcher :ambiguous_endless_method_body, <<~PATTERN
|
|
41
|
+
^${
|
|
42
|
+
(if _ <def _>)
|
|
43
|
+
({and or} def _)
|
|
44
|
+
({while until} _ def)
|
|
45
|
+
}
|
|
46
|
+
PATTERN
|
|
47
|
+
|
|
48
|
+
def on_def(node)
|
|
49
|
+
return unless node.endless?
|
|
50
|
+
|
|
51
|
+
operation = ambiguous_endless_method_body(node)
|
|
52
|
+
return unless operation
|
|
53
|
+
|
|
54
|
+
return unless modifier_form?(operation)
|
|
55
|
+
|
|
56
|
+
add_offense(operation, message: format(MSG, keyword: keyword(operation))) do |corrector|
|
|
57
|
+
correct_to_multiline(corrector, node)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def modifier_form?(operation)
|
|
64
|
+
return true if operation.operator_keyword?
|
|
65
|
+
|
|
66
|
+
operation.modifier_form?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def keyword(operation)
|
|
70
|
+
if operation.respond_to?(:keyword)
|
|
71
|
+
operation.keyword
|
|
72
|
+
else
|
|
73
|
+
operation.operator
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -71,7 +71,7 @@ module RuboCop
|
|
|
71
71
|
node.each_child_node do |expr|
|
|
72
72
|
if expr.send_type?
|
|
73
73
|
correct_send(expr, corrector)
|
|
74
|
-
elsif expr.
|
|
74
|
+
elsif expr.type?(:return, :next, :break, :yield) || expr.assignment?
|
|
75
75
|
correct_other(expr, corrector)
|
|
76
76
|
end
|
|
77
77
|
end
|
|
@@ -127,7 +127,8 @@ module RuboCop
|
|
|
127
127
|
end
|
|
128
128
|
|
|
129
129
|
def correct_other(node, corrector)
|
|
130
|
-
return if node.
|
|
130
|
+
return if node.parenthesized_call?
|
|
131
|
+
return if node.children.empty? && node.equal?(node.parent.children.last)
|
|
131
132
|
|
|
132
133
|
corrector.wrap(node, '(', ')')
|
|
133
134
|
end
|