rubocop 1.71.1 → 1.88.2
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 +513 -149
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +38 -4
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +48 -11
- data/lib/rubocop/comment_config.rb +60 -18
- data/lib/rubocop/config.rb +53 -16
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +65 -49
- data/lib/rubocop/config_loader_resolver.rb +44 -19
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -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 +7 -2
- data/lib/rubocop/config_validator.rb +7 -6
- data/lib/rubocop/cop/autocorrect_logic.rb +27 -14
- data/lib/rubocop/cop/base.rb +38 -12
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +26 -7
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +36 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +13 -13
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- 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_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +60 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +56 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +9 -2
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +28 -9
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +10 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +35 -2
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +20 -15
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/hash_alignment.rb +5 -8
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +152 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +62 -15
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +236 -41
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +12 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +15 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +18 -3
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +12 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +13 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +93 -11
- data/lib/rubocop/cop/lint/constant_resolution.rb +6 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +219 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +20 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +129 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +19 -10
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -23
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -11
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +268 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +4 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +22 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +123 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +36 -3
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +36 -10
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +17 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +30 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +55 -25
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +11 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +147 -0
- data/lib/rubocop/cop/lint/void.rb +50 -21
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +3 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +38 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +12 -1
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -4
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +5 -7
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +27 -4
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/line_length_help.rb +45 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
- 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/project_index_help.rb +48 -0
- data/lib/rubocop/cop/mixin/range_help.rb +15 -3
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -7
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +25 -6
- data/lib/rubocop/cop/mixin.rb +86 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -2
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -4
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/offense.rb +17 -1
- data/lib/rubocop/cop/registry.rb +66 -39
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +45 -12
- data/lib/rubocop/cop/style/accessor_grouping.rb +46 -8
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +46 -31
- data/lib/rubocop/cop/style/array_first_last.rb +12 -1
- data/lib/rubocop/cop/style/array_intersect.rb +117 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +42 -34
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +67 -12
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +6 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +33 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +20 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/data_inheritance.rb +11 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +6 -6
- data/lib/rubocop/cop/style/documentation_method.rb +12 -8
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +12 -2
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +11 -2
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +181 -18
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +8 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +4 -2
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +15 -1
- data/lib/rubocop/cop/style/for.rb +4 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +85 -14
- 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 +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +29 -23
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +28 -12
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -2
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +102 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -1
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +26 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +83 -16
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +16 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -6
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +8 -1
- data/lib/rubocop/cop/style/lambda_call.rb +26 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +3 -3
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +5 -2
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +12 -3
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +9 -8
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +33 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +11 -5
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -5
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -7
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +4 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +13 -16
- data/lib/rubocop/cop/style/mutable_constant.rb +106 -12
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +21 -12
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +11 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +57 -25
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +4 -0
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +9 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +61 -1
- data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_each.rb +3 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +7 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -10
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +312 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +28 -7
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +111 -37
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +9 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -0
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +6 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +67 -20
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +53 -20
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -12
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +21 -6
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -8
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +77 -101
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +18 -15
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +24 -2
- data/lib/rubocop/cop/style/super_arguments.rb +3 -4
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +10 -7
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +11 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +18 -19
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/team.rb +105 -40
- data/lib/rubocop/cop/util.rb +4 -5
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +10 -3
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +23 -7
- data/lib/rubocop/directive_comment.rb +80 -3
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +38 -13
- data/lib/rubocop/formatter/formatter_set.rb +2 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/junit_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/formatter/simple_text_formatter.rb +0 -2
- data/lib/rubocop/formatter/tap_formatter.rb +5 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lsp/diagnostic.rb +22 -37
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +47 -11
- data/lib/rubocop/lsp/runtime.rb +19 -8
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +11 -18
- data/lib/rubocop/magic_comment.rb +28 -0
- data/lib/rubocop/mcp/server.rb +200 -0
- data/lib/rubocop/options.rb +60 -14
- data/lib/rubocop/path_util.rb +18 -2
- 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/project_index_loader.rb +66 -0
- data/lib/rubocop/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +10 -8
- data/lib/rubocop/result_cache.rb +72 -47
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +9 -3
- data/lib/rubocop/rspec/shared_contexts.rb +71 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +188 -65
- data/lib/rubocop/server/cache.rb +56 -41
- 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/server/core.rb +8 -0
- data/lib/rubocop/target_finder.rb +21 -10
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/version.rb +50 -10
- data/lib/rubocop.rb +47 -96
- data/lib/ruby_lsp/rubocop/addon.rb +29 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +86 -16
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for manual counting patterns that can be replaced by `Enumerable#tally`.
|
|
7
|
+
#
|
|
8
|
+
# The cop detects the following patterns:
|
|
9
|
+
#
|
|
10
|
+
# - `each_with_object(Hash.new(0)) { |item, counts| counts[item] += 1 }`
|
|
11
|
+
# - `group_by(&:itself).transform_values(&:count)`
|
|
12
|
+
# - `group_by { |x| x }.transform_values(&:size)`
|
|
13
|
+
# - `group_by { |x| x }.transform_values { |v| v.length }`
|
|
14
|
+
#
|
|
15
|
+
# @safety
|
|
16
|
+
# This cop is unsafe because it cannot guarantee that the receiver
|
|
17
|
+
# is an `Enumerable` by static analysis, so the correction may
|
|
18
|
+
# not be actually equivalent.
|
|
19
|
+
#
|
|
20
|
+
# @example
|
|
21
|
+
# # bad
|
|
22
|
+
# array.each_with_object(Hash.new(0)) { |item, counts| counts[item] += 1 }
|
|
23
|
+
#
|
|
24
|
+
# # bad
|
|
25
|
+
# array.group_by(&:itself).transform_values(&:count)
|
|
26
|
+
#
|
|
27
|
+
# # bad
|
|
28
|
+
# array.group_by { |item| item }.transform_values(&:size)
|
|
29
|
+
#
|
|
30
|
+
# # bad
|
|
31
|
+
# array.group_by { |item| item }.transform_values { |v| v.length }
|
|
32
|
+
#
|
|
33
|
+
# # good
|
|
34
|
+
# array.tally
|
|
35
|
+
#
|
|
36
|
+
class TallyMethod < Base
|
|
37
|
+
extend AutoCorrector
|
|
38
|
+
extend TargetRubyVersion
|
|
39
|
+
include RangeHelp
|
|
40
|
+
|
|
41
|
+
minimum_target_ruby_version 2.7
|
|
42
|
+
|
|
43
|
+
MSG_EACH_WITH_OBJECT = 'Use `tally` instead of `each_with_object`.'
|
|
44
|
+
MSG_GROUP_BY = 'Use `tally` instead of `group_by` and `transform_values`.'
|
|
45
|
+
RESTRICT_ON_SEND = %i[each_with_object transform_values].freeze
|
|
46
|
+
COUNTING_METHODS = %i[count size length].to_set.freeze
|
|
47
|
+
|
|
48
|
+
# Pattern 1: collection.each_with_object(Hash.new(0)) { |elem, hash| hash[elem] += 1 }
|
|
49
|
+
# @!method tally_each_with_object?(node)
|
|
50
|
+
def_node_matcher :tally_each_with_object?, <<~PATTERN
|
|
51
|
+
{
|
|
52
|
+
(block
|
|
53
|
+
(call _ :each_with_object
|
|
54
|
+
(send (const {nil? cbase} :Hash) :new (int 0)))
|
|
55
|
+
(args (arg _elem) (arg _hash))
|
|
56
|
+
(op_asgn
|
|
57
|
+
(send (lvar _hash) :[] (lvar _elem)) :+ (int 1)))
|
|
58
|
+
(numblock
|
|
59
|
+
(call _ :each_with_object
|
|
60
|
+
(send (const {nil? cbase} :Hash) :new (int 0)))
|
|
61
|
+
2
|
|
62
|
+
(op_asgn
|
|
63
|
+
(send (lvar :_2) :[] (lvar :_1)) :+ (int 1)))
|
|
64
|
+
}
|
|
65
|
+
PATTERN
|
|
66
|
+
|
|
67
|
+
# Pattern 2: collection.group_by(&:itself).transform_values(&:count/size/length)
|
|
68
|
+
# @!method tally_group_by_symbol?(node)
|
|
69
|
+
def_node_matcher :tally_group_by_symbol?, <<~PATTERN
|
|
70
|
+
(call
|
|
71
|
+
(call _ :group_by (block_pass (sym :itself)))
|
|
72
|
+
:transform_values
|
|
73
|
+
(block_pass (sym %COUNTING_METHODS)))
|
|
74
|
+
PATTERN
|
|
75
|
+
|
|
76
|
+
# Pattern 3: collection.group_by { |x| x }.transform_values(&:count/size/length)
|
|
77
|
+
# @!method tally_group_by_identity_block?(node)
|
|
78
|
+
def_node_matcher :tally_group_by_identity_block?, <<~PATTERN
|
|
79
|
+
(call
|
|
80
|
+
{
|
|
81
|
+
(block (call _ :group_by) (args (arg _x)) (lvar _x))
|
|
82
|
+
(numblock (call _ :group_by) 1 (lvar :_1))
|
|
83
|
+
(itblock (call _ :group_by) :it (lvar :it))
|
|
84
|
+
}
|
|
85
|
+
:transform_values
|
|
86
|
+
(block_pass (sym %COUNTING_METHODS)))
|
|
87
|
+
PATTERN
|
|
88
|
+
|
|
89
|
+
# Pattern 4: collection.group_by(&:itself).transform_values { |v| v.count/size/length }
|
|
90
|
+
# collection.group_by { |x| x }.transform_values { |v| v.count/size/length }
|
|
91
|
+
# @!method tally_group_by_transform_block?(node)
|
|
92
|
+
def_node_matcher :tally_group_by_transform_block?, <<~PATTERN
|
|
93
|
+
{
|
|
94
|
+
(block
|
|
95
|
+
(call
|
|
96
|
+
{
|
|
97
|
+
(call _ :group_by (block_pass (sym :itself)))
|
|
98
|
+
(block (call _ :group_by) (args (arg _x)) (lvar _x))
|
|
99
|
+
(numblock (call _ :group_by) 1 (lvar :_1))
|
|
100
|
+
(itblock (call _ :group_by) :it (lvar :it))
|
|
101
|
+
}
|
|
102
|
+
:transform_values)
|
|
103
|
+
(args (arg _v))
|
|
104
|
+
(send (lvar _v) %COUNTING_METHODS))
|
|
105
|
+
(numblock
|
|
106
|
+
(call
|
|
107
|
+
{
|
|
108
|
+
(call _ :group_by (block_pass (sym :itself)))
|
|
109
|
+
(block (call _ :group_by) (args (arg _x)) (lvar _x))
|
|
110
|
+
(numblock (call _ :group_by) 1 (lvar :_1))
|
|
111
|
+
(itblock (call _ :group_by) :it (lvar :it))
|
|
112
|
+
}
|
|
113
|
+
:transform_values)
|
|
114
|
+
1
|
|
115
|
+
(send (lvar :_1) %COUNTING_METHODS))
|
|
116
|
+
(itblock
|
|
117
|
+
(call
|
|
118
|
+
{
|
|
119
|
+
(call _ :group_by (block_pass (sym :itself)))
|
|
120
|
+
(block (call _ :group_by) (args (arg _x)) (lvar _x))
|
|
121
|
+
(numblock (call _ :group_by) 1 (lvar :_1))
|
|
122
|
+
(itblock (call _ :group_by) :it (lvar :it))
|
|
123
|
+
}
|
|
124
|
+
:transform_values)
|
|
125
|
+
:it
|
|
126
|
+
(send (lvar :it) %COUNTING_METHODS))
|
|
127
|
+
}
|
|
128
|
+
PATTERN
|
|
129
|
+
def on_send(node)
|
|
130
|
+
if node.method?(:each_with_object)
|
|
131
|
+
check_each_with_object(node)
|
|
132
|
+
elsif node.method?(:transform_values)
|
|
133
|
+
check_transform_values(node)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
alias on_csend on_send
|
|
137
|
+
|
|
138
|
+
private
|
|
139
|
+
|
|
140
|
+
def check_each_with_object(node)
|
|
141
|
+
block_node = node.block_node
|
|
142
|
+
return unless block_node
|
|
143
|
+
return unless tally_each_with_object?(block_node)
|
|
144
|
+
|
|
145
|
+
add_offense(node.loc.selector, message: MSG_EACH_WITH_OBJECT) do |corrector|
|
|
146
|
+
corrector.replace(replacement_range(node, block_node), 'tally')
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def check_transform_values(node)
|
|
151
|
+
if tally_group_by_symbol?(node) || tally_group_by_identity_block?(node)
|
|
152
|
+
register_group_by_offense(node, node)
|
|
153
|
+
elsif (block_node = node.block_node) && tally_group_by_transform_block?(block_node)
|
|
154
|
+
register_group_by_offense(node, block_node)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def register_group_by_offense(transform_node, end_node)
|
|
159
|
+
group_by_node = group_by_send_node(transform_node)
|
|
160
|
+
|
|
161
|
+
add_offense(group_by_node.loc.selector, message: MSG_GROUP_BY) do |corrector|
|
|
162
|
+
corrector.replace(replacement_range(group_by_node, end_node), 'tally')
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def group_by_send_node(transform_node)
|
|
167
|
+
receiver = transform_node.receiver
|
|
168
|
+
if receiver.type?(:any_block)
|
|
169
|
+
receiver.send_node
|
|
170
|
+
else
|
|
171
|
+
receiver
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def replacement_range(start_node, end_node)
|
|
176
|
+
range_between(start_node.loc.selector.begin_pos, end_node.source_range.end_pos)
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
@@ -113,6 +113,10 @@ module RuboCop
|
|
|
113
113
|
def offense?(node)
|
|
114
114
|
condition = node.condition
|
|
115
115
|
|
|
116
|
+
# A modifier `if`/`unless` requires the parentheses, e.g. `(a if b) ? x : y`,
|
|
117
|
+
# so removing them would change the meaning. Don't flag it.
|
|
118
|
+
return false if parenthesized_modifier_condition?(condition)
|
|
119
|
+
|
|
116
120
|
if safe_assignment?(condition)
|
|
117
121
|
!safe_assignment_allowed?
|
|
118
122
|
else
|
|
@@ -174,6 +178,13 @@ module RuboCop
|
|
|
174
178
|
condition.children.any? { |child| below_ternary_precedence?(child) }
|
|
175
179
|
end
|
|
176
180
|
|
|
181
|
+
def parenthesized_modifier_condition?(condition)
|
|
182
|
+
return false unless condition.begin_type?
|
|
183
|
+
|
|
184
|
+
inner = condition.children.first
|
|
185
|
+
inner&.if_type? && inner.modifier_form?
|
|
186
|
+
end
|
|
187
|
+
|
|
177
188
|
def unparenthesized_method_call?(child)
|
|
178
189
|
/^[a-z]/i.match?(method_name(child)) && !child.parenthesized?
|
|
179
190
|
end
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Newcomers to
|
|
6
|
+
# Newcomers to Ruby applications may write top-level methods,
|
|
7
7
|
# when ideally they should be organized in appropriate classes or modules.
|
|
8
8
|
# This cop looks for definitions of top-level methods and warns about them.
|
|
9
9
|
#
|
|
10
|
-
# However for
|
|
10
|
+
# However, for Ruby scripts it is perfectly fine to use top-level methods.
|
|
11
11
|
# Hence this cop is disabled by default.
|
|
12
12
|
#
|
|
13
13
|
# @example
|
|
@@ -64,6 +64,7 @@ module RuboCop
|
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
alias on_numblock on_block
|
|
67
|
+
alias on_itblock on_block
|
|
67
68
|
|
|
68
69
|
private
|
|
69
70
|
|
|
@@ -10,6 +10,9 @@ module RuboCop
|
|
|
10
10
|
# for all parenthesized multi-line method calls with arguments.
|
|
11
11
|
# * `comma`: Requires a comma after the last argument, but only for
|
|
12
12
|
# parenthesized method calls where each argument is on its own line.
|
|
13
|
+
# * `diff_comma`: Requires a comma after the last argument, but only
|
|
14
|
+
# when that argument is followed by an immediate newline, even if
|
|
15
|
+
# there is an inline comment on the same line.
|
|
13
16
|
# * `no_comma`: Requires that there is no comma after the last
|
|
14
17
|
# argument.
|
|
15
18
|
#
|
|
@@ -75,14 +78,62 @@ module RuboCop
|
|
|
75
78
|
# 2,
|
|
76
79
|
# )
|
|
77
80
|
#
|
|
81
|
+
# @example EnforcedStyleForMultiline: diff_comma
|
|
82
|
+
# # bad
|
|
83
|
+
# method(1, 2,)
|
|
84
|
+
#
|
|
85
|
+
# # good
|
|
86
|
+
# method(1, 2)
|
|
87
|
+
#
|
|
88
|
+
# # good
|
|
89
|
+
# method(
|
|
90
|
+
# 1, 2,
|
|
91
|
+
# 3,
|
|
92
|
+
# )
|
|
93
|
+
#
|
|
94
|
+
# # good
|
|
95
|
+
# method(
|
|
96
|
+
# 1, 2, 3,
|
|
97
|
+
# )
|
|
98
|
+
#
|
|
99
|
+
# # good
|
|
100
|
+
# method(
|
|
101
|
+
# 1,
|
|
102
|
+
# 2,
|
|
103
|
+
# )
|
|
104
|
+
#
|
|
105
|
+
# # bad
|
|
106
|
+
# method(1, [
|
|
107
|
+
# 2,
|
|
108
|
+
# ],)
|
|
109
|
+
#
|
|
110
|
+
# # good
|
|
111
|
+
# method(1, [
|
|
112
|
+
# 2,
|
|
113
|
+
# ])
|
|
114
|
+
#
|
|
115
|
+
# # bad
|
|
116
|
+
# object[1, 2,
|
|
117
|
+
# 3, 4,]
|
|
118
|
+
#
|
|
119
|
+
# # good
|
|
120
|
+
# object[1, 2,
|
|
121
|
+
# 3, 4]
|
|
122
|
+
#
|
|
78
123
|
# @example EnforcedStyleForMultiline: no_comma (default)
|
|
79
124
|
# # bad
|
|
80
125
|
# method(1, 2,)
|
|
81
126
|
#
|
|
127
|
+
# # bad
|
|
128
|
+
# object[1, 2,]
|
|
129
|
+
#
|
|
82
130
|
# # good
|
|
83
131
|
# method(1, 2)
|
|
84
132
|
#
|
|
85
133
|
# # good
|
|
134
|
+
# object[1, 2]
|
|
135
|
+
#
|
|
136
|
+
# # good
|
|
86
137
|
# method(
|
|
87
138
|
# 1,
|
|
88
139
|
# 2
|
|
@@ -96,7 +147,7 @@ module RuboCop
|
|
|
96
147
|
end
|
|
97
148
|
|
|
98
149
|
def on_send(node)
|
|
99
|
-
return unless node.arguments? && node.parenthesized?
|
|
150
|
+
return unless node.arguments? && (node.parenthesized? || node.method?(:[]))
|
|
100
151
|
|
|
101
152
|
check(node, node.arguments, 'parameter of %<article>s method call',
|
|
102
153
|
node.last_argument.source_range.end_pos,
|
|
@@ -6,12 +6,13 @@ module RuboCop
|
|
|
6
6
|
# Checks for trailing comma in array literals.
|
|
7
7
|
# The configuration options are:
|
|
8
8
|
#
|
|
9
|
-
# * `consistent_comma`: Requires a comma after the
|
|
10
|
-
#
|
|
11
|
-
# * `comma`: Requires a comma after last item in an array,
|
|
12
|
-
#
|
|
13
|
-
# * `
|
|
14
|
-
#
|
|
9
|
+
# * `consistent_comma`: Requires a comma after the last item of all non-empty, multiline array
|
|
10
|
+
# literals.
|
|
11
|
+
# * `comma`: Requires a comma after the last item in an array, but only when each item is on
|
|
12
|
+
# its own line.
|
|
13
|
+
# * `diff_comma`: Requires a comma after the last item in an array, but only when that item is
|
|
14
|
+
# followed by an immediate newline, even if there is an inline comment on the same line.
|
|
15
|
+
# * `no_comma`: Does not require a comma after the last item in an array
|
|
15
16
|
#
|
|
16
17
|
# @example EnforcedStyleForMultiline: consistent_comma
|
|
17
18
|
# # bad
|
|
@@ -37,6 +38,14 @@ module RuboCop
|
|
|
37
38
|
# 2,
|
|
38
39
|
# ]
|
|
39
40
|
#
|
|
41
|
+
# # bad
|
|
42
|
+
# a = [1, 2,
|
|
43
|
+
# 3, 4]
|
|
44
|
+
#
|
|
45
|
+
# # good
|
|
46
|
+
# a = [1, 2,
|
|
47
|
+
# 3, 4,]
|
|
48
|
+
#
|
|
40
49
|
# @example EnforcedStyleForMultiline: comma
|
|
41
50
|
# # bad
|
|
42
51
|
# a = [1, 2,]
|
|
@@ -72,6 +81,38 @@ module RuboCop
|
|
|
72
81
|
# 2,
|
|
73
82
|
# ]
|
|
74
83
|
#
|
|
84
|
+
# @example EnforcedStyleForMultiline: diff_comma
|
|
85
|
+
# # bad
|
|
86
|
+
# a = [1, 2,]
|
|
87
|
+
#
|
|
88
|
+
# # good
|
|
89
|
+
# a = [1, 2]
|
|
90
|
+
#
|
|
91
|
+
# # good
|
|
92
|
+
# a = [
|
|
93
|
+
# 1, 2,
|
|
94
|
+
# 3,
|
|
95
|
+
# ]
|
|
96
|
+
#
|
|
97
|
+
# # good
|
|
98
|
+
# a = [
|
|
99
|
+
# 1, 2, 3,
|
|
100
|
+
# ]
|
|
101
|
+
#
|
|
102
|
+
# # good
|
|
103
|
+
# a = [
|
|
104
|
+
# 1,
|
|
105
|
+
# 2,
|
|
106
|
+
# ]
|
|
107
|
+
#
|
|
108
|
+
# # bad
|
|
109
|
+
# a = [1, 2,
|
|
110
|
+
# 3, 4,]
|
|
111
|
+
#
|
|
112
|
+
# # good
|
|
113
|
+
# a = [1, 2,
|
|
114
|
+
# 3, 4]
|
|
115
|
+
#
|
|
75
116
|
# @example EnforcedStyleForMultiline: no_comma (default)
|
|
76
117
|
# # bad
|
|
77
118
|
# a = [1, 2,]
|
|
@@ -64,7 +64,7 @@ module RuboCop
|
|
|
64
64
|
|
|
65
65
|
MSG = 'Useless trailing comma present in block arguments.'
|
|
66
66
|
|
|
67
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
67
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
|
|
68
68
|
# lambda literal (`->`) never has block arguments.
|
|
69
69
|
return if node.send_node.lambda_literal?
|
|
70
70
|
return unless useless_trailing_comma?(node)
|
|
@@ -97,7 +97,7 @@ module RuboCop
|
|
|
97
97
|
pipes = tokens.select { |token| token.type == :tPIPE }
|
|
98
98
|
begin_pos, end_pos = pipes.map { |pipe| tokens.index(pipe) }
|
|
99
99
|
|
|
100
|
-
tokens[begin_pos + 1..end_pos - 1]
|
|
100
|
+
tokens[(begin_pos + 1)..(end_pos - 1)]
|
|
101
101
|
end
|
|
102
102
|
end
|
|
103
103
|
end
|
|
@@ -6,12 +6,13 @@ module RuboCop
|
|
|
6
6
|
# Checks for trailing comma in hash literals.
|
|
7
7
|
# The configuration options are:
|
|
8
8
|
#
|
|
9
|
-
# * `consistent_comma`: Requires a comma after the
|
|
10
|
-
#
|
|
11
|
-
# * `comma`: Requires a comma after the last item in a hash,
|
|
12
|
-
#
|
|
13
|
-
# * `
|
|
14
|
-
#
|
|
9
|
+
# * `consistent_comma`: Requires a comma after the last item of all non-empty, multiline hash
|
|
10
|
+
# literals.
|
|
11
|
+
# * `comma`: Requires a comma after the last item in a hash, but only when each item is on its
|
|
12
|
+
# own line.
|
|
13
|
+
# * `diff_comma`: Requires a comma after the last item in a hash, but only when that item is
|
|
14
|
+
# followed by an immediate newline, even if there is an inline comment on the same line.
|
|
15
|
+
# * `no_comma`: Does not require a comma after the last item in a hash
|
|
15
16
|
#
|
|
16
17
|
# @example EnforcedStyleForMultiline: consistent_comma
|
|
17
18
|
#
|
|
@@ -38,6 +39,14 @@ module RuboCop
|
|
|
38
39
|
# bar: 2,
|
|
39
40
|
# }
|
|
40
41
|
#
|
|
42
|
+
# # bad
|
|
43
|
+
# a = { foo: 1, bar: 2,
|
|
44
|
+
# baz: 3, qux: 4 }
|
|
45
|
+
#
|
|
46
|
+
# # good
|
|
47
|
+
# a = { foo: 1, bar: 2,
|
|
48
|
+
# baz: 3, qux: 4, }
|
|
49
|
+
#
|
|
41
50
|
# @example EnforcedStyleForMultiline: comma
|
|
42
51
|
#
|
|
43
52
|
# # bad
|
|
@@ -74,6 +83,39 @@ module RuboCop
|
|
|
74
83
|
# bar: 2,
|
|
75
84
|
# }
|
|
76
85
|
#
|
|
86
|
+
# @example EnforcedStyleForMultiline: diff_comma
|
|
87
|
+
#
|
|
88
|
+
# # bad
|
|
89
|
+
# a = { foo: 1, bar: 2, }
|
|
90
|
+
#
|
|
91
|
+
# # good
|
|
92
|
+
# a = { foo: 1, bar: 2 }
|
|
93
|
+
#
|
|
94
|
+
# # good
|
|
95
|
+
# a = {
|
|
96
|
+
# foo: 1, bar: 2,
|
|
97
|
+
# qux: 3,
|
|
98
|
+
# }
|
|
99
|
+
#
|
|
100
|
+
# # good
|
|
101
|
+
# a = {
|
|
102
|
+
# foo: 1, bar: 2, qux: 3,
|
|
103
|
+
# }
|
|
104
|
+
#
|
|
105
|
+
# # good
|
|
106
|
+
# a = {
|
|
107
|
+
# foo: 1,
|
|
108
|
+
# bar: 2,
|
|
109
|
+
# }
|
|
110
|
+
#
|
|
111
|
+
# # bad
|
|
112
|
+
# a = { foo: 1, bar: 2,
|
|
113
|
+
# baz: 3, qux: 4, }
|
|
114
|
+
#
|
|
115
|
+
# # good
|
|
116
|
+
# a = { foo: 1, bar: 2,
|
|
117
|
+
# baz: 3, qux: 4 }
|
|
118
|
+
#
|
|
77
119
|
# @example EnforcedStyleForMultiline: no_comma (default)
|
|
78
120
|
#
|
|
79
121
|
# # bad
|
|
@@ -7,26 +7,26 @@ module RuboCop
|
|
|
7
7
|
#
|
|
8
8
|
# @example
|
|
9
9
|
# # bad
|
|
10
|
-
# a, b, _ = foo
|
|
11
|
-
# a, b, _, = foo
|
|
12
|
-
# a, _, _ = foo
|
|
13
|
-
# a, _, _, = foo
|
|
10
|
+
# a, b, _ = foo
|
|
11
|
+
# a, b, _, = foo
|
|
12
|
+
# a, _, _ = foo
|
|
13
|
+
# a, _, _, = foo
|
|
14
14
|
#
|
|
15
15
|
# # good
|
|
16
|
-
# a, b, = foo
|
|
17
|
-
# a, = foo
|
|
18
|
-
# *a, b, _ = foo
|
|
16
|
+
# a, b, = foo
|
|
17
|
+
# a, = foo
|
|
18
|
+
# *a, b, _ = foo
|
|
19
19
|
# # => We need to know to not include 2 variables in a
|
|
20
|
-
# a, *b, _ = foo
|
|
21
|
-
# # => The correction `a, *b, = foo
|
|
20
|
+
# a, *b, _ = foo
|
|
21
|
+
# # => The correction `a, *b, = foo` is a syntax error
|
|
22
22
|
#
|
|
23
23
|
# @example AllowNamedUnderscoreVariables: true (default)
|
|
24
24
|
# # good
|
|
25
|
-
# a, b, _something = foo
|
|
25
|
+
# a, b, _something = foo
|
|
26
26
|
#
|
|
27
27
|
# @example AllowNamedUnderscoreVariables: false
|
|
28
28
|
# # bad
|
|
29
|
-
# a, b, _something = foo
|
|
29
|
+
# a, b, _something = foo
|
|
30
30
|
#
|
|
31
31
|
class TrailingUnderscoreVariable < Base
|
|
32
32
|
include SurroundingSpace
|
|
@@ -113,9 +113,7 @@ module RuboCop
|
|
|
113
113
|
|
|
114
114
|
return unless first_offense
|
|
115
115
|
|
|
116
|
-
if unused_variables_only?(first_offense, variables)
|
|
117
|
-
return unused_range(node.type, mlhs_node, node.rhs)
|
|
118
|
-
end
|
|
116
|
+
return unused_range(node, mlhs_node) if unused_variables_only?(first_offense, variables)
|
|
119
117
|
|
|
120
118
|
return range_for_parentheses(first_offense, mlhs_node) if Util.parentheses?(mlhs_node)
|
|
121
119
|
|
|
@@ -130,13 +128,14 @@ module RuboCop
|
|
|
130
128
|
offense.source_range == variables.first.source_range
|
|
131
129
|
end
|
|
132
130
|
|
|
133
|
-
def unused_range(
|
|
131
|
+
def unused_range(node, mlhs_node)
|
|
134
132
|
start_range = mlhs_node.source_range.begin_pos
|
|
135
133
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
134
|
+
# `node` can be an `mlhs` when recursing into a nested destructuring
|
|
135
|
+
# group; only a `masgn` has a right-hand side to anchor against.
|
|
136
|
+
end_range = if node.masgn_type?
|
|
137
|
+
node.rhs.source_range.begin_pos
|
|
138
|
+
else
|
|
140
139
|
mlhs_node.source_range.end_pos
|
|
141
140
|
end
|
|
142
141
|
|
|
@@ -113,7 +113,7 @@ module RuboCop
|
|
|
113
113
|
private
|
|
114
114
|
|
|
115
115
|
def in_module_or_instance_eval?(node)
|
|
116
|
-
node.each_ancestor(:
|
|
116
|
+
node.each_ancestor(:any_block, :class, :sclass, :module).each do |pnode|
|
|
117
117
|
case pnode.type
|
|
118
118
|
when :class, :sclass
|
|
119
119
|
return false
|
|
@@ -234,7 +234,7 @@ module RuboCop
|
|
|
234
234
|
def autocorrect_class(corrector, node)
|
|
235
235
|
kind = trivial_accessor_kind(node)
|
|
236
236
|
|
|
237
|
-
return unless names_match?(node) && kind
|
|
237
|
+
return unless names_match?(node) && !node.predicate_method? && kind
|
|
238
238
|
|
|
239
239
|
indent = ' ' * node.loc.column
|
|
240
240
|
corrector.replace(
|
|
@@ -20,7 +20,6 @@ module RuboCop
|
|
|
20
20
|
# # do a different thing...
|
|
21
21
|
# end
|
|
22
22
|
class UnlessElse < Base
|
|
23
|
-
include RangeHelp
|
|
24
23
|
extend AutoCorrector
|
|
25
24
|
|
|
26
25
|
MSG = 'Do not use `unless` with `else`. Rewrite these with the positive case first.'
|
|
@@ -29,25 +28,27 @@ module RuboCop
|
|
|
29
28
|
return unless node.unless? && node.else?
|
|
30
29
|
|
|
31
30
|
add_offense(node) do |corrector|
|
|
32
|
-
body_range = range_between_condition_and_else(node, node.condition)
|
|
33
|
-
else_range = range_between_else_and_end(node)
|
|
34
|
-
|
|
35
31
|
next if part_of_ignored_node?(node)
|
|
36
32
|
|
|
37
33
|
corrector.replace(node.loc.keyword, 'if')
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
|
|
35
|
+
body_range = range_between_condition_and_else(node)
|
|
36
|
+
else_range = range_between_else_and_end(node)
|
|
37
|
+
|
|
38
|
+
corrector.swap(body_range, else_range)
|
|
40
39
|
end
|
|
41
40
|
|
|
42
41
|
ignore_node(node)
|
|
43
42
|
end
|
|
44
43
|
|
|
45
|
-
def range_between_condition_and_else(node
|
|
46
|
-
|
|
44
|
+
def range_between_condition_and_else(node)
|
|
45
|
+
range = node.loc.begin ? node.loc.begin.end : node.condition.source_range
|
|
46
|
+
|
|
47
|
+
range.end.join(node.loc.else.begin)
|
|
47
48
|
end
|
|
48
49
|
|
|
49
50
|
def range_between_else_and_end(node)
|
|
50
|
-
|
|
51
|
+
node.loc.else.end.join(node.loc.end.begin)
|
|
51
52
|
end
|
|
52
53
|
end
|
|
53
54
|
end
|
|
@@ -14,11 +14,11 @@ module RuboCop
|
|
|
14
14
|
#
|
|
15
15
|
# `forbid_mixed_logical_operators` style forbids the use of more than one type
|
|
16
16
|
# of logical operators. This makes the `unless` condition easier to read
|
|
17
|
-
# because either all conditions need to be met or any condition
|
|
17
|
+
# because either all conditions need to be met or any condition needs to be met
|
|
18
18
|
# in order for the expression to be truthy or falsey.
|
|
19
19
|
#
|
|
20
|
-
# `forbid_logical_operators` style forbids any use of logical
|
|
21
|
-
# This makes it even
|
|
20
|
+
# `forbid_logical_operators` style forbids any use of logical operators.
|
|
21
|
+
# This makes it even easier to read the `unless` condition as
|
|
22
22
|
# there is only one condition in the expression.
|
|
23
23
|
#
|
|
24
24
|
# @example EnforcedStyle: forbid_mixed_logical_operators (default)
|
|
@@ -33,6 +33,7 @@ module RuboCop
|
|
|
33
33
|
|
|
34
34
|
def on_while(node)
|
|
35
35
|
return unless node.multiline? && node.do?
|
|
36
|
+
return if same_line_body?(node)
|
|
36
37
|
|
|
37
38
|
add_offense(node.loc.begin, message: format(MSG, keyword: node.keyword)) do |corrector|
|
|
38
39
|
do_range = node.condition.source_range.end.join(node.loc.begin)
|
|
@@ -41,6 +42,12 @@ module RuboCop
|
|
|
41
42
|
end
|
|
42
43
|
end
|
|
43
44
|
alias on_until on_while
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def same_line_body?(node)
|
|
49
|
+
node.body && same_line?(node.loc.begin, node.body)
|
|
50
|
+
end
|
|
44
51
|
end
|
|
45
52
|
end
|
|
46
53
|
end
|
|
@@ -16,6 +16,11 @@ module RuboCop
|
|
|
16
16
|
# # good
|
|
17
17
|
# x += 1 while x < 10
|
|
18
18
|
#
|
|
19
|
+
# # good
|
|
20
|
+
# while x < 10
|
|
21
|
+
# y += 1 if x.odd?
|
|
22
|
+
# end
|
|
23
|
+
#
|
|
19
24
|
# # bad
|
|
20
25
|
# until x > 10
|
|
21
26
|
# x += 1
|
|
@@ -24,7 +29,11 @@ module RuboCop
|
|
|
24
29
|
# # good
|
|
25
30
|
# x += 1 until x > 10
|
|
26
31
|
#
|
|
27
|
-
#
|
|
32
|
+
# # good
|
|
33
|
+
# until x > 10
|
|
34
|
+
# y += 1 unless x.even?
|
|
35
|
+
# end
|
|
36
|
+
#
|
|
28
37
|
# # bad
|
|
29
38
|
# x += 100 while x < 500 # a long comment that makes code too long if it were a single line
|
|
30
39
|
#
|
|
@@ -46,6 +55,12 @@ module RuboCop
|
|
|
46
55
|
end
|
|
47
56
|
end
|
|
48
57
|
alias on_until on_while
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def non_eligible_body?(body)
|
|
62
|
+
body&.conditional? || super
|
|
63
|
+
end
|
|
49
64
|
end
|
|
50
65
|
end
|
|
51
66
|
end
|