rubocop 1.67.0 → 1.82.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 +403 -75
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +12 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -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 +21 -5
- data/lib/rubocop/comment_config.rb +64 -19
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +58 -49
- data/lib/rubocop/config_loader_resolver.rb +43 -16
- 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 +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -28
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +9 -19
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +10 -5
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
- 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_source_range.rb +3 -1
- 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 +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- 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/def_end_alignment.rb +1 -1
- 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_line_after_guard_clause.rb +6 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_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 +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- 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_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +10 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -4
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +20 -8
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- 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 +163 -11
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -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 +9 -5
- 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 +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +3 -11
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -2
- data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +31 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- 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 +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +51 -4
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- 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 +3 -5
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +5 -5
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- 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 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +129 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +25 -7
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +6 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- 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 +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23 -9
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -23
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- 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_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +47 -15
- 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 +13 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.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/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +54 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- 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/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +47 -17
- 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 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
- data/lib/rubocop/cop/lint/useless_or.rb +111 -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 -25
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +23 -12
- 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 +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- 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 +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +5 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- 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 +47 -0
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- 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 +4 -3
- 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 +22 -22
- 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 +48 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +3 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +8 -10
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_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/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -8
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +28 -9
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +2 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- 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 +2 -3
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- 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 +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- 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 +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- 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/bare_percent_literals.rb +1 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_equality.rb +11 -13
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +53 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- 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 +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +50 -42
- data/lib/rubocop/cop/style/constant_visibility.rb +19 -23
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- 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 +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +17 -4
- 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_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +23 -5
- data/lib/rubocop/cop/style/for.rb +1 -1
- 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 +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -14
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- 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 +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +39 -12
- 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 +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- 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 +1 -0
- 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/map_into_array.rb +11 -3
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +12 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +35 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/module_member_existence_check.rb +74 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +3 -13
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- 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_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +16 -8
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +43 -40
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +5 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- 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_line_continuation.rb +55 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +13 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +15 -18
- 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 -10
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +24 -8
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -102
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- 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/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +68 -21
- 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 +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- 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 +15 -15
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +14 -8
- 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 +30 -19
- data/lib/rubocop/cops_documentation_generator.rb +54 -28
- data/lib/rubocop/directive_comment.rb +88 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +21 -6
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +185 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +37 -24
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +31 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- 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 +7 -8
- data/lib/rubocop/result_cache.rb +61 -48
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +35 -18
- data/lib/rubocop/server/cache.rb +51 -13
- 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 +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +14 -9
- data/lib/rubocop/target_ruby.rb +27 -3
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +45 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +92 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -69,10 +69,11 @@ module RuboCop
|
|
|
69
69
|
|
|
70
70
|
def each_semicolon
|
|
71
71
|
tokens_for_lines.each do |line, tokens|
|
|
72
|
-
semicolon_pos = semicolon_position(tokens)
|
|
72
|
+
next unless (semicolon_pos = semicolon_position(tokens))
|
|
73
|
+
|
|
73
74
|
after_expr_pos = semicolon_pos == -1 ? -2 : semicolon_pos
|
|
74
75
|
|
|
75
|
-
yield line, tokens[semicolon_pos].column, tokens[after_expr_pos]
|
|
76
|
+
yield line, tokens[semicolon_pos].column, tokens[after_expr_pos]
|
|
76
77
|
end
|
|
77
78
|
end
|
|
78
79
|
|
|
@@ -119,6 +120,7 @@ module RuboCop
|
|
|
119
120
|
tokens[1]&.type == :tSTRING_DBEG && tokens[2]&.semicolon?
|
|
120
121
|
end
|
|
121
122
|
|
|
123
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
122
124
|
def register_semicolon(line, column, after_expression, token_before_semicolon = nil)
|
|
123
125
|
range = source_range(processed_source.buffer, line, column)
|
|
124
126
|
|
|
@@ -130,14 +132,19 @@ module RuboCop
|
|
|
130
132
|
# without parentheses.
|
|
131
133
|
# See: https://github.com/rubocop/rubocop/issues/10791
|
|
132
134
|
if token_before_semicolon&.regexp_dots?
|
|
133
|
-
|
|
134
|
-
|
|
135
|
+
node = find_node(range_nodes, token_before_semicolon)
|
|
136
|
+
elsif token_before_semicolon&.type == :tLABEL
|
|
137
|
+
node = find_node(value_omission_pair_nodes, token_before_semicolon).parent
|
|
138
|
+
space = node.parent.loc.selector.end.join(node.source_range.begin)
|
|
139
|
+
corrector.remove(space)
|
|
135
140
|
end
|
|
136
141
|
|
|
142
|
+
corrector.wrap(node, '(', ')') if node
|
|
137
143
|
corrector.remove(range)
|
|
138
144
|
end
|
|
139
145
|
end
|
|
140
146
|
end
|
|
147
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
141
148
|
|
|
142
149
|
def expressions_per_line(exprs)
|
|
143
150
|
# create a map matching lines to the number of expressions on them
|
|
@@ -153,9 +160,9 @@ module RuboCop
|
|
|
153
160
|
end
|
|
154
161
|
end
|
|
155
162
|
|
|
156
|
-
def
|
|
157
|
-
|
|
158
|
-
|
|
163
|
+
def find_node(nodes, token_before_semicolon)
|
|
164
|
+
nodes.detect do |node|
|
|
165
|
+
node.source_range.overlaps?(token_before_semicolon.pos)
|
|
159
166
|
end
|
|
160
167
|
end
|
|
161
168
|
|
|
@@ -164,7 +171,16 @@ module RuboCop
|
|
|
164
171
|
|
|
165
172
|
ast = processed_source.ast
|
|
166
173
|
@range_nodes = ast.range_type? ? [ast] : []
|
|
167
|
-
@range_nodes.concat(ast.each_descendant(:
|
|
174
|
+
@range_nodes.concat(ast.each_descendant(:range).to_a)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def value_omission_pair_nodes
|
|
178
|
+
if instance_variable_defined?(:@value_omission_pair_nodes)
|
|
179
|
+
return @value_omission_pair_nodes
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
ast = processed_source.ast
|
|
183
|
+
@value_omission_pair_nodes = ast.each_descendant(:pair).to_a.select(&:value_omission?)
|
|
168
184
|
end
|
|
169
185
|
end
|
|
170
186
|
end
|
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
|
68
68
|
def on_send(node)
|
|
69
69
|
return if allow_send? && !node.method?(:public_send)
|
|
70
70
|
return unless (first_argument = node.first_argument)
|
|
71
|
-
return unless
|
|
71
|
+
return unless first_argument.type?(*STATIC_METHOD_NAME_NODE_TYPES)
|
|
72
72
|
|
|
73
73
|
offense_range = offense_range(node)
|
|
74
74
|
method_name = first_argument.value
|
|
@@ -83,6 +83,7 @@ module RuboCop
|
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
|
+
alias on_csend on_send
|
|
86
87
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
87
88
|
|
|
88
89
|
private
|
|
@@ -122,10 +122,9 @@ module RuboCop
|
|
|
122
122
|
def on_rescue(node)
|
|
123
123
|
return unless style == :semantic
|
|
124
124
|
|
|
125
|
-
|
|
126
|
-
check_scope(:raise, begin_node)
|
|
125
|
+
check_scope(:raise, node.body)
|
|
127
126
|
|
|
128
|
-
|
|
127
|
+
node.resbody_branches.each do |rescue_node|
|
|
129
128
|
check_scope(:fail, rescue_node)
|
|
130
129
|
allow(:raise, rescue_node)
|
|
131
130
|
end
|
|
@@ -33,22 +33,19 @@ module RuboCop
|
|
|
33
33
|
#
|
|
34
34
|
class SingleArgumentDig < Base
|
|
35
35
|
extend AutoCorrector
|
|
36
|
+
include DigHelp
|
|
36
37
|
|
|
37
38
|
MSG = 'Use `%<receiver>s[%<argument>s]` instead of `%<original>s`.'
|
|
38
39
|
RESTRICT_ON_SEND = %i[dig].freeze
|
|
39
40
|
IGNORED_ARGUMENT_TYPES = %i[block_pass forwarded_restarg forwarded_args hash].freeze
|
|
40
41
|
|
|
41
|
-
# @!method single_argument_dig?(node)
|
|
42
|
-
def_node_matcher :single_argument_dig?, <<~PATTERN
|
|
43
|
-
(send _ :dig $!splat)
|
|
44
|
-
PATTERN
|
|
45
|
-
|
|
46
42
|
def on_send(node)
|
|
47
43
|
return unless node.receiver
|
|
48
44
|
|
|
49
45
|
expression = single_argument_dig?(node)
|
|
50
46
|
return unless expression
|
|
51
47
|
return if IGNORED_ARGUMENT_TYPES.include?(expression.type)
|
|
48
|
+
return if ignore_dig_chain?(node)
|
|
52
49
|
|
|
53
50
|
receiver = node.receiver.source
|
|
54
51
|
argument = expression.source
|
|
@@ -63,6 +60,13 @@ module RuboCop
|
|
|
63
60
|
|
|
64
61
|
ignore_node(node)
|
|
65
62
|
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def ignore_dig_chain?(node)
|
|
67
|
+
dig_chain_enabled? &&
|
|
68
|
+
(dig?(node.receiver) || dig?(node.parent))
|
|
69
|
+
end
|
|
66
70
|
end
|
|
67
71
|
end
|
|
68
72
|
end
|
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
|
10
10
|
# parameters.
|
|
11
11
|
#
|
|
12
12
|
# Configuration option: Methods
|
|
13
|
-
# Should be set to use this cop. Array of hashes, where each key is the
|
|
13
|
+
# Should be set to use this cop. `Array` of hashes, where each key is the
|
|
14
14
|
# method name and value - array of argument names.
|
|
15
15
|
#
|
|
16
16
|
# @example Methods: [{reduce: %w[a b]}]
|
|
@@ -6,8 +6,13 @@ module RuboCop
|
|
|
6
6
|
# Checks for single-line `do`...`end` block.
|
|
7
7
|
#
|
|
8
8
|
# In practice a single line `do`...`end` is autocorrected when `EnforcedStyle: semantic`
|
|
9
|
-
#
|
|
10
|
-
# preserve semantics and does not change it to `{`...`}` block.
|
|
9
|
+
# is configured for `Style/BlockDelimiters`. The autocorrection maintains the
|
|
10
|
+
# `do` ... `end` syntax to preserve semantics and does not change it to `{`...`}` block.
|
|
11
|
+
#
|
|
12
|
+
# NOTE: If `InspectBlocks` is set to `true` for `Layout/RedundantLineBreak`, blocks will
|
|
13
|
+
# be autocorrected to be on a single line if possible. This cop respects that configuration
|
|
14
|
+
# by not registering an offense if it would subsequently cause a
|
|
15
|
+
# `Layout/RedundantLineBreak` offense.
|
|
11
16
|
#
|
|
12
17
|
# @example
|
|
13
18
|
#
|
|
@@ -27,12 +32,14 @@ module RuboCop
|
|
|
27
32
|
#
|
|
28
33
|
class SingleLineDoEndBlock < Base
|
|
29
34
|
extend AutoCorrector
|
|
35
|
+
include CheckSingleLineSuitability
|
|
30
36
|
|
|
31
37
|
MSG = 'Prefer multiline `do`...`end` block.'
|
|
32
38
|
|
|
33
39
|
# rubocop:disable Metrics/AbcSize
|
|
34
40
|
def on_block(node)
|
|
35
41
|
return if !node.single_line? || node.braces?
|
|
42
|
+
return if single_line_blocks_preferred? && suitable_as_single_line?(node)
|
|
36
43
|
|
|
37
44
|
add_offense(node) do |corrector|
|
|
38
45
|
corrector.insert_after(do_line(node), "\n")
|
|
@@ -49,18 +56,22 @@ module RuboCop
|
|
|
49
56
|
end
|
|
50
57
|
# rubocop:enable Metrics/AbcSize
|
|
51
58
|
alias on_numblock on_block
|
|
59
|
+
alias on_itblock on_block
|
|
52
60
|
|
|
53
61
|
private
|
|
54
62
|
|
|
55
63
|
def do_line(node)
|
|
56
|
-
if node.
|
|
64
|
+
if node.type?(:numblock, :itblock) ||
|
|
65
|
+
node.arguments.children.empty? || node.send_node.lambda_literal?
|
|
57
66
|
node.loc.begin
|
|
58
67
|
else
|
|
59
68
|
node.arguments
|
|
60
69
|
end
|
|
61
70
|
end
|
|
62
71
|
|
|
63
|
-
def
|
|
72
|
+
def single_line_blocks_preferred?
|
|
73
|
+
@config.for_enabled_cop('Layout/RedundantLineBreak')['InspectBlocks']
|
|
74
|
+
end
|
|
64
75
|
end
|
|
65
76
|
end
|
|
66
77
|
end
|
|
@@ -8,9 +8,9 @@ module RuboCop
|
|
|
8
8
|
#
|
|
9
9
|
# Endless methods added in Ruby 3.0 are also accepted by this cop.
|
|
10
10
|
#
|
|
11
|
-
# If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line`
|
|
12
|
-
# `
|
|
13
|
-
# methods if there is only one statement in the body.
|
|
11
|
+
# If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line`, `allow_always`,
|
|
12
|
+
# `require_single_line`, or `require_always`, single-line methods will be autocorrected
|
|
13
|
+
# to endless methods if there is only one statement in the body.
|
|
14
14
|
#
|
|
15
15
|
# @example
|
|
16
16
|
# # bad
|
|
@@ -65,10 +65,10 @@ module RuboCop
|
|
|
65
65
|
return false if target_ruby_version < 3.0
|
|
66
66
|
return false if disallow_endless_method_style?
|
|
67
67
|
return false unless body_node
|
|
68
|
-
return false if body_node.parent.assignment_method? ||
|
|
68
|
+
return false if body_node.basic_conditional? || body_node.parent.assignment_method? ||
|
|
69
69
|
NOT_SUPPORTED_ENDLESS_METHOD_BODY_TYPES.include?(body_node.type)
|
|
70
70
|
|
|
71
|
-
!
|
|
71
|
+
!body_node.type?(:begin, :kwbegin)
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
def correct_to_multiline(corrector, node)
|
|
@@ -86,10 +86,10 @@ module RuboCop
|
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def correct_to_endless(corrector, node)
|
|
89
|
-
|
|
89
|
+
receiver = "#{node.receiver.source}." if node.receiver
|
|
90
90
|
arguments = node.arguments.any? ? node.arguments.source : '()'
|
|
91
91
|
body_source = method_body_source(node.body)
|
|
92
|
-
replacement = "def #{
|
|
92
|
+
replacement = "def #{receiver}#{node.method_name}#{arguments} = #{body_source}"
|
|
93
93
|
|
|
94
94
|
corrector.replace(node, replacement)
|
|
95
95
|
end
|
|
@@ -130,14 +130,16 @@ module RuboCop
|
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
def require_parentheses?(method_body)
|
|
133
|
-
|
|
133
|
+
return false unless method_body.send_type?
|
|
134
|
+
return false if method_body.arithmetic_operation?
|
|
135
|
+
|
|
136
|
+
!method_body.arguments.empty? && !method_body.comparison_method?
|
|
134
137
|
end
|
|
135
138
|
|
|
136
139
|
def disallow_endless_method_style?
|
|
137
|
-
|
|
138
|
-
return true unless endless_method_config['Enabled']
|
|
140
|
+
return true unless config.cop_enabled?('Style/EndlessMethod')
|
|
139
141
|
|
|
140
|
-
|
|
142
|
+
config.for_cop('Style/EndlessMethod')['EnforcedStyle'] == 'disallow'
|
|
141
143
|
end
|
|
142
144
|
end
|
|
143
145
|
end
|
|
@@ -78,38 +78,67 @@ module RuboCop
|
|
|
78
78
|
return unless node.arguments.one?
|
|
79
79
|
|
|
80
80
|
range_node = node.first_argument
|
|
81
|
-
|
|
82
|
-
unless (message, removal_range =
|
|
83
|
-
|
|
84
|
-
|
|
81
|
+
offense_range = find_offense_range(node)
|
|
82
|
+
return unless (message, removal_range =
|
|
83
|
+
offense_message_with_removal_range(node, range_node, offense_range))
|
|
84
|
+
|
|
85
|
+
# Changing the range to beginningless or endless when unparenthesized
|
|
86
|
+
# changes the semantics of the code, and thus will not be considered
|
|
87
|
+
# an offense.
|
|
88
|
+
return if removal_range != offense_range && unparenthesized_call?(node)
|
|
85
89
|
|
|
86
|
-
add_offense(
|
|
90
|
+
add_offense(offense_range, message: message) do |corrector|
|
|
87
91
|
corrector.remove(removal_range)
|
|
88
92
|
end
|
|
89
93
|
end
|
|
94
|
+
alias on_csend on_send
|
|
90
95
|
|
|
91
96
|
private
|
|
92
97
|
|
|
93
|
-
def
|
|
98
|
+
def unparenthesized_call?(node)
|
|
99
|
+
node.loc.dot && !node.parenthesized?
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def find_offense_range(node)
|
|
103
|
+
if node.loc.dot
|
|
104
|
+
node.loc.dot.join(node.source_range.end)
|
|
105
|
+
else
|
|
106
|
+
node.loc.selector
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def offense_message_with_removal_range(node, range_node, offense_range)
|
|
94
111
|
if range_from_zero_till_minus_one?(range_node)
|
|
95
|
-
[format(MSG_USELESS_RANGE, prefer:
|
|
112
|
+
[format(MSG_USELESS_RANGE, prefer: offense_range.source), offense_range]
|
|
96
113
|
elsif range_till_minus_one?(range_node)
|
|
97
114
|
[
|
|
98
|
-
|
|
115
|
+
offense_message_for_partial_range(node, endless(range_node), offense_range),
|
|
116
|
+
range_node.end
|
|
99
117
|
]
|
|
100
118
|
elsif range_from_zero?(range_node) && target_ruby_version >= 2.7
|
|
101
119
|
[
|
|
102
|
-
|
|
120
|
+
offense_message_for_partial_range(node, beginless(range_node), offense_range),
|
|
121
|
+
range_node.begin
|
|
103
122
|
]
|
|
104
123
|
end
|
|
105
124
|
end
|
|
106
125
|
|
|
126
|
+
def offense_message_for_partial_range(node, prefer, offense_range)
|
|
127
|
+
current = node.loc.dot ? arguments_source(node) : offense_range.source
|
|
128
|
+
prefer = "[#{prefer}]" unless node.loc.dot
|
|
129
|
+
format(MSG, prefer: prefer, current: current)
|
|
130
|
+
end
|
|
131
|
+
|
|
107
132
|
def endless(range_node)
|
|
108
|
-
"
|
|
133
|
+
"#{range_node.begin.source}#{range_node.loc.operator.source}"
|
|
109
134
|
end
|
|
110
135
|
|
|
111
136
|
def beginless(range_node)
|
|
112
|
-
"
|
|
137
|
+
"#{range_node.loc.operator.source}#{range_node.end.source}"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def arguments_source(node)
|
|
141
|
+
node.first_argument.source_range.join(node.last_argument.source_range.end).source
|
|
113
142
|
end
|
|
114
143
|
end
|
|
115
144
|
end
|
|
@@ -96,11 +96,7 @@ module RuboCop
|
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
def autocorrect(corrector, node, if_branch)
|
|
99
|
-
if node.
|
|
100
|
-
corrector.wrap(node.condition, '(', ')')
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
if outer_condition_modify_form?(node, if_branch)
|
|
99
|
+
if node.modifier_form?
|
|
104
100
|
autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
|
105
101
|
else
|
|
106
102
|
autocorrect_outer_condition_basic(corrector, node, if_branch)
|
|
@@ -108,74 +104,56 @@ module RuboCop
|
|
|
108
104
|
end
|
|
109
105
|
|
|
110
106
|
def autocorrect_outer_condition_basic(corrector, node, if_branch)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
outer_condition = node.condition
|
|
114
|
-
correct_outer_condition(corrector, outer_condition)
|
|
107
|
+
correct_node(corrector, node)
|
|
115
108
|
|
|
116
|
-
and_operator = if_branch.unless? ? ' && !' : ' && '
|
|
117
109
|
if if_branch.modifier_form?
|
|
118
|
-
correct_for_guard_condition_style(corrector,
|
|
110
|
+
correct_for_guard_condition_style(corrector, node, if_branch)
|
|
119
111
|
else
|
|
120
|
-
correct_for_basic_condition_style(corrector, node, if_branch
|
|
112
|
+
correct_for_basic_condition_style(corrector, node, if_branch)
|
|
121
113
|
correct_for_comment(corrector, node, if_branch)
|
|
122
114
|
end
|
|
123
115
|
end
|
|
124
116
|
|
|
125
|
-
def
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def correct_from_unless_to_if(corrector, node, is_modify_form: false)
|
|
131
|
-
corrector.replace(node.loc.keyword, 'if')
|
|
132
|
-
|
|
133
|
-
insert_bang(corrector, node, is_modify_form)
|
|
117
|
+
def correct_node(corrector, node)
|
|
118
|
+
corrector.replace(node.loc.keyword, 'if') if node.unless? && !part_of_ignored_node?(node)
|
|
119
|
+
corrector.replace(node.condition, chainable_condition(node))
|
|
120
|
+
ignore_node(node)
|
|
134
121
|
end
|
|
135
122
|
|
|
136
|
-
def correct_for_guard_condition_style(corrector,
|
|
137
|
-
condition
|
|
138
|
-
corrector.insert_after(outer_condition, "#{and_operator}#{replace_condition(condition)}")
|
|
123
|
+
def correct_for_guard_condition_style(corrector, node, if_branch)
|
|
124
|
+
corrector.insert_after(node.condition, " && #{chainable_condition(if_branch)}")
|
|
139
125
|
|
|
140
|
-
range = range_between(
|
|
126
|
+
range = range_between(
|
|
127
|
+
if_branch.loc.keyword.begin_pos, if_branch.condition.source_range.end_pos
|
|
128
|
+
)
|
|
141
129
|
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
|
142
|
-
corrector.remove(if_branch.loc.keyword)
|
|
143
130
|
end
|
|
144
131
|
|
|
145
|
-
|
|
132
|
+
# rubocop:disable Metrics/AbcSize
|
|
133
|
+
def correct_for_basic_condition_style(corrector, node, if_branch)
|
|
146
134
|
range = range_between(
|
|
147
135
|
node.condition.source_range.end_pos, if_branch.condition.source_range.begin_pos
|
|
148
136
|
)
|
|
149
|
-
corrector.replace(range,
|
|
150
|
-
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
|
137
|
+
corrector.replace(range, ' && ')
|
|
151
138
|
|
|
152
|
-
|
|
153
|
-
end
|
|
139
|
+
corrector.replace(if_branch.condition, chainable_condition(if_branch))
|
|
154
140
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if condition.call_type?
|
|
163
|
-
source = parenthesized_method_arguments(condition)
|
|
164
|
-
|
|
165
|
-
corrector.replace(condition, source)
|
|
166
|
-
else
|
|
167
|
-
corrector.wrap(condition, '(', ')')
|
|
168
|
-
end
|
|
141
|
+
end_range = if same_line?(node.loc.end, node.if_branch.loc.end)
|
|
142
|
+
node.loc.end
|
|
143
|
+
else
|
|
144
|
+
range_by_whole_lines(node.loc.end, include_final_newline: true)
|
|
145
|
+
end
|
|
146
|
+
corrector.remove(end_range)
|
|
169
147
|
end
|
|
148
|
+
# rubocop:enable Metrics/AbcSize
|
|
170
149
|
|
|
171
|
-
def
|
|
172
|
-
|
|
173
|
-
corrector.insert_before(condition,
|
|
174
|
-
"#{'!' if node.unless?}#{replace_condition(node.condition)} && ")
|
|
150
|
+
def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
|
151
|
+
correct_node(corrector, if_branch)
|
|
175
152
|
|
|
176
|
-
corrector.
|
|
177
|
-
|
|
178
|
-
|
|
153
|
+
corrector.insert_before(if_branch.condition, "#{chainable_condition(node)} && ")
|
|
154
|
+
|
|
155
|
+
range = range_between(node.loc.keyword.begin_pos, node.condition.source_range.end_pos)
|
|
156
|
+
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
|
179
157
|
end
|
|
180
158
|
|
|
181
159
|
def correct_for_comment(corrector, node, if_branch)
|
|
@@ -187,68 +165,47 @@ module RuboCop
|
|
|
187
165
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
|
188
166
|
end
|
|
189
167
|
|
|
190
|
-
def
|
|
191
|
-
|
|
168
|
+
def chainable_condition(node)
|
|
169
|
+
wrapped_condition = add_parentheses_if_needed(node.condition)
|
|
192
170
|
|
|
193
|
-
|
|
194
|
-
begin_pos = condition.first_argument.source_range.begin_pos
|
|
195
|
-
return if end_pos > begin_pos
|
|
171
|
+
return wrapped_condition if node.if?
|
|
196
172
|
|
|
197
|
-
|
|
198
|
-
corrector.remove(range)
|
|
199
|
-
corrector.insert_after(range, '(')
|
|
200
|
-
corrector.insert_after(condition.last_argument, ')')
|
|
173
|
+
node.condition.and_type? ? "!(#{wrapped_condition})" : "!#{wrapped_condition}"
|
|
201
174
|
end
|
|
202
175
|
|
|
203
|
-
def
|
|
204
|
-
|
|
176
|
+
def add_parentheses_if_needed(condition)
|
|
177
|
+
# Handle `send` and `block` nodes that need to be wrapped in parens
|
|
178
|
+
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
|
179
|
+
# but wrapping the argument list would be a more ergonomic correction.
|
|
180
|
+
node_to_check = condition&.any_block_type? ? condition.send_node : condition
|
|
181
|
+
return condition.source unless add_parentheses?(node_to_check)
|
|
205
182
|
|
|
206
|
-
if (condition
|
|
207
|
-
|
|
208
|
-
corrector.wrap(node.condition, '!(', ')')
|
|
183
|
+
if parenthesize_method?(condition)
|
|
184
|
+
parenthesized_method_arguments(condition)
|
|
209
185
|
elsif condition.and_type?
|
|
210
|
-
|
|
211
|
-
else
|
|
212
|
-
corrector.insert_before(condition, '!')
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
def insert_bang_for_and(corrector, node)
|
|
217
|
-
lhs, rhs = *node
|
|
218
|
-
|
|
219
|
-
if lhs.and_type?
|
|
220
|
-
insert_bang_for_and(corrector, lhs)
|
|
221
|
-
corrector.insert_before(rhs, '!') if rhs
|
|
186
|
+
parenthesized_and(condition)
|
|
222
187
|
else
|
|
223
|
-
|
|
224
|
-
corrector.insert_before(rhs, '!')
|
|
188
|
+
"(#{condition.source})"
|
|
225
189
|
end
|
|
226
190
|
end
|
|
227
191
|
|
|
228
|
-
def
|
|
229
|
-
|
|
230
|
-
!
|
|
192
|
+
def parenthesize_method?(node)
|
|
193
|
+
node.call_type? && node.arguments.any? && !node.parenthesized? &&
|
|
194
|
+
!node.comparison_method? && !node.operator_method?
|
|
231
195
|
end
|
|
232
196
|
|
|
233
|
-
def
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
end
|
|
197
|
+
def add_parentheses?(node)
|
|
198
|
+
return true if node.assignment? || node.or_type?
|
|
199
|
+
return true if assignment_in_and?(node)
|
|
200
|
+
return false unless node.call_type?
|
|
238
201
|
|
|
239
|
-
|
|
240
|
-
node.and_type? || node.or_type? ||
|
|
241
|
-
(node.call_type? && node.arguments.any? && !node.parenthesized?)
|
|
202
|
+
(node.arguments.any? && !node.parenthesized?) || node.prefix_not?
|
|
242
203
|
end
|
|
243
204
|
|
|
244
|
-
def
|
|
245
|
-
return
|
|
205
|
+
def assignment_in_and?(node)
|
|
206
|
+
return false unless node.and_type?
|
|
246
207
|
|
|
247
|
-
|
|
248
|
-
parenthesized_method_arguments(condition)
|
|
249
|
-
else
|
|
250
|
-
"(#{condition.source})"
|
|
251
|
-
end
|
|
208
|
+
node.each_descendant.any?(&:assignment?)
|
|
252
209
|
end
|
|
253
210
|
|
|
254
211
|
def parenthesized_method_arguments(node)
|
|
@@ -258,12 +215,28 @@ module RuboCop
|
|
|
258
215
|
"#{method_call}(#{arguments})"
|
|
259
216
|
end
|
|
260
217
|
|
|
261
|
-
def
|
|
262
|
-
|
|
218
|
+
def parenthesized_and(node)
|
|
219
|
+
# We only need to add parentheses around the last clause if it's an assignment,
|
|
220
|
+
# because other clauses will be unchanged by merging conditionals.
|
|
221
|
+
lhs = node.lhs.source
|
|
222
|
+
rhs = parenthesized_and_clause(node.rhs)
|
|
223
|
+
operator = range_with_surrounding_space(node.loc.operator, whitespace: true).source
|
|
224
|
+
|
|
225
|
+
"#{lhs}#{operator}#{rhs}"
|
|
263
226
|
end
|
|
264
227
|
|
|
265
|
-
def
|
|
266
|
-
node.
|
|
228
|
+
def parenthesized_and_clause(node)
|
|
229
|
+
if node.and_type?
|
|
230
|
+
parenthesized_and(node)
|
|
231
|
+
elsif node.assignment?
|
|
232
|
+
"(#{node.source})"
|
|
233
|
+
else
|
|
234
|
+
node.source
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def allow_modifier?
|
|
239
|
+
cop_config['AllowModifier']
|
|
267
240
|
end
|
|
268
241
|
end
|
|
269
242
|
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
#
|
|
6
|
+
# Checks for parentheses around stabby lambda arguments.
|
|
7
7
|
# There are two different styles. Defaults to `require_parentheses`.
|
|
8
8
|
#
|
|
9
9
|
# @example EnforcedStyle: require_parentheses (default)
|