rubocop 1.65.1 → 1.75.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +72 -72
- data/config/default.yml +299 -55
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +3 -1
- data/exe/rubocop +4 -3
- 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/cli.rb +1 -1
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +57 -11
- data/lib/rubocop/config_loader.rb +66 -17
- data/lib/rubocop/config_loader_resolver.rb +39 -14
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_validator.rb +27 -15
- data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
- data/lib/rubocop/cop/base.rb +17 -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/line_break_corrector.rb +2 -0
- 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/documentation.rb +18 -1
- 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/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
- 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 +2 -2
- 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 +230 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_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 +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs.rb +7 -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 +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- 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 +4 -4
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +9 -12
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +30 -4
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
- 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 -10
- 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 +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +12 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -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 +135 -16
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +6 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +23 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- 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 +11 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +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 +118 -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 +2 -2
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -2
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +46 -19
- 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_conditional_body.rb +29 -58
- 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 -7
- data/lib/rubocop/cop/lint/float_comparison.rb +21 -17
- 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 +13 -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 +118 -9
- 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_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- 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 +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +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/shadowing_outer_local_variable.rb +8 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +2 -2
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +20 -11
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -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 +78 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- 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 +40 -14
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/block_length.rb +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +15 -14
- 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 +15 -6
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +22 -11
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +12 -6
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/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 +15 -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 +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -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 +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_name.rb +46 -2
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- 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 +29 -7
- data/lib/rubocop/cop/style/alias.rb +1 -1
- 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 +94 -30
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +42 -30
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +51 -20
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_compact.rb +10 -10
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +10 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +25 -2
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +40 -28
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -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 +4 -4
- 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 +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +35 -22
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +5 -5
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
- 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 +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +12 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +11 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +26 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +25 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -12
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +2 -1
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_into_array.rb +75 -14
- 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 +38 -23
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +10 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
- 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/next.rb +44 -0
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +2 -2
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +30 -5
- 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 +14 -22
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -3
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +6 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -24
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_format.rb +257 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +56 -20
- data/lib/rubocop/cop/style/redundant_parentheses.rb +57 -27
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -1
- 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 +9 -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_sort_by.rb +17 -1
- 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 +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +123 -54
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +14 -8
- 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 +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -106
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
- 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 +9 -2
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- 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 +14 -3
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +10 -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/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +5 -11
- data/lib/rubocop/cops_documentation_generator.rb +117 -53
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -2
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +6 -4
- 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 +19 -49
- data/lib/rubocop/lsp/server.rb +0 -3
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +4 -1
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +15 -21
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +7 -2
- data/lib/rubocop/rspec/shared_contexts.rb +40 -3
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +27 -13
- data/lib/rubocop/server/cache.rb +52 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/core.rb +1 -0
- data/lib/rubocop/target_finder.rb +7 -2
- data/lib/rubocop/target_ruby.rb +36 -17
- data/lib/rubocop/version.rb +54 -11
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +36 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +83 -40
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -23,11 +23,13 @@ module RuboCop
|
|
23
23
|
'clause in a multiline statement.'
|
24
24
|
|
25
25
|
def on_if(node)
|
26
|
+
return if part_of_ignored_node?(node)
|
26
27
|
return unless node.modifier_form? && node.body.multiline?
|
27
28
|
|
28
29
|
add_offense(node, message: format(MSG, keyword: node.keyword)) do |corrector|
|
29
30
|
corrector.replace(node, to_normal_if(node))
|
30
31
|
end
|
32
|
+
ignore_node(node)
|
31
33
|
end
|
32
34
|
|
33
35
|
private
|
@@ -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
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
corrector.remove(range_by_whole_lines(arguments.loc.end, include_final_newline: true))
|
51
51
|
end
|
52
52
|
|
53
|
-
arguments_range = arguments_range(node)
|
53
|
+
arguments_range = range_with_surrounding_space(arguments_range(node), side: :left)
|
54
54
|
# If the method name isn't on the same line as def, move it directly after def
|
55
55
|
if arguments_range.first_line != opening_line(node)
|
56
56
|
corrector.remove(node.loc.name)
|
@@ -66,14 +66,6 @@ module RuboCop
|
|
66
66
|
processed_source[arguments.last_line - 1].strip
|
67
67
|
end
|
68
68
|
|
69
|
-
def arguments_range(node)
|
70
|
-
range = range_between(
|
71
|
-
node.first_argument.source_range.begin_pos, node.last_argument.source_range.end_pos
|
72
|
-
)
|
73
|
-
|
74
|
-
range_with_surrounding_space(range, side: :left)
|
75
|
-
end
|
76
|
-
|
77
69
|
def opening_line(node)
|
78
70
|
node.first_line
|
79
71
|
end
|
@@ -55,70 +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
|
61
62
|
|
62
|
-
|
63
|
-
|
63
|
+
# @!method simple_comparison_lhs(node)
|
64
|
+
def_node_matcher :simple_comparison_lhs, <<~PATTERN
|
65
|
+
(send ${lvar call} :== $_)
|
66
|
+
PATTERN
|
64
67
|
|
65
|
-
|
68
|
+
# @!method simple_comparison_rhs(node)
|
69
|
+
def_node_matcher :simple_comparison_rhs, <<~PATTERN
|
70
|
+
(send $_ :== ${lvar call})
|
71
|
+
PATTERN
|
66
72
|
|
73
|
+
# rubocop:disable Metrics/AbcSize
|
74
|
+
def on_or(node)
|
75
|
+
root_of_or_node = root_of_or_node(node)
|
67
76
|
return unless node == root_of_or_node
|
68
|
-
return unless
|
69
|
-
return if @allowed_method_comparison
|
70
|
-
return if @compared_elements.size < comparisons_threshold
|
77
|
+
return unless nested_comparison?(node)
|
71
78
|
|
72
|
-
|
73
|
-
|
74
|
-
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
|
75
81
|
|
76
|
-
|
77
|
-
|
82
|
+
range = offense_range(values)
|
83
|
+
|
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})"
|
78
88
|
|
79
|
-
|
89
|
+
corrector.replace(range, prefer_method)
|
90
|
+
end
|
80
91
|
end
|
92
|
+
# rubocop:enable Metrics/AbcSize
|
81
93
|
|
82
94
|
private
|
83
95
|
|
84
|
-
#
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
(
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
def_node_matcher :simple_comparison_rhs?, <<~PATTERN
|
94
|
-
(send $_ :== $lvar)
|
95
|
-
PATTERN
|
96
|
-
|
97
|
-
def nested_variable_comparison?(node)
|
98
|
-
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?
|
99
105
|
|
100
|
-
|
101
|
-
|
106
|
+
variables << var
|
107
|
+
return if variables.size > 1
|
102
108
|
|
103
|
-
|
104
|
-
if node.or_type?
|
105
|
-
node.node_parts.flat_map { |node_part| variables_in_node(node_part) }.uniq
|
106
|
-
else
|
107
|
-
variables_in_simple_node(node)
|
109
|
+
values << obj
|
108
110
|
end
|
109
|
-
end
|
110
111
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
end
|
115
|
-
if (var, obj = simple_comparison_lhs?(node)) || (obj, var = simple_comparison_rhs?(node))
|
116
|
-
@allowed_method_comparison = true if allow_method_comparison? && obj.send_type?
|
117
|
-
@compared_elements << obj.source
|
118
|
-
return [variable_name(var)]
|
119
|
-
end
|
112
|
+
[variables.first, values] if variables.any?
|
113
|
+
end
|
114
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
120
115
|
|
121
|
-
|
116
|
+
def offense_range(values)
|
117
|
+
values.first.parent.source_range.begin.join(values.last.parent.source_range.end)
|
122
118
|
end
|
123
119
|
|
124
120
|
def variable_name(node)
|
@@ -134,7 +130,15 @@ module RuboCop
|
|
134
130
|
end
|
135
131
|
|
136
132
|
def comparison?(node)
|
137
|
-
|
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
|
138
142
|
end
|
139
143
|
|
140
144
|
def root_of_or_node(or_node)
|
@@ -147,17 +151,6 @@ module RuboCop
|
|
147
151
|
end
|
148
152
|
end
|
149
153
|
|
150
|
-
def switch_comparison?(node)
|
151
|
-
return true if @last_comparison.nil?
|
152
|
-
|
153
|
-
@last_comparison.descendants.none?(node)
|
154
|
-
end
|
155
|
-
|
156
|
-
def reset_comparison
|
157
|
-
@compared_elements = []
|
158
|
-
@allowed_method_comparison = false
|
159
|
-
end
|
160
|
-
|
161
154
|
def allow_method_comparison?
|
162
155
|
cop_config.fetch('AllowMethodComparison', true)
|
163
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)
|
@@ -46,6 +46,38 @@ module RuboCop
|
|
46
46
|
# next unless a == 1
|
47
47
|
# puts a
|
48
48
|
# end
|
49
|
+
#
|
50
|
+
# @example AllowConsecutiveConditionals: false (default)
|
51
|
+
# # bad
|
52
|
+
# [1, 2].each do |a|
|
53
|
+
# if a == 1
|
54
|
+
# puts a
|
55
|
+
# end
|
56
|
+
# if a == 2
|
57
|
+
# puts a
|
58
|
+
# end
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# # good
|
62
|
+
# [1, 2].each do |a|
|
63
|
+
# if a == 1
|
64
|
+
# puts a
|
65
|
+
# end
|
66
|
+
# next unless a == 2
|
67
|
+
# puts a
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# @example AllowConsecutiveConditionals: true
|
71
|
+
# # good
|
72
|
+
# [1, 2].each do |a|
|
73
|
+
# if a == 1
|
74
|
+
# puts a
|
75
|
+
# end
|
76
|
+
# if a == 2
|
77
|
+
# puts a
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
#
|
49
81
|
class Next < Base
|
50
82
|
include ConfigurableEnforcedStyle
|
51
83
|
include MinBodyLength
|
@@ -72,6 +104,7 @@ module RuboCop
|
|
72
104
|
end
|
73
105
|
|
74
106
|
alias on_numblock on_block
|
107
|
+
alias on_itblock on_block
|
75
108
|
|
76
109
|
def on_while(node)
|
77
110
|
check(node)
|
@@ -86,6 +119,9 @@ module RuboCop
|
|
86
119
|
|
87
120
|
offending_node = offense_node(node.body)
|
88
121
|
|
122
|
+
return if allowed_consecutive_conditionals? &&
|
123
|
+
consecutive_conditionals?(offending_node)
|
124
|
+
|
89
125
|
add_offense(offense_location(offending_node)) do |corrector|
|
90
126
|
if offending_node.modifier_form?
|
91
127
|
autocorrect_modifier(corrector, offending_node)
|
@@ -227,6 +263,14 @@ module RuboCop
|
|
227
263
|
|
228
264
|
corrector.remove_leading(buffer.line_range(lineno), adjustment) if adjustment.positive?
|
229
265
|
end
|
266
|
+
|
267
|
+
def consecutive_conditionals?(if_node)
|
268
|
+
if_node.parent&.begin_type? && if_node.left_sibling&.if_type?
|
269
|
+
end
|
270
|
+
|
271
|
+
def allowed_consecutive_conditionals?
|
272
|
+
cop_config.fetch('AllowConsecutiveConditionals', false)
|
273
|
+
end
|
230
274
|
end
|
231
275
|
end
|
232
276
|
end
|
@@ -8,8 +8,8 @@ module RuboCop
|
|
8
8
|
# These can be replaced by their respective predicate methods.
|
9
9
|
# This cop can also be configured to do the reverse.
|
10
10
|
#
|
11
|
-
# This cop can be customized
|
12
|
-
# By default, there are no methods
|
11
|
+
# This cop's allowed methods can be customized with `AllowedMethods`.
|
12
|
+
# By default, there are no allowed methods.
|
13
13
|
#
|
14
14
|
# This cop disregards `#nonzero?` as its value is truthy or falsey,
|
15
15
|
# but not `true` and `false`, and thus not always interchangeable with
|
@@ -30,41 +30,41 @@ 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
|
41
|
+
alias on_itblock on_block
|
39
42
|
|
40
43
|
def on_send(node)
|
41
44
|
return unless node.arguments.one? && node.first_argument.block_pass_type?
|
42
45
|
|
43
46
|
check_method_node(node)
|
44
47
|
end
|
48
|
+
alias on_csend on_send
|
45
49
|
|
46
50
|
private
|
47
51
|
|
48
52
|
def check_method_node(node)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
if preferred_method?(node)
|
54
|
+
correct_style_detected
|
55
|
+
else
|
56
|
+
opposite_style_detected
|
57
|
+
message = message(node)
|
58
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
59
|
+
prefer = style == :then && node.receiver.nil? ? 'self.then' : style
|
54
60
|
|
55
|
-
|
61
|
+
corrector.replace(node.loc.selector, prefer)
|
62
|
+
end
|
56
63
|
end
|
57
64
|
end
|
58
65
|
|
59
66
|
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
|
67
|
+
node.method?(style)
|
68
68
|
end
|
69
69
|
|
70
70
|
def message(node)
|
@@ -4,8 +4,8 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# Checks for uses of if/then/else/end constructs on a single line.
|
7
|
-
# AlwaysCorrectToMultiline config option can be set to true to
|
8
|
-
# multi-line constructs. When AlwaysCorrectToMultiline is false (default case) the
|
7
|
+
# `AlwaysCorrectToMultiline` config option can be set to true to autocorrect all offenses to
|
8
|
+
# multi-line constructs. When `AlwaysCorrectToMultiline` is false (default case) the
|
9
9
|
# autocorrect will first try converting them to ternary operators.
|
10
10
|
#
|
11
11
|
# @example
|
@@ -30,6 +30,25 @@ module RuboCop
|
|
30
30
|
# else
|
31
31
|
# baz
|
32
32
|
# end
|
33
|
+
#
|
34
|
+
# @example AlwaysCorrectToMultiline: false (default)
|
35
|
+
# # bad
|
36
|
+
# if cond then run else dont end
|
37
|
+
#
|
38
|
+
# # good
|
39
|
+
# cond ? run : dont
|
40
|
+
#
|
41
|
+
# @example AlwaysCorrectToMultiline: true
|
42
|
+
# # bad
|
43
|
+
# if cond then run else dont end
|
44
|
+
#
|
45
|
+
# # good
|
46
|
+
# if cond
|
47
|
+
# run
|
48
|
+
# else
|
49
|
+
# dont
|
50
|
+
# end
|
51
|
+
#
|
33
52
|
class OneLineConditional < Base
|
34
53
|
include Alignment
|
35
54
|
include ConfigurableEnforcedStyle
|
@@ -42,11 +61,15 @@ module RuboCop
|
|
42
61
|
def on_normal_if_unless(node)
|
43
62
|
return unless node.single_line?
|
44
63
|
return unless node.else_branch
|
45
|
-
return if node.elsif?
|
64
|
+
return if node.elsif? || node.if_branch&.begin_type?
|
46
65
|
|
47
66
|
message = message(node)
|
48
67
|
add_offense(node, message: message) do |corrector|
|
68
|
+
next if part_of_ignored_node?(node)
|
69
|
+
|
49
70
|
autocorrect(corrector, node)
|
71
|
+
|
72
|
+
ignore_node(node)
|
50
73
|
end
|
51
74
|
end
|
52
75
|
|
@@ -79,11 +102,13 @@ module RuboCop
|
|
79
102
|
end
|
80
103
|
|
81
104
|
def cannot_replace_to_ternary?(node)
|
82
|
-
node.elsif_conditional?
|
105
|
+
return true if node.elsif_conditional?
|
106
|
+
|
107
|
+
node.else_branch.begin_type? && node.else_branch.children.compact.count >= 2
|
83
108
|
end
|
84
109
|
|
85
110
|
def ternary_replacement(node)
|
86
|
-
condition, if_branch, else_branch = *node
|
111
|
+
condition, if_branch, else_branch = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
87
112
|
|
88
113
|
"#{expr_replacement(condition)} ? " \
|
89
114
|
"#{expr_replacement(if_branch)} : " \
|
@@ -3,15 +3,15 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Flags uses of OpenStruct
|
6
|
+
# Flags uses of `OpenStruct`, as it is now officially discouraged
|
7
7
|
# to be used for performance, version compatibility, and potential security issues.
|
8
8
|
#
|
9
9
|
# @safety
|
10
|
-
#
|
11
10
|
# Note that this cop may flag false positives; for instance, the following legal
|
12
11
|
# use of a hand-rolled `OpenStruct` type would be considered an offense:
|
13
12
|
#
|
14
|
-
#
|
13
|
+
# [source,ruby]
|
14
|
+
# -----
|
15
15
|
# module MyNamespace
|
16
16
|
# class OpenStruct # not the OpenStruct we're looking for
|
17
17
|
# end
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
# OpenStruct.new # resolves to MyNamespace::OpenStruct
|
21
21
|
# end
|
22
22
|
# end
|
23
|
-
#
|
23
|
+
# -----
|
24
24
|
#
|
25
25
|
# @example
|
26
26
|
#
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
def custom_class_or_module_definition?(node)
|
62
62
|
parent = node.parent
|
63
63
|
|
64
|
-
|
64
|
+
parent.type?(:class, :module) && node.left_siblings.empty?
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -22,21 +22,25 @@ module RuboCop
|
|
22
22
|
|
23
23
|
MSG = 'Redundant dot detected.'
|
24
24
|
RESTRICT_ON_SEND = %i[| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ ! != !~].freeze
|
25
|
+
INVALID_SYNTAX_ARG_TYPES = %i[
|
26
|
+
splat kwsplat forwarded_args forwarded_restarg forwarded_kwrestarg block_pass
|
27
|
+
].freeze
|
25
28
|
|
26
29
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
27
30
|
def on_send(node)
|
28
31
|
return unless (dot = node.loc.dot)
|
29
32
|
return if node.receiver.const_type? || !node.arguments.one?
|
30
33
|
|
31
|
-
|
32
|
-
return if
|
34
|
+
return unless (rhs = node.first_argument)
|
35
|
+
return if method_call_with_parenthesized_arg?(rhs)
|
36
|
+
return if invalid_syntax_argument?(rhs)
|
33
37
|
|
34
38
|
add_offense(dot) do |corrector|
|
35
39
|
wrap_in_parentheses_if_chained(corrector, node)
|
36
40
|
corrector.replace(dot, ' ')
|
37
41
|
|
38
42
|
selector = node.loc.selector
|
39
|
-
corrector.insert_after(selector, ' ') if
|
43
|
+
corrector.insert_after(selector, ' ') if insert_space_after?(node)
|
40
44
|
end
|
41
45
|
end
|
42
46
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
@@ -50,11 +54,10 @@ module RuboCop
|
|
50
54
|
argument.children.first && argument.parent.parenthesized?
|
51
55
|
end
|
52
56
|
|
53
|
-
def
|
54
|
-
|
55
|
-
return true if argument.hash_type? && argument.children.first&.forwarded_kwrestarg_type?
|
57
|
+
def invalid_syntax_argument?(argument)
|
58
|
+
type = argument.hash_type? ? argument.children.first&.type : argument.type
|
56
59
|
|
57
|
-
|
60
|
+
INVALID_SYNTAX_ARG_TYPES.include?(type)
|
58
61
|
end
|
59
62
|
|
60
63
|
def wrap_in_parentheses_if_chained(corrector, node)
|
@@ -67,6 +70,21 @@ module RuboCop
|
|
67
70
|
corrector.insert_after(operator, ' ')
|
68
71
|
corrector.wrap(node, '(', ')')
|
69
72
|
end
|
73
|
+
|
74
|
+
def insert_space_after?(node)
|
75
|
+
rhs = node.first_argument
|
76
|
+
selector = node.loc.selector
|
77
|
+
|
78
|
+
return true if selector.end_pos == rhs.source_range.begin_pos
|
79
|
+
return false if node.parent&.call_type? # if chained, a space is already added
|
80
|
+
|
81
|
+
# For `/` operations, if the RHS starts with a `(` without space,
|
82
|
+
# add one to avoid a syntax error.
|
83
|
+
range = selector.end.join(rhs.source_range.begin)
|
84
|
+
return true if node.method?(:/) && range.source == '('
|
85
|
+
|
86
|
+
false
|
87
|
+
end
|
70
88
|
end
|
71
89
|
end
|
72
90
|
end
|