rubocop 1.68.0 → 1.71.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/config/default.yml +77 -8
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +13 -4
- data/lib/rubocop/config_loader.rb +4 -0
- data/lib/rubocop/config_loader_resolver.rb +14 -3
- data/lib/rubocop/config_validator.rb +18 -8
- data/lib/rubocop/cop/autocorrect_logic.rb +32 -35
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs.rb +5 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -2
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -0
- data/lib/rubocop/cop/layout/indentation_width.rb +7 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +15 -0
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +119 -4
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +6 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/debugger.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_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +19 -8
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -0
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +5 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +2 -0
- data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/void.rb +8 -11
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +8 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -3
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +7 -2
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +4 -4
- data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +0 -1
- 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 +1 -1
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +0 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +3 -4
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/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 +86 -28
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +5 -4
- data/lib/rubocop/cop/style/bitwise_predicate.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +24 -22
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +11 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +25 -25
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +0 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +1 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +0 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -7
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +2 -2
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +3 -2
- data/lib/rubocop/cop/style/map_into_array.rb +1 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +20 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +7 -5
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +38 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +44 -23
- data/lib/rubocop/cop/style/redundant_parentheses.rb +12 -12
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +8 -15
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +2 -3
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- 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/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +12 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +14 -13
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +65 -17
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/util.rb +11 -4
- data/lib/rubocop/cop/variable_force/variable.rb +14 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cop/variable_force.rb +4 -10
- data/lib/rubocop/cops_documentation_generator.rb +22 -14
- data/lib/rubocop/directive_comment.rb +9 -8
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +15 -49
- data/lib/rubocop/lsp/stdin_runner.rb +83 -0
- data/lib/rubocop/magic_comment.rb +3 -3
- data/lib/rubocop/options.rb +2 -1
- data/lib/rubocop/path_util.rb +11 -8
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -1
- data/lib/rubocop/rspec/support.rb +1 -2
- data/lib/rubocop/runner.rb +5 -6
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +15 -0
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +14 -0
- data/lib/ruby_lsp/rubocop/addon.rb +78 -0
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +50 -0
- metadata +36 -15
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -70,6 +70,7 @@ module RuboCop
|
|
70
70
|
# private :bar, :baz
|
71
71
|
# private *%i[qux quux]
|
72
72
|
# private *METHOD_NAMES
|
73
|
+
# private *private_methods
|
73
74
|
#
|
74
75
|
# end
|
75
76
|
#
|
@@ -80,6 +81,7 @@ module RuboCop
|
|
80
81
|
# private :bar, :baz
|
81
82
|
# private *%i[qux quux]
|
82
83
|
# private *METHOD_NAMES
|
84
|
+
# private *private_methods
|
83
85
|
#
|
84
86
|
# end
|
85
87
|
#
|
@@ -110,6 +112,26 @@ module RuboCop
|
|
110
112
|
# private attr :quux
|
111
113
|
#
|
112
114
|
# end
|
115
|
+
#
|
116
|
+
# @example AllowModifiersOnAliasMethod: true (default)
|
117
|
+
# # good
|
118
|
+
# class Foo
|
119
|
+
#
|
120
|
+
# public alias_method :bar, :foo
|
121
|
+
# protected alias_method :baz, :foo
|
122
|
+
# private alias_method :qux, :foo
|
123
|
+
#
|
124
|
+
# end
|
125
|
+
#
|
126
|
+
# @example AllowModifiersOnAliasMethod: false
|
127
|
+
# # bad
|
128
|
+
# class Foo
|
129
|
+
#
|
130
|
+
# public alias_method :bar, :foo
|
131
|
+
# protected alias_method :baz, :foo
|
132
|
+
# private alias_method :qux, :foo
|
133
|
+
#
|
134
|
+
# end
|
113
135
|
class AccessModifierDeclarations < Base
|
114
136
|
extend AutoCorrector
|
115
137
|
|
@@ -128,26 +150,27 @@ module RuboCop
|
|
128
150
|
|
129
151
|
RESTRICT_ON_SEND = %i[private protected public module_function].freeze
|
130
152
|
|
131
|
-
ALLOWED_NODE_TYPES = %i[pair block].freeze
|
132
|
-
|
133
153
|
# @!method access_modifier_with_symbol?(node)
|
134
154
|
def_node_matcher :access_modifier_with_symbol?, <<~PATTERN
|
135
155
|
(send nil? {:private :protected :public :module_function}
|
136
|
-
{(sym _) (splat {#percent_symbol_array? const})}
|
156
|
+
{(sym _)+ (splat {#percent_symbol_array? const send})}
|
137
157
|
)
|
138
158
|
PATTERN
|
139
159
|
|
140
160
|
# @!method access_modifier_with_attr?(node)
|
141
161
|
def_node_matcher :access_modifier_with_attr?, <<~PATTERN
|
142
162
|
(send nil? {:private :protected :public :module_function}
|
143
|
-
(send nil? {:attr :attr_reader :attr_writer :attr_accessor} _))
|
163
|
+
(send nil? {:attr :attr_reader :attr_writer :attr_accessor} _+))
|
164
|
+
PATTERN
|
165
|
+
|
166
|
+
# @!method access_modifier_with_alias_method?, <<~PATTERN
|
167
|
+
def_node_matcher :access_modifier_with_alias_method?, <<~PATTERN
|
168
|
+
(send nil? {:private :protected :public :module_function}
|
169
|
+
(send nil? :alias_method _ _))
|
144
170
|
PATTERN
|
145
171
|
|
146
172
|
def on_send(node)
|
147
|
-
return
|
148
|
-
return if ALLOWED_NODE_TYPES.include?(node.parent&.type)
|
149
|
-
return if allow_modifiers_on_symbols?(node)
|
150
|
-
return if allow_modifiers_on_attrs?(node)
|
173
|
+
return if allowed?(node)
|
151
174
|
|
152
175
|
if offense?(node)
|
153
176
|
add_offense(node.loc.selector) do |corrector|
|
@@ -161,15 +184,23 @@ module RuboCop
|
|
161
184
|
|
162
185
|
private
|
163
186
|
|
187
|
+
def allowed?(node)
|
188
|
+
!node.access_modifier? ||
|
189
|
+
node.parent&.type?(:pair, :any_block) ||
|
190
|
+
allow_modifiers_on_symbols?(node) ||
|
191
|
+
allow_modifiers_on_attrs?(node) ||
|
192
|
+
allow_modifiers_on_alias_method?(node)
|
193
|
+
end
|
194
|
+
|
164
195
|
def autocorrect(corrector, node)
|
165
196
|
case style
|
166
197
|
when :group
|
167
|
-
|
168
|
-
return unless
|
198
|
+
def_nodes = find_corresponding_def_nodes(node)
|
199
|
+
return unless def_nodes.any?
|
169
200
|
|
170
|
-
|
201
|
+
replace_defs(corrector, node, def_nodes)
|
171
202
|
when :inline
|
172
|
-
|
203
|
+
remove_nodes(corrector, node)
|
173
204
|
select_grouped_def_nodes(node).each do |grouped_def_node|
|
174
205
|
insert_inline_modifier(corrector, grouped_def_node, node.method_name)
|
175
206
|
end
|
@@ -188,12 +219,23 @@ module RuboCop
|
|
188
219
|
cop_config['AllowModifiersOnAttrs'] && access_modifier_with_attr?(node)
|
189
220
|
end
|
190
221
|
|
222
|
+
def allow_modifiers_on_alias_method?(node)
|
223
|
+
cop_config['AllowModifiersOnAliasMethod'] && access_modifier_with_alias_method?(node)
|
224
|
+
end
|
225
|
+
|
191
226
|
def offense?(node)
|
192
227
|
(group_style? && access_modifier_is_inlined?(node) &&
|
193
|
-
!right_siblings_same_inline_method?(node)) ||
|
228
|
+
!node.parent&.if_type? && !right_siblings_same_inline_method?(node)) ||
|
194
229
|
(inline_style? && access_modifier_is_not_inlined?(node))
|
195
230
|
end
|
196
231
|
|
232
|
+
def correctable_group_offense?(node)
|
233
|
+
return false unless group_style?
|
234
|
+
return false if allowed?(node)
|
235
|
+
|
236
|
+
access_modifier_is_inlined?(node) && find_corresponding_def_nodes(node).any?
|
237
|
+
end
|
238
|
+
|
197
239
|
def group_style?
|
198
240
|
style == :group
|
199
241
|
end
|
@@ -212,7 +254,11 @@ module RuboCop
|
|
212
254
|
|
213
255
|
def right_siblings_same_inline_method?(node)
|
214
256
|
node.right_siblings.any? do |sibling|
|
215
|
-
sibling.send_type? &&
|
257
|
+
sibling.send_type? &&
|
258
|
+
correctable_group_offense?(sibling) &&
|
259
|
+
sibling.method?(node.method_name) &&
|
260
|
+
!sibling.arguments.empty? &&
|
261
|
+
find_corresponding_def_nodes(sibling).any?
|
216
262
|
end
|
217
263
|
end
|
218
264
|
|
@@ -226,14 +272,22 @@ module RuboCop
|
|
226
272
|
end
|
227
273
|
end
|
228
274
|
|
229
|
-
def
|
275
|
+
def find_corresponding_def_nodes(node)
|
230
276
|
if access_modifier_with_symbol?(node)
|
231
|
-
|
232
|
-
|
233
|
-
|
277
|
+
method_names = node.arguments.filter_map do |argument|
|
278
|
+
next unless argument.sym_type?
|
279
|
+
|
280
|
+
argument.respond_to?(:value) && argument.value
|
234
281
|
end
|
282
|
+
|
283
|
+
def_nodes = node.parent.each_child_node(:def).select do |child|
|
284
|
+
method_names.include?(child.method_name)
|
285
|
+
end
|
286
|
+
|
287
|
+
# If there isn't a `def` node for each symbol, we will skip autocorrection.
|
288
|
+
def_nodes.size == method_names.size ? def_nodes : []
|
235
289
|
else
|
236
|
-
node.first_argument
|
290
|
+
[node.first_argument]
|
237
291
|
end
|
238
292
|
end
|
239
293
|
|
@@ -251,12 +305,12 @@ module RuboCop
|
|
251
305
|
end.select(&:def_type?)
|
252
306
|
end
|
253
307
|
|
254
|
-
def
|
255
|
-
source = def_source(node,
|
308
|
+
def replace_defs(corrector, node, def_nodes)
|
309
|
+
source = def_source(node, def_nodes)
|
256
310
|
argument_less_modifier_node = find_argument_less_modifier_node(node)
|
257
311
|
if argument_less_modifier_node
|
258
312
|
corrector.insert_after(argument_less_modifier_node, "\n\n#{source}")
|
259
|
-
elsif (ancestor = node.each_ancestor(:
|
313
|
+
elsif (ancestor = node.each_ancestor(:class, :module).first)
|
260
314
|
|
261
315
|
corrector.insert_before(ancestor.loc.end, "#{node.method_name}\n\n#{source}\n")
|
262
316
|
else
|
@@ -264,20 +318,24 @@ module RuboCop
|
|
264
318
|
return
|
265
319
|
end
|
266
320
|
|
267
|
-
|
268
|
-
remove_node(corrector, node)
|
321
|
+
remove_nodes(corrector, *def_nodes, node)
|
269
322
|
end
|
270
323
|
|
271
324
|
def insert_inline_modifier(corrector, node, modifier_name)
|
272
325
|
corrector.insert_before(node, "#{modifier_name} ")
|
273
326
|
end
|
274
327
|
|
275
|
-
def
|
276
|
-
|
328
|
+
def remove_nodes(corrector, *nodes)
|
329
|
+
nodes.each do |node|
|
330
|
+
corrector.remove(range_with_comments_and_lines(node))
|
331
|
+
end
|
277
332
|
end
|
278
333
|
|
279
|
-
def def_source(node,
|
280
|
-
[
|
334
|
+
def def_source(node, def_nodes)
|
335
|
+
[
|
336
|
+
*processed_source.ast_with_comments[node].map(&:text),
|
337
|
+
*def_nodes.map(&:source)
|
338
|
+
].join("\n")
|
281
339
|
end
|
282
340
|
end
|
283
341
|
end
|
@@ -31,6 +31,20 @@ module RuboCop
|
|
31
31
|
#
|
32
32
|
# This cop handles not only method forwarding but also forwarding to `super`.
|
33
33
|
#
|
34
|
+
# [NOTE]
|
35
|
+
# --
|
36
|
+
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
37
|
+
# no offense will be registered until Ruby 3.4:
|
38
|
+
|
39
|
+
# [source,ruby]
|
40
|
+
# ----
|
41
|
+
# def foo(&block)
|
42
|
+
# # Using an anonymous block would be a syntax error on Ruby 3.3.0
|
43
|
+
# block_method { bar(&block) }
|
44
|
+
# end
|
45
|
+
# ----
|
46
|
+
# --
|
47
|
+
#
|
34
48
|
# @example
|
35
49
|
# # bad
|
36
50
|
# def foo(*args, &block)
|
@@ -148,7 +162,7 @@ module RuboCop
|
|
148
162
|
|
149
163
|
restarg, kwrestarg, blockarg = extract_forwardable_args(node.arguments)
|
150
164
|
forwardable_args = redundant_forwardable_named_args(restarg, kwrestarg, blockarg)
|
151
|
-
send_nodes = node.each_descendant(:
|
165
|
+
send_nodes = node.each_descendant(:call, :super, :yield).to_a
|
152
166
|
|
153
167
|
send_classifications = classify_send_nodes(
|
154
168
|
node, send_nodes, non_splat_or_block_pass_lvar_references(node.body), forwardable_args
|
@@ -191,9 +205,7 @@ module RuboCop
|
|
191
205
|
|
192
206
|
send_classifications.each do |send_node, c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
|
193
207
|
if !forward_rest && !forward_kwrest && c != :all_anonymous
|
194
|
-
|
195
|
-
# in Ruby 3.3.0.
|
196
|
-
if outside_block?(forward_block_arg)
|
208
|
+
if allow_anonymous_forwarding_in_block?(forward_block_arg)
|
197
209
|
register_forward_block_arg_offense(!forward_rest, node.arguments, block_arg)
|
198
210
|
register_forward_block_arg_offense(!forward_rest, send_node, forward_block_arg)
|
199
211
|
end
|
@@ -214,24 +226,22 @@ module RuboCop
|
|
214
226
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
215
227
|
def add_post_ruby_32_offenses(def_node, send_classifications, forwardable_args)
|
216
228
|
return unless use_anonymous_forwarding?
|
217
|
-
return
|
229
|
+
return unless all_forwarding_offenses_correctable?(send_classifications)
|
218
230
|
|
219
231
|
rest_arg, kwrest_arg, block_arg = *forwardable_args
|
220
232
|
|
221
233
|
send_classifications.each do |send_node, _c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
|
222
|
-
if
|
234
|
+
if allow_anonymous_forwarding_in_block?(forward_rest)
|
223
235
|
register_forward_args_offense(def_node.arguments, rest_arg)
|
224
236
|
register_forward_args_offense(send_node, forward_rest)
|
225
237
|
end
|
226
238
|
|
227
|
-
if
|
239
|
+
if allow_anonymous_forwarding_in_block?(forward_kwrest)
|
228
240
|
register_forward_kwargs_offense(!forward_rest, def_node.arguments, kwrest_arg)
|
229
241
|
register_forward_kwargs_offense(!forward_rest, send_node, forward_kwrest)
|
230
242
|
end
|
231
243
|
|
232
|
-
|
233
|
-
# in Ruby 3.3.0.
|
234
|
-
if outside_block?(forward_block_arg)
|
244
|
+
if allow_anonymous_forwarding_in_block?(forward_block_arg)
|
235
245
|
register_forward_block_arg_offense(!forward_rest, def_node.arguments, block_arg)
|
236
246
|
register_forward_block_arg_offense(!forward_rest, send_node, forward_block_arg)
|
237
247
|
end
|
@@ -293,10 +303,25 @@ module RuboCop
|
|
293
303
|
redundant_arg_names.include?(arg.source) ? arg : nil
|
294
304
|
end
|
295
305
|
|
296
|
-
|
306
|
+
# Checks if forwarding is uses both in blocks and outside of blocks.
|
307
|
+
# On Ruby 3.3.0, anonymous block forwarding in blocks can be is a syntax
|
308
|
+
# error, so we only want to register an offense if we can change all occurrences.
|
309
|
+
def all_forwarding_offenses_correctable?(send_classifications)
|
310
|
+
return true if target_ruby_version >= 3.4
|
311
|
+
|
312
|
+
send_classifications.none? do |send_node, *|
|
313
|
+
send_node.each_ancestor(:any_block).any?
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
# Ruby 3.3.0 had a bug where accessing an anonymous block argument inside of a block
|
318
|
+
# was a syntax error in unambiguous cases: https://bugs.ruby-lang.org/issues/20090
|
319
|
+
# We disallow this also for earlier Ruby versions so that code is forwards compatible.
|
320
|
+
def allow_anonymous_forwarding_in_block?(node)
|
297
321
|
return false unless node
|
322
|
+
return true if target_ruby_version >= 3.4
|
298
323
|
|
299
|
-
node.each_ancestor(:
|
324
|
+
node.each_ancestor(:any_block).none?
|
300
325
|
end
|
301
326
|
|
302
327
|
def register_forward_args_offense(def_arguments_or_send, rest_arg_or_splat)
|
@@ -357,12 +382,6 @@ module RuboCop
|
|
357
382
|
cop_config.fetch('UseAnonymousForwarding', false)
|
358
383
|
end
|
359
384
|
|
360
|
-
def send_inside_block?(send_classifications)
|
361
|
-
send_classifications.any? do |send_node, *|
|
362
|
-
send_node.each_ancestor(:block, :numblock).any?
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
385
|
def add_parens_if_missing(node, corrector)
|
367
386
|
return if parentheses?(node)
|
368
387
|
return if node.send_type? && node.method?(:[])
|
@@ -511,7 +530,7 @@ module RuboCop
|
|
511
530
|
end
|
512
531
|
|
513
532
|
def additional_kwargs?
|
514
|
-
@def_node.arguments.any? { |a| a.
|
533
|
+
@def_node.arguments.any? { |a| a.type?(:kwarg, :kwoptarg) }
|
515
534
|
end
|
516
535
|
|
517
536
|
def forward_additional_kwargs?
|
@@ -540,10 +559,7 @@ module RuboCop
|
|
540
559
|
end
|
541
560
|
|
542
561
|
def explicit_block_name?
|
543
|
-
|
544
|
-
return false unless block_forwarding_config['Enabled']
|
545
|
-
|
546
|
-
block_forwarding_config['EnforcedStyle'] == 'explicit'
|
562
|
+
config.for_enabled_cop('Naming/BlockForwarding')['EnforcedStyle'] == 'explicit'
|
547
563
|
end
|
548
564
|
end
|
549
565
|
end
|
@@ -42,14 +42,30 @@ module RuboCop
|
|
42
42
|
return if node.parent && brace_method?(node.parent)
|
43
43
|
|
44
44
|
preferred = (value.zero? ? 'first' : 'last')
|
45
|
-
|
46
|
-
|
45
|
+
offense_range = find_offense_range(node)
|
46
|
+
|
47
|
+
add_offense(offense_range, message: format(MSG, preferred: preferred)) do |corrector|
|
48
|
+
corrector.replace(offense_range, preferred_value(node, preferred))
|
47
49
|
end
|
48
50
|
end
|
49
51
|
# rubocop:enable Metrics/AbcSize
|
52
|
+
alias on_csend on_send
|
50
53
|
|
51
54
|
private
|
52
55
|
|
56
|
+
def preferred_value(node, value)
|
57
|
+
value = ".#{value}" unless node.loc.dot
|
58
|
+
value
|
59
|
+
end
|
60
|
+
|
61
|
+
def find_offense_range(node)
|
62
|
+
if node.loc.dot
|
63
|
+
node.loc.selector.join(node.source_range.end)
|
64
|
+
else
|
65
|
+
node.loc.selector
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
53
69
|
def innermost_braces_node(node)
|
54
70
|
node = node.receiver while node.receiver.send_type? && node.receiver.method?(:[])
|
55
71
|
node
|
@@ -28,6 +28,7 @@ module RuboCop
|
|
28
28
|
# # bad
|
29
29
|
# (array1 & array2).any?
|
30
30
|
# (array1 & array2).empty?
|
31
|
+
# (array1 & array2).none?
|
31
32
|
#
|
32
33
|
# # good
|
33
34
|
# array1.intersect?(array2)
|
@@ -57,7 +58,7 @@ module RuboCop
|
|
57
58
|
(send
|
58
59
|
(begin
|
59
60
|
(send $(...) :& $(...))
|
60
|
-
) ${:any? :empty?}
|
61
|
+
) ${:any? :empty? :none?}
|
61
62
|
)
|
62
63
|
PATTERN
|
63
64
|
|
@@ -66,18 +67,18 @@ module RuboCop
|
|
66
67
|
(send
|
67
68
|
(begin
|
68
69
|
(send $(...) :& $(...))
|
69
|
-
) ${:present? :any? :blank? :empty?}
|
70
|
+
) ${:present? :any? :blank? :empty? :none?}
|
70
71
|
)
|
71
72
|
PATTERN
|
72
73
|
|
73
74
|
MSG = 'Use `%<negated>s%<receiver>s.intersect?(%<argument>s)` ' \
|
74
75
|
'instead of `(%<receiver>s & %<argument>s).%<method_name>s`.'
|
75
76
|
STRAIGHT_METHODS = %i[present? any?].freeze
|
76
|
-
NEGATED_METHODS = %i[blank? empty?].freeze
|
77
|
+
NEGATED_METHODS = %i[blank? empty? none?].freeze
|
77
78
|
RESTRICT_ON_SEND = (STRAIGHT_METHODS + NEGATED_METHODS).freeze
|
78
79
|
|
79
80
|
def on_send(node)
|
80
|
-
return if
|
81
|
+
return if node.block_literal?
|
81
82
|
return unless (receiver, argument, method_name = bad_intersection_check?(node))
|
82
83
|
|
83
84
|
message = message(receiver.source, argument.source, method_name)
|
@@ -183,7 +183,8 @@ module RuboCop
|
|
183
183
|
def on_send(node)
|
184
184
|
return unless node.arguments?
|
185
185
|
return if node.parenthesized?
|
186
|
-
return if node.
|
186
|
+
return if node.assignment_method?
|
187
|
+
return if single_argument_operator_method?(node)
|
187
188
|
|
188
189
|
node.arguments.each do |arg|
|
189
190
|
get_blocks(arg) do |block|
|
@@ -194,6 +195,7 @@ module RuboCop
|
|
194
195
|
end
|
195
196
|
end
|
196
197
|
end
|
198
|
+
alias on_csend on_send
|
197
199
|
|
198
200
|
def on_block(node)
|
199
201
|
return if ignored_node?(node)
|
@@ -342,16 +344,23 @@ module RuboCop
|
|
342
344
|
node.respond_to?(:block_node) && node.block_node
|
343
345
|
end
|
344
346
|
|
347
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
345
348
|
def get_blocks(node, &block)
|
346
349
|
case node.type
|
347
350
|
when :block, :numblock
|
348
351
|
yield node
|
349
|
-
when :send
|
352
|
+
when :send, :csend
|
353
|
+
# When a method has an argument which is another method with a block,
|
354
|
+
# that block needs braces, otherwise a syntax error will be introduced
|
355
|
+
# for subsequent arguments.
|
356
|
+
# Additionally, even without additional arguments, changing `{...}` to
|
357
|
+
# `do...end` will change the binding of the block to the outer method.
|
350
358
|
get_blocks(node.receiver, &block) if node.receiver
|
359
|
+
node.arguments.each { |argument| get_blocks(argument, &block) }
|
351
360
|
when :hash
|
352
361
|
# A hash which is passed as method argument may have no braces
|
353
362
|
# In that case, one of the K/V pairs could contain a block node
|
354
|
-
# which could change in meaning if do...end replaced {...}
|
363
|
+
# which could change in meaning if `do...end` is replaced with `{...}`
|
355
364
|
return if node.braces?
|
356
365
|
|
357
366
|
node.each_child_node { |child| get_blocks(child, &block) }
|
@@ -359,10 +368,10 @@ module RuboCop
|
|
359
368
|
node.each_child_node { |child| get_blocks(child, &block) }
|
360
369
|
end
|
361
370
|
end
|
371
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
362
372
|
|
363
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
364
373
|
def proper_block_style?(node)
|
365
|
-
return true if
|
374
|
+
return true if require_do_end?(node)
|
366
375
|
return special_method_proper_block_style?(node) if special_method?(node.method_name)
|
367
376
|
|
368
377
|
case style
|
@@ -372,15 +381,6 @@ module RuboCop
|
|
372
381
|
when :always_braces then braces_style?(node)
|
373
382
|
end
|
374
383
|
end
|
375
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
376
|
-
|
377
|
-
def require_braces?(node)
|
378
|
-
return false unless node.braces?
|
379
|
-
|
380
|
-
node.each_ancestor(:send).any? do |send|
|
381
|
-
send.arithmetic_operation? && node.source_range.end_pos < send.loc.selector.begin_pos
|
382
|
-
end
|
383
|
-
end
|
384
384
|
|
385
385
|
def require_do_end?(node)
|
386
386
|
return false if node.braces? || node.multiline?
|
@@ -474,18 +474,14 @@ module RuboCop
|
|
474
474
|
end
|
475
475
|
|
476
476
|
def return_value_of_scope?(node)
|
477
|
-
return false unless node.parent
|
478
|
-
|
479
|
-
conditional?(node.parent) || array_or_range?(node.parent) ||
|
480
|
-
node.parent.children.last == node
|
481
|
-
end
|
477
|
+
return false unless (parent = node.parent)
|
482
478
|
|
483
|
-
|
484
|
-
|
479
|
+
parent.conditional? || parent.operator_keyword? || array_or_range?(parent) ||
|
480
|
+
parent.children.last == node
|
485
481
|
end
|
486
482
|
|
487
483
|
def array_or_range?(node)
|
488
|
-
node.
|
484
|
+
node.type?(:array, :range)
|
489
485
|
end
|
490
486
|
|
491
487
|
def begin_required?(block_node)
|
@@ -493,6 +489,12 @@ module RuboCop
|
|
493
489
|
# `begin`...`end` when changing `do-end` to `{}`.
|
494
490
|
block_node.each_child_node(:rescue, :ensure).any? && !block_node.single_line?
|
495
491
|
end
|
492
|
+
|
493
|
+
def single_argument_operator_method?(node)
|
494
|
+
return false unless node.operator_method?
|
495
|
+
|
496
|
+
node.arguments.one? && node.first_argument.block_type?
|
497
|
+
end
|
496
498
|
end
|
497
499
|
end
|
498
500
|
end
|
@@ -106,7 +106,7 @@ module RuboCop
|
|
106
106
|
when :or
|
107
107
|
find_target(node.lhs)
|
108
108
|
when :match_with_lvasgn
|
109
|
-
lhs, rhs = *node
|
109
|
+
lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
110
110
|
if lhs.regexp_type?
|
111
111
|
rhs
|
112
112
|
elsif rhs.regexp_type?
|
@@ -172,7 +172,7 @@ module RuboCop
|
|
172
172
|
return collect_conditions(node.lhs, target, conditions) &&
|
173
173
|
collect_conditions(node.rhs, target, conditions)
|
174
174
|
when :match_with_lvasgn
|
175
|
-
lhs, rhs = *node
|
175
|
+
lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
176
176
|
condition_from_binary_op(lhs, rhs, target)
|
177
177
|
when :send
|
178
178
|
condition_from_send_node(node, target)
|
@@ -191,8 +191,7 @@ module RuboCop
|
|
191
191
|
when :=~, :match, :match?
|
192
192
|
condition_from_match_node(node, target)
|
193
193
|
when :===
|
194
|
-
|
195
|
-
lhs if rhs == target
|
194
|
+
node.receiver if node.first_argument == target
|
196
195
|
when :include?, :cover?
|
197
196
|
condition_from_include_or_cover_node(node, target)
|
198
197
|
end
|
@@ -200,14 +199,12 @@ module RuboCop
|
|
200
199
|
# rubocop:enable Metrics/CyclomaticComplexity
|
201
200
|
|
202
201
|
def condition_from_equality_node(node, target)
|
203
|
-
|
204
|
-
condition = condition_from_binary_op(lhs, rhs, target)
|
202
|
+
condition = condition_from_binary_op(node.receiver, node.first_argument, target)
|
205
203
|
condition if condition && !class_reference?(condition)
|
206
204
|
end
|
207
205
|
|
208
206
|
def condition_from_match_node(node, target)
|
209
|
-
|
210
|
-
condition_from_binary_op(lhs, rhs, target)
|
207
|
+
condition_from_binary_op(node.receiver, node.first_argument, target)
|
211
208
|
end
|
212
209
|
|
213
210
|
def condition_from_include_or_cover_node(node, target)
|
@@ -263,11 +260,11 @@ module RuboCop
|
|
263
260
|
def regexp_with_working_captures?(node)
|
264
261
|
case node.type
|
265
262
|
when :match_with_lvasgn
|
266
|
-
lhs, _rhs = *node
|
263
|
+
lhs, _rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
267
264
|
node.loc.selector.source == '=~' && regexp_with_named_captures?(lhs)
|
268
265
|
when :send
|
269
|
-
|
270
|
-
|
266
|
+
node.method?(:match) &&
|
267
|
+
[node.receiver, node.first_argument].any? { |n| regexp_with_named_captures?(n) }
|
271
268
|
end
|
272
269
|
end
|
273
270
|
|
@@ -126,9 +126,12 @@ module RuboCop
|
|
126
126
|
end
|
127
127
|
|
128
128
|
def unindent(corrector, node)
|
129
|
-
return
|
129
|
+
return unless node.body.children.last
|
130
130
|
|
131
|
-
|
131
|
+
last_child_leading_spaces = leading_spaces(node.body.children.last)
|
132
|
+
return if leading_spaces(node).size == last_child_leading_spaces.size
|
133
|
+
|
134
|
+
column_delta = configured_indentation_width - last_child_leading_spaces.size
|
132
135
|
return if column_delta.zero?
|
133
136
|
|
134
137
|
AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
|
@@ -158,7 +161,7 @@ module RuboCop
|
|
158
161
|
|
159
162
|
def check_compact_style(node, body)
|
160
163
|
parent = node.parent
|
161
|
-
return if parent&.
|
164
|
+
return if parent&.type?(:class, :module)
|
162
165
|
|
163
166
|
return unless needs_compacting?(body)
|
164
167
|
|
@@ -49,7 +49,6 @@ module RuboCop
|
|
49
49
|
def on_block(node)
|
50
50
|
check_method_node(node.send_node)
|
51
51
|
end
|
52
|
-
|
53
52
|
alias on_numblock on_block
|
54
53
|
|
55
54
|
def on_send(node)
|
@@ -57,6 +56,7 @@ module RuboCop
|
|
57
56
|
|
58
57
|
check_method_node(node)
|
59
58
|
end
|
59
|
+
alias on_csend on_send
|
60
60
|
|
61
61
|
private
|
62
62
|
|