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
|
@@ -3,16 +3,29 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Use a consistent style for
|
|
6
|
+
# Use a consistent style for tokens within a format string.
|
|
7
7
|
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
# The reason is that _unannotated_ format is very similar
|
|
12
|
-
# to encoded URLs or Date/Time formatting strings.
|
|
8
|
+
# By default, all strings are evaluated. In some cases, this may be undesirable,
|
|
9
|
+
# as they could be used as arguments to a method that does not consider
|
|
10
|
+
# them to be tokens, but rather other identifiers or just part of the string.
|
|
13
11
|
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
12
|
+
# `AllowedMethods` or `AllowedPatterns` can be configured with in order to mark specific
|
|
13
|
+
# methods as always allowed, thereby avoiding an offense from the cop. By default, there
|
|
14
|
+
# are no allowed methods.
|
|
15
|
+
#
|
|
16
|
+
# Additionally, the cop can be made conservative by configuring it with
|
|
17
|
+
# `Mode: conservative` (default `aggressive`). In this mode, tokens (regardless
|
|
18
|
+
# of `EnforcedStyle`) are only considered if used in the format string argument to the
|
|
19
|
+
# methods `printf`, `sprintf`, `format` and `%`.
|
|
20
|
+
#
|
|
21
|
+
# NOTE: In `aggressive` mode, offenses are registered for all strings containing tokens,
|
|
22
|
+
# but autocorrection is only applied when the string appears in a known formatting context
|
|
23
|
+
# (`format`, `sprintf`, `printf`, or `%`). This is done in order to prevent false
|
|
24
|
+
# autocorrections for strings that are not actually format strings.
|
|
25
|
+
#
|
|
26
|
+
# NOTE: Tokens in the `unannotated` style (eg. `%s`) are always treated as if
|
|
27
|
+
# configured with `Conservative: true`. This is done in order to prevent false positives,
|
|
28
|
+
# because this format is very similar to encoded URLs or Date/Time formatting strings.
|
|
16
29
|
#
|
|
17
30
|
# @example EnforcedStyle: annotated (default)
|
|
18
31
|
#
|
|
@@ -82,6 +95,42 @@ module RuboCop
|
|
|
82
95
|
# # good
|
|
83
96
|
# redirect('foo/%{bar_id}')
|
|
84
97
|
#
|
|
98
|
+
# @example Mode: aggressive (default), EnforcedStyle: annotated
|
|
99
|
+
#
|
|
100
|
+
# # bad
|
|
101
|
+
# "%{greeting}"
|
|
102
|
+
# foo("%{greeting}")
|
|
103
|
+
#
|
|
104
|
+
# # bad
|
|
105
|
+
# format("%{greeting}", greeting: 'Hello')
|
|
106
|
+
# printf("%{greeting}", greeting: 'Hello')
|
|
107
|
+
# sprintf("%{greeting}", greeting: 'Hello')
|
|
108
|
+
# "%{greeting}" % { greeting: 'Hello' }
|
|
109
|
+
#
|
|
110
|
+
# # good
|
|
111
|
+
# format("%<greeting>s", greeting: 'Hello')
|
|
112
|
+
# printf("%<greeting>s", greeting: 'Hello')
|
|
113
|
+
# sprintf("%<greeting>s", greeting: 'Hello')
|
|
114
|
+
# "%<greeting>s" % { greeting: 'Hello' }
|
|
115
|
+
#
|
|
116
|
+
# @example Mode: conservative, EnforcedStyle: annotated
|
|
117
|
+
#
|
|
118
|
+
# # good
|
|
119
|
+
# "%{greeting}"
|
|
120
|
+
# foo("%{greeting}")
|
|
121
|
+
#
|
|
122
|
+
# # bad
|
|
123
|
+
# format("%{greeting}", greeting: 'Hello')
|
|
124
|
+
# printf("%{greeting}", greeting: 'Hello')
|
|
125
|
+
# sprintf("%{greeting}", greeting: 'Hello')
|
|
126
|
+
# "%{greeting}" % { greeting: 'Hello' }
|
|
127
|
+
#
|
|
128
|
+
# # good
|
|
129
|
+
# format("%<greeting>s", greeting: 'Hello')
|
|
130
|
+
# printf("%<greeting>s", greeting: 'Hello')
|
|
131
|
+
# sprintf("%<greeting>s", greeting: 'Hello')
|
|
132
|
+
# "%<greeting>s" % { greeting: 'Hello' }
|
|
133
|
+
#
|
|
85
134
|
class FormatStringToken < Base
|
|
86
135
|
include ConfigurableEnforcedStyle
|
|
87
136
|
include AllowedMethods
|
|
@@ -96,7 +145,7 @@ module RuboCop
|
|
|
96
145
|
return if allowed_unannotated?(detections)
|
|
97
146
|
|
|
98
147
|
detections.each do |detected_sequence, token_range|
|
|
99
|
-
check_sequence(detected_sequence, token_range)
|
|
148
|
+
check_sequence(node, detected_sequence, token_range)
|
|
100
149
|
end
|
|
101
150
|
end
|
|
102
151
|
|
|
@@ -121,17 +170,34 @@ module RuboCop
|
|
|
121
170
|
matches_allowed_pattern?(send_parent.method_name))
|
|
122
171
|
end
|
|
123
172
|
|
|
124
|
-
def check_sequence(detected_sequence, token_range)
|
|
173
|
+
def check_sequence(node, detected_sequence, token_range)
|
|
125
174
|
if detected_sequence.style == style
|
|
126
175
|
correct_style_detected
|
|
127
176
|
elsif correctable_sequence?(detected_sequence.type)
|
|
128
177
|
style_detected(detected_sequence.style)
|
|
129
|
-
|
|
178
|
+
register_offense(node, detected_sequence, token_range)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def register_offense(node, detected_sequence, token_range)
|
|
183
|
+
msg = message(detected_sequence.style)
|
|
184
|
+
|
|
185
|
+
if format_string_context?(node)
|
|
186
|
+
add_offense(token_range, message: msg) do |corrector|
|
|
130
187
|
autocorrect_sequence(corrector, detected_sequence, token_range)
|
|
131
188
|
end
|
|
189
|
+
else
|
|
190
|
+
add_offense(token_range, message: msg)
|
|
132
191
|
end
|
|
133
192
|
end
|
|
134
193
|
|
|
194
|
+
def format_string_context?(node)
|
|
195
|
+
format_string_in_typical_context?(node) ||
|
|
196
|
+
node.each_ancestor(:dstr).any? do |dstr_node|
|
|
197
|
+
format_string_in_typical_context?(dstr_node)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
135
201
|
def correctable_sequence?(detected_type)
|
|
136
202
|
detected_type == 's' || style == :annotated || style == :unannotated
|
|
137
203
|
end
|
|
@@ -153,15 +219,16 @@ module RuboCop
|
|
|
153
219
|
corrector.replace(token_range, correction)
|
|
154
220
|
end
|
|
155
221
|
|
|
156
|
-
def
|
|
157
|
-
detected_style == :unannotated
|
|
222
|
+
def allowed_string?(node, detected_style)
|
|
223
|
+
(detected_style == :unannotated || conservative?) &&
|
|
224
|
+
!format_string_in_typical_context?(node)
|
|
158
225
|
end
|
|
159
226
|
|
|
160
227
|
def message(detected_style)
|
|
161
228
|
"Prefer #{message_text(style)} over #{message_text(detected_style)}."
|
|
162
229
|
end
|
|
163
230
|
|
|
164
|
-
# rubocop:disable Style/FormatStringToken
|
|
231
|
+
# rubocop:disable-next Style/FormatStringToken -- the cop needs the token style it is matching
|
|
165
232
|
def message_text(style)
|
|
166
233
|
{
|
|
167
234
|
annotated: 'annotated tokens (like `%<foo>s`)',
|
|
@@ -169,7 +236,6 @@ module RuboCop
|
|
|
169
236
|
unannotated: 'unannotated tokens (like `%s`)'
|
|
170
237
|
}[style]
|
|
171
238
|
end
|
|
172
|
-
# rubocop:enable Style/FormatStringToken
|
|
173
239
|
|
|
174
240
|
def tokens(str_node, &block)
|
|
175
241
|
return if str_node.source == '__FILE__'
|
|
@@ -203,7 +269,7 @@ module RuboCop
|
|
|
203
269
|
def collect_detections(node)
|
|
204
270
|
detections = []
|
|
205
271
|
tokens(node) do |detected_sequence, token_range|
|
|
206
|
-
unless
|
|
272
|
+
unless allowed_string?(node, detected_sequence.style)
|
|
207
273
|
detections << [detected_sequence, token_range]
|
|
208
274
|
end
|
|
209
275
|
end
|
|
@@ -222,6 +288,10 @@ module RuboCop
|
|
|
222
288
|
def max_unannotated_placeholders_allowed
|
|
223
289
|
cop_config['MaxUnannotatedPlaceholdersAllowed']
|
|
224
290
|
end
|
|
291
|
+
|
|
292
|
+
def conservative?
|
|
293
|
+
cop_config.fetch('Mode', :aggressive).to_sym == :conservative
|
|
294
|
+
end
|
|
225
295
|
end
|
|
226
296
|
end
|
|
227
297
|
end
|
|
@@ -142,7 +142,8 @@ module RuboCop
|
|
|
142
142
|
end
|
|
143
143
|
|
|
144
144
|
next_token = processed_source.tokens[token_number]
|
|
145
|
-
if next_token&.text&.valid_encoding? &&
|
|
145
|
+
if next_token&.text&.valid_encoding? &&
|
|
146
|
+
MagicComment.parse(next_token.text).encoding_specified?
|
|
146
147
|
token = next_token
|
|
147
148
|
end
|
|
148
149
|
|
|
@@ -151,7 +152,7 @@ module RuboCop
|
|
|
151
152
|
|
|
152
153
|
def frozen_string_literal_comment(processed_source)
|
|
153
154
|
processed_source.tokens.find do |token|
|
|
154
|
-
token.text.
|
|
155
|
+
MagicComment.parse(token.text).frozen_string_literal_specified?
|
|
155
156
|
end
|
|
156
157
|
end
|
|
157
158
|
|
|
@@ -189,8 +190,9 @@ module RuboCop
|
|
|
189
190
|
|
|
190
191
|
def enable_comment(corrector)
|
|
191
192
|
comment = frozen_string_literal_comment(processed_source)
|
|
193
|
+
replacement = MagicComment.parse(comment.text).new_frozen_string_literal(true)
|
|
192
194
|
|
|
193
|
-
corrector.replace(line_range(comment.line),
|
|
195
|
+
corrector.replace(line_range(comment.line), replacement)
|
|
194
196
|
end
|
|
195
197
|
|
|
196
198
|
def insert_comment(corrector)
|
|
@@ -8,6 +8,9 @@ module RuboCop
|
|
|
8
8
|
# reassign (possibly to redirect some stream) constants in Ruby, you'll get
|
|
9
9
|
# an interpreter warning if you do so.
|
|
10
10
|
#
|
|
11
|
+
# Additionally, `$stdout/$stderr/$stdin` can safely be accessed in a Ractor because they
|
|
12
|
+
# are ractor-local, while `STDOUT/STDERR/STDIN` will raise `Ractor::IsolationError`.
|
|
13
|
+
#
|
|
11
14
|
# @safety
|
|
12
15
|
# Autocorrection is unsafe because `STDOUT` and `$stdout` may point to different
|
|
13
16
|
# objects, for example.
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Looks for uses of global variables.
|
|
6
|
+
# Looks for uses of global variables. Global variables introduce
|
|
7
|
+
# shared mutable state that makes code harder to test, debug,
|
|
8
|
+
# and reason about, since any part of the program can read or modify them.
|
|
9
|
+
#
|
|
7
10
|
# It does not report offenses for built-in global variables.
|
|
8
11
|
# Built-in global variables are allowed by default. Additionally
|
|
9
12
|
# users can allow additional variables via the AllowedVariables option.
|
|
@@ -54,7 +57,7 @@ module RuboCop
|
|
|
54
57
|
].map(&:to_sym)
|
|
55
58
|
|
|
56
59
|
def user_vars
|
|
57
|
-
cop_config['AllowedVariables'].map(&:to_sym)
|
|
60
|
+
@user_vars ||= cop_config['AllowedVariables'].map(&:to_sym).freeze
|
|
58
61
|
end
|
|
59
62
|
|
|
60
63
|
def allowed_var?(global_var)
|
|
@@ -45,17 +45,6 @@ module RuboCop
|
|
|
45
45
|
# ok
|
|
46
46
|
#
|
|
47
47
|
# # bad
|
|
48
|
-
# if something
|
|
49
|
-
# foo || raise('exception')
|
|
50
|
-
# else
|
|
51
|
-
# ok
|
|
52
|
-
# end
|
|
53
|
-
#
|
|
54
|
-
# # good
|
|
55
|
-
# foo || raise('exception') if something
|
|
56
|
-
# ok
|
|
57
|
-
#
|
|
58
|
-
# # bad
|
|
59
48
|
# define_method(:test) do
|
|
60
49
|
# if something
|
|
61
50
|
# work
|
|
@@ -120,6 +109,10 @@ module RuboCop
|
|
|
120
109
|
MSG = 'Use a guard clause (`%<example>s`) instead of wrapping the ' \
|
|
121
110
|
'code inside a conditional expression.'
|
|
122
111
|
|
|
112
|
+
def self.autocorrect_incompatible_with
|
|
113
|
+
[Style::MissingElse]
|
|
114
|
+
end
|
|
115
|
+
|
|
123
116
|
def on_def(node)
|
|
124
117
|
body = node.body
|
|
125
118
|
|
|
@@ -135,6 +128,7 @@ module RuboCop
|
|
|
135
128
|
on_def(node)
|
|
136
129
|
end
|
|
137
130
|
alias on_numblock on_block
|
|
131
|
+
alias on_itblock on_block
|
|
138
132
|
|
|
139
133
|
def on_if(node)
|
|
140
134
|
return if accepted_form?(node)
|
|
@@ -192,57 +186,73 @@ module RuboCop
|
|
|
192
186
|
return if trivial?(node)
|
|
193
187
|
|
|
194
188
|
example = "#{conditional_keyword} #{condition.source}; #{scope_exiting_keyword}; end"
|
|
195
|
-
replacement =
|
|
196
|
-
#{conditional_keyword} #{condition.source}
|
|
197
|
-
#{scope_exiting_keyword}
|
|
198
|
-
end
|
|
199
|
-
RUBY
|
|
189
|
+
replacement = "#{conditional_keyword} #{condition.source}\n #{scope_exiting_keyword}"
|
|
200
190
|
end
|
|
201
191
|
|
|
202
192
|
add_offense(node.loc.keyword, message: format(MSG, example: example)) do |corrector|
|
|
203
193
|
next if node.else? && guard.nil?
|
|
204
194
|
|
|
205
|
-
autocorrect(corrector, node,
|
|
195
|
+
autocorrect(corrector, node, example, replacement, guard)
|
|
206
196
|
end
|
|
207
197
|
end
|
|
208
198
|
|
|
209
|
-
# rubocop:disable Metrics/AbcSize
|
|
210
|
-
def autocorrect(corrector, node,
|
|
211
|
-
|
|
199
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
200
|
+
def autocorrect(corrector, node, example, multiline_replacement, guard)
|
|
201
|
+
range = node.loc.keyword.join(node.condition.source_range)
|
|
202
|
+
corrector.replace(range, multiline_replacement || example)
|
|
203
|
+
corrector.replace(node.loc.begin, "\n") if node.then?
|
|
212
204
|
|
|
213
|
-
|
|
214
|
-
|
|
205
|
+
branches = [node.if_branch, node.else_branch]
|
|
206
|
+
guard_branch, leave_branch = guard == :else ? branches.reverse : branches
|
|
215
207
|
|
|
216
|
-
|
|
208
|
+
heredoc = find_heredoc_argument(guard_branch)
|
|
209
|
+
close_multiline_guard_clause(corrector, range, heredoc, guard) if multiline_replacement
|
|
217
210
|
|
|
218
|
-
if
|
|
219
|
-
autocorrect_heredoc_argument(corrector, node,
|
|
220
|
-
elsif else_branch&.send_type? && heredoc?(else_branch.last_argument)
|
|
221
|
-
autocorrect_heredoc_argument(corrector, node, else_branch, if_branch, guard)
|
|
222
|
-
else
|
|
223
|
-
corrector.remove(node.loc.end)
|
|
224
|
-
return unless node.else?
|
|
225
|
-
|
|
226
|
-
corrector.remove(node.loc.else)
|
|
227
|
-
corrector.remove(range_of_branch_to_remove(node, guard))
|
|
211
|
+
if heredoc
|
|
212
|
+
return autocorrect_heredoc_argument(corrector, node, heredoc, leave_branch, guard)
|
|
228
213
|
end
|
|
214
|
+
|
|
215
|
+
corrector.remove(node.loc.end)
|
|
216
|
+
return unless node.else?
|
|
217
|
+
|
|
218
|
+
corrector.remove(node.loc.else)
|
|
219
|
+
corrector.remove(range_of_branch_to_remove(node, guard))
|
|
229
220
|
end
|
|
230
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
231
221
|
|
|
232
222
|
def heredoc?(argument)
|
|
233
223
|
argument.respond_to?(:heredoc?) && argument.heredoc?
|
|
234
224
|
end
|
|
235
225
|
|
|
236
|
-
def
|
|
226
|
+
def find_heredoc_argument(node)
|
|
227
|
+
return unless node
|
|
228
|
+
|
|
229
|
+
node = node.children.first while node.begin_type?
|
|
230
|
+
return node if heredoc?(node)
|
|
231
|
+
return unless node.call_type?
|
|
232
|
+
|
|
233
|
+
node.arguments.reverse_each do |argument|
|
|
234
|
+
heredoc_argument = find_heredoc_argument(argument)
|
|
235
|
+
return heredoc_argument if heredoc_argument
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
find_heredoc_argument(node.receiver)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def close_multiline_guard_clause(corrector, range, heredoc, guard)
|
|
242
|
+
corrector.insert_after(guard && heredoc ? heredoc.loc.heredoc_end : range, "\nend")
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def autocorrect_heredoc_argument(corrector, node, heredoc_node, leave_branch, guard)
|
|
237
246
|
remove_whole_lines(corrector, node.loc.end)
|
|
238
247
|
return unless node.else?
|
|
239
248
|
|
|
240
|
-
|
|
249
|
+
if leave_branch
|
|
250
|
+
remove_whole_lines(corrector, leave_branch.source_range)
|
|
251
|
+
corrector.insert_after(heredoc_node.loc.heredoc_end, "\n#{leave_branch.source}")
|
|
252
|
+
end
|
|
253
|
+
|
|
241
254
|
remove_whole_lines(corrector, node.loc.else)
|
|
242
255
|
remove_whole_lines(corrector, range_of_branch_to_remove(node, guard))
|
|
243
|
-
corrector.insert_after(
|
|
244
|
-
heredoc_branch.last_argument.loc.heredoc_end, "\n#{leave_branch.source}"
|
|
245
|
-
)
|
|
246
256
|
end
|
|
247
257
|
|
|
248
258
|
def range_of_branch_to_remove(node, guard)
|
|
@@ -273,7 +283,15 @@ module RuboCop
|
|
|
273
283
|
end
|
|
274
284
|
|
|
275
285
|
def accepted_form?(node, ending: false)
|
|
276
|
-
accepted_if?(node, ending) || node.condition.multiline? ||
|
|
286
|
+
accepted_if?(node, ending) || node.condition.multiline? ||
|
|
287
|
+
node.parent&.assignment? || endless_method_body?(node)
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
# The body of an endless method is a single expression, so there is no
|
|
291
|
+
# room for a guard clause followed by the rest of the code.
|
|
292
|
+
def endless_method_body?(node)
|
|
293
|
+
parent = node.parent
|
|
294
|
+
parent&.any_def_type? && parent.endless?
|
|
277
295
|
end
|
|
278
296
|
|
|
279
297
|
def trivial?(node)
|
|
@@ -6,8 +6,13 @@ module RuboCop
|
|
|
6
6
|
# Checks for presence or absence of braces around hash literal as a last
|
|
7
7
|
# array item depending on configuration.
|
|
8
8
|
#
|
|
9
|
-
# NOTE: This cop will ignore arrays where
|
|
10
|
-
# EnforcedStyle
|
|
9
|
+
# NOTE: This cop will ignore arrays where multiple items are all hashes,
|
|
10
|
+
# regardless of `EnforcedStyle`.
|
|
11
|
+
#
|
|
12
|
+
# [source,ruby]
|
|
13
|
+
# ----
|
|
14
|
+
# [{ one: 1 }, { two: 2 }]
|
|
15
|
+
# ----
|
|
11
16
|
#
|
|
12
17
|
# @example EnforcedStyle: braces (default)
|
|
13
18
|
# # bad
|
|
@@ -16,8 +21,11 @@ module RuboCop
|
|
|
16
21
|
# # good
|
|
17
22
|
# [1, 2, { one: 1, two: 2 }]
|
|
18
23
|
#
|
|
24
|
+
# # bad
|
|
25
|
+
# [one: 1, two: 2]
|
|
26
|
+
#
|
|
19
27
|
# # good
|
|
20
|
-
# [{ one: 1
|
|
28
|
+
# [{ one: 1, two: 2 }]
|
|
21
29
|
#
|
|
22
30
|
# @example EnforcedStyle: no_braces
|
|
23
31
|
# # bad
|
|
@@ -26,17 +34,24 @@ module RuboCop
|
|
|
26
34
|
# # good
|
|
27
35
|
# [1, 2, one: 1, two: 2]
|
|
28
36
|
#
|
|
37
|
+
# # bad
|
|
38
|
+
# [{ one: 1, two: 2 }]
|
|
39
|
+
#
|
|
29
40
|
# # good
|
|
30
|
-
# [
|
|
41
|
+
# [one: 1, two: 2]
|
|
31
42
|
class HashAsLastArrayItem < Base
|
|
32
43
|
include RangeHelp
|
|
33
44
|
include ConfigurableEnforcedStyle
|
|
34
45
|
extend AutoCorrector
|
|
35
46
|
|
|
47
|
+
def self.autocorrect_incompatible_with
|
|
48
|
+
[Style::TrailingCommaInArrayLiteral]
|
|
49
|
+
end
|
|
50
|
+
|
|
36
51
|
def on_hash(node)
|
|
37
52
|
return if node.children.first&.kwsplat_type?
|
|
38
53
|
return unless (array = containing_array(node))
|
|
39
|
-
return unless
|
|
54
|
+
return unless expected_braced_last_array_item?(array, node) && explicit_array?(array)
|
|
40
55
|
|
|
41
56
|
if braces_style?
|
|
42
57
|
check_braces(node)
|
|
@@ -52,10 +67,12 @@ module RuboCop
|
|
|
52
67
|
parent if parent&.array_type?
|
|
53
68
|
end
|
|
54
69
|
|
|
55
|
-
def
|
|
56
|
-
return false if array.
|
|
70
|
+
def expected_braced_last_array_item?(array, node)
|
|
71
|
+
return false if array.each_value.all? do |node|
|
|
72
|
+
node.hash_type? && (braces_style? ? node.braces? : !node.braces?)
|
|
73
|
+
end
|
|
57
74
|
|
|
58
|
-
array.
|
|
75
|
+
!array.values[-2]&.hash_type? && array.values.last.equal?(node)
|
|
59
76
|
end
|
|
60
77
|
|
|
61
78
|
def explicit_array?(array)
|
|
@@ -67,7 +84,12 @@ module RuboCop
|
|
|
67
84
|
return if node.braces?
|
|
68
85
|
|
|
69
86
|
add_offense(node, message: 'Wrap hash in `{` and `}`.') do |corrector|
|
|
70
|
-
|
|
87
|
+
if node.single_line? || same_line?(node, node.parent)
|
|
88
|
+
corrector.wrap(node, '{', '}')
|
|
89
|
+
else
|
|
90
|
+
indent = indent(node)
|
|
91
|
+
corrector.wrap(node, "{\n#{indent}", "\n#{indent}}")
|
|
92
|
+
end
|
|
71
93
|
end
|
|
72
94
|
end
|
|
73
95
|
|
|
@@ -44,17 +44,23 @@ module RuboCop
|
|
|
44
44
|
class HashConversion < Base
|
|
45
45
|
extend AutoCorrector
|
|
46
46
|
|
|
47
|
-
MSG_TO_H = 'Prefer ary.to_h to Hash[ary]
|
|
48
|
-
MSG_LITERAL_MULTI_ARG = 'Prefer literal hash to Hash[arg1, arg2, ...]
|
|
49
|
-
MSG_LITERAL_HASH_ARG = 'Prefer literal hash to Hash[key: value, ...]
|
|
50
|
-
MSG_SPLAT = 'Prefer array_of_pairs.to_h to Hash[*array]
|
|
47
|
+
MSG_TO_H = 'Prefer `ary.to_h` to `Hash[ary]`.'
|
|
48
|
+
MSG_LITERAL_MULTI_ARG = 'Prefer literal hash to `Hash[arg1, arg2, ...]`.'
|
|
49
|
+
MSG_LITERAL_HASH_ARG = 'Prefer literal hash to `Hash[key: value, ...]`.'
|
|
50
|
+
MSG_SPLAT = 'Prefer `array_of_pairs.to_h` to `Hash[*array]`.'
|
|
51
51
|
RESTRICT_ON_SEND = %i[[]].freeze
|
|
52
52
|
|
|
53
53
|
# @!method hash_from_array?(node)
|
|
54
54
|
def_node_matcher :hash_from_array?, '(send (const {nil? cbase} :Hash) :[] ...)'
|
|
55
55
|
|
|
56
|
+
# A hash literal as the first argument needs the parentheses of the call,
|
|
57
|
+
# which `Style/MethodCallWithArgsParentheses` removes in the same pass.
|
|
58
|
+
def self.autocorrect_incompatible_with
|
|
59
|
+
[Style::MethodCallWithArgsParentheses]
|
|
60
|
+
end
|
|
61
|
+
|
|
56
62
|
def on_send(node)
|
|
57
|
-
return
|
|
63
|
+
return if part_of_ignored_node?(node) || !hash_from_array?(node)
|
|
58
64
|
|
|
59
65
|
# There are several cases:
|
|
60
66
|
# If there is one argument:
|
|
@@ -63,7 +69,8 @@ module RuboCop
|
|
|
63
69
|
# If there is 0 or 2+ arguments:
|
|
64
70
|
# Hash[a1, a2, a3, a4] => {a1 => a2, a3 => a4}
|
|
65
71
|
# ...but don't suggest correction if there is odd number of them (it is a bug)
|
|
66
|
-
node.arguments.
|
|
72
|
+
node.arguments.one? ? single_argument(node) : multi_argument(node)
|
|
73
|
+
ignore_node(node)
|
|
67
74
|
end
|
|
68
75
|
|
|
69
76
|
private
|
|
@@ -72,7 +79,7 @@ module RuboCop
|
|
|
72
79
|
first_argument = node.first_argument
|
|
73
80
|
if first_argument.hash_type?
|
|
74
81
|
register_offense_for_hash(node, first_argument)
|
|
75
|
-
elsif first_argument.
|
|
82
|
+
elsif first_argument.type?(:splat, :forwarded_restarg)
|
|
76
83
|
add_offense(node, message: MSG_SPLAT) unless allowed_splat_argument?
|
|
77
84
|
elsif use_zip_method_without_argument?(first_argument)
|
|
78
85
|
register_offense_for_zip_method(node, first_argument)
|
|
@@ -94,12 +101,30 @@ module RuboCop
|
|
|
94
101
|
def register_offense_for_hash(node, hash_argument)
|
|
95
102
|
add_offense(node, message: MSG_LITERAL_HASH_ARG) do |corrector|
|
|
96
103
|
corrector.replace(node, "{#{hash_argument.source}}")
|
|
97
|
-
|
|
98
|
-
parent = node.parent
|
|
99
|
-
add_parentheses(parent, corrector) if parent&.send_type? && !parent.parenthesized?
|
|
104
|
+
add_parentheses_to_parent_call(node, corrector)
|
|
100
105
|
end
|
|
101
106
|
end
|
|
102
107
|
|
|
108
|
+
# Without parentheses, a hash literal at the start of the first argument would be
|
|
109
|
+
# parsed as a block. That includes an argument like `Hash[a, b].merge(c)`.
|
|
110
|
+
def add_parentheses_to_parent_call(node, corrector)
|
|
111
|
+
node = node.parent while starts_parent?(node)
|
|
112
|
+
parent = node.parent
|
|
113
|
+
return unless parent&.type?(:call, :super, :yield)
|
|
114
|
+
return if parent.parenthesized? || operator_syntax?(parent)
|
|
115
|
+
|
|
116
|
+
add_parentheses(parent, corrector)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def starts_parent?(node)
|
|
120
|
+
node.parent && node.parent.source_range.begin_pos == node.source_range.begin_pos
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# `foo[x]`, `foo.bar = x` and `foo == x` take a hash literal as it is.
|
|
124
|
+
def operator_syntax?(call)
|
|
125
|
+
call.setter_method? || (call.operator_method? && !call.loc?(:dot))
|
|
126
|
+
end
|
|
127
|
+
|
|
103
128
|
def register_offense_for_zip_method(node, zip_method)
|
|
104
129
|
add_offense(node, message: MSG_TO_H) do |corrector|
|
|
105
130
|
if zip_method.parenthesized?
|
|
@@ -111,19 +136,30 @@ module RuboCop
|
|
|
111
136
|
end
|
|
112
137
|
|
|
113
138
|
def requires_parens?(node)
|
|
114
|
-
|
|
139
|
+
if node.call_type?
|
|
140
|
+
return false if node.method?(:[])
|
|
141
|
+
return true if node.arguments.any? && !node.parenthesized?
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
node.operator_keyword?
|
|
115
145
|
end
|
|
116
146
|
|
|
117
147
|
def multi_argument(node)
|
|
148
|
+
# A splat argument can expand to any number of elements, so the pairs
|
|
149
|
+
# can't be built statically and there is no literal hash to suggest.
|
|
150
|
+
return if node.arguments.any?(&:splat_type?)
|
|
151
|
+
|
|
118
152
|
if node.arguments.count.odd?
|
|
119
153
|
add_offense(node, message: MSG_LITERAL_MULTI_ARG)
|
|
120
154
|
else
|
|
121
|
-
|
|
122
|
-
|
|
155
|
+
correct_multi_argument(node)
|
|
156
|
+
end
|
|
157
|
+
end
|
|
123
158
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
159
|
+
def correct_multi_argument(node)
|
|
160
|
+
add_offense(node, message: MSG_LITERAL_MULTI_ARG) do |corrector|
|
|
161
|
+
corrector.replace(node, args_to_hash(node.arguments))
|
|
162
|
+
add_parentheses_to_parent_call(node, corrector)
|
|
127
163
|
end
|
|
128
164
|
end
|
|
129
165
|
|
|
@@ -74,8 +74,9 @@ module RuboCop
|
|
|
74
74
|
check_unused_block_args(node, key, value)
|
|
75
75
|
end
|
|
76
76
|
alias on_numblock on_block
|
|
77
|
+
alias on_itblock on_block
|
|
77
78
|
|
|
78
|
-
# rubocop:disable Metrics/AbcSize
|
|
79
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
79
80
|
def check_unused_block_args(node, key, value)
|
|
80
81
|
return if node.body.nil?
|
|
81
82
|
|
|
@@ -95,7 +96,6 @@ module RuboCop
|
|
|
95
96
|
register_each_args_offense(node, message, 'each_value', unused_range)
|
|
96
97
|
end
|
|
97
98
|
end
|
|
98
|
-
# rubocop:enable Metrics/AbcSize
|
|
99
99
|
|
|
100
100
|
def on_block_pass(node)
|
|
101
101
|
kv_each_with_block_pass(node.parent) do |target, method|
|
|
@@ -128,8 +128,8 @@ module RuboCop
|
|
|
128
128
|
lvar_sources = node.body.each_descendant(:lvar).map(&:source)
|
|
129
129
|
|
|
130
130
|
if block_arg.mlhs_type?
|
|
131
|
-
block_arg.each_descendant(:arg, :restarg).all? do |
|
|
132
|
-
lvar_sources.none?(
|
|
131
|
+
block_arg.each_descendant(:arg, :restarg).all? do |descendant|
|
|
132
|
+
lvar_sources.none?(descendant.source.delete_prefix('*'))
|
|
133
133
|
end
|
|
134
134
|
else
|
|
135
135
|
lvar_sources.none?(block_arg.source.delete_prefix('*'))
|