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
@@ -28,7 +28,7 @@ module RuboCop
|
|
28
28
|
FOR_METHOD = ' Or, if they were intended to be separate method ' \
|
29
29
|
'arguments, separate them with a comma.'
|
30
30
|
|
31
|
-
# rubocop:disable Metrics/AbcSize
|
31
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
|
32
32
|
def on_dstr(node)
|
33
33
|
each_bad_cons(node) do |lhs_node, rhs_node|
|
34
34
|
range = lhs_node.source_range.join(rhs_node.source_range)
|
@@ -40,13 +40,19 @@ module RuboCop
|
|
40
40
|
end
|
41
41
|
|
42
42
|
add_offense(range, message: message) do |corrector|
|
43
|
-
|
43
|
+
if lhs_node.value == ''
|
44
|
+
corrector.remove(lhs_node)
|
45
|
+
elsif rhs_node.value == ''
|
46
|
+
corrector.remove(rhs_node)
|
47
|
+
else
|
48
|
+
range = lhs_node.source_range.end.join(rhs_node.source_range.begin)
|
44
49
|
|
45
|
-
|
50
|
+
corrector.replace(range, ' + ')
|
51
|
+
end
|
46
52
|
end
|
47
53
|
end
|
48
54
|
end
|
49
|
-
# rubocop:enable Metrics/AbcSize
|
55
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
|
50
56
|
|
51
57
|
private
|
52
58
|
|
@@ -76,7 +82,7 @@ module RuboCop
|
|
76
82
|
end
|
77
83
|
|
78
84
|
def string_literal?(node)
|
79
|
-
node.
|
85
|
+
node.type?(:str, :dstr)
|
80
86
|
end
|
81
87
|
|
82
88
|
def string_literals?(node1, node2)
|
@@ -24,14 +24,17 @@ module RuboCop
|
|
24
24
|
MSG = 'Interpolation in single quoted string detected. ' \
|
25
25
|
'Use double quoted strings if you need interpolation.'
|
26
26
|
|
27
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
27
28
|
def on_str(node)
|
28
29
|
return if node.parent&.regexp_type?
|
29
30
|
return unless /(?<!\\)#\{.*\}/.match?(node.source)
|
30
31
|
return if heredoc?(node)
|
31
32
|
return unless node.loc.begin && node.loc.end
|
33
|
+
return unless valid_syntax?(node)
|
32
34
|
|
33
35
|
add_offense(node) { |corrector| autocorrect(corrector, node) }
|
34
36
|
end
|
37
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
35
38
|
|
36
39
|
private
|
37
40
|
|
@@ -49,6 +52,12 @@ module RuboCop
|
|
49
52
|
def heredoc?(node)
|
50
53
|
node.loc.is_a?(Parser::Source::Map::Heredoc) || (node.parent && heredoc?(node.parent))
|
51
54
|
end
|
55
|
+
|
56
|
+
def valid_syntax?(node)
|
57
|
+
double_quoted_string = node.source.gsub(/\A'|'\z/, '"')
|
58
|
+
|
59
|
+
parse(double_quoted_string).valid_syntax?
|
60
|
+
end
|
52
61
|
end
|
53
62
|
end
|
54
63
|
end
|
@@ -26,28 +26,22 @@ module RuboCop
|
|
26
26
|
#
|
27
27
|
class ItWithoutArgumentsInBlock < Base
|
28
28
|
include NodePattern::Macros
|
29
|
+
extend TargetRubyVersion
|
30
|
+
|
31
|
+
maximum_target_ruby_version 3.3
|
29
32
|
|
30
33
|
MSG = '`it` calls without arguments will refer to the first block param in Ruby 3.4; ' \
|
31
34
|
'use `it()` or `self.it`.'
|
35
|
+
RESTRICT_ON_SEND = %i[it].freeze
|
32
36
|
|
33
|
-
def
|
34
|
-
return unless (
|
35
|
-
return unless
|
36
|
-
|
37
|
-
if body.send_type? && deprecated_it_method?(body)
|
38
|
-
add_offense(body)
|
39
|
-
else
|
40
|
-
body.each_descendant(:send).each do |send_node|
|
41
|
-
next unless deprecated_it_method?(send_node)
|
37
|
+
def on_send(node)
|
38
|
+
return unless (block_node = node.each_ancestor(:block).first)
|
39
|
+
return unless block_node.arguments.empty_and_without_delimiters?
|
42
40
|
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
41
|
+
add_offense(node) if deprecated_it_method?(node)
|
46
42
|
end
|
47
43
|
|
48
44
|
def deprecated_it_method?(node)
|
49
|
-
return false unless node.method?(:it)
|
50
|
-
|
51
45
|
!node.receiver && node.arguments.empty? && !node.parenthesized? && !node.block_literal?
|
52
46
|
end
|
53
47
|
end
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
traverse_node(node.condition) do |asgn_node|
|
41
41
|
next unless asgn_node.loc.operator
|
42
42
|
|
43
|
-
rhs = asgn_node.
|
43
|
+
rhs = asgn_node.rhs
|
44
44
|
next if !all_literals?(rhs) || parallel_assignment_with_splat_operator?(rhs)
|
45
45
|
|
46
46
|
range = offense_range(asgn_node, rhs)
|
@@ -5,6 +5,9 @@ module RuboCop
|
|
5
5
|
module Lint
|
6
6
|
# Checks for interpolated literals.
|
7
7
|
#
|
8
|
+
# NOTE: Array literals interpolated in regexps are not handled by this cop, but
|
9
|
+
# by `Lint/ArrayLiteralInRegexp` instead.
|
10
|
+
#
|
8
11
|
# @example
|
9
12
|
#
|
10
13
|
# # bad
|
@@ -21,6 +24,7 @@ module RuboCop
|
|
21
24
|
MSG = 'Literal interpolation detected.'
|
22
25
|
COMPOSITE = %i[array hash pair irange erange].freeze
|
23
26
|
|
27
|
+
# rubocop:disable Metrics/AbcSize
|
24
28
|
def on_interpolation(begin_node)
|
25
29
|
final_node = begin_node.children.last
|
26
30
|
return unless offending?(final_node)
|
@@ -30,14 +34,23 @@ module RuboCop
|
|
30
34
|
# interpolation should not be removed if the expanded value
|
31
35
|
# contains a space character.
|
32
36
|
expanded_value = autocorrected_value(final_node)
|
37
|
+
expanded_value = handle_special_regexp_chars(begin_node, expanded_value)
|
38
|
+
|
33
39
|
return if in_array_percent_literal?(begin_node) && /\s|\A\z/.match?(expanded_value)
|
34
40
|
|
35
41
|
add_offense(final_node) do |corrector|
|
36
|
-
|
42
|
+
next if final_node.dstr_type? # nested, fixed in next iteration
|
43
|
+
|
44
|
+
replacement = if final_node.str_type? && !final_node.value.valid_encoding?
|
45
|
+
final_node.source.delete_prefix('"').delete_suffix('"')
|
46
|
+
else
|
47
|
+
expanded_value
|
48
|
+
end
|
37
49
|
|
38
|
-
corrector.replace(final_node.parent,
|
50
|
+
corrector.replace(final_node.parent, replacement)
|
39
51
|
end
|
40
52
|
end
|
53
|
+
# rubocop:enable Metrics/AbcSize
|
41
54
|
|
42
55
|
private
|
43
56
|
|
@@ -45,8 +58,10 @@ module RuboCop
|
|
45
58
|
node &&
|
46
59
|
!special_keyword?(node) &&
|
47
60
|
prints_as_self?(node) &&
|
48
|
-
# Special case for Layout/TrailingWhitespace
|
49
|
-
!(space_literal?(node) && ends_heredoc_line?(node))
|
61
|
+
# Special case for `Layout/TrailingWhitespace`
|
62
|
+
!(space_literal?(node) && ends_heredoc_line?(node)) &&
|
63
|
+
# Handled by `Lint/ArrayLiteralInRegexp`
|
64
|
+
!array_in_regexp?(node)
|
50
65
|
end
|
51
66
|
|
52
67
|
def special_keyword?(node)
|
@@ -54,6 +69,11 @@ module RuboCop
|
|
54
69
|
(node.str_type? && !node.loc.respond_to?(:begin)) || node.source_range.is?('__LINE__')
|
55
70
|
end
|
56
71
|
|
72
|
+
def array_in_regexp?(node)
|
73
|
+
grandparent = node.parent.parent
|
74
|
+
node.array_type? && grandparent.regexp_type?
|
75
|
+
end
|
76
|
+
|
57
77
|
# rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
58
78
|
def autocorrected_value(node)
|
59
79
|
case node.type
|
@@ -77,6 +97,27 @@ module RuboCop
|
|
77
97
|
end
|
78
98
|
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
79
99
|
|
100
|
+
def handle_special_regexp_chars(begin_node, value)
|
101
|
+
parent_node = begin_node.parent
|
102
|
+
|
103
|
+
return value unless parent_node.regexp_type? && parent_node.slash_literal? && value['/']
|
104
|
+
|
105
|
+
# When a literal string containing a forward slash preceded by backslashes
|
106
|
+
# is interpolated inside a regexp, the number of resultant backslashes in the
|
107
|
+
# compiled Regexp is `(2(n+1) / 4)+1`, where `n` is the number of backslashes
|
108
|
+
# inside the interpolation.
|
109
|
+
# ie. 0-2 backslashes is compiled to 1, 3-6 is compiled to 3, etc.
|
110
|
+
# This maintains that same behavior in order to ensure the Regexp behavior
|
111
|
+
# does not change upon removing the interpolation.
|
112
|
+
value.gsub(%r{(\\*)/}) do
|
113
|
+
backslashes = Regexp.last_match[1]
|
114
|
+
backslash_count = backslashes.length
|
115
|
+
needed_backslashes = (2 * ((backslash_count + 1) / 4)) + 1
|
116
|
+
|
117
|
+
"#{'\\' * needed_backslashes}/"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
80
121
|
def autocorrected_value_for_string(node)
|
81
122
|
if node.source.start_with?("'", '%q')
|
82
123
|
node.children.last.inspect[1..-2]
|
@@ -145,12 +186,12 @@ module RuboCop
|
|
145
186
|
end
|
146
187
|
|
147
188
|
def space_literal?(node)
|
148
|
-
node.str_type? && node.value.blank?
|
189
|
+
node.str_type? && node.value.valid_encoding? && node.value.blank?
|
149
190
|
end
|
150
191
|
|
151
192
|
def ends_heredoc_line?(node)
|
152
193
|
grandparent = node.parent.parent
|
153
|
-
return false unless grandparent&.dstr_type? && grandparent
|
194
|
+
return false unless grandparent&.dstr_type? && grandparent.heredoc?
|
154
195
|
|
155
196
|
line = processed_source.lines[node.last_line - 1]
|
156
197
|
line.size == node.loc.last_column + 1
|
@@ -158,10 +199,10 @@ module RuboCop
|
|
158
199
|
|
159
200
|
def in_array_percent_literal?(node)
|
160
201
|
parent = node.parent
|
161
|
-
return false unless parent.
|
202
|
+
return false unless parent.type?(:dstr, :dsym)
|
162
203
|
|
163
204
|
grandparent = parent.parent
|
164
|
-
grandparent&.array_type? && grandparent
|
205
|
+
grandparent&.array_type? && grandparent.percent_literal?
|
165
206
|
end
|
166
207
|
end
|
167
208
|
end
|
@@ -97,7 +97,7 @@ module RuboCop
|
|
97
97
|
|
98
98
|
# @!method class_new_block(node)
|
99
99
|
def_node_matcher :class_new_block, <<~RUBY
|
100
|
-
(
|
100
|
+
(any_block
|
101
101
|
(send
|
102
102
|
(const {nil? cbase} :Class) :new $_) ...)
|
103
103
|
RUBY
|
@@ -135,7 +135,7 @@ module RuboCop
|
|
135
135
|
end
|
136
136
|
|
137
137
|
def inside_class_with_stateful_parent?(node)
|
138
|
-
if (block_node = node.each_ancestor(:
|
138
|
+
if (block_node = node.each_ancestor(:any_block).first)
|
139
139
|
return false unless (super_class = class_new_block(block_node))
|
140
140
|
|
141
141
|
!allowed_class?(super_class)
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
# Offenses are registered for regexp character classes like `/[A-z]/`
|
9
9
|
# as well as range objects like `('A'..'z')`.
|
10
10
|
#
|
11
|
-
# NOTE: Range objects cannot be autocorrected.
|
11
|
+
# NOTE: `Range` objects cannot be autocorrected.
|
12
12
|
#
|
13
13
|
# @safety
|
14
14
|
# The cop autocorrects regexp character classes
|
@@ -36,12 +36,9 @@ module RuboCop
|
|
36
36
|
|
37
37
|
def on_irange(node)
|
38
38
|
return unless node.children.compact.all?(&:str_type?)
|
39
|
+
return if node.begin.nil? || node.end.nil?
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
return if range_start.nil? || range_end.nil?
|
43
|
-
|
44
|
-
add_offense(node) if unsafe_range?(range_start.value, range_end.value)
|
41
|
+
add_offense(node) if unsafe_range?(node.begin.value, node.end.value)
|
45
42
|
end
|
46
43
|
alias on_erange on_irange
|
47
44
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
|
-
# Do not mix named captures and numbered captures in a Regexp literal
|
6
|
+
# Do not mix named captures and numbered captures in a `Regexp` literal
|
7
7
|
# because numbered capture is ignored if they're mixed.
|
8
8
|
# Replace numbered captures with non-capturing groupings or
|
9
9
|
# named captures.
|
@@ -95,14 +95,14 @@ module RuboCop
|
|
95
95
|
MSG = 'Method definitions must not be nested. Use `lambda` instead.'
|
96
96
|
|
97
97
|
def on_def(node)
|
98
|
-
subject, = *node
|
99
|
-
return if node.defs_type? && subject
|
98
|
+
subject, = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
99
|
+
return if node.defs_type? && allowed_subject_type?(subject)
|
100
100
|
|
101
101
|
def_ancestor = node.each_ancestor(:def, :defs).first
|
102
102
|
return unless def_ancestor
|
103
103
|
|
104
104
|
within_scoping_def =
|
105
|
-
node.each_ancestor(:
|
105
|
+
node.each_ancestor(:any_block, :sclass).any? do |ancestor|
|
106
106
|
scoping_method_call?(ancestor)
|
107
107
|
end
|
108
108
|
|
@@ -117,6 +117,10 @@ module RuboCop
|
|
117
117
|
child.class_constructor? || allowed_method_name?(child)
|
118
118
|
end
|
119
119
|
|
120
|
+
def allowed_subject_type?(subject)
|
121
|
+
subject.variable? || subject.const_type? || subject.call_type?
|
122
|
+
end
|
123
|
+
|
120
124
|
def allowed_method_name?(node)
|
121
125
|
name = node.method_name
|
122
126
|
|
@@ -125,12 +129,12 @@ module RuboCop
|
|
125
129
|
|
126
130
|
# @!method eval_call?(node)
|
127
131
|
def_node_matcher :eval_call?, <<~PATTERN
|
128
|
-
(
|
132
|
+
(any_block (send _ {:instance_eval :class_eval :module_eval} ...) ...)
|
129
133
|
PATTERN
|
130
134
|
|
131
135
|
# @!method exec_call?(node)
|
132
136
|
def_node_matcher :exec_call?, <<~PATTERN
|
133
|
-
(
|
137
|
+
(any_block (send _ {:instance_exec :class_exec :module_exec} ...) ...)
|
134
138
|
PATTERN
|
135
139
|
end
|
136
140
|
end
|
@@ -59,12 +59,12 @@ module RuboCop
|
|
59
59
|
|
60
60
|
# @!method send_exist_node(node)
|
61
61
|
def_node_search :send_exist_node, <<~PATTERN
|
62
|
-
$(send (const nil? {:FileTest :File :Dir :Shell}) {:exist? :exists?} ...)
|
62
|
+
$(send (const {cbase nil?} {:FileTest :File :Dir :Shell}) {:exist? :exists?} ...)
|
63
63
|
PATTERN
|
64
64
|
|
65
65
|
# @!method receiver_and_method_name(node)
|
66
66
|
def_node_matcher :receiver_and_method_name, <<~PATTERN
|
67
|
-
(send (const nil? $_) $_ ...)
|
67
|
+
(send (const {cbase nil?} $_) $_ ...)
|
68
68
|
PATTERN
|
69
69
|
|
70
70
|
# @!method force?(node)
|
@@ -78,6 +78,7 @@ module RuboCop
|
|
78
78
|
PATTERN
|
79
79
|
|
80
80
|
def on_send(node)
|
81
|
+
return unless node.receiver&.const_type?
|
81
82
|
return unless if_node_child?(node)
|
82
83
|
return if explicit_not_force?(node)
|
83
84
|
return unless (exist_node = send_exist_node(node.parent).first)
|
@@ -95,7 +96,7 @@ module RuboCop
|
|
95
96
|
end
|
96
97
|
|
97
98
|
def allowable_use_with_if?(if_node)
|
98
|
-
if_node.condition.
|
99
|
+
if_node.condition.operator_keyword? || if_node.else_branch
|
99
100
|
end
|
100
101
|
|
101
102
|
def register_offense(node, exist_node)
|
@@ -115,6 +116,7 @@ module RuboCop
|
|
115
116
|
|
116
117
|
def message_remove_file_exist_check(node)
|
117
118
|
receiver, method_name = receiver_and_method_name(node)
|
119
|
+
|
118
120
|
format(MSG_REMOVE_FILE_EXIST_CHECK, receiver: receiver, method_name: method_name)
|
119
121
|
end
|
120
122
|
|
@@ -134,6 +136,7 @@ module RuboCop
|
|
134
136
|
|
135
137
|
corrector.replace(node.child_nodes.first.loc.name, 'FileUtils')
|
136
138
|
corrector.replace(node.loc.selector, replacement_method(node))
|
139
|
+
corrector.insert_before(node.last_argument, 'mode: ') if require_mode_keyword?(node)
|
137
140
|
end
|
138
141
|
|
139
142
|
def replacement_method(node)
|
@@ -152,6 +155,12 @@ module RuboCop
|
|
152
155
|
force_method_name?(node) || force_option?(node)
|
153
156
|
end
|
154
157
|
|
158
|
+
def require_mode_keyword?(node)
|
159
|
+
return false unless node.receiver.const_name == 'Dir'
|
160
|
+
|
161
|
+
replacement_method(node) == 'mkdir_p' && node.arguments.length == 2
|
162
|
+
end
|
163
|
+
|
155
164
|
def force_option?(node)
|
156
165
|
node.arguments.any? { |arg| force?(arg) }
|
157
166
|
end
|
@@ -59,11 +59,13 @@ module RuboCop
|
|
59
59
|
#
|
60
60
|
class NonDeterministicRequireOrder < Base
|
61
61
|
extend AutoCorrector
|
62
|
+
extend TargetRubyVersion
|
62
63
|
|
63
64
|
MSG = 'Sort files before requiring them.'
|
64
65
|
|
66
|
+
maximum_target_ruby_version 2.7
|
67
|
+
|
65
68
|
def on_block(node)
|
66
|
-
return if target_ruby_version >= 3.0
|
67
69
|
return unless node.body
|
68
70
|
return unless unsorted_dir_loop?(node.send_node)
|
69
71
|
|
@@ -75,7 +77,6 @@ module RuboCop
|
|
75
77
|
end
|
76
78
|
|
77
79
|
def on_numblock(node)
|
78
|
-
return if target_ruby_version >= 3.0
|
79
80
|
return unless node.body
|
80
81
|
return unless unsorted_dir_loop?(node.send_node)
|
81
82
|
|
@@ -87,7 +88,6 @@ module RuboCop
|
|
87
88
|
end
|
88
89
|
|
89
90
|
def on_block_pass(node)
|
90
|
-
return if target_ruby_version >= 3.0
|
91
91
|
return unless method_require?(node)
|
92
92
|
return unless unsorted_dir_pass?(node.parent)
|
93
93
|
|
@@ -33,8 +33,7 @@ module RuboCop
|
|
33
33
|
NUMBERED_PARAMETER_RANGE = (1..9).freeze
|
34
34
|
|
35
35
|
def on_lvasgn(node)
|
36
|
-
|
37
|
-
return unless /\A_(\d+)\z/ =~ lhs
|
36
|
+
return unless /\A_(\d+)\z/ =~ node.name
|
38
37
|
|
39
38
|
number = Regexp.last_match(1).to_i
|
40
39
|
template = NUMBERED_PARAMETER_RANGE.include?(number) ? NUM_PARAM_MSG : LVAR_MSG
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Certain numeric operations have a constant result, usually 0 or 1.
|
7
|
+
# Multiplying a number by 0 will always return 0.
|
8
|
+
# Dividing a number by itself or raising it to the power of 0 will always return 1.
|
9
|
+
# As such, they can be replaced with that result.
|
10
|
+
# These are probably leftover from debugging, or are mistakes.
|
11
|
+
# Other numeric operations that are similarly leftover from debugging or mistakes
|
12
|
+
# are handled by `Lint/UselessNumericOperation`.
|
13
|
+
#
|
14
|
+
# NOTE: This cop doesn't detect offenses for the `-` and `%` operator because it
|
15
|
+
# can't determine the type of `x`. If `x` is an `Array` or `String`, it doesn't perform
|
16
|
+
# a numeric operation.
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
#
|
20
|
+
# # bad
|
21
|
+
# x * 0
|
22
|
+
#
|
23
|
+
# # good
|
24
|
+
# 0
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# x *= 0
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# x = 0
|
31
|
+
#
|
32
|
+
# # bad
|
33
|
+
# x / x
|
34
|
+
# x ** 0
|
35
|
+
#
|
36
|
+
# # good
|
37
|
+
# 1
|
38
|
+
#
|
39
|
+
# # bad
|
40
|
+
# x /= x
|
41
|
+
# x **= 0
|
42
|
+
#
|
43
|
+
# # good
|
44
|
+
# x = 1
|
45
|
+
#
|
46
|
+
class NumericOperationWithConstantResult < Base
|
47
|
+
extend AutoCorrector
|
48
|
+
MSG = 'Numeric operation with a constant result detected.'
|
49
|
+
RESTRICT_ON_SEND = %i[* / **].freeze
|
50
|
+
|
51
|
+
# @!method operation_with_constant_result?(node)
|
52
|
+
def_node_matcher :operation_with_constant_result?,
|
53
|
+
'(call (call nil? $_lhs) $_operation ({int | call nil?} $_rhs))'
|
54
|
+
|
55
|
+
# @!method abbreviated_assignment_with_constant_result?(node)
|
56
|
+
def_node_matcher :abbreviated_assignment_with_constant_result?,
|
57
|
+
'(op-asgn (lvasgn $_lhs) $_operation ({int lvar} $_rhs))'
|
58
|
+
|
59
|
+
def on_send(node)
|
60
|
+
return unless (lhs, operation, rhs = operation_with_constant_result?(node))
|
61
|
+
return unless (result = constant_result?(lhs, operation, rhs))
|
62
|
+
|
63
|
+
add_offense(node) do |corrector|
|
64
|
+
corrector.replace(node, result.to_s)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
alias on_csend on_send
|
68
|
+
|
69
|
+
def on_op_asgn(node)
|
70
|
+
return unless (lhs, operation, rhs = abbreviated_assignment_with_constant_result?(node))
|
71
|
+
return unless (result = constant_result?(lhs, operation, rhs))
|
72
|
+
|
73
|
+
add_offense(node) do |corrector|
|
74
|
+
corrector.replace(node, "#{lhs} = #{result}")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def constant_result?(lhs, operation, rhs)
|
81
|
+
if rhs.to_s == '0'
|
82
|
+
return 0 if operation == :*
|
83
|
+
return 1 if operation == :**
|
84
|
+
elsif rhs == lhs
|
85
|
+
return 1 if operation == :/
|
86
|
+
end
|
87
|
+
# If we weren't able to find any matches, return false so we can bail out.
|
88
|
+
false
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -27,8 +27,7 @@ module RuboCop
|
|
27
27
|
MSG = 'Avoid using or-assignment with constants.'
|
28
28
|
|
29
29
|
def on_or_asgn(node)
|
30
|
-
|
31
|
-
return unless lhs&.casgn_type?
|
30
|
+
return unless node.lhs&.casgn_type?
|
32
31
|
|
33
32
|
add_offense(node.loc.operator) do |corrector|
|
34
33
|
next if node.each_ancestor(:def, :defs).any?
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
|
-
# Looks for references of Regexp captures that are out of range
|
6
|
+
# Looks for references of `Regexp` captures that are out of range
|
7
7
|
# and thus always returns nil.
|
8
8
|
#
|
9
9
|
# @safety
|
@@ -61,6 +61,7 @@ module RuboCop
|
|
61
61
|
check_regexp(node.receiver)
|
62
62
|
end
|
63
63
|
end
|
64
|
+
alias after_csend after_send
|
64
65
|
|
65
66
|
def on_when(node)
|
66
67
|
regexp_conditions = node.conditions.select(&:regexp_type?)
|
@@ -75,7 +76,7 @@ module RuboCop
|
|
75
76
|
end
|
76
77
|
|
77
78
|
def on_nth_ref(node)
|
78
|
-
backref
|
79
|
+
backref = node.children.first
|
79
80
|
return if @valid_ref.nil? || backref <= @valid_ref
|
80
81
|
|
81
82
|
message = format(
|
@@ -37,25 +37,20 @@ module RuboCop
|
|
37
37
|
private
|
38
38
|
|
39
39
|
def valid_context?(node)
|
40
|
-
unless node.arguments.one? &&
|
41
|
-
|
42
|
-
end
|
43
|
-
return true if first_argument_block_type?(node.first_argument)
|
40
|
+
return true unless node.arguments.one? && node.first_argument.parenthesized_call?
|
41
|
+
return true if node.first_argument.any_block_type?
|
44
42
|
|
45
43
|
node.operator_method? || node.setter_method? || chained_calls?(node) ||
|
46
44
|
valid_first_argument?(node.first_argument)
|
47
45
|
end
|
48
46
|
|
49
|
-
def first_argument_block_type?(first_arg)
|
50
|
-
first_arg.block_type? || first_arg.numblock_type?
|
51
|
-
end
|
52
|
-
|
53
47
|
def valid_first_argument?(first_arg)
|
54
|
-
first_arg.operator_keyword? || first_arg.hash_type? || ternary_expression?(first_arg)
|
48
|
+
first_arg.operator_keyword? || first_arg.hash_type? || ternary_expression?(first_arg) ||
|
49
|
+
compound_range?(first_arg)
|
55
50
|
end
|
56
51
|
|
57
|
-
def
|
58
|
-
|
52
|
+
def compound_range?(first_arg)
|
53
|
+
first_arg.range_type? && first_arg.parenthesized_call?
|
59
54
|
end
|
60
55
|
|
61
56
|
def chained_calls?(node)
|
@@ -111,7 +111,7 @@ module RuboCop
|
|
111
111
|
range_between(start + begin_pos - 1, start + end_pos)
|
112
112
|
end
|
113
113
|
|
114
|
-
# If the list of cops is comma-separated, but without
|
114
|
+
# If the list of cops is comma-separated, but without an empty space after the comma,
|
115
115
|
# we should **not** remove the prepending empty space, thus begin_pos += 1
|
116
116
|
def range_with_comma_after(comment, start, begin_pos, end_pos)
|
117
117
|
begin_pos += 1 if comment.source[end_pos + 1] != ' '
|