rubocop 1.57.1 → 1.81.6
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 +92 -89
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +540 -86
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -7
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +28 -4
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +71 -58
- data/lib/rubocop/config_loader_resolver.rb +48 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
- data/lib/rubocop/cop/base.rb +79 -18
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/documentation.rb +32 -5
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- 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/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator.rb +6 -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 +13 -8
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- 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 +124 -30
- 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 +131 -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_message_argument.rb +6 -21
- 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 +0 -5
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
- 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 +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +36 -21
- 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_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- 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/end_alignment.rb +16 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- 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 +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +177 -29
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- 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 +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- 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 +32 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -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 +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- 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_inside_array_literal_brackets.rb +18 -3
- 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_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
- 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 +4 -14
- 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 +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +30 -8
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- 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 +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- 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 +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
- 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_interpolation.rb +14 -5
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
- data/lib/rubocop/cop/lint/float_comparison.rb +58 -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 +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -5
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- 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 +29 -10
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +72 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -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 +4 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- 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 +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -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 +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +92 -18
- 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 +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +21 -15
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +15 -6
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -9
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- 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 +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +23 -14
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- 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 +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -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 +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- 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 +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- 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/statement_modifier.rb +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- 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 +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
- data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
- data/lib/rubocop/cop/style/alias.rb +2 -1
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +228 -36
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
- data/lib/rubocop/cop/style/case_like_if.rb +14 -17
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +25 -15
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
- 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/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +25 -25
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +3 -4
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -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 +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -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 +2 -5
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +110 -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_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +37 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
- 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/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- 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 +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +2 -1
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +29 -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 +52 -25
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
- 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_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- 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 +5 -4
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +48 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- 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/redundant_argument.rb +29 -3
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +41 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- 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 +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
- data/lib/rubocop/cop/style/redundant_return.rb +9 -3
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +30 -7
- 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 +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +72 -87
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- 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 +9 -2
- data/lib/rubocop/cop/style/super_arguments.rb +221 -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 +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- 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 +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- 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/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_do.rb +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +28 -4
- data/lib/rubocop/cop/util.rb +19 -6
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- 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 +135 -58
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +54 -18
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +77 -40
- data/lib/rubocop/lsp/runtime.rb +20 -50
- data/lib/rubocop/lsp/server.rb +6 -4
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +12 -4
- data/lib/rubocop/options.rb +43 -22
- data/lib/rubocop/path_util.rb +21 -10
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -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/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +29 -34
- data/lib/rubocop/rspec/cop_helper.rb +20 -2
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +112 -18
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +3 -3
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +93 -82
- data/lib/rubocop/target_ruby.rb +111 -81
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +61 -3
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +103 -51
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- 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,236 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for usages of `each` with `<<`, `push`, or `append` which
|
|
7
|
+
# can be replaced by `map`.
|
|
8
|
+
#
|
|
9
|
+
# If `PreferredMethods` is configured for `map` in `Style/CollectionMethods`,
|
|
10
|
+
# this cop uses the specified method for replacement.
|
|
11
|
+
#
|
|
12
|
+
# NOTE: The return value of `Enumerable#each` is `self`, whereas the
|
|
13
|
+
# return value of `Enumerable#map` is an `Array`. They are not autocorrected
|
|
14
|
+
# when a return value could be used because these types differ.
|
|
15
|
+
#
|
|
16
|
+
# NOTE: It only detects when the mapping destination is either:
|
|
17
|
+
# * a local variable initialized as an empty array and referred to only by the
|
|
18
|
+
# pushing operation;
|
|
19
|
+
# * or, if it is the single block argument to a `[].tap` block.
|
|
20
|
+
# This is because, if not, it's challenging to statically guarantee that the
|
|
21
|
+
# mapping destination variable remains an empty array:
|
|
22
|
+
#
|
|
23
|
+
# [source,ruby]
|
|
24
|
+
# ----
|
|
25
|
+
# ret = []
|
|
26
|
+
# src.each { |e| ret << e * 2 } # `<<` method may mutate `ret`
|
|
27
|
+
#
|
|
28
|
+
# dest = []
|
|
29
|
+
# src.each { |e| dest << transform(e, dest) } # `transform` method may mutate `dest`
|
|
30
|
+
# ----
|
|
31
|
+
#
|
|
32
|
+
# @safety
|
|
33
|
+
# This cop is unsafe because not all objects that have an `each`
|
|
34
|
+
# method also have a `map` method (e.g. `ENV`). Additionally, for calls
|
|
35
|
+
# with a block, not all objects that have a `map` method return an array
|
|
36
|
+
# (e.g. `Enumerator::Lazy`).
|
|
37
|
+
#
|
|
38
|
+
# @example
|
|
39
|
+
# # bad
|
|
40
|
+
# dest = []
|
|
41
|
+
# src.each { |e| dest << e * 2 }
|
|
42
|
+
# dest
|
|
43
|
+
#
|
|
44
|
+
# # good
|
|
45
|
+
# dest = src.map { |e| e * 2 }
|
|
46
|
+
#
|
|
47
|
+
# # bad
|
|
48
|
+
# [].tap do |dest|
|
|
49
|
+
# src.each { |e| dest << e * 2 }
|
|
50
|
+
# end
|
|
51
|
+
#
|
|
52
|
+
# # good
|
|
53
|
+
# dest = src.map { |e| e * 2 }
|
|
54
|
+
#
|
|
55
|
+
# # good - contains another operation
|
|
56
|
+
# dest = []
|
|
57
|
+
# src.each { |e| dest << e * 2; puts e }
|
|
58
|
+
# dest
|
|
59
|
+
#
|
|
60
|
+
class MapIntoArray < Base
|
|
61
|
+
include RangeHelp
|
|
62
|
+
extend AutoCorrector
|
|
63
|
+
|
|
64
|
+
MSG = 'Use `%<new_method_name>s` instead of `each` to map elements into an array.'
|
|
65
|
+
|
|
66
|
+
# @!method suitable_argument_node?(node)
|
|
67
|
+
def_node_matcher :suitable_argument_node?, <<-PATTERN
|
|
68
|
+
!{splat forwarded-restarg forwarded-args (hash (forwarded-kwrestarg)) (block-pass nil?)}
|
|
69
|
+
PATTERN
|
|
70
|
+
|
|
71
|
+
# @!method each_block_with_push?(node)
|
|
72
|
+
def_node_matcher :each_block_with_push?, <<-PATTERN
|
|
73
|
+
[
|
|
74
|
+
^({begin kwbegin block} ...)
|
|
75
|
+
(any_block (send !{nil? self} :each) _
|
|
76
|
+
(send (lvar _) {:<< :push :append} #suitable_argument_node?))
|
|
77
|
+
]
|
|
78
|
+
PATTERN
|
|
79
|
+
|
|
80
|
+
# @!method empty_array_asgn?(node)
|
|
81
|
+
def_node_matcher :empty_array_asgn?, <<~PATTERN
|
|
82
|
+
(
|
|
83
|
+
lvasgn _ {
|
|
84
|
+
(array)
|
|
85
|
+
(send (const {nil? cbase} :Array) :[])
|
|
86
|
+
(send (const {nil? cbase} :Array) :new (array)?)
|
|
87
|
+
(send nil? :Array (array))
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
PATTERN
|
|
91
|
+
|
|
92
|
+
# @!method empty_array_tap(node)
|
|
93
|
+
def_node_matcher :empty_array_tap, <<~PATTERN
|
|
94
|
+
^^$(
|
|
95
|
+
block
|
|
96
|
+
(send (array) :tap)
|
|
97
|
+
(args (arg _))
|
|
98
|
+
...
|
|
99
|
+
)
|
|
100
|
+
PATTERN
|
|
101
|
+
|
|
102
|
+
# @!method lvar_ref?(node, name)
|
|
103
|
+
def_node_matcher :lvar_ref?, '(lvar %1)'
|
|
104
|
+
|
|
105
|
+
def self.joining_forces
|
|
106
|
+
VariableForce
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def after_leaving_scope(scope, _variable_table)
|
|
110
|
+
(@scopes ||= []) << scope
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def on_block(node)
|
|
114
|
+
return unless each_block_with_push?(node)
|
|
115
|
+
|
|
116
|
+
dest_var = find_dest_var(node)
|
|
117
|
+
|
|
118
|
+
if offending_empty_array_tap?(node, dest_var)
|
|
119
|
+
asgn = dest_var.declaration_node
|
|
120
|
+
else
|
|
121
|
+
return unless (asgn = find_closest_assignment(node, dest_var))
|
|
122
|
+
return unless empty_array_asgn?(asgn)
|
|
123
|
+
return unless dest_used_only_for_mapping?(node, dest_var, asgn)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
register_offense(node, dest_var, asgn)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
alias on_numblock on_block
|
|
130
|
+
alias on_itblock on_block
|
|
131
|
+
|
|
132
|
+
private
|
|
133
|
+
|
|
134
|
+
def find_dest_var(block)
|
|
135
|
+
node = block.body.receiver
|
|
136
|
+
name = node.children.first
|
|
137
|
+
|
|
138
|
+
candidates = @scopes.lazy.filter_map { |s| s.variables[name] }
|
|
139
|
+
candidates.find { |v| v.references.any? { |n| n.node.equal?(node) } }
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def offending_empty_array_tap?(node, dest_var)
|
|
143
|
+
return false unless (tap_block_node = empty_array_tap(dest_var.declaration_node))
|
|
144
|
+
|
|
145
|
+
# A `tap` block only offends if the array push is the only thing in it;
|
|
146
|
+
# otherwise we cannot guarantee that the block variable is still an empty
|
|
147
|
+
# array when pushed to.
|
|
148
|
+
tap_block_node.body == node
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def find_closest_assignment(block, dest_var)
|
|
152
|
+
dest_var.assignments.reverse_each.lazy.map(&:node).find do |node|
|
|
153
|
+
node.source_range.end_pos < block.source_range.begin_pos
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def dest_used_only_for_mapping?(block, dest_var, asgn)
|
|
158
|
+
range = asgn.source_range.join(block.source_range)
|
|
159
|
+
|
|
160
|
+
asgn.parent.equal?(block.parent) &&
|
|
161
|
+
dest_var.references.one? { |r| range.contains?(r.node.source_range) } &&
|
|
162
|
+
dest_var.assignments.one? { |a| range.contains?(a.node.source_range) }
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def register_offense(block, dest_var, asgn)
|
|
166
|
+
add_offense(block, message: format(MSG, new_method_name: new_method_name)) do |corrector|
|
|
167
|
+
next if return_value_used?(block)
|
|
168
|
+
|
|
169
|
+
corrector.replace(block.send_node.selector, new_method_name)
|
|
170
|
+
|
|
171
|
+
if (tap_block_node = empty_array_tap(dest_var.declaration_node))
|
|
172
|
+
remove_tap(corrector, block, tap_block_node)
|
|
173
|
+
else
|
|
174
|
+
remove_assignment(corrector, asgn)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
correct_push_node(corrector, block.body)
|
|
178
|
+
correct_return_value_handling(corrector, block, dest_var)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def new_method_name
|
|
183
|
+
default = 'map'
|
|
184
|
+
alternative = config.for_cop('Style/CollectionMethods').dig('PreferredMethods', default)
|
|
185
|
+
alternative || default
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def return_value_used?(node)
|
|
189
|
+
parent = node.parent
|
|
190
|
+
|
|
191
|
+
case parent&.type
|
|
192
|
+
when nil
|
|
193
|
+
false
|
|
194
|
+
when :begin, :kwbegin
|
|
195
|
+
!node.right_sibling && return_value_used?(parent)
|
|
196
|
+
else
|
|
197
|
+
!parent.respond_to?(:void_context?) || !parent.void_context?
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def remove_assignment(corrector, asgn)
|
|
202
|
+
range = range_with_surrounding_space(asgn.source_range, side: :right)
|
|
203
|
+
range = range_with_surrounding_space(range, side: :right, newlines: false)
|
|
204
|
+
|
|
205
|
+
corrector.remove(range)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def remove_tap(corrector, node, block_node)
|
|
209
|
+
range = range_between(block_node.source_range.begin_pos, node.source_range.begin_pos)
|
|
210
|
+
corrector.remove(range)
|
|
211
|
+
corrector.remove(range_with_surrounding_space(block_node.loc.end, side: :left))
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def correct_push_node(corrector, push_node)
|
|
215
|
+
arg_node = push_node.first_argument
|
|
216
|
+
range = push_node.source_range
|
|
217
|
+
arg_range = arg_node.source_range
|
|
218
|
+
|
|
219
|
+
corrector.wrap(arg_node, '{ ', ' }') if arg_node.hash_type? && !arg_node.braces?
|
|
220
|
+
corrector.remove(range_between(range.begin_pos, arg_range.begin_pos))
|
|
221
|
+
corrector.remove(range_between(arg_range.end_pos, range.end_pos))
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def correct_return_value_handling(corrector, block, dest_var)
|
|
225
|
+
next_node = block.right_sibling
|
|
226
|
+
|
|
227
|
+
if lvar_ref?(next_node, dest_var.name)
|
|
228
|
+
corrector.remove(range_with_surrounding_space(next_node.source_range, side: :left))
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
corrector.insert_before(block, "#{dest_var.name} = ")
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
@@ -34,37 +34,56 @@ module RuboCop
|
|
|
34
34
|
|
|
35
35
|
minimum_target_ruby_version 2.6
|
|
36
36
|
|
|
37
|
-
MSG = 'Pass a block to `to_h` instead of calling `%<method>s
|
|
37
|
+
MSG = 'Pass a block to `to_h` instead of calling `%<method>s%<dot>sto_h`.'
|
|
38
38
|
RESTRICT_ON_SEND = %i[to_h].freeze
|
|
39
39
|
|
|
40
|
-
# @!method map_to_h
|
|
41
|
-
def_node_matcher :map_to_h
|
|
40
|
+
# @!method map_to_h(node)
|
|
41
|
+
def_node_matcher :map_to_h, <<~PATTERN
|
|
42
42
|
{
|
|
43
|
-
$(
|
|
44
|
-
$(
|
|
43
|
+
$(call (any_block $(call _ {:map :collect}) ...) :to_h)
|
|
44
|
+
$(call $(call _ {:map :collect} (block_pass sym)) :to_h)
|
|
45
45
|
}
|
|
46
46
|
PATTERN
|
|
47
47
|
|
|
48
|
+
# @!method destructuring_argument(node)
|
|
49
|
+
def_node_matcher :destructuring_argument, <<~PATTERN
|
|
50
|
+
(args $(mlhs (arg _)+))
|
|
51
|
+
PATTERN
|
|
52
|
+
|
|
53
|
+
def self.autocorrect_incompatible_with
|
|
54
|
+
[Layout::SingleLineBlockChain]
|
|
55
|
+
end
|
|
56
|
+
|
|
48
57
|
def on_send(node)
|
|
49
|
-
return unless (to_h_node, map_node = map_to_h
|
|
58
|
+
return unless (to_h_node, map_node = map_to_h(node))
|
|
59
|
+
return if to_h_node.block_literal?
|
|
50
60
|
|
|
51
|
-
message = format(MSG, method: map_node.loc.selector.source)
|
|
61
|
+
message = format(MSG, method: map_node.loc.selector.source, dot: to_h_node.loc.dot.source)
|
|
52
62
|
add_offense(map_node.loc.selector, message: message) do |corrector|
|
|
53
|
-
# If the `to_h` call already has a block, do not autocorrect.
|
|
54
|
-
next if to_h_node.block_node
|
|
55
|
-
|
|
56
63
|
autocorrect(corrector, to_h_node, map_node)
|
|
57
64
|
end
|
|
58
65
|
end
|
|
66
|
+
alias on_csend on_send
|
|
59
67
|
|
|
60
68
|
private
|
|
61
69
|
|
|
70
|
+
# rubocop:disable Metrics/AbcSize
|
|
62
71
|
def autocorrect(corrector, to_h, map)
|
|
63
72
|
removal_range = range_between(to_h.loc.dot.begin_pos, to_h.loc.selector.end_pos)
|
|
64
73
|
|
|
65
74
|
corrector.remove(range_with_surrounding_space(removal_range, side: :left))
|
|
75
|
+
if (map_dot = map.loc.dot)
|
|
76
|
+
corrector.replace(map_dot, to_h.loc.dot.source)
|
|
77
|
+
end
|
|
66
78
|
corrector.replace(map.loc.selector, 'to_h')
|
|
79
|
+
|
|
80
|
+
return unless map.parent.block_type?
|
|
81
|
+
|
|
82
|
+
if (argument = destructuring_argument(map.parent.arguments))
|
|
83
|
+
corrector.replace(argument, argument.source[1..-2])
|
|
84
|
+
end
|
|
67
85
|
end
|
|
86
|
+
# rubocop:enable Metrics/AbcSize
|
|
68
87
|
end
|
|
69
88
|
end
|
|
70
89
|
end
|
|
@@ -33,22 +33,21 @@ module RuboCop
|
|
|
33
33
|
# @!method map_to_set?(node)
|
|
34
34
|
def_node_matcher :map_to_set?, <<~PATTERN
|
|
35
35
|
{
|
|
36
|
-
$(
|
|
37
|
-
$(
|
|
36
|
+
$(call (any_block $(call _ {:map :collect}) ...) :to_set)
|
|
37
|
+
$(call $(call _ {:map :collect} (block_pass sym)) :to_set)
|
|
38
38
|
}
|
|
39
39
|
PATTERN
|
|
40
40
|
|
|
41
41
|
def on_send(node)
|
|
42
42
|
return unless (to_set_node, map_node = map_to_set?(node))
|
|
43
|
+
return if to_set_node.block_literal?
|
|
43
44
|
|
|
44
45
|
message = format(MSG, method: map_node.loc.selector.source)
|
|
45
46
|
add_offense(map_node.loc.selector, message: message) do |corrector|
|
|
46
|
-
# If the `to_set` call already has a block, do not autocorrect.
|
|
47
|
-
next if to_set_node.block_node
|
|
48
|
-
|
|
49
47
|
autocorrect(corrector, to_set_node, map_node)
|
|
50
48
|
end
|
|
51
49
|
end
|
|
50
|
+
alias on_csend on_send
|
|
52
51
|
|
|
53
52
|
private
|
|
54
53
|
|
|
@@ -7,6 +7,8 @@ module RuboCop
|
|
|
7
7
|
# Style omit_parentheses
|
|
8
8
|
# rubocop:disable Metrics/ModuleLength, Metrics/CyclomaticComplexity
|
|
9
9
|
module OmitParentheses
|
|
10
|
+
include RangeHelp
|
|
11
|
+
|
|
10
12
|
TRAILING_WHITESPACE_REGEX = /\s+\Z/.freeze
|
|
11
13
|
OMIT_MSG = 'Omit parentheses for method calls with arguments.'
|
|
12
14
|
private_constant :OMIT_MSG
|
|
@@ -18,6 +20,7 @@ module RuboCop
|
|
|
18
20
|
return if inside_endless_method_def?(node)
|
|
19
21
|
return if require_parentheses_for_hash_value_omission?(node)
|
|
20
22
|
return if syntax_like_method_call?(node)
|
|
23
|
+
return if method_call_before_constant_resolution?(node)
|
|
21
24
|
return if super_call_without_arguments?(node)
|
|
22
25
|
return if legitimate_call_with_parentheses?(node)
|
|
23
26
|
return if allowed_camel_case_method_call?(node)
|
|
@@ -29,10 +32,13 @@ module RuboCop
|
|
|
29
32
|
end
|
|
30
33
|
|
|
31
34
|
def autocorrect(corrector, node)
|
|
35
|
+
range = args_begin(node)
|
|
32
36
|
if parentheses_at_the_end_of_multiline_call?(node)
|
|
33
|
-
|
|
37
|
+
# Whitespace after line continuation (`\ `) is a syntax error
|
|
38
|
+
with_whitespace = range_with_surrounding_space(range, side: :right, newlines: false)
|
|
39
|
+
corrector.replace(with_whitespace, ' \\')
|
|
34
40
|
else
|
|
35
|
-
corrector.replace(
|
|
41
|
+
corrector.replace(range, ' ')
|
|
36
42
|
end
|
|
37
43
|
corrector.remove(node.loc.end)
|
|
38
44
|
end
|
|
@@ -43,14 +49,14 @@ module RuboCop
|
|
|
43
49
|
|
|
44
50
|
def inside_endless_method_def?(node)
|
|
45
51
|
# parens are required around arguments inside an endless method
|
|
46
|
-
node.each_ancestor(:
|
|
52
|
+
node.each_ancestor(:any_def).any?(&:endless?) && node.arguments.any?
|
|
47
53
|
end
|
|
48
54
|
|
|
49
|
-
def require_parentheses_for_hash_value_omission?(node)
|
|
55
|
+
def require_parentheses_for_hash_value_omission?(node) # rubocop:disable Metrics/PerceivedComplexity
|
|
50
56
|
return false unless (last_argument = node.last_argument)
|
|
51
57
|
return false if !last_argument.hash_type? || !last_argument.pairs.last&.value_omission?
|
|
52
58
|
|
|
53
|
-
node.parent&.conditional? || !last_expression?(node)
|
|
59
|
+
node.parent&.conditional? || node.parent&.single_line? || !last_expression?(node)
|
|
54
60
|
end
|
|
55
61
|
|
|
56
62
|
# Require hash value omission be enclosed in parentheses to prevent the following issue:
|
|
@@ -63,6 +69,10 @@ module RuboCop
|
|
|
63
69
|
node.implicit_call? || node.operator_method?
|
|
64
70
|
end
|
|
65
71
|
|
|
72
|
+
def method_call_before_constant_resolution?(node)
|
|
73
|
+
node.parent&.const_type?
|
|
74
|
+
end
|
|
75
|
+
|
|
66
76
|
def super_call_without_arguments?(node)
|
|
67
77
|
node.super_type? && node.arguments.none?
|
|
68
78
|
end
|
|
@@ -86,6 +96,7 @@ module RuboCop
|
|
|
86
96
|
|
|
87
97
|
def legitimate_call_with_parentheses?(node) # rubocop:disable Metrics/PerceivedComplexity
|
|
88
98
|
call_in_literals?(node) ||
|
|
99
|
+
node.parent&.when_type? ||
|
|
89
100
|
call_with_ambiguous_arguments?(node) ||
|
|
90
101
|
call_in_logical_operators?(node) ||
|
|
91
102
|
call_in_optional_arguments?(node) ||
|
|
@@ -97,18 +108,16 @@ module RuboCop
|
|
|
97
108
|
end
|
|
98
109
|
|
|
99
110
|
def call_in_literals?(node)
|
|
100
|
-
parent = node.parent&.
|
|
111
|
+
parent = node.parent&.any_block_type? ? node.parent.parent : node.parent
|
|
101
112
|
return false unless parent
|
|
102
113
|
|
|
103
|
-
parent.
|
|
104
|
-
parent.array_type? ||
|
|
105
|
-
parent.range_type? ||
|
|
114
|
+
parent.type?(:pair, :array, :range) ||
|
|
106
115
|
splat?(parent) ||
|
|
107
116
|
ternary_if?(parent)
|
|
108
117
|
end
|
|
109
118
|
|
|
110
119
|
def call_in_logical_operators?(node)
|
|
111
|
-
parent = node.parent&.
|
|
120
|
+
parent = node.parent&.any_block_type? ? node.parent.parent : node.parent
|
|
112
121
|
return false unless parent
|
|
113
122
|
|
|
114
123
|
logical_operator?(parent) ||
|
|
@@ -117,38 +126,48 @@ module RuboCop
|
|
|
117
126
|
end
|
|
118
127
|
|
|
119
128
|
def call_in_optional_arguments?(node)
|
|
120
|
-
node.parent
|
|
129
|
+
node.parent&.type?(:optarg, :kwoptarg)
|
|
121
130
|
end
|
|
122
131
|
|
|
123
132
|
def call_in_single_line_inheritance?(node)
|
|
124
|
-
node.parent&.class_type? && node.parent
|
|
133
|
+
node.parent&.class_type? && node.parent.single_line?
|
|
125
134
|
end
|
|
126
135
|
|
|
127
|
-
|
|
136
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
137
|
+
def call_with_ambiguous_arguments?(node)
|
|
128
138
|
call_with_braced_block?(node) ||
|
|
139
|
+
call_in_argument_with_block?(node) ||
|
|
129
140
|
call_as_argument_or_chain?(node) ||
|
|
130
141
|
call_in_match_pattern?(node) ||
|
|
131
142
|
hash_literal_in_arguments?(node) ||
|
|
143
|
+
ambiguous_range_argument?(node) ||
|
|
132
144
|
node.descendants.any? do |n|
|
|
133
|
-
n.
|
|
134
|
-
|
|
145
|
+
n.type?(:forwarded_args, :any_block) ||
|
|
146
|
+
ambiguous_literal?(n) || logical_operator?(n)
|
|
135
147
|
end
|
|
136
148
|
end
|
|
149
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
137
150
|
|
|
138
151
|
def call_with_braced_block?(node)
|
|
139
|
-
|
|
152
|
+
node.type?(:call, :super) && node.block_node&.braces?
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def call_in_argument_with_block?(node)
|
|
156
|
+
parent = node.parent&.any_block_type? && node.parent.parent
|
|
157
|
+
return false unless parent
|
|
158
|
+
|
|
159
|
+
parent.type?(:call, :super, :yield)
|
|
140
160
|
end
|
|
141
161
|
|
|
142
162
|
def call_as_argument_or_chain?(node)
|
|
143
|
-
node.parent &&
|
|
144
|
-
|
|
145
|
-
node.parent.csend_type? || node.parent.super_type? || node.parent.yield_type?)
|
|
163
|
+
node.parent&.type?(:call, :super, :yield) &&
|
|
164
|
+
!assigned_before?(node.parent, node)
|
|
146
165
|
end
|
|
147
166
|
|
|
148
167
|
def call_in_match_pattern?(node)
|
|
149
168
|
return false unless (parent = node.parent)
|
|
150
169
|
|
|
151
|
-
parent.
|
|
170
|
+
parent.any_match_pattern_type?
|
|
152
171
|
end
|
|
153
172
|
|
|
154
173
|
def hash_literal_in_arguments?(node)
|
|
@@ -158,6 +177,13 @@ module RuboCop
|
|
|
158
177
|
end
|
|
159
178
|
end
|
|
160
179
|
|
|
180
|
+
def ambiguous_range_argument?(node)
|
|
181
|
+
return true if (first_arg = node.first_argument)&.range_type? && first_arg.begin.nil?
|
|
182
|
+
return true if (last_arg = node.last_argument)&.range_type? && last_arg.end.nil?
|
|
183
|
+
|
|
184
|
+
false
|
|
185
|
+
end
|
|
186
|
+
|
|
161
187
|
def allowed_multiline_call_with_parentheses?(node)
|
|
162
188
|
cop_config['AllowParenthesesInMultilineCall'] && node.multiline?
|
|
163
189
|
end
|
|
@@ -176,7 +202,7 @@ module RuboCop
|
|
|
176
202
|
end
|
|
177
203
|
|
|
178
204
|
def splat?(node)
|
|
179
|
-
node.
|
|
205
|
+
node.type?(:splat, :kwsplat, :block_pass)
|
|
180
206
|
end
|
|
181
207
|
|
|
182
208
|
def ternary_if?(node)
|
|
@@ -184,7 +210,7 @@ module RuboCop
|
|
|
184
210
|
end
|
|
185
211
|
|
|
186
212
|
def logical_operator?(node)
|
|
187
|
-
|
|
213
|
+
node.operator_keyword? && node.logical_operator?
|
|
188
214
|
end
|
|
189
215
|
|
|
190
216
|
def hash_literal?(node)
|
|
@@ -196,8 +222,9 @@ module RuboCop
|
|
|
196
222
|
end
|
|
197
223
|
|
|
198
224
|
def unary_literal?(node)
|
|
199
|
-
|
|
200
|
-
|
|
225
|
+
return true if node.numeric_type? && node.sign?
|
|
226
|
+
|
|
227
|
+
node.parent&.send_type? && node.parent.unary_operation?
|
|
201
228
|
end
|
|
202
229
|
|
|
203
230
|
def assigned_before?(node, target)
|
|
@@ -222,7 +249,7 @@ module RuboCop
|
|
|
222
249
|
return false unless (last_argument = node.last_argument)
|
|
223
250
|
return true if last_argument.forwarded_restarg_type?
|
|
224
251
|
|
|
225
|
-
last_argument.hash_type? && last_argument.children.
|
|
252
|
+
last_argument.hash_type? && last_argument.children.any?(&:forwarded_kwrestarg_type?)
|
|
226
253
|
end
|
|
227
254
|
end
|
|
228
255
|
# rubocop:enable Metrics/ModuleLength, Metrics/CyclomaticComplexity
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Enforces the presence (default) or absence of parentheses in
|
|
7
|
-
# method calls containing
|
|
7
|
+
# method calls containing arguments.
|
|
8
8
|
#
|
|
9
9
|
# In the default style (require_parentheses), macro methods are allowed.
|
|
10
10
|
# Additional methods can be added to the `AllowedMethods` or
|
|
@@ -61,6 +61,8 @@ module RuboCop
|
|
|
61
61
|
# https://bugs.ruby-lang.org/issues/18396.
|
|
62
62
|
# - Parentheses are required in anonymous arguments, keyword arguments
|
|
63
63
|
# and block passing in Ruby 3.2.
|
|
64
|
+
# - Parentheses are required when the first argument is a beginless range or
|
|
65
|
+
# the last argument is an endless range.
|
|
64
66
|
#
|
|
65
67
|
# @example EnforcedStyle: require_parentheses (default)
|
|
66
68
|
#
|
|
@@ -130,6 +132,22 @@ module RuboCop
|
|
|
130
132
|
# bar :baz
|
|
131
133
|
# end
|
|
132
134
|
#
|
|
135
|
+
# @example AllowedMethods: ["puts", "print"]
|
|
136
|
+
#
|
|
137
|
+
# # good
|
|
138
|
+
# puts "Hello world"
|
|
139
|
+
# print "Hello world"
|
|
140
|
+
# # still enforces parentheses on other methods
|
|
141
|
+
# array.delete(e)
|
|
142
|
+
#
|
|
143
|
+
# @example AllowedPatterns: ["^assert"]
|
|
144
|
+
#
|
|
145
|
+
# # good
|
|
146
|
+
# assert_equal 'test', x
|
|
147
|
+
# assert_match(/foo/, bar)
|
|
148
|
+
# # still enforces parentheses on other methods
|
|
149
|
+
# array.delete(e)
|
|
150
|
+
#
|
|
133
151
|
# @example AllowParenthesesInMultilineCall: false (default)
|
|
134
152
|
#
|
|
135
153
|
# # bad
|
|
@@ -218,15 +236,13 @@ module RuboCop
|
|
|
218
236
|
send(style, node) # call require_parentheses or omit_parentheses
|
|
219
237
|
end
|
|
220
238
|
alias on_csend on_send
|
|
221
|
-
alias on_super on_send
|
|
222
239
|
alias on_yield on_send
|
|
223
240
|
|
|
224
241
|
private
|
|
225
242
|
|
|
226
243
|
def args_begin(node)
|
|
227
244
|
loc = node.loc
|
|
228
|
-
selector =
|
|
229
|
-
node.super_type? || node.yield_type? ? loc.keyword : loc.selector
|
|
245
|
+
selector = node.yield_type? ? loc.keyword : loc.selector
|
|
230
246
|
|
|
231
247
|
resize_by = args_parenthesized?(node) ? 2 : 1
|
|
232
248
|
selector.end.resize(resize_by)
|
|
@@ -239,7 +255,7 @@ module RuboCop
|
|
|
239
255
|
def args_parenthesized?(node)
|
|
240
256
|
return false unless node.arguments.one?
|
|
241
257
|
|
|
242
|
-
first_node = node.
|
|
258
|
+
first_node = node.first_argument
|
|
243
259
|
first_node.begin_type? && first_node.parenthesized_call?
|
|
244
260
|
end
|
|
245
261
|
end
|
|
@@ -5,8 +5,11 @@ module RuboCop
|
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for unwanted parentheses in parameterless method calls.
|
|
7
7
|
#
|
|
8
|
-
# This cop can be customized
|
|
9
|
-
# By default, there are no methods
|
|
8
|
+
# This cop's allowed methods can be customized with `AllowedMethods`.
|
|
9
|
+
# By default, there are no allowed methods.
|
|
10
|
+
#
|
|
11
|
+
# NOTE: This cop allows the use of `it()` without arguments in blocks,
|
|
12
|
+
# as in `0.times { it() }`, following `Lint/ItWithoutArgumentsInBlock` cop.
|
|
10
13
|
#
|
|
11
14
|
# @example
|
|
12
15
|
# # bad
|
|
@@ -30,15 +33,19 @@ module RuboCop
|
|
|
30
33
|
|
|
31
34
|
MSG = 'Do not use parentheses for method calls with no arguments.'
|
|
32
35
|
|
|
36
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
33
37
|
def on_send(node)
|
|
34
38
|
return unless !node.arguments? && node.parenthesized?
|
|
35
39
|
return if ineligible_node?(node)
|
|
36
40
|
return if default_argument?(node)
|
|
37
41
|
return if allowed_method_name?(node.method_name)
|
|
38
42
|
return if same_name_assignment?(node)
|
|
43
|
+
return if parenthesized_it_method_in_block?(node)
|
|
39
44
|
|
|
40
45
|
register_offense(node)
|
|
41
46
|
end
|
|
47
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
48
|
+
alias on_csend on_send
|
|
42
49
|
|
|
43
50
|
private
|
|
44
51
|
|
|
@@ -65,12 +72,28 @@ module RuboCop
|
|
|
65
72
|
return false if node.receiver
|
|
66
73
|
|
|
67
74
|
any_assignment?(node) do |asgn_node|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
if asgn_node.masgn_type?
|
|
76
|
+
variable_in_mass_assignment?(node.method_name, asgn_node)
|
|
77
|
+
else
|
|
78
|
+
asgn_node.loc.name.source == node.method_name.to_s
|
|
79
|
+
end
|
|
71
80
|
end
|
|
72
81
|
end
|
|
73
82
|
|
|
83
|
+
# Respects `Lint/ItWithoutArgumentsInBlock` cop and the following Ruby 3.3's warning:
|
|
84
|
+
#
|
|
85
|
+
# $ ruby -e '0.times { begin; it; end }'
|
|
86
|
+
# -e:1: warning: `it` calls without arguments will refer to the first block param in
|
|
87
|
+
# Ruby 3.4; use it() or self.it
|
|
88
|
+
#
|
|
89
|
+
def parenthesized_it_method_in_block?(node)
|
|
90
|
+
return false unless node.method?(:it)
|
|
91
|
+
return false unless (block_node = node.each_ancestor(:block).first)
|
|
92
|
+
return false unless block_node.arguments.empty_and_without_delimiters?
|
|
93
|
+
|
|
94
|
+
!node.receiver && node.arguments.empty? && !node.block_literal?
|
|
95
|
+
end
|
|
96
|
+
|
|
74
97
|
def any_assignment?(node)
|
|
75
98
|
node.each_ancestor(*AST::Node::ASSIGNMENTS).any? do |asgn_node|
|
|
76
99
|
# `obj.method = value` parses as (send ... :method= ...), and will
|
|
@@ -78,20 +101,14 @@ module RuboCop
|
|
|
78
101
|
# `obj.method ||= value` parses as (or-asgn (send ...) ...)
|
|
79
102
|
# which IS an `asgn_node`. Similarly, `obj.method += value` parses
|
|
80
103
|
# as (op-asgn (send ...) ...), which is also an `asgn_node`.
|
|
81
|
-
if asgn_node.shorthand_asgn?
|
|
82
|
-
asgn_node, _value = *asgn_node
|
|
83
|
-
next if asgn_node.send_type?
|
|
84
|
-
end
|
|
104
|
+
next if asgn_node.shorthand_asgn? && asgn_node.lhs.call_type?
|
|
85
105
|
|
|
86
106
|
yield asgn_node
|
|
87
107
|
end
|
|
88
108
|
end
|
|
89
109
|
|
|
90
110
|
def variable_in_mass_assignment?(variable_name, node)
|
|
91
|
-
|
|
92
|
-
var_nodes = *mlhs_node
|
|
93
|
-
|
|
94
|
-
var_nodes.any? { |n| n.to_a.first == variable_name }
|
|
111
|
+
node.assignments.reject(&:send_type?).any? { |n| n.name == variable_name }
|
|
95
112
|
end
|
|
96
113
|
|
|
97
114
|
def offense_range(node)
|