rubocop 1.66.1 → 1.72.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 +2 -2
- data/config/default.yml +162 -14
- data/config/internal_affairs.yml +11 -0
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +6 -7
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +2 -2
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +17 -4
- data/lib/rubocop/config_loader.rb +48 -8
- data/lib/rubocop/config_loader_resolver.rb +36 -11
- data/lib/rubocop/config_validator.rb +20 -9
- data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
- data/lib/rubocop/cop/base.rb +13 -3
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +1 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/cop.rb +8 -0
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +4 -2
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs.rb +6 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +11 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +71 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +119 -4
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +6 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +4 -1
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -4
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +20 -9
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +11 -5
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +8 -14
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -0
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -8
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +13 -8
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +231 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +2 -2
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/void.rb +8 -11
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +8 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -3
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -10
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -2
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +3 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +0 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +12 -3
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
- data/lib/rubocop/cop/naming/predicate_name.rb +45 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +3 -4
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +96 -28
- data/lib/rubocop/cop/style/accessor_grouping.rb +10 -2
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +78 -22
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +5 -4
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +49 -19
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
- data/lib/rubocop/cop/style/collection_compact.rb +10 -10
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +9 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +17 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +26 -26
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +1 -14
- data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +0 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +16 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +9 -6
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +8 -5
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +26 -11
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -7
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +3 -2
- data/lib/rubocop/cop/style/map_into_array.rb +60 -9
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +32 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +29 -4
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +25 -7
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +7 -5
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +5 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +39 -24
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_format.rb +238 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +56 -17
- data/lib/rubocop/cop/style/redundant_parentheses.rb +37 -25
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +8 -15
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/require_order.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +15 -4
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +105 -51
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +10 -7
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +2 -2
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +12 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +14 -13
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +65 -17
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +8 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +7 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +18 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +4 -10
- data/lib/rubocop/cops_documentation_generator.rb +100 -51
- data/lib/rubocop/directive_comment.rb +44 -10
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +18 -48
- data/lib/rubocop/lsp/server.rb +0 -3
- data/lib/rubocop/lsp/stdin_runner.rb +83 -0
- data/lib/rubocop/magic_comment.rb +3 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- 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 +39 -0
- data/lib/rubocop/rake_task.rb +4 -1
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +9 -0
- data/lib/rubocop/rspec/expect_offense.rb +7 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -1
- data/lib/rubocop/rspec/support.rb +1 -2
- data/lib/rubocop/runner.rb +22 -12
- data/lib/rubocop/server/cache.rb +39 -1
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/core.rb +1 -0
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +28 -13
- data/lib/rubocop/version.rb +42 -6
- data/lib/rubocop/yaml_duplication_checker.rb +20 -27
- data/lib/rubocop.rb +29 -0
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
- metadata +75 -19
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -7,6 +7,8 @@ module RuboCop
|
|
7
7
|
# Style omit_parentheses
|
8
8
|
# rubocop:disable Metrics/ModuleLength, Metrics/CyclomaticComplexity
|
9
9
|
module OmitParentheses
|
10
|
+
include RangeHelp
|
11
|
+
|
10
12
|
TRAILING_WHITESPACE_REGEX = /\s+\Z/.freeze
|
11
13
|
OMIT_MSG = 'Omit parentheses for method calls with arguments.'
|
12
14
|
private_constant :OMIT_MSG
|
@@ -30,10 +32,13 @@ module RuboCop
|
|
30
32
|
end
|
31
33
|
|
32
34
|
def autocorrect(corrector, node)
|
35
|
+
range = args_begin(node)
|
33
36
|
if parentheses_at_the_end_of_multiline_call?(node)
|
34
|
-
|
37
|
+
# Whitespace after line continuation (`\ `) is a syntax error
|
38
|
+
with_whitespace = range_with_surrounding_space(range, side: :right, newlines: false)
|
39
|
+
corrector.replace(with_whitespace, ' \\')
|
35
40
|
else
|
36
|
-
corrector.replace(
|
41
|
+
corrector.replace(range, ' ')
|
37
42
|
end
|
38
43
|
corrector.remove(node.loc.end)
|
39
44
|
end
|
@@ -47,11 +52,11 @@ module RuboCop
|
|
47
52
|
node.each_ancestor(:def, :defs).any?(&:endless?) && node.arguments.any?
|
48
53
|
end
|
49
54
|
|
50
|
-
def require_parentheses_for_hash_value_omission?(node)
|
55
|
+
def require_parentheses_for_hash_value_omission?(node) # rubocop:disable Metrics/PerceivedComplexity
|
51
56
|
return false unless (last_argument = node.last_argument)
|
52
57
|
return false if !last_argument.hash_type? || !last_argument.pairs.last&.value_omission?
|
53
58
|
|
54
|
-
node.parent&.conditional? || !last_expression?(node)
|
59
|
+
node.parent&.conditional? || node.parent&.single_line? || !last_expression?(node)
|
55
60
|
end
|
56
61
|
|
57
62
|
# Require hash value omission be enclosed in parentheses to prevent the following issue:
|
@@ -106,9 +111,7 @@ module RuboCop
|
|
106
111
|
parent = node.parent&.block_type? ? node.parent.parent : node.parent
|
107
112
|
return false unless parent
|
108
113
|
|
109
|
-
parent.
|
110
|
-
parent.array_type? ||
|
111
|
-
parent.range_type? ||
|
114
|
+
parent.type?(:pair, :array, :range) ||
|
112
115
|
splat?(parent) ||
|
113
116
|
ternary_if?(parent)
|
114
117
|
end
|
@@ -123,46 +126,48 @@ module RuboCop
|
|
123
126
|
end
|
124
127
|
|
125
128
|
def call_in_optional_arguments?(node)
|
126
|
-
node.parent
|
129
|
+
node.parent&.type?(:optarg, :kwoptarg)
|
127
130
|
end
|
128
131
|
|
129
132
|
def call_in_single_line_inheritance?(node)
|
130
|
-
node.parent&.class_type? && node.parent
|
133
|
+
node.parent&.class_type? && node.parent.single_line?
|
131
134
|
end
|
132
135
|
|
133
|
-
|
136
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
137
|
+
def call_with_ambiguous_arguments?(node)
|
134
138
|
call_with_braced_block?(node) ||
|
135
139
|
call_in_argument_with_block?(node) ||
|
136
140
|
call_as_argument_or_chain?(node) ||
|
137
141
|
call_in_match_pattern?(node) ||
|
138
142
|
hash_literal_in_arguments?(node) ||
|
143
|
+
ambiguous_range_argument?(node) ||
|
139
144
|
node.descendants.any? do |n|
|
140
|
-
n.
|
145
|
+
n.type?(:forwarded_args, :any_block) ||
|
141
146
|
ambiguous_literal?(n) || logical_operator?(n)
|
142
147
|
end
|
143
148
|
end
|
149
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
144
150
|
|
145
151
|
def call_with_braced_block?(node)
|
146
|
-
|
152
|
+
node.type?(:call, :super) && node.block_node&.braces?
|
147
153
|
end
|
148
154
|
|
149
155
|
def call_in_argument_with_block?(node)
|
150
|
-
parent = node.parent&.block_type? && node.parent
|
156
|
+
parent = node.parent&.block_type? && node.parent.parent
|
151
157
|
return false unless parent
|
152
158
|
|
153
|
-
parent.
|
159
|
+
parent.type?(:call, :super, :yield)
|
154
160
|
end
|
155
161
|
|
156
162
|
def call_as_argument_or_chain?(node)
|
157
|
-
node.parent &&
|
158
|
-
(node.parent.call_type? || node.parent.super_type? || node.parent.yield_type?) &&
|
163
|
+
node.parent&.type?(:call, :super, :yield) &&
|
159
164
|
!assigned_before?(node.parent, node)
|
160
165
|
end
|
161
166
|
|
162
167
|
def call_in_match_pattern?(node)
|
163
168
|
return false unless (parent = node.parent)
|
164
169
|
|
165
|
-
parent.
|
170
|
+
parent.type?(:match_pattern, :match_pattern_p)
|
166
171
|
end
|
167
172
|
|
168
173
|
def hash_literal_in_arguments?(node)
|
@@ -172,6 +177,13 @@ module RuboCop
|
|
172
177
|
end
|
173
178
|
end
|
174
179
|
|
180
|
+
def ambiguous_range_argument?(node)
|
181
|
+
return true if (first_arg = node.first_argument)&.range_type? && first_arg.begin.nil?
|
182
|
+
return true if (last_arg = node.last_argument)&.range_type? && last_arg.end.nil?
|
183
|
+
|
184
|
+
false
|
185
|
+
end
|
186
|
+
|
175
187
|
def allowed_multiline_call_with_parentheses?(node)
|
176
188
|
cop_config['AllowParenthesesInMultilineCall'] && node.multiline?
|
177
189
|
end
|
@@ -190,7 +202,7 @@ module RuboCop
|
|
190
202
|
end
|
191
203
|
|
192
204
|
def splat?(node)
|
193
|
-
node.
|
205
|
+
node.type?(:splat, :kwsplat, :block_pass)
|
194
206
|
end
|
195
207
|
|
196
208
|
def ternary_if?(node)
|
@@ -198,7 +210,7 @@ module RuboCop
|
|
198
210
|
end
|
199
211
|
|
200
212
|
def logical_operator?(node)
|
201
|
-
|
213
|
+
node.operator_keyword? && node.logical_operator?
|
202
214
|
end
|
203
215
|
|
204
216
|
def hash_literal?(node)
|
@@ -211,7 +223,7 @@ module RuboCop
|
|
211
223
|
|
212
224
|
def unary_literal?(node)
|
213
225
|
(node.numeric_type? && node.sign?) ||
|
214
|
-
(node.parent&.send_type? && node.parent
|
226
|
+
(node.parent&.send_type? && node.parent.unary_operation?)
|
215
227
|
end
|
216
228
|
|
217
229
|
def assigned_before?(node, target)
|
@@ -61,6 +61,8 @@ module RuboCop
|
|
61
61
|
# https://bugs.ruby-lang.org/issues/18396.
|
62
62
|
# - Parentheses are required in anonymous arguments, keyword arguments
|
63
63
|
# and block passing in Ruby 3.2.
|
64
|
+
# - Parentheses are required when the first argument is a beginless range or
|
65
|
+
# the last argument is an endless range.
|
64
66
|
#
|
65
67
|
# @example EnforcedStyle: require_parentheses (default)
|
66
68
|
#
|
@@ -45,6 +45,7 @@ module RuboCop
|
|
45
45
|
register_offense(node)
|
46
46
|
end
|
47
47
|
# rubocop:enable Metrics/CyclomaticComplexity
|
48
|
+
alias on_csend on_send
|
48
49
|
|
49
50
|
private
|
50
51
|
|
@@ -71,9 +72,11 @@ module RuboCop
|
|
71
72
|
return false if node.receiver
|
72
73
|
|
73
74
|
any_assignment?(node) do |asgn_node|
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
if asgn_node.masgn_type?
|
76
|
+
variable_in_mass_assignment?(node.method_name, asgn_node)
|
77
|
+
else
|
78
|
+
asgn_node.loc.name.source == node.method_name.to_s
|
79
|
+
end
|
77
80
|
end
|
78
81
|
end
|
79
82
|
|
@@ -98,20 +101,14 @@ module RuboCop
|
|
98
101
|
# `obj.method ||= value` parses as (or-asgn (send ...) ...)
|
99
102
|
# which IS an `asgn_node`. Similarly, `obj.method += value` parses
|
100
103
|
# as (op-asgn (send ...) ...), which is also an `asgn_node`.
|
101
|
-
if asgn_node.shorthand_asgn?
|
102
|
-
asgn_node, _value = *asgn_node
|
103
|
-
next if asgn_node.send_type?
|
104
|
-
end
|
104
|
+
next if asgn_node.shorthand_asgn? && asgn_node.lhs.call_type?
|
105
105
|
|
106
106
|
yield asgn_node
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
110
|
def variable_in_mass_assignment?(variable_name, node)
|
111
|
-
|
112
|
-
var_nodes = *mlhs_node
|
113
|
-
|
114
|
-
var_nodes.any? { |n| n.to_a.first == variable_name }
|
111
|
+
node.assignments.reject(&:send_type?).any? { |n| n.name == variable_name }
|
115
112
|
end
|
116
113
|
|
117
114
|
def offense_range(node)
|
@@ -40,10 +40,8 @@ module RuboCop
|
|
40
40
|
def on_send(node)
|
41
41
|
return if ignored_node?(node)
|
42
42
|
|
43
|
-
receiver = node.receiver
|
44
|
-
|
45
|
-
return unless (receiver&.block_type? || receiver&.numblock_type?) &&
|
46
|
-
receiver.loc.end.is?('end')
|
43
|
+
return unless (receiver = node.receiver)
|
44
|
+
return unless receiver.any_block_type? && receiver.loc.end.is?('end')
|
47
45
|
|
48
46
|
range = range_between(receiver.loc.end.begin_pos, node.source_range.end_pos)
|
49
47
|
|
@@ -168,7 +168,7 @@ module RuboCop
|
|
168
168
|
|
169
169
|
def anonymous_arguments?(node)
|
170
170
|
return true if node.arguments.any? do |arg|
|
171
|
-
arg.
|
171
|
+
arg.type?(:forward_arg, :restarg, :kwrestarg)
|
172
172
|
end
|
173
173
|
return false unless (last_argument = node.last_argument)
|
174
174
|
|
@@ -6,19 +6,49 @@ module RuboCop
|
|
6
6
|
# Checks for the presence of `method_missing` without also
|
7
7
|
# defining `respond_to_missing?`.
|
8
8
|
#
|
9
|
+
# Not defining `respond_to_missing?` will cause metaprogramming
|
10
|
+
# methods like `respond_to?` to behave unexpectedly:
|
11
|
+
#
|
12
|
+
# [source,ruby]
|
13
|
+
# ----
|
14
|
+
# class StringDelegator
|
15
|
+
# def initialize(string)
|
16
|
+
# @string = string
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# def method_missing(name, *args)
|
20
|
+
# @string.send(name, *args)
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# delegator = StringDelegator.new("foo")
|
25
|
+
# # Claims to not respond to `upcase`.
|
26
|
+
# delegator.respond_to?(:upcase) # => false
|
27
|
+
# # But you can call it.
|
28
|
+
# delegator.upcase # => FOO
|
29
|
+
# ----
|
30
|
+
#
|
9
31
|
# @example
|
10
32
|
# # bad
|
11
33
|
# def method_missing(name, *args)
|
12
|
-
#
|
34
|
+
# if @delegate.respond_to?(name)
|
35
|
+
# @delegate.send(name, *args)
|
36
|
+
# else
|
37
|
+
# super
|
38
|
+
# end
|
13
39
|
# end
|
14
40
|
#
|
15
41
|
# # good
|
16
42
|
# def respond_to_missing?(name, include_private)
|
17
|
-
#
|
43
|
+
# @delegate.respond_to?(name) || super
|
18
44
|
# end
|
19
45
|
#
|
20
46
|
# def method_missing(name, *args)
|
21
|
-
#
|
47
|
+
# if @delegate.respond_to?(name)
|
48
|
+
# @delegate.send(name, *args)
|
49
|
+
# else
|
50
|
+
# super
|
51
|
+
# end
|
22
52
|
# end
|
23
53
|
#
|
24
54
|
class MissingRespondToMissing < Base
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
node.send_node.each_node(:send, :csend) do |send_node|
|
32
32
|
receiver = send_node.receiver
|
33
33
|
|
34
|
-
next unless
|
34
|
+
next unless receiver&.any_block_type? && receiver.multiline?
|
35
35
|
|
36
36
|
range = range_between(receiver.loc.end.begin_pos, node.send_node.source_range.end_pos)
|
37
37
|
|
@@ -39,11 +39,11 @@ module RuboCop
|
|
39
39
|
BRACES_MSG = 'Wrap multiline memoization blocks in `(` and `)`.'
|
40
40
|
|
41
41
|
def on_or_asgn(node)
|
42
|
-
|
42
|
+
rhs = node.expression
|
43
43
|
|
44
44
|
return unless bad_rhs?(rhs)
|
45
45
|
|
46
|
-
add_offense(node
|
46
|
+
add_offense(node) do |corrector|
|
47
47
|
if style == :keyword
|
48
48
|
keyword_autocorrect(rhs, corrector)
|
49
49
|
else
|
@@ -55,68 +55,66 @@ module RuboCop
|
|
55
55
|
MSG = 'Avoid comparing a variable with multiple items ' \
|
56
56
|
'in a conditional, use `Array#include?` instead.'
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
# @!method simple_double_comparison?(node)
|
59
|
+
def_node_matcher :simple_double_comparison?, <<~PATTERN
|
60
|
+
(send lvar :== lvar)
|
61
|
+
PATTERN
|
62
|
+
|
63
|
+
# @!method simple_comparison_lhs(node)
|
64
|
+
def_node_matcher :simple_comparison_lhs, <<~PATTERN
|
65
|
+
(send ${lvar call} :== $_)
|
66
|
+
PATTERN
|
67
|
+
|
68
|
+
# @!method simple_comparison_rhs(node)
|
69
|
+
def_node_matcher :simple_comparison_rhs, <<~PATTERN
|
70
|
+
(send $_ :== ${lvar call})
|
71
|
+
PATTERN
|
61
72
|
|
73
|
+
# rubocop:disable Metrics/AbcSize
|
62
74
|
def on_or(node)
|
63
75
|
root_of_or_node = root_of_or_node(node)
|
64
|
-
|
65
76
|
return unless node == root_of_or_node
|
66
|
-
return unless
|
67
|
-
return if @allowed_method_comparison
|
68
|
-
return if @compared_elements.size < comparisons_threshold
|
77
|
+
return unless nested_comparison?(node)
|
69
78
|
|
70
|
-
|
71
|
-
|
72
|
-
prefer_method = "[#{elements}].include?(#{variables_in_node(node).first})"
|
79
|
+
return unless (variable, values = find_offending_var(node))
|
80
|
+
return if values.size < comparisons_threshold
|
73
81
|
|
74
|
-
|
82
|
+
range = offense_range(values)
|
75
83
|
|
76
|
-
|
84
|
+
add_offense(range) do |corrector|
|
85
|
+
elements = values.map(&:source).join(', ')
|
86
|
+
argument = variable.lvar_type? ? variable_name(variable) : variable.source
|
87
|
+
prefer_method = "[#{elements}].include?(#{argument})"
|
88
|
+
|
89
|
+
corrector.replace(range, prefer_method)
|
77
90
|
end
|
78
91
|
end
|
92
|
+
# rubocop:enable Metrics/AbcSize
|
79
93
|
|
80
94
|
private
|
81
95
|
|
82
|
-
#
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
(
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
def_node_matcher :simple_comparison_rhs?, <<~PATTERN
|
92
|
-
(send $_ :== $lvar)
|
93
|
-
PATTERN
|
94
|
-
|
95
|
-
def nested_variable_comparison?(node)
|
96
|
-
return false unless nested_comparison?(node)
|
96
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
97
|
+
def find_offending_var(node, variables = Set.new, values = [])
|
98
|
+
if node.or_type?
|
99
|
+
find_offending_var(node.lhs, variables, values)
|
100
|
+
find_offending_var(node.rhs, variables, values)
|
101
|
+
elsif simple_double_comparison?(node)
|
102
|
+
return
|
103
|
+
elsif (var, obj = simple_comparison(node))
|
104
|
+
return if allow_method_comparison? && obj.call_type?
|
97
105
|
|
98
|
-
|
99
|
-
|
106
|
+
variables << var
|
107
|
+
return if variables.size > 1
|
100
108
|
|
101
|
-
|
102
|
-
if node.or_type?
|
103
|
-
node.node_parts.flat_map { |node_part| variables_in_node(node_part) }.uniq
|
104
|
-
else
|
105
|
-
variables_in_simple_node(node)
|
109
|
+
values << obj
|
106
110
|
end
|
107
|
-
end
|
108
111
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
end
|
113
|
-
if (var, obj = simple_comparison_lhs?(node)) || (obj, var = simple_comparison_rhs?(node))
|
114
|
-
@allowed_method_comparison = true if allow_method_comparison? && obj.send_type?
|
115
|
-
@compared_elements << obj.source
|
116
|
-
return [variable_name(var)]
|
117
|
-
end
|
112
|
+
[variables.first, values] if variables.any?
|
113
|
+
end
|
114
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
118
115
|
|
119
|
-
|
116
|
+
def offense_range(values)
|
117
|
+
values.first.parent.source_range.begin.join(values.last.parent.source_range.end)
|
120
118
|
end
|
121
119
|
|
122
120
|
def variable_name(node)
|
@@ -132,7 +130,15 @@ module RuboCop
|
|
132
130
|
end
|
133
131
|
|
134
132
|
def comparison?(node)
|
135
|
-
|
133
|
+
!!simple_comparison(node) || nested_comparison?(node)
|
134
|
+
end
|
135
|
+
|
136
|
+
def simple_comparison(node)
|
137
|
+
if (var, obj = simple_comparison_lhs(node)) || (obj, var = simple_comparison_rhs(node))
|
138
|
+
return if var.call_type? && !allow_method_comparison?
|
139
|
+
|
140
|
+
[var, obj]
|
141
|
+
end
|
136
142
|
end
|
137
143
|
|
138
144
|
def root_of_or_node(or_node)
|
@@ -145,11 +151,6 @@ module RuboCop
|
|
145
151
|
end
|
146
152
|
end
|
147
153
|
|
148
|
-
def reset_comparison
|
149
|
-
@compared_elements = []
|
150
|
-
@allowed_method_comparison = false
|
151
|
-
end
|
152
|
-
|
153
154
|
def allow_method_comparison?
|
154
155
|
cop_config.fetch('AllowMethodComparison', true)
|
155
156
|
end
|
@@ -19,7 +19,7 @@ module RuboCop
|
|
19
19
|
# acceptable value other than none, it will suppress the offenses
|
20
20
|
# raised by this cop. It enforces frozen state.
|
21
21
|
#
|
22
|
-
# NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
|
22
|
+
# NOTE: `Regexp` and `Range` literals are frozen objects since Ruby 3.0.
|
23
23
|
#
|
24
24
|
# NOTE: From Ruby 3.0, interpolated strings are not frozen when
|
25
25
|
# `# frozen-string-literal: true` is used, so this cop enforces explicit
|
@@ -125,15 +125,14 @@ module RuboCop
|
|
125
125
|
MSG = 'Freeze mutable objects assigned to constants.'
|
126
126
|
|
127
127
|
def on_casgn(node)
|
128
|
-
|
129
|
-
if value.nil? # This is only the case for `CONST += ...` or similarg66
|
128
|
+
if node.expression.nil? # This is only the case for `CONST += ...` or similarg66
|
130
129
|
parent = node.parent
|
131
130
|
return unless parent.or_asgn_type? # We only care about `CONST ||= ...`
|
132
131
|
|
133
|
-
|
132
|
+
on_assignment(parent.children.last)
|
133
|
+
else
|
134
|
+
on_assignment(node.expression)
|
134
135
|
end
|
135
|
-
|
136
|
-
on_assignment(value)
|
137
136
|
end
|
138
137
|
|
139
138
|
private
|
@@ -198,7 +197,7 @@ module RuboCop
|
|
198
197
|
end
|
199
198
|
|
200
199
|
def frozen_regexp_or_range_literals?(node)
|
201
|
-
target_ruby_version >= 3.0 &&
|
200
|
+
target_ruby_version >= 3.0 && node.type?(:regexp, :range)
|
202
201
|
end
|
203
202
|
|
204
203
|
def requires_parentheses?(node)
|
@@ -239,7 +238,7 @@ module RuboCop
|
|
239
238
|
|
240
239
|
# @!method range_enclosed_in_parentheses?(node)
|
241
240
|
def_node_matcher :range_enclosed_in_parentheses?, <<~PATTERN
|
242
|
-
(begin (
|
241
|
+
(begin (range _ _))
|
243
242
|
PATTERN
|
244
243
|
end
|
245
244
|
end
|
@@ -46,10 +46,12 @@ module RuboCop
|
|
46
46
|
@corrected_nodes = nil
|
47
47
|
end
|
48
48
|
|
49
|
+
# rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity
|
49
50
|
def on_if(node)
|
50
51
|
return unless if_else?(node)
|
51
52
|
return unless (condition = unwrap_begin_nodes(node.condition))
|
52
53
|
return if double_negation?(condition) || !negated_condition?(condition)
|
54
|
+
return unless condition.arguments.size < 2
|
53
55
|
|
54
56
|
message = message(node)
|
55
57
|
add_offense(node, message: message) do |corrector|
|
@@ -62,6 +64,7 @@ module RuboCop
|
|
62
64
|
end
|
63
65
|
end
|
64
66
|
end
|
67
|
+
# rubocop:enable Metrics/AbcSize,Metrics/CyclomaticComplexity
|
65
68
|
|
66
69
|
private
|
67
70
|
|
@@ -71,7 +74,7 @@ module RuboCop
|
|
71
74
|
end
|
72
75
|
|
73
76
|
def unwrap_begin_nodes(node)
|
74
|
-
node = node.children.first while node
|
77
|
+
node = node.children.first while node&.type?(:begin, :kwbegin)
|
75
78
|
|
76
79
|
node
|
77
80
|
end
|
@@ -92,13 +95,12 @@ module RuboCop
|
|
92
95
|
end
|
93
96
|
|
94
97
|
def correct_negated_condition(corrector, node)
|
95
|
-
receiver, method_name, rhs = *node
|
96
98
|
replacement =
|
97
99
|
if node.negation_method?
|
98
|
-
receiver.source
|
100
|
+
node.receiver.source
|
99
101
|
else
|
100
|
-
inverted_method = method_name.to_s.sub('!', '=')
|
101
|
-
"#{receiver.source} #{inverted_method} #{
|
102
|
+
inverted_method = node.method_name.to_s.sub('!', '=')
|
103
|
+
"#{node.receiver.source} #{inverted_method} #{node.first_argument.source}"
|
102
104
|
end
|
103
105
|
|
104
106
|
corrector.replace(node, replacement)
|
@@ -35,11 +35,11 @@ module RuboCop
|
|
35
35
|
def on_send(node)
|
36
36
|
return unless node.parenthesized?
|
37
37
|
|
38
|
-
node.each_child_node(:
|
38
|
+
node.each_child_node(:call) do |nested|
|
39
39
|
next if allowed_omission?(nested)
|
40
40
|
|
41
41
|
message = format(MSG, source: nested.source)
|
42
|
-
add_offense(nested
|
42
|
+
add_offense(nested, message: message) do |corrector|
|
43
43
|
autocorrect(corrector, nested)
|
44
44
|
end
|
45
45
|
end
|
@@ -18,7 +18,6 @@ module RuboCop
|
|
18
18
|
class NestedTernaryOperator < Base
|
19
19
|
extend AutoCorrector
|
20
20
|
include RangeHelp
|
21
|
-
include IgnoredNode
|
22
21
|
|
23
22
|
MSG = 'Ternary operators must not be nested. Prefer `if` or `else` constructs instead.'
|
24
23
|
|
@@ -45,9 +44,11 @@ module RuboCop
|
|
45
44
|
end
|
46
45
|
|
47
46
|
def remove_parentheses(source)
|
48
|
-
|
49
|
-
|
50
|
-
|
47
|
+
if source.start_with?('(') && source.end_with?(')')
|
48
|
+
source.delete_prefix('(').delete_suffix(')')
|
49
|
+
else
|
50
|
+
source
|
51
|
+
end
|
51
52
|
end
|
52
53
|
|
53
54
|
def replace_loc_and_whitespace(corrector, range, replacement)
|
@@ -30,11 +30,13 @@ module RuboCop
|
|
30
30
|
minimum_target_ruby_version 2.6
|
31
31
|
|
32
32
|
MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
|
33
|
+
RESTRICT_ON_SEND = %i[then yield_self].freeze
|
33
34
|
|
34
35
|
def on_block(node)
|
36
|
+
return unless RESTRICT_ON_SEND.include?(node.method_name)
|
37
|
+
|
35
38
|
check_method_node(node.send_node)
|
36
39
|
end
|
37
|
-
|
38
40
|
alias on_numblock on_block
|
39
41
|
|
40
42
|
def on_send(node)
|
@@ -42,29 +44,26 @@ module RuboCop
|
|
42
44
|
|
43
45
|
check_method_node(node)
|
44
46
|
end
|
47
|
+
alias on_csend on_send
|
45
48
|
|
46
49
|
private
|
47
50
|
|
48
51
|
def check_method_node(node)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
if preferred_method?(node)
|
53
|
+
correct_style_detected
|
54
|
+
else
|
55
|
+
opposite_style_detected
|
56
|
+
message = message(node)
|
57
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
58
|
+
prefer = style == :then && node.receiver.nil? ? 'self.then' : style
|
54
59
|
|
55
|
-
|
60
|
+
corrector.replace(node.loc.selector, prefer)
|
61
|
+
end
|
56
62
|
end
|
57
63
|
end
|
58
64
|
|
59
65
|
def preferred_method?(node)
|
60
|
-
|
61
|
-
when :then
|
62
|
-
node.method?(:yield_self)
|
63
|
-
when :yield_self
|
64
|
-
node.method?(:then)
|
65
|
-
else
|
66
|
-
false
|
67
|
-
end
|
66
|
+
node.method?(style)
|
68
67
|
end
|
69
68
|
|
70
69
|
def message(node)
|