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
|
@@ -4,8 +4,10 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for grouping of accessors in `class` and `module` bodies.
|
|
7
|
-
# By default it enforces accessors to be placed in grouped
|
|
8
|
-
#
|
|
7
|
+
# By default it enforces accessors to be placed in grouped
|
|
8
|
+
# declarations, reducing boilerplate. It can also be configured
|
|
9
|
+
# to enforce separating them into individual declarations for
|
|
10
|
+
# easier diffing and per-attribute documentation.
|
|
9
11
|
#
|
|
10
12
|
# NOTE: If there is a method call before the accessor method it is always allowed
|
|
11
13
|
# as it might be intended like Sorbet.
|
|
@@ -84,7 +86,10 @@ module RuboCop
|
|
|
84
86
|
|
|
85
87
|
def autocorrect(corrector, node)
|
|
86
88
|
if (preferred_accessors = preferred_accessors(node))
|
|
87
|
-
corrector.replace(
|
|
89
|
+
corrector.replace(
|
|
90
|
+
grouped_style? ? node : range_with_trailing_argument_comment(node),
|
|
91
|
+
preferred_accessors
|
|
92
|
+
)
|
|
88
93
|
else
|
|
89
94
|
range = range_with_surrounding_space(node.source_range, side: :left)
|
|
90
95
|
corrector.remove(range)
|
|
@@ -139,12 +144,16 @@ module RuboCop
|
|
|
139
144
|
style == :separated
|
|
140
145
|
end
|
|
141
146
|
|
|
147
|
+
def groupable_sibling_accessor?(node, sibling)
|
|
148
|
+
sibling.attribute_accessor? &&
|
|
149
|
+
sibling.method?(node.method_name) &&
|
|
150
|
+
node_visibility(sibling) == node_visibility(node) &&
|
|
151
|
+
groupable_accessor?(sibling) && !previous_line_comment?(sibling)
|
|
152
|
+
end
|
|
153
|
+
|
|
142
154
|
def groupable_sibling_accessors(send_node)
|
|
143
155
|
send_node.parent.each_child_node(:send).select do |sibling|
|
|
144
|
-
|
|
145
|
-
sibling.method?(send_node.method_name) &&
|
|
146
|
-
node_visibility(sibling) == node_visibility(send_node) &&
|
|
147
|
-
groupable_accessor?(sibling) && !previous_line_comment?(sibling)
|
|
156
|
+
groupable_sibling_accessor?(send_node, sibling)
|
|
148
157
|
end
|
|
149
158
|
end
|
|
150
159
|
|
|
@@ -155,13 +164,23 @@ module RuboCop
|
|
|
155
164
|
|
|
156
165
|
def preferred_accessors(node)
|
|
157
166
|
if grouped_style?
|
|
167
|
+
return if skip_for_grouping?(node)
|
|
168
|
+
|
|
158
169
|
accessors = groupable_sibling_accessors(node)
|
|
159
|
-
|
|
170
|
+
if node.loc == accessors.first.loc || skip_for_grouping?(accessors.first)
|
|
171
|
+
group_accessors(node, accessors)
|
|
172
|
+
end
|
|
160
173
|
else
|
|
161
174
|
separate_accessors(node)
|
|
162
175
|
end
|
|
163
176
|
end
|
|
164
177
|
|
|
178
|
+
# Group after constants
|
|
179
|
+
def skip_for_grouping?(node)
|
|
180
|
+
node.right_siblings.any?(&:casgn_type?) &&
|
|
181
|
+
node.right_siblings.any? { |n| n.send_type? && groupable_sibling_accessor?(node, n) }
|
|
182
|
+
end
|
|
183
|
+
|
|
165
184
|
def group_accessors(node, accessors)
|
|
166
185
|
accessor_names = accessors.flat_map { |accessor| accessor.arguments.map(&:source) }.uniq
|
|
167
186
|
|
|
@@ -182,6 +201,25 @@ module RuboCop
|
|
|
182
201
|
end
|
|
183
202
|
end.join("\n")
|
|
184
203
|
end
|
|
204
|
+
|
|
205
|
+
def range_with_trailing_argument_comment(node)
|
|
206
|
+
comment = trailing_argument_comment(node)
|
|
207
|
+
if comment
|
|
208
|
+
add_range(node.source_range, comment.source_range)
|
|
209
|
+
else
|
|
210
|
+
node
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# For a single-line declaration the parser associates the trailing
|
|
215
|
+
# comment with the first argument, not `last_argument`, so look through
|
|
216
|
+
# all arguments for a comment that trails the whole node.
|
|
217
|
+
def trailing_argument_comment(node)
|
|
218
|
+
comments = node.arguments.filter_map do |argument|
|
|
219
|
+
processed_source.ast_with_comments[argument].last
|
|
220
|
+
end
|
|
221
|
+
comments.find { |comment| comment.source_range.begin_pos >= node.source_range.end_pos }
|
|
222
|
+
end
|
|
185
223
|
end
|
|
186
224
|
end
|
|
187
225
|
end
|
|
@@ -4,10 +4,13 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Enforces the use of either `#alias` or `#alias_method`
|
|
7
|
-
# depending on configuration.
|
|
7
|
+
# depending on configuration. Consistent use of one or the
|
|
8
|
+
# other prevents confusion about their different semantics
|
|
9
|
+
# (e.g., `alias` is resolved at parse time, while `alias_method`
|
|
10
|
+
# is resolved at runtime).
|
|
8
11
|
# It also flags uses of `alias :symbol` rather than `alias bareword`.
|
|
9
12
|
#
|
|
10
|
-
# However, it will always enforce `
|
|
13
|
+
# However, it will always enforce `alias_method` when `alias` is used
|
|
11
14
|
# in an instance method definition and in a singleton method definition.
|
|
12
15
|
# If used in a block, always enforce `alias_method`
|
|
13
16
|
# unless it is an `instance_eval` block.
|
|
@@ -42,6 +45,7 @@ module RuboCop
|
|
|
42
45
|
return unless node.command?(:alias_method)
|
|
43
46
|
return unless style == :prefer_alias && alias_keyword_possible?(node)
|
|
44
47
|
return unless node.arguments.count == 2
|
|
48
|
+
return if alias_method_value_used?(node)
|
|
45
49
|
|
|
46
50
|
msg = format(MSG_ALIAS_METHOD, current: lexical_scope_type(node))
|
|
47
51
|
add_offense(node.loc.selector, message: msg) do |corrector|
|
|
@@ -77,6 +81,14 @@ module RuboCop
|
|
|
77
81
|
scope_type(node) != :dynamic && node.arguments.all?(&:sym_type?)
|
|
78
82
|
end
|
|
79
83
|
|
|
84
|
+
# `alias_method` is a method call whose return value can be used
|
|
85
|
+
# (e.g., as an argument to `public`/`module_function`, or as an assignment),
|
|
86
|
+
# but `alias` is a keyword statement that cannot appear in such positions.
|
|
87
|
+
# Detect these positions so the conversion does not produce a syntax error.
|
|
88
|
+
def alias_method_value_used?(node)
|
|
89
|
+
node.argument? || node.parent&.assignment?
|
|
90
|
+
end
|
|
91
|
+
|
|
80
92
|
def alias_method_possible?(node)
|
|
81
93
|
scope_type(node) != :instance_eval &&
|
|
82
94
|
node.children.none?(&:gvar_type?) &&
|
|
@@ -101,7 +113,7 @@ module RuboCop
|
|
|
101
113
|
return :lexical
|
|
102
114
|
when :def, :defs
|
|
103
115
|
return :dynamic
|
|
104
|
-
when :block
|
|
116
|
+
when :block, :numblock, :itblock
|
|
105
117
|
return :instance_eval if parent.method?(:instance_eval)
|
|
106
118
|
|
|
107
119
|
return :dynamic
|
|
@@ -71,7 +71,7 @@ module RuboCop
|
|
|
71
71
|
node.each_child_node do |expr|
|
|
72
72
|
if expr.send_type?
|
|
73
73
|
correct_send(expr, corrector)
|
|
74
|
-
elsif expr.
|
|
74
|
+
elsif expr.type?(:return, :next, :break, :yield) || expr.assignment?
|
|
75
75
|
correct_other(expr, corrector)
|
|
76
76
|
end
|
|
77
77
|
end
|
|
@@ -128,6 +128,7 @@ module RuboCop
|
|
|
128
128
|
|
|
129
129
|
def correct_other(node, corrector)
|
|
130
130
|
return if node.parenthesized_call?
|
|
131
|
+
return if node.children.empty? && node.equal?(node.parent.children.last)
|
|
131
132
|
|
|
132
133
|
corrector.wrap(node, '(', ')')
|
|
133
134
|
end
|
|
@@ -16,26 +16,26 @@ module RuboCop
|
|
|
16
16
|
#
|
|
17
17
|
# In Ruby 3.2, anonymous args/kwargs forwarding has been added.
|
|
18
18
|
#
|
|
19
|
-
# This cop also identifies places where
|
|
20
|
-
# replaced by
|
|
21
|
-
# by setting `UseAnonymousForwarding: false`.
|
|
19
|
+
# This cop also identifies places where `+use_args(*args)+`/`+use_kwargs(**kwargs)+` can be
|
|
20
|
+
# replaced by `+use_args(*)+`/`+use_kwargs(**)+`; if desired, this functionality can be
|
|
21
|
+
# disabled by setting `UseAnonymousForwarding: false`.
|
|
22
22
|
#
|
|
23
23
|
# And this cop has `RedundantRestArgumentNames`, `RedundantKeywordRestArgumentNames`,
|
|
24
24
|
# and `RedundantBlockArgumentNames` options. This configuration is a list of redundant names
|
|
25
25
|
# that are sufficient for anonymizing meaningless naming.
|
|
26
26
|
#
|
|
27
27
|
# Meaningless names that are commonly used can be anonymized by default:
|
|
28
|
-
# e.g.,
|
|
28
|
+
# e.g., `+*args+`, `+**options+`, `&block`, and so on.
|
|
29
29
|
#
|
|
30
30
|
# Names not on this list are likely to be meaningful and are allowed by default.
|
|
31
31
|
#
|
|
32
32
|
# This cop handles not only method forwarding but also forwarding to `super`.
|
|
33
33
|
#
|
|
34
34
|
# [NOTE]
|
|
35
|
-
#
|
|
35
|
+
# ====
|
|
36
36
|
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
|
37
37
|
# no offense will be registered until Ruby 3.4:
|
|
38
|
-
|
|
38
|
+
#
|
|
39
39
|
# [source,ruby]
|
|
40
40
|
# ----
|
|
41
41
|
# def foo(&block)
|
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
|
43
43
|
# block_method { bar(&block) }
|
|
44
44
|
# end
|
|
45
45
|
# ----
|
|
46
|
-
#
|
|
46
|
+
# ====
|
|
47
47
|
#
|
|
48
48
|
# @example
|
|
49
49
|
# # bad
|
|
@@ -146,7 +146,6 @@ module RuboCop
|
|
|
146
146
|
minimum_target_ruby_version 2.7
|
|
147
147
|
|
|
148
148
|
FORWARDING_LVAR_TYPES = %i[splat kwsplat block_pass].freeze
|
|
149
|
-
ADDITIONAL_ARG_TYPES = %i[lvar arg].freeze
|
|
150
149
|
|
|
151
150
|
FORWARDING_MSG = 'Use shorthand syntax `...` for arguments forwarding.'
|
|
152
151
|
ARGS_MSG = 'Use anonymous positional arguments forwarding (`*`).'
|
|
@@ -154,7 +153,7 @@ module RuboCop
|
|
|
154
153
|
BLOCK_MSG = 'Use anonymous block arguments forwarding (`&`).'
|
|
155
154
|
|
|
156
155
|
def self.autocorrect_incompatible_with
|
|
157
|
-
[Naming::BlockForwarding]
|
|
156
|
+
[Naming::BlockForwarding, Style::MethodDefParentheses]
|
|
158
157
|
end
|
|
159
158
|
|
|
160
159
|
def on_def(node)
|
|
@@ -198,9 +197,9 @@ module RuboCop
|
|
|
198
197
|
send_classifications.all? { |_, c, _, _| all_classifications.include?(c) }
|
|
199
198
|
end
|
|
200
199
|
|
|
201
|
-
# rubocop:disable Metrics/MethodLength
|
|
200
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
202
201
|
def add_forward_all_offenses(node, send_classifications, forwardable_args)
|
|
203
|
-
|
|
202
|
+
rest_arg, kwrest_arg, block_arg = *forwardable_args
|
|
204
203
|
registered_block_arg_offense = false
|
|
205
204
|
|
|
206
205
|
send_classifications.each do |send_node, c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
|
|
@@ -212,16 +211,20 @@ module RuboCop
|
|
|
212
211
|
registered_block_arg_offense = true
|
|
213
212
|
break
|
|
214
213
|
else
|
|
215
|
-
|
|
214
|
+
first_arg = forward_rest || forward_kwrest || forward_all_first_argument(send_node)
|
|
215
|
+
register_forward_all_offense(send_node, send_node, first_arg)
|
|
216
216
|
end
|
|
217
217
|
end
|
|
218
218
|
|
|
219
219
|
return if registered_block_arg_offense
|
|
220
220
|
|
|
221
|
-
|
|
222
|
-
|
|
221
|
+
register_forward_all_offense(node, node.arguments, rest_arg || kwrest_arg)
|
|
222
|
+
end
|
|
223
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
224
|
+
|
|
225
|
+
def forward_all_first_argument(node)
|
|
226
|
+
node.arguments.reverse_each.find(&:forwarded_restarg_type?)
|
|
223
227
|
end
|
|
224
|
-
# rubocop:enable Metrics/MethodLength
|
|
225
228
|
|
|
226
229
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
227
230
|
def add_post_ruby_32_offenses(def_node, send_classifications, forwardable_args)
|
|
@@ -361,18 +364,9 @@ module RuboCop
|
|
|
361
364
|
end
|
|
362
365
|
end
|
|
363
366
|
|
|
364
|
-
# rubocop:disable Metrics/AbcSize
|
|
365
367
|
def arguments_range(node, first_node)
|
|
366
|
-
|
|
367
|
-
next true if ADDITIONAL_ARG_TYPES.include?(arg.type) || arg.variable? || arg.call_type?
|
|
368
|
-
|
|
369
|
-
arg.literal? && arg.each_descendant(:kwsplat).none?
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
start_node = first_node || arguments.first
|
|
373
|
-
start_node.source_range.begin.join(arguments.last.source_range.end)
|
|
368
|
+
first_node.source_range.begin.join(node.last_argument.source_range.end)
|
|
374
369
|
end
|
|
375
|
-
# rubocop:enable Metrics/AbcSize
|
|
376
370
|
|
|
377
371
|
def allow_only_rest_arguments?
|
|
378
372
|
cop_config.fetch('AllowOnlyRestArgument', true)
|
|
@@ -430,21 +424,39 @@ module RuboCop
|
|
|
430
424
|
end
|
|
431
425
|
|
|
432
426
|
def forwarded_rest_arg
|
|
433
|
-
return
|
|
427
|
+
return @forwarded_rest_arg if defined?(@forwarded_rest_arg)
|
|
434
428
|
|
|
435
|
-
|
|
429
|
+
@forwarded_rest_arg = if referenced_rest_arg?
|
|
430
|
+
nil
|
|
431
|
+
else
|
|
432
|
+
arguments.find do |arg|
|
|
433
|
+
forwarded_rest_arg?(arg, @rest_arg_name)
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
436
|
end
|
|
437
437
|
|
|
438
438
|
def forwarded_kwrest_arg
|
|
439
|
-
return
|
|
439
|
+
return @forwarded_kwrest_arg if defined?(@forwarded_kwrest_arg)
|
|
440
440
|
|
|
441
|
-
|
|
441
|
+
@forwarded_kwrest_arg = if referenced_kwrest_arg?
|
|
442
|
+
nil
|
|
443
|
+
else
|
|
444
|
+
arguments.filter_map do |arg|
|
|
445
|
+
extract_forwarded_kwrest_arg(arg, @kwrest_arg_name)
|
|
446
|
+
end.first
|
|
447
|
+
end
|
|
442
448
|
end
|
|
443
449
|
|
|
444
450
|
def forwarded_block_arg
|
|
445
|
-
return
|
|
451
|
+
return @forwarded_block_arg if defined?(@forwarded_block_arg)
|
|
446
452
|
|
|
447
|
-
|
|
453
|
+
@forwarded_block_arg = if referenced_block_arg?
|
|
454
|
+
nil
|
|
455
|
+
else
|
|
456
|
+
arguments.find do |arg|
|
|
457
|
+
forwarded_block_arg?(arg, @block_arg_name)
|
|
458
|
+
end
|
|
459
|
+
end
|
|
448
460
|
end
|
|
449
461
|
|
|
450
462
|
def classification
|
|
@@ -479,6 +491,9 @@ module RuboCop
|
|
|
479
491
|
end
|
|
480
492
|
|
|
481
493
|
def ruby_32_only_anonymous_forwarding?
|
|
494
|
+
# A block argument and an anonymous block argument are never passed together.
|
|
495
|
+
return false if @send_node.each_ancestor(:any_block).any?
|
|
496
|
+
|
|
482
497
|
def_all_anonymous_args?(@def_node) && send_all_anonymous_args?(@send_node)
|
|
483
498
|
end
|
|
484
499
|
|
|
@@ -40,8 +40,9 @@ module RuboCop
|
|
|
40
40
|
|
|
41
41
|
node = innermost_braces_node(node)
|
|
42
42
|
return if node.parent && brace_method?(node.parent)
|
|
43
|
+
return if compound_assignment_target?(node)
|
|
43
44
|
|
|
44
|
-
preferred = (value
|
|
45
|
+
preferred = preferred_name(value)
|
|
45
46
|
offense_range = find_offense_range(node)
|
|
46
47
|
|
|
47
48
|
add_offense(offense_range, message: format(MSG, preferred: preferred)) do |corrector|
|
|
@@ -53,6 +54,10 @@ module RuboCop
|
|
|
53
54
|
|
|
54
55
|
private
|
|
55
56
|
|
|
57
|
+
def preferred_name(value)
|
|
58
|
+
value.zero? ? 'first' : 'last'
|
|
59
|
+
end
|
|
60
|
+
|
|
56
61
|
def preferred_value(node, value)
|
|
57
62
|
value = ".#{value}" unless node.loc.dot
|
|
58
63
|
value
|
|
@@ -74,6 +79,12 @@ module RuboCop
|
|
|
74
79
|
def brace_method?(node)
|
|
75
80
|
node.send_type? && (node.method?(:[]) || node.method?(:[]=))
|
|
76
81
|
end
|
|
82
|
+
|
|
83
|
+
# `arr[0] += 1` etc. would autocorrect to `arr.first += 1`, which calls the
|
|
84
|
+
# nonexistent `first=`/`last=` setter and raises `NoMethodError`.
|
|
85
|
+
def compound_assignment_target?(node)
|
|
86
|
+
node.parent&.type?(:op_asgn, :or_asgn, :and_asgn) && node.parent.children.first == node
|
|
87
|
+
end
|
|
77
88
|
end
|
|
78
89
|
end
|
|
79
90
|
end
|
|
@@ -5,11 +5,17 @@ module RuboCop
|
|
|
5
5
|
module Style
|
|
6
6
|
# In Ruby 3.1, `Array#intersect?` has been added.
|
|
7
7
|
#
|
|
8
|
-
# This cop identifies places where
|
|
9
|
-
# can be replaced by `array1.intersect?(array2)`.
|
|
8
|
+
# This cop identifies places where:
|
|
10
9
|
#
|
|
11
|
-
#
|
|
12
|
-
# `(array1
|
|
10
|
+
# * `(array1 & array2).any?`
|
|
11
|
+
# * `(array1.intersection(array2)).any?`
|
|
12
|
+
# * `array1.any? { |elem| array2.member?(elem) }`
|
|
13
|
+
# * `(array1 & array2).count > 0`
|
|
14
|
+
# * `(array1 & array2).size > 0`
|
|
15
|
+
#
|
|
16
|
+
# can be replaced with `array1.intersect?(array2)`.
|
|
17
|
+
#
|
|
18
|
+
# `array1.intersect?(array2)` is faster and more readable.
|
|
13
19
|
#
|
|
14
20
|
# In cases like the following, compatibility is not ensured,
|
|
15
21
|
# so it will not be detected when using block argument.
|
|
@@ -20,6 +26,10 @@ module RuboCop
|
|
|
20
26
|
# [1].intersect?([1,2]) { |x| false } # => true
|
|
21
27
|
# ----
|
|
22
28
|
#
|
|
29
|
+
# NOTE: Although `Array#intersection` can take zero or multiple arguments,
|
|
30
|
+
# only cases where exactly one argument is provided can be replaced with
|
|
31
|
+
# `Array#intersect?` and are handled by this cop.
|
|
32
|
+
#
|
|
23
33
|
# @safety
|
|
24
34
|
# This cop cannot guarantee that `array1` and `array2` are
|
|
25
35
|
# actually arrays while method `intersect?` is for arrays only.
|
|
@@ -30,8 +40,30 @@ module RuboCop
|
|
|
30
40
|
# (array1 & array2).empty?
|
|
31
41
|
# (array1 & array2).none?
|
|
32
42
|
#
|
|
43
|
+
# # bad
|
|
44
|
+
# array1.intersection(array2).any?
|
|
45
|
+
# array1.intersection(array2).empty?
|
|
46
|
+
# array1.intersection(array2).none?
|
|
47
|
+
#
|
|
48
|
+
# # bad
|
|
49
|
+
# array1.any? { |elem| array2.member?(elem) }
|
|
50
|
+
# array1.none? { |elem| array2.include?(elem) }
|
|
51
|
+
#
|
|
52
|
+
# # good
|
|
53
|
+
# array1.intersect?(array2)
|
|
54
|
+
# !array1.intersect?(array2)
|
|
55
|
+
#
|
|
56
|
+
# # bad
|
|
57
|
+
# (array1 & array2).count > 0
|
|
58
|
+
# (array1 & array2).count.positive?
|
|
59
|
+
# (array1 & array2).count != 0
|
|
60
|
+
#
|
|
61
|
+
# (array1 & array2).count == 0
|
|
62
|
+
# (array1 & array2).count.zero?
|
|
63
|
+
#
|
|
33
64
|
# # good
|
|
34
65
|
# array1.intersect?(array2)
|
|
66
|
+
#
|
|
35
67
|
# !array1.intersect?(array2)
|
|
36
68
|
#
|
|
37
69
|
# @example AllCops:ActiveSupportExtensionsEnabled: false (default)
|
|
@@ -53,50 +85,100 @@ module RuboCop
|
|
|
53
85
|
|
|
54
86
|
minimum_target_ruby_version 3.1
|
|
55
87
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
88
|
+
PREDICATES = %i[any? empty? none?].to_set.freeze
|
|
89
|
+
ACTIVE_SUPPORT_PREDICATES = (PREDICATES + %i[present? blank?]).freeze
|
|
90
|
+
|
|
91
|
+
ARRAY_SIZE_METHODS = %i[count length size].to_set.freeze
|
|
92
|
+
|
|
93
|
+
# @!method bad_intersection_check?(node, predicates)
|
|
94
|
+
def_node_matcher :bad_intersection_check?, <<~PATTERN
|
|
95
|
+
$(call
|
|
96
|
+
{
|
|
97
|
+
(begin (send $_ :& $_))
|
|
98
|
+
(call $!nil? :intersection $_)
|
|
99
|
+
}
|
|
100
|
+
$%1
|
|
62
101
|
)
|
|
63
102
|
PATTERN
|
|
64
103
|
|
|
65
|
-
# @!method
|
|
66
|
-
def_node_matcher :
|
|
67
|
-
(
|
|
68
|
-
(
|
|
69
|
-
|
|
70
|
-
|
|
104
|
+
# @!method intersection_size_check?(node, predicates)
|
|
105
|
+
def_node_matcher :intersection_size_check?, <<~PATTERN
|
|
106
|
+
(call
|
|
107
|
+
$(call
|
|
108
|
+
{
|
|
109
|
+
(begin (send $_ :& $_))
|
|
110
|
+
(call $!nil? :intersection $_)
|
|
111
|
+
}
|
|
112
|
+
%ARRAY_SIZE_METHODS
|
|
113
|
+
)
|
|
114
|
+
{$:> (int 0) | $:positive? | $:!= (int 0) | $:== (int 0) | $:zero?}
|
|
71
115
|
)
|
|
72
116
|
PATTERN
|
|
73
117
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
118
|
+
# @!method any_none_block_intersection(node)
|
|
119
|
+
def_node_matcher :any_none_block_intersection, <<~PATTERN
|
|
120
|
+
{
|
|
121
|
+
(block
|
|
122
|
+
(call $_receiver ${:any? :none?})
|
|
123
|
+
(args (arg _key))
|
|
124
|
+
(send $_argument {:member? :include?} (lvar _key))
|
|
125
|
+
)
|
|
126
|
+
(numblock
|
|
127
|
+
(call $_receiver ${:any? :none?}) 1
|
|
128
|
+
(send $_argument {:member? :include?} (lvar :_1))
|
|
129
|
+
)
|
|
130
|
+
(itblock
|
|
131
|
+
(call $_receiver ${:any? :none?}) :it
|
|
132
|
+
(send $_argument {:member? :include?} (lvar :it))
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
PATTERN
|
|
136
|
+
|
|
137
|
+
MSG = 'Use `%<replacement>s` instead of `%<existing>s`.'
|
|
138
|
+
STRAIGHT_METHODS = %i[present? any? > positive? !=].freeze
|
|
139
|
+
NEGATED_METHODS = %i[blank? empty? none? == zero?].freeze
|
|
78
140
|
RESTRICT_ON_SEND = (STRAIGHT_METHODS + NEGATED_METHODS).freeze
|
|
79
141
|
|
|
80
142
|
def on_send(node)
|
|
81
143
|
return if node.block_literal?
|
|
82
|
-
return unless (receiver, argument, method_name =
|
|
144
|
+
return unless (dot_node, receiver, argument, method_name = bad_intersection?(node))
|
|
83
145
|
|
|
84
|
-
|
|
146
|
+
dot = dot_node.loc.dot.source
|
|
147
|
+
bang = straight?(method_name) ? '' : '!'
|
|
148
|
+
# `a&.intersection(b)&.none?` returns `nil` when `a` is `nil`, but the negated
|
|
149
|
+
# rewrite `!a&.intersect?(b)` returns `true` there, flipping the result.
|
|
150
|
+
return if bang == '!' && dot == '&.'
|
|
85
151
|
|
|
86
|
-
|
|
87
|
-
bang = straight?(method_name) ? '' : '!'
|
|
152
|
+
replacement = "#{bang}#{receiver.source}#{dot}intersect?(#{argument.source})"
|
|
88
153
|
|
|
89
|
-
|
|
90
|
-
end
|
|
154
|
+
register_offense(node, replacement)
|
|
91
155
|
end
|
|
156
|
+
alias on_csend on_send
|
|
157
|
+
|
|
158
|
+
def on_block(node)
|
|
159
|
+
return unless (receiver, method_name, argument = any_none_block_intersection(node))
|
|
160
|
+
|
|
161
|
+
dot = node.send_node.loc.dot.source
|
|
162
|
+
bang = method_name == :any? ? '' : '!'
|
|
163
|
+
replacement = "#{bang}#{receiver.source}#{dot}intersect?(#{argument.source})"
|
|
164
|
+
|
|
165
|
+
register_offense(node, replacement)
|
|
166
|
+
end
|
|
167
|
+
alias on_numblock on_block
|
|
168
|
+
alias on_itblock on_block
|
|
92
169
|
|
|
93
170
|
private
|
|
94
171
|
|
|
95
|
-
def
|
|
172
|
+
def bad_intersection?(node)
|
|
173
|
+
bad_intersection_check?(node, bad_intersection_predicates) ||
|
|
174
|
+
intersection_size_check?(node)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def bad_intersection_predicates
|
|
96
178
|
if active_support_extensions_enabled?
|
|
97
|
-
|
|
179
|
+
ACTIVE_SUPPORT_PREDICATES
|
|
98
180
|
else
|
|
99
|
-
|
|
181
|
+
PREDICATES
|
|
100
182
|
end
|
|
101
183
|
end
|
|
102
184
|
|
|
@@ -104,15 +186,12 @@ module RuboCop
|
|
|
104
186
|
STRAIGHT_METHODS.include?(method_name.to_sym)
|
|
105
187
|
end
|
|
106
188
|
|
|
107
|
-
def
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
argument: argument,
|
|
114
|
-
method_name: method_name
|
|
115
|
-
)
|
|
189
|
+
def register_offense(node, replacement)
|
|
190
|
+
message = format(MSG, replacement: replacement, existing: node.source)
|
|
191
|
+
|
|
192
|
+
add_offense(node, message: message) do |corrector|
|
|
193
|
+
corrector.replace(node, replacement)
|
|
194
|
+
end
|
|
116
195
|
end
|
|
117
196
|
end
|
|
118
197
|
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Use `include?(element)` instead of `intersect?([element])`.
|
|
7
|
+
#
|
|
8
|
+
# @safety
|
|
9
|
+
# The receiver might not be an array.
|
|
10
|
+
#
|
|
11
|
+
# @example
|
|
12
|
+
# # bad
|
|
13
|
+
# array.intersect?([element])
|
|
14
|
+
#
|
|
15
|
+
# # good
|
|
16
|
+
# array.include?(element)
|
|
17
|
+
class ArrayIntersectWithSingleElement < Base
|
|
18
|
+
extend AutoCorrector
|
|
19
|
+
|
|
20
|
+
MSG = 'Use `include?(element)` instead of `intersect?([element])`.'
|
|
21
|
+
|
|
22
|
+
RESTRICT_ON_SEND = %i[intersect?].freeze
|
|
23
|
+
|
|
24
|
+
# @!method single_element(node)
|
|
25
|
+
def_node_matcher :single_element, <<~PATTERN
|
|
26
|
+
(send _ _ $(array $_))
|
|
27
|
+
PATTERN
|
|
28
|
+
|
|
29
|
+
def on_send(node)
|
|
30
|
+
array, element = single_element(node)
|
|
31
|
+
return unless array
|
|
32
|
+
# `[*foo]` is not a single element: the splat can expand to any number of
|
|
33
|
+
# elements, so `intersect?([*foo])` is not equivalent to `include?(*foo)`.
|
|
34
|
+
return if element.splat_type?
|
|
35
|
+
|
|
36
|
+
add_offense(
|
|
37
|
+
node.source_range.with(begin_pos: node.loc.selector.begin_pos)
|
|
38
|
+
) do |corrector|
|
|
39
|
+
corrector.replace(node.loc.selector, 'include?')
|
|
40
|
+
corrector.replace(
|
|
41
|
+
array,
|
|
42
|
+
array.percent_literal? ? element.value.inspect : element.source
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
alias on_csend on_send
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for uses of
|
|
6
|
+
# Checks for uses of `*` as a substitute for `Array#join`.
|
|
7
|
+
# Using `join` is clearer about intent and more readable than
|
|
8
|
+
# overloading the `*` operator for string conversion.
|
|
7
9
|
#
|
|
8
|
-
# Not all cases can reliably checked, due to Ruby's dynamic
|
|
10
|
+
# Not all cases can be reliably checked, due to Ruby's dynamic
|
|
9
11
|
# types, so we consider only cases when the first argument is an
|
|
10
12
|
# array literal or the second is a string literal.
|
|
11
13
|
#
|
|
@@ -4,8 +4,11 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for non-ascii (non-English) characters
|
|
7
|
-
# in comments.
|
|
8
|
-
#
|
|
7
|
+
# in comments. Non-ascii characters can cause issues with
|
|
8
|
+
# portability and encoding across different environments
|
|
9
|
+
# and editors. You could set an array of allowed non-ascii
|
|
10
|
+
# chars in `AllowedChars` attribute (copyright notice "©"
|
|
11
|
+
# by default).
|
|
9
12
|
#
|
|
10
13
|
# @example
|
|
11
14
|
# # bad
|
|
@@ -49,7 +52,7 @@ module RuboCop
|
|
|
49
52
|
end
|
|
50
53
|
|
|
51
54
|
def allowed_non_ascii_chars
|
|
52
|
-
cop_config['AllowedChars'] || []
|
|
55
|
+
@allowed_non_ascii_chars ||= (cop_config['AllowedChars'] || []).freeze
|
|
53
56
|
end
|
|
54
57
|
end
|
|
55
58
|
end
|