rubocop 1.67.0 → 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 +23 -19
- data/config/default.yml +384 -72
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -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 +19 -4
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +56 -48
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- 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 +53 -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 +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- 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 +1 -1
- 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/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 +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/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 +3 -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 +1 -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 +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
- 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 +158 -10
- 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 +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -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 +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 +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 +4 -1
- 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 -3
- 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 +1 -1
- 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/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 +125 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- 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 +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 +2 -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_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 +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- 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 +39 -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 +52 -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 +3 -1
- 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 +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 -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 +1 -1
- 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 +49 -0
- 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 +27 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- 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_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_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- 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 +21 -5
- 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 +185 -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/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -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 +49 -31
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- 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 +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 +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 +8 -4
- 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 -3
- 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 +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 +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.rb +18 -0
- 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/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 +1 -9
- 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 +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +41 -38
- 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 +3 -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_regexp_argument.rb +8 -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 +3 -3
- 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 +21 -6
- 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 +68 -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 +66 -19
- 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 +4 -4
- 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 +12 -5
- 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 +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +20 -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 +190 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +66 -26
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +2 -4
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +11 -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 +4 -1
- data/lib/rubocop/result_cache.rb +27 -25
- 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 +31 -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 +44 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +91 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -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,49 @@ 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
|
-
def correct_for_basic_condition_style(corrector, node, if_branch
|
|
132
|
+
def correct_for_basic_condition_style(corrector, node, if_branch)
|
|
146
133
|
range = range_between(
|
|
147
134
|
node.condition.source_range.end_pos, if_branch.condition.source_range.begin_pos
|
|
148
135
|
)
|
|
149
|
-
corrector.replace(range,
|
|
150
|
-
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
|
151
|
-
|
|
152
|
-
wrap_condition(corrector, if_branch.condition)
|
|
153
|
-
end
|
|
136
|
+
corrector.replace(range, ' && ')
|
|
154
137
|
|
|
155
|
-
|
|
156
|
-
# Handle `send` and `block` nodes that need to be wrapped in parens
|
|
157
|
-
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
|
158
|
-
# but wrapping the argument list would be a more ergonomic correction.
|
|
159
|
-
node_to_check = condition&.block_type? ? condition.send_node : condition
|
|
160
|
-
return unless wrap_condition?(node_to_check)
|
|
138
|
+
corrector.replace(if_branch.condition, chainable_condition(if_branch))
|
|
161
139
|
|
|
162
|
-
|
|
163
|
-
source = parenthesized_method_arguments(condition)
|
|
164
|
-
|
|
165
|
-
corrector.replace(condition, source)
|
|
166
|
-
else
|
|
167
|
-
corrector.wrap(condition, '(', ')')
|
|
168
|
-
end
|
|
140
|
+
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
|
169
141
|
end
|
|
170
142
|
|
|
171
|
-
def
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
143
|
+
def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
|
144
|
+
correct_node(corrector, if_branch)
|
|
145
|
+
|
|
146
|
+
corrector.insert_before(if_branch.condition, "#{chainable_condition(node)} && ")
|
|
175
147
|
|
|
176
|
-
|
|
177
|
-
corrector.remove(range_with_surrounding_space(
|
|
178
|
-
corrector.replace(if_branch.loc.keyword, 'if')
|
|
148
|
+
range = range_between(node.loc.keyword.begin_pos, node.condition.source_range.end_pos)
|
|
149
|
+
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
|
179
150
|
end
|
|
180
151
|
|
|
181
152
|
def correct_for_comment(corrector, node, if_branch)
|
|
@@ -187,68 +158,47 @@ module RuboCop
|
|
|
187
158
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
|
188
159
|
end
|
|
189
160
|
|
|
190
|
-
def
|
|
191
|
-
|
|
161
|
+
def chainable_condition(node)
|
|
162
|
+
wrapped_condition = add_parentheses_if_needed(node.condition)
|
|
192
163
|
|
|
193
|
-
|
|
194
|
-
begin_pos = condition.first_argument.source_range.begin_pos
|
|
195
|
-
return if end_pos > begin_pos
|
|
164
|
+
return wrapped_condition if node.if?
|
|
196
165
|
|
|
197
|
-
|
|
198
|
-
corrector.remove(range)
|
|
199
|
-
corrector.insert_after(range, '(')
|
|
200
|
-
corrector.insert_after(condition.last_argument, ')')
|
|
166
|
+
node.condition.and_type? ? "!(#{wrapped_condition})" : "!#{wrapped_condition}"
|
|
201
167
|
end
|
|
202
168
|
|
|
203
|
-
def
|
|
204
|
-
|
|
169
|
+
def add_parentheses_if_needed(condition)
|
|
170
|
+
# Handle `send` and `block` nodes that need to be wrapped in parens
|
|
171
|
+
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
|
172
|
+
# but wrapping the argument list would be a more ergonomic correction.
|
|
173
|
+
node_to_check = condition&.any_block_type? ? condition.send_node : condition
|
|
174
|
+
return condition.source unless add_parentheses?(node_to_check)
|
|
205
175
|
|
|
206
|
-
if (condition
|
|
207
|
-
|
|
208
|
-
corrector.wrap(node.condition, '!(', ')')
|
|
176
|
+
if parenthesize_method?(condition)
|
|
177
|
+
parenthesized_method_arguments(condition)
|
|
209
178
|
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
|
|
179
|
+
parenthesized_and(condition)
|
|
222
180
|
else
|
|
223
|
-
|
|
224
|
-
corrector.insert_before(rhs, '!')
|
|
181
|
+
"(#{condition.source})"
|
|
225
182
|
end
|
|
226
183
|
end
|
|
227
184
|
|
|
228
|
-
def
|
|
229
|
-
|
|
230
|
-
!
|
|
185
|
+
def parenthesize_method?(node)
|
|
186
|
+
node.call_type? && node.arguments.any? && !node.parenthesized? &&
|
|
187
|
+
!node.comparison_method? && !node.operator_method?
|
|
231
188
|
end
|
|
232
189
|
|
|
233
|
-
def
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
end
|
|
190
|
+
def add_parentheses?(node)
|
|
191
|
+
return true if node.assignment? || node.or_type?
|
|
192
|
+
return true if assignment_in_and?(node)
|
|
193
|
+
return false unless node.call_type?
|
|
238
194
|
|
|
239
|
-
|
|
240
|
-
node.and_type? || node.or_type? ||
|
|
241
|
-
(node.call_type? && node.arguments.any? && !node.parenthesized?)
|
|
195
|
+
(node.arguments.any? && !node.parenthesized?) || node.prefix_not?
|
|
242
196
|
end
|
|
243
197
|
|
|
244
|
-
def
|
|
245
|
-
return
|
|
198
|
+
def assignment_in_and?(node)
|
|
199
|
+
return false unless node.and_type?
|
|
246
200
|
|
|
247
|
-
|
|
248
|
-
parenthesized_method_arguments(condition)
|
|
249
|
-
else
|
|
250
|
-
"(#{condition.source})"
|
|
251
|
-
end
|
|
201
|
+
node.each_descendant.any?(&:assignment?)
|
|
252
202
|
end
|
|
253
203
|
|
|
254
204
|
def parenthesized_method_arguments(node)
|
|
@@ -258,12 +208,28 @@ module RuboCop
|
|
|
258
208
|
"#{method_call}(#{arguments})"
|
|
259
209
|
end
|
|
260
210
|
|
|
261
|
-
def
|
|
262
|
-
|
|
211
|
+
def parenthesized_and(node)
|
|
212
|
+
# We only need to add parentheses around the last clause if it's an assignment,
|
|
213
|
+
# because other clauses will be unchanged by merging conditionals.
|
|
214
|
+
lhs = node.lhs.source
|
|
215
|
+
rhs = parenthesized_and_clause(node.rhs)
|
|
216
|
+
operator = range_with_surrounding_space(node.loc.operator, whitespace: true).source
|
|
217
|
+
|
|
218
|
+
"#{lhs}#{operator}#{rhs}"
|
|
263
219
|
end
|
|
264
220
|
|
|
265
|
-
def
|
|
266
|
-
node.
|
|
221
|
+
def parenthesized_and_clause(node)
|
|
222
|
+
if node.and_type?
|
|
223
|
+
parenthesized_and(node)
|
|
224
|
+
elsif node.assignment?
|
|
225
|
+
"(#{node.source})"
|
|
226
|
+
else
|
|
227
|
+
node.source
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def allow_modifier?
|
|
232
|
+
cop_config['AllowModifier']
|
|
267
233
|
end
|
|
268
234
|
end
|
|
269
235
|
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)
|
|
@@ -51,8 +51,6 @@ module RuboCop
|
|
|
51
51
|
# Pathname.new('/') + 'test'
|
|
52
52
|
#
|
|
53
53
|
class StringConcatenation < Base
|
|
54
|
-
include Util
|
|
55
|
-
include RangeHelp
|
|
56
54
|
extend AutoCorrector
|
|
57
55
|
|
|
58
56
|
MSG = 'Prefer string interpolation to string concatenation.'
|
|
@@ -102,7 +100,7 @@ module RuboCop
|
|
|
102
100
|
node.receiver.str_type? &&
|
|
103
101
|
node.first_argument.str_type? &&
|
|
104
102
|
node.multiline? &&
|
|
105
|
-
node.source
|
|
103
|
+
node.source.match?(/\+\s*\n/)
|
|
106
104
|
end
|
|
107
105
|
|
|
108
106
|
def find_topmost_plus_node(node)
|
|
@@ -129,11 +127,11 @@ module RuboCop
|
|
|
129
127
|
end
|
|
130
128
|
|
|
131
129
|
def uncorrectable?(part)
|
|
132
|
-
part.multiline? || heredoc?(part) || part.each_descendant(:
|
|
130
|
+
part.multiline? || heredoc?(part) || part.each_descendant(:any_block).any?
|
|
133
131
|
end
|
|
134
132
|
|
|
135
133
|
def heredoc?(node)
|
|
136
|
-
return false unless node.
|
|
134
|
+
return false unless node.type?(:str, :dstr)
|
|
137
135
|
|
|
138
136
|
node.heredoc?
|
|
139
137
|
end
|
|
@@ -143,22 +141,28 @@ module RuboCop
|
|
|
143
141
|
end
|
|
144
142
|
|
|
145
143
|
def replacement(parts)
|
|
146
|
-
interpolated_parts =
|
|
147
|
-
parts.map do |part|
|
|
148
|
-
case part.type
|
|
149
|
-
when :str
|
|
150
|
-
value = part.value
|
|
151
|
-
single_quoted?(part) ? value.gsub(/(\\|")/, '\\\\\&') : value.inspect[1..-2]
|
|
152
|
-
when :dstr
|
|
153
|
-
contents_range(part).source
|
|
154
|
-
else
|
|
155
|
-
"\#{#{part.source}}"
|
|
156
|
-
end
|
|
157
|
-
end
|
|
144
|
+
interpolated_parts = parts.map { |part| adjust_str(part) }
|
|
158
145
|
|
|
159
146
|
"\"#{handle_quotes(interpolated_parts).join}\""
|
|
160
147
|
end
|
|
161
148
|
|
|
149
|
+
def adjust_str(part)
|
|
150
|
+
case part.type
|
|
151
|
+
when :str
|
|
152
|
+
if single_quoted?(part)
|
|
153
|
+
part.value.gsub(/(\\|"|#\{|#@|#\$)/, '\\\\\&')
|
|
154
|
+
else
|
|
155
|
+
part.value.inspect[1..-2]
|
|
156
|
+
end
|
|
157
|
+
when :dstr, :begin
|
|
158
|
+
part.children.map do |child|
|
|
159
|
+
adjust_str(child)
|
|
160
|
+
end.join
|
|
161
|
+
else
|
|
162
|
+
"\#{#{part.source}}"
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
162
166
|
def handle_quotes(parts)
|
|
163
167
|
parts.map do |part|
|
|
164
168
|
part == '"' ? '\"' : part
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for inheritance from Struct.new.
|
|
6
|
+
# Checks for inheritance from `Struct.new`. Inheriting from `Struct.new`
|
|
7
|
+
# adds a superfluous level in inheritance tree.
|
|
7
8
|
#
|
|
8
9
|
# @safety
|
|
9
10
|
# Autocorrection is unsafe because it will change the inheritance
|
|
@@ -17,12 +18,18 @@ module RuboCop
|
|
|
17
18
|
# end
|
|
18
19
|
# end
|
|
19
20
|
#
|
|
21
|
+
# Person.ancestors
|
|
22
|
+
# # => [Person, #<Class:0x000000010b4e14a0>, Struct, (...)]
|
|
23
|
+
#
|
|
20
24
|
# # good
|
|
21
25
|
# Person = Struct.new(:first_name, :last_name) do
|
|
22
26
|
# def age
|
|
23
27
|
# 42
|
|
24
28
|
# end
|
|
25
29
|
# end
|
|
30
|
+
#
|
|
31
|
+
# Person.ancestors
|
|
32
|
+
# # => [Person, Struct, (...)]
|
|
26
33
|
class StructInheritance < Base
|
|
27
34
|
include RangeHelp
|
|
28
35
|
extend AutoCorrector
|