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
@@ -11,6 +11,9 @@ module RuboCop
|
|
11
11
|
# will not register an offense, because it allows the initializer to take a different
|
12
12
|
# number of arguments as its superclass potentially does.
|
13
13
|
#
|
14
|
+
# NOTE: If an initializer takes any arguments and has an empty body, RuboCop
|
15
|
+
# assumes it to *not* be redundant. This is to prevent potential `ArgumentError`.
|
16
|
+
#
|
14
17
|
# NOTE: If an initializer argument has a default value, RuboCop assumes it
|
15
18
|
# to *not* be redundant.
|
16
19
|
#
|
@@ -19,8 +22,10 @@ module RuboCop
|
|
19
22
|
# initializer.
|
20
23
|
#
|
21
24
|
# @safety
|
22
|
-
# This cop is unsafe because
|
23
|
-
#
|
25
|
+
# This cop is unsafe because removing an empty initializer may alter
|
26
|
+
# the behavior of the code, particularly if the superclass initializer
|
27
|
+
# raises an exception. In such cases, the empty initializer may act as
|
28
|
+
# a safeguard to prevent unintended errors from propagating.
|
24
29
|
#
|
25
30
|
# @example
|
26
31
|
# # bad
|
@@ -69,6 +74,10 @@ module RuboCop
|
|
69
74
|
# end
|
70
75
|
#
|
71
76
|
# # good (changes the parameter requirements)
|
77
|
+
# def initialize(_)
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
# # good (changes the parameter requirements)
|
72
81
|
# def initialize(*)
|
73
82
|
# end
|
74
83
|
#
|
@@ -111,7 +120,7 @@ module RuboCop
|
|
111
120
|
return if acceptable?(node)
|
112
121
|
|
113
122
|
if node.body.nil?
|
114
|
-
register_offense(node, MSG_EMPTY)
|
123
|
+
register_offense(node, MSG_EMPTY) if node.arguments.empty?
|
115
124
|
else
|
116
125
|
return if node.body.begin_type?
|
117
126
|
|
@@ -73,10 +73,15 @@ module RuboCop
|
|
73
73
|
LINE_CONTINUATION_PATTERN = /(\\\n)/.freeze
|
74
74
|
ALLOWED_STRING_TOKENS = %i[tSTRING tSTRING_CONTENT].freeze
|
75
75
|
ARGUMENT_TYPES = %i[
|
76
|
-
kFALSE kNIL kSELF kTRUE
|
77
|
-
|
76
|
+
kDEF kDEFINED kFALSE kNIL kSELF kTRUE tAMPER tBANG tCARET tCHARACTER tCOLON3 tCONSTANT
|
77
|
+
tCVAR tDOT2 tDOT3 tFLOAT tGVAR tIDENTIFIER tINTEGER tIVAR tLAMBDA tLBRACK tLCURLY
|
78
|
+
tLPAREN_ARG tPIPE tQSYMBOLS_BEG tQWORDS_BEG tREGEXP_BEG tSTAR tSTRING tSTRING_BEG tSYMBEG
|
79
|
+
tSYMBOL tSYMBOLS_BEG tTILDE tUMINUS tUNARY_NUM tUPLUS tWORDS_BEG tXSTRING_BEG
|
78
80
|
].freeze
|
79
|
-
ARGUMENT_TAKING_FLOW_TOKEN_TYPES = %i[
|
81
|
+
ARGUMENT_TAKING_FLOW_TOKEN_TYPES = %i[
|
82
|
+
tIDENTIFIER kBREAK kNEXT kRETURN kSUPER kYIELD
|
83
|
+
].freeze
|
84
|
+
ARITHMETIC_OPERATOR_TOKENS = %i[tDIVIDE tDSTAR tMINUS tPERCENT tPLUS tSTAR2].freeze
|
80
85
|
|
81
86
|
def on_new_investigation
|
82
87
|
return unless processed_source.ast
|
@@ -96,15 +101,20 @@ module RuboCop
|
|
96
101
|
private
|
97
102
|
|
98
103
|
def require_line_continuation?(range)
|
99
|
-
!
|
104
|
+
!ends_with_uncommented_backslash?(range) ||
|
100
105
|
string_concatenation?(range.source_line) ||
|
101
|
-
start_with_arithmetic_operator?(
|
106
|
+
start_with_arithmetic_operator?(range) ||
|
102
107
|
inside_string_literal_or_method_with_argument?(range) ||
|
103
108
|
leading_dot_method_chain_with_blank_line?(range)
|
104
109
|
end
|
105
110
|
|
106
|
-
def
|
107
|
-
|
111
|
+
def ends_with_uncommented_backslash?(range)
|
112
|
+
# A line continuation always needs to be the last character on the line, which
|
113
|
+
# means that it is impossible to have a comment following a continuation.
|
114
|
+
# Therefore, if the line contains a comment, it cannot end with a continuation.
|
115
|
+
return false if processed_source.line_with_comment?(range.line)
|
116
|
+
|
117
|
+
range.source_line.end_with?(LINE_CONTINUATION)
|
108
118
|
end
|
109
119
|
|
110
120
|
def string_concatenation?(source_line)
|
@@ -112,10 +122,13 @@ module RuboCop
|
|
112
122
|
end
|
113
123
|
|
114
124
|
def inside_string_literal_or_method_with_argument?(range)
|
125
|
+
line_range = range_by_whole_lines(range)
|
126
|
+
|
115
127
|
processed_source.tokens.each_cons(2).any? do |token, next_token|
|
116
128
|
next if token.line == next_token.line
|
117
129
|
|
118
|
-
inside_string_literal?(range, token) ||
|
130
|
+
inside_string_literal?(range, token) ||
|
131
|
+
method_with_argument?(line_range, token, next_token)
|
119
132
|
end
|
120
133
|
end
|
121
134
|
|
@@ -129,16 +142,15 @@ module RuboCop
|
|
129
142
|
return true unless (node = find_node_for_line(range.last_line))
|
130
143
|
return false if argument_newline?(node)
|
131
144
|
|
132
|
-
source
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
parse(source.gsub("\\\n", "\n")).valid_syntax?
|
145
|
+
# Check if source is still valid without the continuation
|
146
|
+
source = processed_source.raw_source.dup
|
147
|
+
source[range.begin_pos, range.length] = "\n"
|
148
|
+
parse(source).valid_syntax?
|
137
149
|
end
|
138
150
|
|
139
151
|
def inspect_end_of_ruby_code_line_continuation
|
140
152
|
last_line = processed_source.lines[processed_source.ast.last_line - 1]
|
141
|
-
return unless
|
153
|
+
return unless code_ends_with_continuation?(last_line)
|
142
154
|
|
143
155
|
last_column = last_line.length
|
144
156
|
line_continuation_range = range_between(last_column - 1, last_column)
|
@@ -148,6 +160,12 @@ module RuboCop
|
|
148
160
|
end
|
149
161
|
end
|
150
162
|
|
163
|
+
def code_ends_with_continuation?(last_line)
|
164
|
+
return false if processed_source.line_with_comment?(processed_source.ast.last_line)
|
165
|
+
|
166
|
+
last_line.end_with?(LINE_CONTINUATION)
|
167
|
+
end
|
168
|
+
|
151
169
|
def inside_string_literal?(range, token)
|
152
170
|
ALLOWED_STRING_TOKENS.include?(token.type) && token.pos.overlaps?(range)
|
153
171
|
end
|
@@ -156,15 +174,14 @@ module RuboCop
|
|
156
174
|
#
|
157
175
|
# do_something \
|
158
176
|
# argument
|
159
|
-
def method_with_argument?(current_token, next_token)
|
177
|
+
def method_with_argument?(line_range, current_token, next_token)
|
160
178
|
return false unless ARGUMENT_TAKING_FLOW_TOKEN_TYPES.include?(current_token.type)
|
179
|
+
return false unless current_token.pos.overlaps?(line_range)
|
161
180
|
|
162
181
|
ARGUMENT_TYPES.include?(next_token.type)
|
163
182
|
end
|
164
183
|
|
165
|
-
# rubocop:disable Metrics/AbcSize
|
166
184
|
def argument_newline?(node)
|
167
|
-
node = node.to_a.last if node.assignment?
|
168
185
|
return false if node.parenthesized_call?
|
169
186
|
|
170
187
|
node = node.children.first if node.root? && node.begin_type?
|
@@ -177,11 +194,10 @@ module RuboCop
|
|
177
194
|
node.loc.selector.line != node.first_argument.loc.line
|
178
195
|
end
|
179
196
|
end
|
180
|
-
# rubocop:enable Metrics/AbcSize
|
181
197
|
|
182
198
|
def find_node_for_line(last_line)
|
183
199
|
processed_source.ast.each_node do |node|
|
184
|
-
return node if
|
200
|
+
return node if same_line?(node, last_line)
|
185
201
|
end
|
186
202
|
end
|
187
203
|
|
@@ -210,8 +226,9 @@ module RuboCop
|
|
210
226
|
node.call_type? && !node.arguments.empty?
|
211
227
|
end
|
212
228
|
|
213
|
-
def start_with_arithmetic_operator?(
|
214
|
-
|
229
|
+
def start_with_arithmetic_operator?(range)
|
230
|
+
line_range = processed_source.buffer.line_range(range.line + 1)
|
231
|
+
ARITHMETIC_OPERATOR_TOKENS.include?(processed_source.first_token_of(line_range).type)
|
215
232
|
end
|
216
233
|
end
|
217
234
|
end
|
@@ -13,14 +13,16 @@ module RuboCop
|
|
13
13
|
# # good
|
14
14
|
# x if y.z.nil?
|
15
15
|
#
|
16
|
-
class RedundantParentheses < Base
|
16
|
+
class RedundantParentheses < Base # rubocop:disable Metrics/ClassLength
|
17
17
|
include Parentheses
|
18
18
|
extend AutoCorrector
|
19
19
|
|
20
|
-
ALLOWED_NODE_TYPES = %i[
|
20
|
+
ALLOWED_NODE_TYPES = %i[or send splat kwsplat].freeze
|
21
21
|
|
22
22
|
# @!method square_brackets?(node)
|
23
|
-
def_node_matcher :square_brackets?,
|
23
|
+
def_node_matcher :square_brackets?, <<~PATTERN
|
24
|
+
(send `{(send _recv _msg) str array hash const #variable?} :[] ...)
|
25
|
+
PATTERN
|
24
26
|
|
25
27
|
# @!method method_node_and_args(node)
|
26
28
|
def_node_matcher :method_node_and_args, '$(call _recv _msg $...)'
|
@@ -39,10 +41,15 @@ module RuboCop
|
|
39
41
|
|
40
42
|
private
|
41
43
|
|
44
|
+
def variable?(node)
|
45
|
+
node.respond_to?(:variable?) && node.variable?
|
46
|
+
end
|
47
|
+
|
42
48
|
def parens_allowed?(node)
|
43
49
|
empty_parentheses?(node) ||
|
44
50
|
first_arg_begins_with_hash_literal?(node) ||
|
45
51
|
rescue?(node) ||
|
52
|
+
in_pattern_matching_in_method_argument?(node) ||
|
46
53
|
allowed_pin_operator?(node) ||
|
47
54
|
allowed_expression?(node)
|
48
55
|
end
|
@@ -50,7 +57,7 @@ module RuboCop
|
|
50
57
|
def ignore_syntax?(node)
|
51
58
|
return false unless (parent = node.parent)
|
52
59
|
|
53
|
-
parent.
|
60
|
+
parent.type?(:while_post, :until_post, :match_with_lvasgn) ||
|
54
61
|
like_method_argument_parentheses?(parent) || multiline_control_flow_statements?(node)
|
55
62
|
end
|
56
63
|
|
@@ -72,7 +79,7 @@ module RuboCop
|
|
72
79
|
ancestor = node.ancestors.first
|
73
80
|
return false unless ancestor
|
74
81
|
|
75
|
-
!ancestor.
|
82
|
+
!ancestor.type?(:begin, :any_def, :any_block)
|
76
83
|
end
|
77
84
|
|
78
85
|
def allowed_ternary?(node)
|
@@ -89,17 +96,17 @@ module RuboCop
|
|
89
96
|
end
|
90
97
|
|
91
98
|
def like_method_argument_parentheses?(node)
|
92
|
-
return false
|
99
|
+
return false unless node.type?(:send, :super, :yield)
|
93
100
|
|
94
101
|
node.arguments.one? && !node.parenthesized? &&
|
95
|
-
!node.
|
102
|
+
!node.operator_method? && node.first_argument.begin_type?
|
96
103
|
end
|
97
104
|
|
98
105
|
def multiline_control_flow_statements?(node)
|
99
106
|
return false unless (parent = node.parent)
|
100
107
|
return false if parent.single_line?
|
101
108
|
|
102
|
-
parent.
|
109
|
+
parent.type?(:return, :next, :break)
|
103
110
|
end
|
104
111
|
|
105
112
|
def empty_parentheses?(node)
|
@@ -116,6 +123,13 @@ module RuboCop
|
|
116
123
|
hash_literal && first_argument?(node) && !parentheses?(hash_literal) && !parenthesized
|
117
124
|
end
|
118
125
|
|
126
|
+
def in_pattern_matching_in_method_argument?(begin_node)
|
127
|
+
return false unless begin_node.parent&.call_type?
|
128
|
+
return false unless (node = begin_node.children.first)
|
129
|
+
|
130
|
+
target_ruby_version <= 2.7 ? node.match_pattern_type? : node.match_pattern_p_type?
|
131
|
+
end
|
132
|
+
|
119
133
|
def method_chain_begins_with_hash_literal(node)
|
120
134
|
return if node.nil?
|
121
135
|
return node if node.hash_type?
|
@@ -128,6 +142,10 @@ module RuboCop
|
|
128
142
|
node = begin_node.children.first
|
129
143
|
|
130
144
|
if (message = find_offense_message(begin_node, node))
|
145
|
+
if node.range_type? && !argument_of_parenthesized_method_call?(begin_node, node)
|
146
|
+
begin_node = begin_node.parent
|
147
|
+
end
|
148
|
+
|
131
149
|
return offense(begin_node, message)
|
132
150
|
end
|
133
151
|
|
@@ -137,13 +155,20 @@ module RuboCop
|
|
137
155
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
138
156
|
def find_offense_message(begin_node, node)
|
139
157
|
return 'a keyword' if keyword_with_redundant_parentheses?(node)
|
140
|
-
return 'a literal' if disallowed_literal?(begin_node, node)
|
158
|
+
return 'a literal' if node.literal? && disallowed_literal?(begin_node, node)
|
141
159
|
return 'a variable' if node.variable?
|
142
160
|
return 'a constant' if node.const_type?
|
161
|
+
if node.assignment? && (begin_node.parent.nil? || begin_node.parent.begin_type?)
|
162
|
+
return 'an assignment'
|
163
|
+
end
|
143
164
|
if node.lambda_or_proc? && (node.braces? || node.send_node.lambda_literal?)
|
144
165
|
return 'an expression'
|
145
166
|
end
|
167
|
+
if node.any_match_pattern_type? && node.each_ancestor.none?(&:operator_keyword?)
|
168
|
+
return 'a one-line pattern matching'
|
169
|
+
end
|
146
170
|
return 'an interpolated expression' if interpolation?(begin_node)
|
171
|
+
return 'a method argument' if argument_of_parenthesized_method_call?(begin_node, node)
|
147
172
|
|
148
173
|
return if begin_node.chained?
|
149
174
|
|
@@ -151,6 +176,7 @@ module RuboCop
|
|
151
176
|
return if node.semantic_operator? && begin_node.parent
|
152
177
|
return if node.multiline? && allow_in_multiline_conditions?
|
153
178
|
return if ALLOWED_NODE_TYPES.include?(begin_node.parent&.type)
|
179
|
+
return if !node.and_type? && begin_node.parent&.and_type?
|
154
180
|
return if begin_node.parent&.if_type? && begin_node.parent.ternary?
|
155
181
|
|
156
182
|
'a logical expression'
|
@@ -165,11 +191,23 @@ module RuboCop
|
|
165
191
|
# @!method interpolation?(node)
|
166
192
|
def_node_matcher :interpolation?, '[^begin ^^dstr]'
|
167
193
|
|
168
|
-
def
|
169
|
-
|
170
|
-
|
194
|
+
def argument_of_parenthesized_method_call?(begin_node, node)
|
195
|
+
if node.basic_conditional? || node.rescue_type? || method_call_parentheses_required?(node)
|
196
|
+
return false
|
197
|
+
end
|
198
|
+
return false unless (parent = begin_node.parent)
|
171
199
|
|
172
|
-
|
200
|
+
parent.call_type? && parent.parenthesized? && parent.receiver != begin_node
|
201
|
+
end
|
202
|
+
|
203
|
+
def method_call_parentheses_required?(node)
|
204
|
+
return false unless node.call_type?
|
205
|
+
|
206
|
+
(node.receiver.nil? || node.loc.dot) && node.arguments.any?
|
207
|
+
end
|
208
|
+
|
209
|
+
def allow_in_multiline_conditions?
|
210
|
+
!!config.for_enabled_cop('Style/ParenthesesAroundCondition')['AllowInMultilineConditions']
|
173
211
|
end
|
174
212
|
|
175
213
|
def check_send(begin_node, node)
|
@@ -207,7 +245,13 @@ module RuboCop
|
|
207
245
|
end
|
208
246
|
|
209
247
|
def disallowed_literal?(begin_node, node)
|
210
|
-
|
248
|
+
if node.range_type?
|
249
|
+
return false unless (parent = begin_node.parent)
|
250
|
+
|
251
|
+
parent.begin_type? && parent.children.one?
|
252
|
+
else
|
253
|
+
!raised_to_power_negative_numeric?(begin_node, node)
|
254
|
+
end
|
211
255
|
end
|
212
256
|
|
213
257
|
def raised_to_power_negative_numeric?(begin_node, node)
|
@@ -244,7 +288,7 @@ module RuboCop
|
|
244
288
|
end
|
245
289
|
|
246
290
|
def only_begin_arg?(args)
|
247
|
-
args.one? && args.first
|
291
|
+
args.one? && args.first&.begin_type?
|
248
292
|
end
|
249
293
|
|
250
294
|
def first_argument?(node)
|
@@ -279,9 +323,9 @@ module RuboCop
|
|
279
323
|
end
|
280
324
|
|
281
325
|
def do_end_block_in_method_chain?(begin_node, node)
|
282
|
-
return false unless (block = node.each_descendant(:
|
326
|
+
return false unless (block = node.each_descendant(:any_block).first)
|
283
327
|
|
284
|
-
block.keywords? && begin_node.each_ancestor(:
|
328
|
+
block.keywords? && begin_node.each_ancestor(:call).any?
|
285
329
|
end
|
286
330
|
end
|
287
331
|
end
|
@@ -118,6 +118,7 @@ module RuboCop
|
|
118
118
|
end
|
119
119
|
|
120
120
|
alias on_numblock on_block
|
121
|
+
alias on_itblock on_block
|
121
122
|
|
122
123
|
def on_if(node)
|
123
124
|
# Allow conditional nodes to use `self` in the condition if that variable
|
@@ -175,7 +176,7 @@ module RuboCop
|
|
175
176
|
def on_argument(node)
|
176
177
|
if node.mlhs_type?
|
177
178
|
on_args(node)
|
178
|
-
|
179
|
+
elsif node.respond_to?(:name)
|
179
180
|
@local_variables_scopes[node] << node.name
|
180
181
|
end
|
181
182
|
end
|
@@ -21,12 +21,8 @@ module RuboCop
|
|
21
21
|
# args += foo
|
22
22
|
# hash.merge!(other)
|
23
23
|
#
|
24
|
-
# # bad
|
25
|
-
# self.foo = foo.concat(ary)
|
26
|
-
#
|
27
24
|
# # good
|
28
25
|
# foo.concat(ary)
|
29
|
-
# self.foo += ary
|
30
26
|
#
|
31
27
|
class RedundantSelfAssignment < Base
|
32
28
|
include RangeHelp
|
@@ -49,10 +45,20 @@ module RuboCop
|
|
49
45
|
gvasgn: :gvar
|
50
46
|
}.freeze
|
51
47
|
|
48
|
+
# @!method redundant_self_assignment?
|
49
|
+
def_node_matcher :redundant_self_assignment?, <<~PATTERN
|
50
|
+
(call
|
51
|
+
%1 _
|
52
|
+
(call
|
53
|
+
(call
|
54
|
+
%1 %2) #method_returning_self?
|
55
|
+
...))
|
56
|
+
PATTERN
|
57
|
+
|
52
58
|
# rubocop:disable Metrics/AbcSize
|
53
59
|
def on_lvasgn(node)
|
54
60
|
return unless (rhs = node.rhs)
|
55
|
-
return unless rhs.
|
61
|
+
return unless rhs.type?(:any_block, :call) && method_returning_self?(rhs.method_name)
|
56
62
|
return unless (receiver = rhs.receiver)
|
57
63
|
|
58
64
|
receiver_type = ASSIGNMENT_TYPE_TO_RECEIVER_TYPE[node.type]
|
@@ -77,6 +83,7 @@ module RuboCop
|
|
77
83
|
corrector.remove(correction_range(node))
|
78
84
|
end
|
79
85
|
end
|
86
|
+
alias on_csend on_send
|
80
87
|
|
81
88
|
private
|
82
89
|
|
@@ -84,31 +91,10 @@ module RuboCop
|
|
84
91
|
METHODS_RETURNING_SELF.include?(method_name)
|
85
92
|
end
|
86
93
|
|
87
|
-
# @!method redundant_self_assignment?(node, method_name)
|
88
|
-
def_node_matcher :redundant_self_assignment?, <<~PATTERN
|
89
|
-
(send
|
90
|
-
(self) _
|
91
|
-
(send
|
92
|
-
(send
|
93
|
-
{(self) nil?} %1) #method_returning_self?
|
94
|
-
...))
|
95
|
-
PATTERN
|
96
|
-
|
97
|
-
# @!method redundant_nonself_assignment?(node, receiver, method_name)
|
98
|
-
def_node_matcher :redundant_nonself_assignment?, <<~PATTERN
|
99
|
-
(send
|
100
|
-
%1 _
|
101
|
-
(send
|
102
|
-
(send
|
103
|
-
%1 %2) #method_returning_self?
|
104
|
-
...))
|
105
|
-
PATTERN
|
106
|
-
|
107
94
|
def redundant_assignment?(node)
|
108
|
-
receiver_name = node.method_name.to_s
|
95
|
+
receiver_name = node.method_name.to_s.delete_suffix('=').to_sym
|
109
96
|
|
110
|
-
redundant_self_assignment?(node, receiver_name)
|
111
|
-
redundant_nonself_assignment?(node, node.receiver, receiver_name)
|
97
|
+
redundant_self_assignment?(node, node.receiver, receiver_name)
|
112
98
|
end
|
113
99
|
|
114
100
|
def correction_range(node)
|
@@ -93,9 +93,9 @@ module RuboCop
|
|
93
93
|
(call $(call _ $:sort_by _) ${:last :first})
|
94
94
|
(send $(send _ $:sort_by _) ${:[] :at :slice} {(int 0) (int -1)})
|
95
95
|
|
96
|
-
(call (
|
96
|
+
(call (any_block $(call _ ${:sort_by :sort}) ...) ${:last :first})
|
97
97
|
(call
|
98
|
-
(
|
98
|
+
(any_block $(call _ ${:sort_by :sort}) ...)
|
99
99
|
${:[] :at :slice} {(int 0) (int -1)}
|
100
100
|
)
|
101
101
|
}
|
@@ -21,6 +21,7 @@ module RuboCop
|
|
21
21
|
|
22
22
|
MSG_BLOCK = 'Use `sort` instead of `sort_by { |%<var>s| %<var>s }`.'
|
23
23
|
MSG_NUMBLOCK = 'Use `sort` instead of `sort_by { _1 }`.'
|
24
|
+
MSG_ITBLOCK = 'Use `sort` instead of `sort_by { it }`.'
|
24
25
|
|
25
26
|
def on_block(node)
|
26
27
|
redundant_sort_by_block(node) do |send, var_name|
|
@@ -36,7 +37,17 @@ module RuboCop
|
|
36
37
|
redundant_sort_by_numblock(node) do |send|
|
37
38
|
range = sort_by_range(send, node)
|
38
39
|
|
39
|
-
add_offense(range, message:
|
40
|
+
add_offense(range, message: MSG_NUMBLOCK) do |corrector|
|
41
|
+
corrector.replace(range, 'sort')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def on_itblock(node)
|
47
|
+
redundant_sort_by_itblock(node) do |send|
|
48
|
+
range = sort_by_range(send, node)
|
49
|
+
|
50
|
+
add_offense(range, message: MSG_ITBLOCK) do |corrector|
|
40
51
|
corrector.replace(range, 'sort')
|
41
52
|
end
|
42
53
|
end
|
@@ -54,6 +65,11 @@ module RuboCop
|
|
54
65
|
(numblock $(call _ :sort_by) 1 (lvar :_1))
|
55
66
|
PATTERN
|
56
67
|
|
68
|
+
# @!method redundant_sort_by_itblock(node)
|
69
|
+
def_node_matcher :redundant_sort_by_itblock, <<~PATTERN
|
70
|
+
(itblock $(call _ :sort_by) _ (lvar :it))
|
71
|
+
PATTERN
|
72
|
+
|
57
73
|
def sort_by_range(send, node)
|
58
74
|
range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
|
59
75
|
end
|
@@ -41,7 +41,7 @@ module RuboCop
|
|
41
41
|
MSG = 'Redundant escape of %<char>s inside string literal.'
|
42
42
|
|
43
43
|
def on_str(node)
|
44
|
-
return if node.parent&.
|
44
|
+
return if node.parent&.type?(:regexp, :xstr) || node.character_literal?
|
45
45
|
|
46
46
|
str_contents_range = str_contents_range(node)
|
47
47
|
|
@@ -147,7 +147,7 @@ module RuboCop
|
|
147
147
|
end
|
148
148
|
|
149
149
|
def heredoc?(node)
|
150
|
-
|
150
|
+
node.type?(:str, :dstr) && node.heredoc?
|
151
151
|
end
|
152
152
|
|
153
153
|
def delimiter?(node, char)
|
@@ -155,7 +155,7 @@ module RuboCop
|
|
155
155
|
end
|
156
156
|
|
157
157
|
def preferred_delimiters
|
158
|
-
config.for_cop('Style/PercentLiteralDelimiters')
|
158
|
+
config.for_cop('Style/PercentLiteralDelimiters')['PreferredDelimiters']['%r'].chars
|
159
159
|
end
|
160
160
|
|
161
161
|
def allowed_omit_parentheses_with_percent_r_literal?(node)
|
@@ -67,11 +67,13 @@ module RuboCop
|
|
67
67
|
node.parent && parentheses?(node.parent)
|
68
68
|
end
|
69
69
|
|
70
|
+
# rubocop:disable Metrics/AbcSize
|
70
71
|
def correct_rescue_block(corrector, node, parenthesized)
|
71
72
|
operation = node.body
|
72
73
|
|
73
74
|
node_indentation, node_offset = indentation_and_offset(node, parenthesized)
|
74
75
|
|
76
|
+
corrector.wrap(operation, '[', ']') if operation.array_type? && !operation.bracketed?
|
75
77
|
corrector.remove(range_between(operation.source_range.end_pos, node.source_range.end_pos))
|
76
78
|
corrector.insert_before(operation, "begin\n#{node_indentation}")
|
77
79
|
corrector.insert_after(heredoc_end(operation) || operation, <<~RESCUE_CLAUSE.chop)
|
@@ -81,6 +83,7 @@ module RuboCop
|
|
81
83
|
#{node_offset}end
|
82
84
|
RESCUE_CLAUSE
|
83
85
|
end
|
86
|
+
# rubocop:enable Metrics/AbcSize
|
84
87
|
|
85
88
|
def indentation_and_offset(node, parenthesized)
|
86
89
|
node_indentation = indentation(node)
|
@@ -47,7 +47,7 @@ module RuboCop
|
|
47
47
|
|
48
48
|
def on_return(node)
|
49
49
|
# Check Lint/NonLocalExitFromIterator first before this cop
|
50
|
-
node.each_ancestor(:block, :
|
50
|
+
node.each_ancestor(:block, :any_def) do |n|
|
51
51
|
break if scoped_node?(n)
|
52
52
|
|
53
53
|
send_node, args_node, _body_node = *n
|
@@ -83,7 +83,7 @@ module RuboCop
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def scoped_node?(node)
|
86
|
-
node.
|
86
|
+
node.any_def_type? || node.lambda?
|
87
87
|
end
|
88
88
|
|
89
89
|
# @!method chained_send?(node)
|