rubocop 1.69.0 → 1.76.1
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 +22 -16
- data/config/default.yml +234 -47
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli.rb +1 -1
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +52 -9
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- 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 +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +44 -39
- data/lib/rubocop/cop/base.rb +6 -0
- 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/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +50 -6
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- 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 +1 -0
- 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 +231 -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/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +4 -2
- 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_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs.rb +6 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +44 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- 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 +2 -2
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -3
- 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 +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- 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 +4 -9
- 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_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 +1 -0
- data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -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 +9 -4
- 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 +1 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
- 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 +1 -0
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -32
- 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 +5 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -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/binary_operator_with_identical_operands.rb +2 -3
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -3
- 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 +2 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +86 -19
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +3 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -8
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +110 -9
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- 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 +3 -3
- 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/non_atomic_file_operation.rb +4 -2
- 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/numeric_operation_with_constant_result.rb +18 -31
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- 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_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/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -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 +1 -1
- 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 +1 -1
- 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/useless_access_modifier.rb +5 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +87 -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_or.rb +98 -0
- 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/void.rb +14 -11
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- 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 +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +9 -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/code_length_calculator.rb +2 -2
- 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_line_breakable.rb +13 -13
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- 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 +0 -1
- 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 +5 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- 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 +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_method.rb +216 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +46 -2
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +4 -4
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- 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 +66 -15
- data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +47 -28
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +39 -28
- data/lib/rubocop/cop/style/block_delimiters.rb +26 -23
- 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_methods.rb +2 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +20 -6
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +5 -6
- 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 +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- 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 +20 -4
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -0
- 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/guard_clause.rb +2 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -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 +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
- data/lib/rubocop/cop/style/if_unless_modifier.rb +25 -7
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
- 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 +119 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +10 -3
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +5 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +12 -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 +26 -16
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +3 -2
- 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/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
- 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 -1
- data/lib/rubocop/cop/style/raise_args.rb +14 -12
- 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_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +59 -2
- 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 +262 -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_line_continuation.rb +38 -21
- data/lib/rubocop/cop/style/redundant_parentheses.rb +61 -17
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -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_self.rb +2 -1
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- 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/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +44 -16
- data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
- 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 -105
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -14
- 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 +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- 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/trivial_accessors.rb +1 -1
- 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 +1 -1
- 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 +7 -3
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +10 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/cops_documentation_generator.rb +31 -16
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.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 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- 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/result_cache.rb +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +10 -7
- data/lib/rubocop/server/cache.rb +47 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +7 -2
- data/lib/rubocop/target_ruby.rb +16 -1
- data/lib/rubocop/version.rb +30 -8
- data/lib/rubocop.rb +22 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +67 -19
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -86,6 +86,10 @@ module RuboCop
|
|
86
86
|
# foo.baz = bar if foo
|
87
87
|
# foo.baz + bar if foo
|
88
88
|
# foo.bar > 2 if foo
|
89
|
+
#
|
90
|
+
# foo ? foo[index] : nil # Ignored `foo&.[](index)` due to unclear readability benefit.
|
91
|
+
# foo ? foo[idx] = v : nil # Ignored `foo&.[]=(idx, v)` due to unclear readability benefit.
|
92
|
+
# foo ? foo * 42 : nil # Ignored `foo&.*(42)` due to unclear readability benefit.
|
89
93
|
class SafeNavigation < Base # rubocop:disable Metrics/ClassLength
|
90
94
|
include NilMethods
|
91
95
|
include RangeHelp
|
@@ -146,6 +150,7 @@ module RuboCop
|
|
146
150
|
|
147
151
|
body = extract_if_body(node)
|
148
152
|
method_call = receiver.parent
|
153
|
+
return if dotless_operator_call?(method_call) || method_call.double_colon?
|
149
154
|
|
150
155
|
removal_ranges = [begin_range(node, body), end_range(node, body)]
|
151
156
|
|
@@ -174,12 +179,19 @@ module RuboCop
|
|
174
179
|
range_with_surrounding_space(range: lhs.source_range, side: :right),
|
175
180
|
range_with_surrounding_space(range: lhs_operator_range, side: :right),
|
176
181
|
offense_range: range_between(lhs.source_range.begin_pos, rhs.source_range.end_pos)
|
177
|
-
)
|
182
|
+
) do |corrector|
|
183
|
+
corrector.replace(rhs_receiver, lhs_receiver.source)
|
184
|
+
end
|
185
|
+
ignore_node(node)
|
178
186
|
end
|
179
187
|
end
|
180
188
|
|
189
|
+
private
|
190
|
+
|
181
191
|
def report_offense(node, rhs, rhs_receiver, *removal_ranges, offense_range: node)
|
182
192
|
add_offense(offense_range) do |corrector|
|
193
|
+
next if ignored_node?(node)
|
194
|
+
|
183
195
|
# If the RHS is an `or` we cannot safely autocorrect because in order to remove
|
184
196
|
# the non-nil check we need to add safe-navs to all clauses where the receiver is used
|
185
197
|
next if and_with_rhs_or?(node)
|
@@ -193,8 +205,6 @@ module RuboCop
|
|
193
205
|
end
|
194
206
|
end
|
195
207
|
|
196
|
-
private
|
197
|
-
|
198
208
|
def find_method_chain(node)
|
199
209
|
return node unless node&.parent&.call_type?
|
200
210
|
|
@@ -227,10 +237,10 @@ module RuboCop
|
|
227
237
|
end
|
228
238
|
|
229
239
|
def offending_node?(node, lhs_receiver, rhs, rhs_receiver) # rubocop:disable Metrics/CyclomaticComplexity
|
230
|
-
return false if lhs_receiver
|
240
|
+
return false if !matching_nodes?(lhs_receiver, rhs_receiver) || rhs_receiver.nil?
|
231
241
|
return false if use_var_only_in_unless_modifier?(node, lhs_receiver)
|
232
242
|
return false if chain_length(rhs, rhs_receiver) > max_chain_length
|
233
|
-
return false if unsafe_method_used?(rhs, rhs_receiver.parent)
|
243
|
+
return false if unsafe_method_used?(node, rhs, rhs_receiver.parent)
|
234
244
|
return false if rhs.send_type? && rhs.method?(:empty?)
|
235
245
|
|
236
246
|
true
|
@@ -248,6 +258,12 @@ module RuboCop
|
|
248
258
|
end
|
249
259
|
end
|
250
260
|
|
261
|
+
def dotless_operator_call?(method_call)
|
262
|
+
return false if method_call.loc.dot
|
263
|
+
|
264
|
+
method_call.method?(:[]) || method_call.method?(:[]=) || method_call.operator_method?
|
265
|
+
end
|
266
|
+
|
251
267
|
def handle_comments(corrector, node, method_call)
|
252
268
|
comments = comments(node)
|
253
269
|
return if comments.empty?
|
@@ -306,34 +322,47 @@ module RuboCop
|
|
306
322
|
|
307
323
|
receiver = method_chain.receiver
|
308
324
|
|
309
|
-
return receiver if receiver
|
325
|
+
return receiver if matching_nodes?(receiver, checked_variable)
|
310
326
|
|
311
327
|
find_matching_receiver_invocation(receiver, checked_variable)
|
312
328
|
end
|
313
329
|
|
330
|
+
def matching_nodes?(left, right)
|
331
|
+
left == right || matching_call_nodes?(left, right)
|
332
|
+
end
|
333
|
+
|
334
|
+
def matching_call_nodes?(left, right)
|
335
|
+
return false unless left && right.respond_to?(:call_type?)
|
336
|
+
|
337
|
+
left.call_type? && right.call_type? && left.children == right.children
|
338
|
+
end
|
339
|
+
|
314
340
|
def chain_length(method_chain, method)
|
315
|
-
method.each_ancestor(:
|
341
|
+
method.each_ancestor(:call).inject(0) do |total, ancestor|
|
316
342
|
break total + 1 if ancestor == method_chain
|
317
343
|
|
318
344
|
total + 1
|
319
345
|
end
|
320
346
|
end
|
321
347
|
|
322
|
-
def unsafe_method_used?(method_chain, method)
|
323
|
-
return true if unsafe_method?(method)
|
348
|
+
def unsafe_method_used?(node, method_chain, method)
|
349
|
+
return true if unsafe_method?(node, method)
|
324
350
|
|
325
351
|
method.each_ancestor(:send).any? do |ancestor|
|
326
|
-
break true unless config.
|
352
|
+
break true unless config.cop_enabled?('Lint/SafeNavigationChain')
|
327
353
|
|
328
|
-
break true if unsafe_method?(ancestor)
|
354
|
+
break true if unsafe_method?(node, ancestor)
|
329
355
|
break true if nil_methods.include?(ancestor.method_name)
|
330
356
|
break false if ancestor == method_chain
|
331
357
|
end
|
332
358
|
end
|
333
359
|
|
334
|
-
def unsafe_method?(send_node)
|
335
|
-
negated?(send_node)
|
336
|
-
|
360
|
+
def unsafe_method?(node, send_node)
|
361
|
+
return true if negated?(send_node)
|
362
|
+
|
363
|
+
return false if node.respond_to?(:ternary?) && node.ternary?
|
364
|
+
|
365
|
+
send_node.assignment? ||
|
337
366
|
(!send_node.dot? && !send_node.safe_navigation?)
|
338
367
|
end
|
339
368
|
|
@@ -362,8 +391,7 @@ module RuboCop
|
|
362
391
|
method_chain)
|
363
392
|
start_method.each_ancestor do |ancestor|
|
364
393
|
break unless %i[send block].include?(ancestor.type)
|
365
|
-
next
|
366
|
-
next if ancestor.safe_navigation?
|
394
|
+
next if !ancestor.send_type? || ancestor.operator_method?
|
367
395
|
|
368
396
|
corrector.insert_before(ancestor.loc.dot, '&')
|
369
397
|
|
@@ -59,6 +59,7 @@ module RuboCop
|
|
59
59
|
{
|
60
60
|
(block call (args (arg $_)) ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
61
61
|
(numblock call $1 ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
62
|
+
(itblock call $_ ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
62
63
|
}
|
63
64
|
PATTERN
|
64
65
|
|
@@ -137,6 +138,7 @@ module RuboCop
|
|
137
138
|
return unless (block_arg_name, regexp_method_send_node = regexp_match?(block_node))
|
138
139
|
|
139
140
|
block_arg_name = :"_#{block_arg_name}" if block_node.numblock_type?
|
141
|
+
|
140
142
|
return unless calls_lvar?(regexp_method_send_node, block_arg_name)
|
141
143
|
|
142
144
|
regexp_method_send_node
|
@@ -150,7 +152,8 @@ module RuboCop
|
|
150
152
|
return node.child_nodes.first if node.match_with_lvasgn_type?
|
151
153
|
|
152
154
|
if node.receiver.lvar_type? &&
|
153
|
-
(block.
|
155
|
+
(block.type?(:numblock, :itblock) ||
|
156
|
+
node.receiver.source == block.first_argument.source)
|
154
157
|
node.first_argument
|
155
158
|
elsif node.first_argument.lvar_type?
|
156
159
|
node.receiver
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
68
68
|
def on_send(node)
|
69
69
|
return if allow_send? && !node.method?(:public_send)
|
70
70
|
return unless (first_argument = node.first_argument)
|
71
|
-
return unless
|
71
|
+
return unless first_argument.type?(*STATIC_METHOD_NAME_NODE_TYPES)
|
72
72
|
|
73
73
|
offense_range = offense_range(node)
|
74
74
|
method_name = first_argument.value
|
@@ -83,6 +83,7 @@ module RuboCop
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
86
|
+
alias on_csend on_send
|
86
87
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
87
88
|
|
88
89
|
private
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
# parameters.
|
11
11
|
#
|
12
12
|
# Configuration option: Methods
|
13
|
-
# Should be set to use this cop. Array of hashes, where each key is the
|
13
|
+
# Should be set to use this cop. `Array` of hashes, where each key is the
|
14
14
|
# method name and value - array of argument names.
|
15
15
|
#
|
16
16
|
# @example Methods: [{reduce: %w[a b]}]
|
@@ -56,11 +56,13 @@ module RuboCop
|
|
56
56
|
end
|
57
57
|
# rubocop:enable Metrics/AbcSize
|
58
58
|
alias on_numblock on_block
|
59
|
+
alias on_itblock on_block
|
59
60
|
|
60
61
|
private
|
61
62
|
|
62
63
|
def do_line(node)
|
63
|
-
if node.
|
64
|
+
if node.type?(:numblock, :itblock) ||
|
65
|
+
node.arguments.children.empty? || node.send_node.lambda_literal?
|
64
66
|
node.loc.begin
|
65
67
|
else
|
66
68
|
node.arguments
|
@@ -68,8 +70,7 @@ module RuboCop
|
|
68
70
|
end
|
69
71
|
|
70
72
|
def single_line_blocks_preferred?
|
71
|
-
|
72
|
-
redundant_line_break_config['Enabled'] && redundant_line_break_config['InspectBlocks']
|
73
|
+
@config.for_enabled_cop('Layout/RedundantLineBreak')['InspectBlocks']
|
73
74
|
end
|
74
75
|
end
|
75
76
|
end
|
@@ -8,9 +8,9 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# Endless methods added in Ruby 3.0 are also accepted by this cop.
|
10
10
|
#
|
11
|
-
# If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line`
|
12
|
-
# `
|
13
|
-
# methods if there is only one statement in the body.
|
11
|
+
# If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line`, `allow_always`,
|
12
|
+
# `require_single_line`, or `require_always`, single-line methods will be autocorrected
|
13
|
+
# to endless methods if there is only one statement in the body.
|
14
14
|
#
|
15
15
|
# @example
|
16
16
|
# # bad
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
68
68
|
return false if body_node.parent.assignment_method? ||
|
69
69
|
NOT_SUPPORTED_ENDLESS_METHOD_BODY_TYPES.include?(body_node.type)
|
70
70
|
|
71
|
-
!
|
71
|
+
!body_node.type?(:begin, :kwbegin)
|
72
72
|
end
|
73
73
|
|
74
74
|
def correct_to_multiline(corrector, node)
|
@@ -134,10 +134,9 @@ module RuboCop
|
|
134
134
|
end
|
135
135
|
|
136
136
|
def disallow_endless_method_style?
|
137
|
-
|
138
|
-
return true unless endless_method_config['Enabled']
|
137
|
+
return true unless config.cop_enabled?('Style/EndlessMethod')
|
139
138
|
|
140
|
-
|
139
|
+
config.for_cop('Style/EndlessMethod')['EnforcedStyle'] == 'disallow'
|
141
140
|
end
|
142
141
|
end
|
143
142
|
end
|
@@ -78,38 +78,67 @@ module RuboCop
|
|
78
78
|
return unless node.arguments.one?
|
79
79
|
|
80
80
|
range_node = node.first_argument
|
81
|
-
|
82
|
-
unless (message, removal_range =
|
83
|
-
|
84
|
-
|
81
|
+
offense_range = find_offense_range(node)
|
82
|
+
return unless (message, removal_range =
|
83
|
+
offense_message_with_removal_range(node, range_node, offense_range))
|
84
|
+
|
85
|
+
# Changing the range to beginningless or endless when unparenthesized
|
86
|
+
# changes the semantics of the code, and thus will not be considered
|
87
|
+
# an offense.
|
88
|
+
return if removal_range != offense_range && unparenthesized_call?(node)
|
85
89
|
|
86
|
-
add_offense(
|
90
|
+
add_offense(offense_range, message: message) do |corrector|
|
87
91
|
corrector.remove(removal_range)
|
88
92
|
end
|
89
93
|
end
|
94
|
+
alias on_csend on_send
|
90
95
|
|
91
96
|
private
|
92
97
|
|
93
|
-
def
|
98
|
+
def unparenthesized_call?(node)
|
99
|
+
node.loc.dot && !node.parenthesized?
|
100
|
+
end
|
101
|
+
|
102
|
+
def find_offense_range(node)
|
103
|
+
if node.loc.dot
|
104
|
+
node.loc.dot.join(node.source_range.end)
|
105
|
+
else
|
106
|
+
node.loc.selector
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def offense_message_with_removal_range(node, range_node, offense_range)
|
94
111
|
if range_from_zero_till_minus_one?(range_node)
|
95
|
-
[format(MSG_USELESS_RANGE, prefer:
|
112
|
+
[format(MSG_USELESS_RANGE, prefer: offense_range.source), offense_range]
|
96
113
|
elsif range_till_minus_one?(range_node)
|
97
114
|
[
|
98
|
-
|
115
|
+
offense_message_for_partial_range(node, endless(range_node), offense_range),
|
116
|
+
range_node.end
|
99
117
|
]
|
100
118
|
elsif range_from_zero?(range_node) && target_ruby_version >= 2.7
|
101
119
|
[
|
102
|
-
|
120
|
+
offense_message_for_partial_range(node, beginless(range_node), offense_range),
|
121
|
+
range_node.begin
|
103
122
|
]
|
104
123
|
end
|
105
124
|
end
|
106
125
|
|
126
|
+
def offense_message_for_partial_range(node, prefer, offense_range)
|
127
|
+
current = node.loc.dot ? arguments_source(node) : offense_range.source
|
128
|
+
prefer = "[#{prefer}]" unless node.loc.dot
|
129
|
+
format(MSG, prefer: prefer, current: current)
|
130
|
+
end
|
131
|
+
|
107
132
|
def endless(range_node)
|
108
|
-
"
|
133
|
+
"#{range_node.begin.source}#{range_node.loc.operator.source}"
|
109
134
|
end
|
110
135
|
|
111
136
|
def beginless(range_node)
|
112
|
-
"
|
137
|
+
"#{range_node.loc.operator.source}#{range_node.end.source}"
|
138
|
+
end
|
139
|
+
|
140
|
+
def arguments_source(node)
|
141
|
+
node.first_argument.source_range.join(node.last_argument.source_range.end).source
|
113
142
|
end
|
114
143
|
end
|
115
144
|
end
|
@@ -96,11 +96,7 @@ module RuboCop
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def autocorrect(corrector, node, if_branch)
|
99
|
-
if node.
|
100
|
-
corrector.wrap(node.condition, '(', ')')
|
101
|
-
end
|
102
|
-
|
103
|
-
if outer_condition_modify_form?(node, if_branch)
|
99
|
+
if node.modifier_form?
|
104
100
|
autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
105
101
|
else
|
106
102
|
autocorrect_outer_condition_basic(corrector, node, if_branch)
|
@@ -108,74 +104,48 @@ module RuboCop
|
|
108
104
|
end
|
109
105
|
|
110
106
|
def autocorrect_outer_condition_basic(corrector, node, if_branch)
|
111
|
-
|
112
|
-
|
113
|
-
outer_condition = node.condition
|
114
|
-
correct_outer_condition(corrector, outer_condition)
|
107
|
+
correct_node(corrector, node)
|
115
108
|
|
116
|
-
and_operator = if_branch.unless? ? ' && !' : ' && '
|
117
109
|
if if_branch.modifier_form?
|
118
|
-
correct_for_guard_condition_style(corrector,
|
110
|
+
correct_for_guard_condition_style(corrector, node, if_branch)
|
119
111
|
else
|
120
|
-
correct_for_basic_condition_style(corrector, node, if_branch
|
112
|
+
correct_for_basic_condition_style(corrector, node, if_branch)
|
121
113
|
correct_for_comment(corrector, node, if_branch)
|
122
114
|
end
|
123
115
|
end
|
124
116
|
|
125
|
-
def
|
126
|
-
|
127
|
-
|
117
|
+
def correct_node(corrector, node)
|
118
|
+
corrector.replace(node.loc.keyword, 'if') if node.unless?
|
119
|
+
corrector.replace(node.condition, chainable_condition(node))
|
128
120
|
end
|
129
121
|
|
130
|
-
def
|
131
|
-
corrector.
|
132
|
-
|
133
|
-
insert_bang(corrector, node, is_modify_form)
|
134
|
-
end
|
122
|
+
def correct_for_guard_condition_style(corrector, node, if_branch)
|
123
|
+
corrector.insert_after(node.condition, " && #{chainable_condition(if_branch)}")
|
135
124
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
range = range_between(if_branch.loc.keyword.begin_pos, condition.source_range.end_pos)
|
125
|
+
range = range_between(
|
126
|
+
if_branch.loc.keyword.begin_pos, if_branch.condition.source_range.end_pos
|
127
|
+
)
|
141
128
|
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
142
|
-
corrector.remove(if_branch.loc.keyword)
|
143
129
|
end
|
144
130
|
|
145
|
-
def correct_for_basic_condition_style(corrector, node, if_branch
|
131
|
+
def correct_for_basic_condition_style(corrector, node, if_branch)
|
146
132
|
range = range_between(
|
147
133
|
node.condition.source_range.end_pos, if_branch.condition.source_range.begin_pos
|
148
134
|
)
|
149
|
-
corrector.replace(range,
|
150
|
-
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
151
|
-
|
152
|
-
wrap_condition(corrector, if_branch.condition)
|
153
|
-
end
|
154
|
-
|
155
|
-
def wrap_condition(corrector, condition)
|
156
|
-
# Handle `send` and `block` nodes that need to be wrapped in parens
|
157
|
-
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
158
|
-
# but wrapping the argument list would be a more ergonomic correction.
|
159
|
-
node_to_check = condition&.block_type? ? condition.send_node : condition
|
160
|
-
return unless wrap_condition?(node_to_check)
|
135
|
+
corrector.replace(range, ' && ')
|
161
136
|
|
162
|
-
|
163
|
-
source = parenthesized_method_arguments(condition)
|
137
|
+
corrector.replace(if_branch.condition, chainable_condition(if_branch))
|
164
138
|
|
165
|
-
|
166
|
-
else
|
167
|
-
corrector.wrap(condition, '(', ')')
|
168
|
-
end
|
139
|
+
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
169
140
|
end
|
170
141
|
|
171
|
-
def
|
172
|
-
|
173
|
-
corrector.insert_before(condition,
|
174
|
-
"#{'!' if node.unless?}#{replace_condition(node.condition)} && ")
|
142
|
+
def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
143
|
+
correct_node(corrector, if_branch)
|
175
144
|
|
176
|
-
corrector.
|
177
|
-
|
178
|
-
|
145
|
+
corrector.insert_before(if_branch.condition, "#{chainable_condition(node)} && ")
|
146
|
+
|
147
|
+
range = range_between(node.loc.keyword.begin_pos, node.condition.source_range.end_pos)
|
148
|
+
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
179
149
|
end
|
180
150
|
|
181
151
|
def correct_for_comment(corrector, node, if_branch)
|
@@ -187,67 +157,38 @@ module RuboCop
|
|
187
157
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
188
158
|
end
|
189
159
|
|
190
|
-
def
|
191
|
-
|
160
|
+
def chainable_condition(node)
|
161
|
+
wrapped_condition = add_parentheses_if_needed(node.condition)
|
192
162
|
|
193
|
-
|
194
|
-
begin_pos = condition.first_argument.source_range.begin_pos
|
195
|
-
return if end_pos > begin_pos
|
163
|
+
return wrapped_condition if node.if?
|
196
164
|
|
197
|
-
|
198
|
-
corrector.remove(range)
|
199
|
-
corrector.insert_after(range, '(')
|
200
|
-
corrector.insert_after(condition.last_argument, ')')
|
165
|
+
node.condition.and_type? ? "!(#{wrapped_condition})" : "!#{wrapped_condition}"
|
201
166
|
end
|
202
167
|
|
203
|
-
def
|
204
|
-
|
168
|
+
def add_parentheses_if_needed(condition)
|
169
|
+
# Handle `send` and `block` nodes that need to be wrapped in parens
|
170
|
+
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
171
|
+
# but wrapping the argument list would be a more ergonomic correction.
|
172
|
+
node_to_check = condition&.any_block_type? ? condition.send_node : condition
|
173
|
+
return condition.source unless add_parentheses?(node_to_check)
|
205
174
|
|
206
|
-
if (condition
|
207
|
-
|
208
|
-
corrector.wrap(node.condition, '!(', ')')
|
209
|
-
elsif condition.and_type?
|
210
|
-
insert_bang_for_and(corrector, node)
|
175
|
+
if parenthesize_method?(condition)
|
176
|
+
parenthesized_method_arguments(condition)
|
211
177
|
else
|
212
|
-
|
178
|
+
"(#{condition.source})"
|
213
179
|
end
|
214
180
|
end
|
215
181
|
|
216
|
-
def
|
217
|
-
|
218
|
-
|
219
|
-
if lhs.and_type?
|
220
|
-
insert_bang_for_and(corrector, lhs)
|
221
|
-
corrector.insert_before(rhs, '!') if rhs
|
222
|
-
else
|
223
|
-
corrector.insert_before(lhs, '!')
|
224
|
-
corrector.insert_before(rhs, '!')
|
225
|
-
end
|
182
|
+
def parenthesize_method?(node)
|
183
|
+
node.call_type? && node.arguments.any? && !node.parenthesized? &&
|
184
|
+
!node.comparison_method? && !node.operator_method?
|
226
185
|
end
|
227
186
|
|
228
|
-
def
|
229
|
-
|
230
|
-
|
231
|
-
end
|
187
|
+
def add_parentheses?(node)
|
188
|
+
return true if node.assignment? || (node.operator_keyword? && !node.and_type?)
|
189
|
+
return false unless node.call_type?
|
232
190
|
|
233
|
-
|
234
|
-
range_between(
|
235
|
-
node.first_argument.source_range.begin_pos, node.last_argument.source_range.end_pos
|
236
|
-
)
|
237
|
-
end
|
238
|
-
|
239
|
-
def wrap_condition?(node)
|
240
|
-
node.operator_keyword? || (node.call_type? && node.arguments.any? && !node.parenthesized?)
|
241
|
-
end
|
242
|
-
|
243
|
-
def replace_condition(condition)
|
244
|
-
return condition.source unless wrap_condition?(condition)
|
245
|
-
|
246
|
-
if condition.call_type?
|
247
|
-
parenthesized_method_arguments(condition)
|
248
|
-
else
|
249
|
-
"(#{condition.source})"
|
250
|
-
end
|
191
|
+
(node.arguments.any? && !node.parenthesized?) || node.prefix_not?
|
251
192
|
end
|
252
193
|
|
253
194
|
def parenthesized_method_arguments(node)
|
@@ -260,10 +201,6 @@ module RuboCop
|
|
260
201
|
def allow_modifier?
|
261
202
|
cop_config['AllowModifier']
|
262
203
|
end
|
263
|
-
|
264
|
-
def outer_condition_modify_form?(node, if_branch)
|
265
|
-
node.condition.source_range.begin_pos > if_branch.condition.source_range.begin_pos
|
266
|
-
end
|
267
204
|
end
|
268
205
|
end
|
269
206
|
end
|
@@ -51,7 +51,6 @@ module RuboCop
|
|
51
51
|
# Pathname.new('/') + 'test'
|
52
52
|
#
|
53
53
|
class StringConcatenation < Base
|
54
|
-
include RangeHelp
|
55
54
|
extend AutoCorrector
|
56
55
|
|
57
56
|
MSG = 'Prefer string interpolation to string concatenation.'
|
@@ -128,11 +127,11 @@ module RuboCop
|
|
128
127
|
end
|
129
128
|
|
130
129
|
def uncorrectable?(part)
|
131
|
-
part.multiline? || heredoc?(part) || part.each_descendant(:
|
130
|
+
part.multiline? || heredoc?(part) || part.each_descendant(:any_block).any?
|
132
131
|
end
|
133
132
|
|
134
133
|
def heredoc?(node)
|
135
|
-
return false unless node.
|
134
|
+
return false unless node.type?(:str, :dstr)
|
136
135
|
|
137
136
|
node.heredoc?
|
138
137
|
end
|
@@ -142,22 +141,24 @@ module RuboCop
|
|
142
141
|
end
|
143
142
|
|
144
143
|
def replacement(parts)
|
145
|
-
interpolated_parts =
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
else
|
154
|
-
"\#{#{part.source}}"
|
155
|
-
end
|
144
|
+
interpolated_parts = parts.map do |part|
|
145
|
+
case part.type
|
146
|
+
when :str
|
147
|
+
adjust_str(part)
|
148
|
+
when :dstr
|
149
|
+
part.children.all?(&:str_type?) ? adjust_str(part) : part.value
|
150
|
+
else
|
151
|
+
"\#{#{part.source}}"
|
156
152
|
end
|
153
|
+
end
|
157
154
|
|
158
155
|
"\"#{handle_quotes(interpolated_parts).join}\""
|
159
156
|
end
|
160
157
|
|
158
|
+
def adjust_str(node)
|
159
|
+
single_quoted?(node) ? node.value.gsub(/(\\|")/, '\\\\\&') : node.value.inspect[1..-2]
|
160
|
+
end
|
161
|
+
|
161
162
|
def handle_quotes(parts)
|
162
163
|
parts.map do |part|
|
163
164
|
part == '"' ? '\"' : part
|
@@ -3,7 +3,8 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks for inheritance from Struct.new.
|
6
|
+
# Checks for inheritance from `Struct.new`. Inheriting from `Struct.new`
|
7
|
+
# adds a superfluous level in inheritance tree.
|
7
8
|
#
|
8
9
|
# @safety
|
9
10
|
# Autocorrection is unsafe because it will change the inheritance
|
@@ -17,12 +18,18 @@ module RuboCop
|
|
17
18
|
# end
|
18
19
|
# end
|
19
20
|
#
|
21
|
+
# Person.ancestors
|
22
|
+
# # => [Person, #<Class:0x000000010b4e14a0>, Struct, (...)]
|
23
|
+
#
|
20
24
|
# # good
|
21
25
|
# Person = Struct.new(:first_name, :last_name) do
|
22
26
|
# def age
|
23
27
|
# 42
|
24
28
|
# end
|
25
29
|
# end
|
30
|
+
#
|
31
|
+
# Person.ancestors
|
32
|
+
# # => [Person, Struct, (...)]
|
26
33
|
class StructInheritance < Base
|
27
34
|
include RangeHelp
|
28
35
|
extend AutoCorrector
|