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
@@ -6,25 +6,29 @@ module RuboCop
|
|
6
6
|
# Checks whether certain expressions, e.g. method calls, that could fit
|
7
7
|
# completely on a single line, are broken up into multiple lines unnecessarily.
|
8
8
|
#
|
9
|
-
# @example
|
9
|
+
# @example
|
10
10
|
# # bad
|
11
11
|
# foo(
|
12
12
|
# a,
|
13
13
|
# b
|
14
14
|
# )
|
15
15
|
#
|
16
|
+
# # good
|
17
|
+
# foo(a, b)
|
18
|
+
#
|
19
|
+
# # bad
|
16
20
|
# puts 'string that fits on ' \
|
17
21
|
# 'a single line'
|
18
22
|
#
|
23
|
+
# # good
|
24
|
+
# puts 'string that fits on a single line'
|
25
|
+
#
|
26
|
+
# # bad
|
19
27
|
# things
|
20
28
|
# .select { |thing| thing.cond? }
|
21
29
|
# .join('-')
|
22
30
|
#
|
23
31
|
# # good
|
24
|
-
# foo(a, b)
|
25
|
-
#
|
26
|
-
# puts 'string that fits on a single line'
|
27
|
-
#
|
28
32
|
# things.select { |thing| thing.cond? }.join('-')
|
29
33
|
#
|
30
34
|
# @example InspectBlocks: false (default)
|
@@ -103,24 +107,25 @@ module RuboCop
|
|
103
107
|
|
104
108
|
def configured_to_not_be_inspected?(node)
|
105
109
|
return true if other_cop_takes_precedence?(node)
|
110
|
+
return false if cop_config['InspectBlocks']
|
106
111
|
|
107
|
-
|
108
|
-
any_descendant?(node, :block, &:multiline?))
|
112
|
+
node.any_block_type? || any_descendant?(node, :any_block, &:multiline?)
|
109
113
|
end
|
110
114
|
|
111
115
|
def other_cop_takes_precedence?(node)
|
112
|
-
single_line_block_chain_enabled? && any_descendant?(node, :
|
116
|
+
single_line_block_chain_enabled? && any_descendant?(node, :any_block) do |block_node|
|
113
117
|
block_node.parent.send_type? && block_node.parent.loc.dot && !block_node.multiline?
|
114
118
|
end
|
115
119
|
end
|
116
120
|
|
117
121
|
def single_line_block_chain_enabled?
|
118
|
-
@config.
|
122
|
+
@config.cop_enabled?('Layout/SingleLineBlockChain')
|
119
123
|
end
|
120
124
|
|
121
125
|
def convertible_block?(node)
|
122
|
-
parent = node.parent
|
123
|
-
|
126
|
+
return false unless (parent = node.parent)
|
127
|
+
|
128
|
+
parent.any_block_type? && node == parent.send_node &&
|
124
129
|
(node.parenthesized? || !node.arguments?)
|
125
130
|
end
|
126
131
|
end
|
@@ -29,8 +29,7 @@ module RuboCop
|
|
29
29
|
MSG = '`%<kw_loc>s` at %<kw_loc_line>d, %<kw_loc_column>d is not ' \
|
30
30
|
'aligned with `%<beginning>s` at ' \
|
31
31
|
'%<begin_loc_line>d, %<begin_loc_column>d.'
|
32
|
-
ANCESTOR_TYPES = %i[kwbegin
|
33
|
-
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS = %i[def defs].freeze
|
32
|
+
ANCESTOR_TYPES = %i[kwbegin any_def class module any_block].freeze
|
34
33
|
ALTERNATIVE_ACCESS_MODIFIERS = %i[public_class_method private_class_method].freeze
|
35
34
|
|
36
35
|
def on_resbody(node)
|
@@ -96,7 +95,7 @@ module RuboCop
|
|
96
95
|
def alignment_source(node, starting_loc)
|
97
96
|
ending_loc =
|
98
97
|
case node.type
|
99
|
-
when :block, :numblock, :kwbegin
|
98
|
+
when :block, :numblock, :itblock, :kwbegin
|
100
99
|
node.loc.begin
|
101
100
|
when :def, :defs, :class, :module,
|
102
101
|
:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
|
@@ -162,8 +161,7 @@ module RuboCop
|
|
162
161
|
end
|
163
162
|
|
164
163
|
def access_modifier_node(node)
|
165
|
-
return nil unless
|
166
|
-
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS.include?(node.type)
|
164
|
+
return nil unless node.any_def_type?
|
167
165
|
|
168
166
|
access_modifier_node = node.ancestors.first
|
169
167
|
return nil unless access_modifier?(access_modifier_node)
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
|
40
40
|
def offending_range(node)
|
41
41
|
receiver = node.receiver
|
42
|
-
return unless receiver&.
|
42
|
+
return unless receiver&.any_block_type?
|
43
43
|
|
44
44
|
receiver_location = receiver.loc
|
45
45
|
closing_block_delimiter_line_num = receiver_location.end.line
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks for colon (
|
6
|
+
# Checks for colon (`:`) not followed by some kind of space.
|
7
7
|
# N.B. this cop does not handle spaces after a ternary operator, which are
|
8
|
-
# instead handled by Layout/SpaceAroundOperators
|
8
|
+
# instead handled by `Layout/SpaceAroundOperators`.
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
# # bad
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks for semicolon (
|
6
|
+
# Checks for semicolon (`;`) not followed by some kind of space.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
# # bad
|
@@ -23,6 +23,16 @@ module RuboCop
|
|
23
23
|
def kind(token)
|
24
24
|
'semicolon' if token.semicolon?
|
25
25
|
end
|
26
|
+
|
27
|
+
def space_missing?(token1, token2)
|
28
|
+
super && !semicolon_sequence?(token1, token2)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def semicolon_sequence?(token, next_token)
|
34
|
+
token.semicolon? && next_token.semicolon?
|
35
|
+
end
|
26
36
|
end
|
27
37
|
end
|
28
38
|
end
|
@@ -36,6 +36,7 @@ module RuboCop
|
|
36
36
|
ACCEPT_LEFT_PAREN = %w[break defined? next not rescue return super yield].freeze
|
37
37
|
ACCEPT_LEFT_SQUARE_BRACKET = %w[super yield].freeze
|
38
38
|
ACCEPT_NAMESPACE_OPERATOR = 'super'
|
39
|
+
RESTRICT_ON_SEND = %i[!].freeze
|
39
40
|
|
40
41
|
def on_and(node)
|
41
42
|
check(node, [:operator].freeze) if node.keyword?
|
@@ -242,12 +242,12 @@ module RuboCop
|
|
242
242
|
return !aligned_with_operator?(operator) unless type == :assignment
|
243
243
|
|
244
244
|
token = Token.new(operator, nil, operator.source)
|
245
|
-
align_preceding =
|
245
|
+
align_preceding = aligned_with_preceding_equals_operator(token)
|
246
246
|
|
247
247
|
return false if align_preceding == :yes ||
|
248
|
-
|
248
|
+
aligned_with_subsequent_equals_operator(token) == :none
|
249
249
|
|
250
|
-
|
250
|
+
aligned_with_subsequent_equals_operator(token) != :yes
|
251
251
|
end
|
252
252
|
|
253
253
|
def excess_trailing_space?(right_operand, with_space)
|
@@ -260,7 +260,10 @@ module RuboCop
|
|
260
260
|
end
|
261
261
|
|
262
262
|
def hash_table_style?
|
263
|
-
|
263
|
+
return false unless align_hash_cop_config
|
264
|
+
|
265
|
+
enforced_styles = Array(align_hash_cop_config['EnforcedHashRocketStyle'])
|
266
|
+
enforced_styles.include?('table')
|
264
267
|
end
|
265
268
|
|
266
269
|
def space_around_exponent_operator?
|
@@ -22,51 +22,25 @@ module RuboCop
|
|
22
22
|
RESTRICT_ON_SEND = %i[[] []=].freeze
|
23
23
|
|
24
24
|
def on_send(node)
|
25
|
-
return unless (first_argument = node.first_argument)
|
26
|
-
|
27
|
-
begin_pos = first_argument.source_range.begin_pos
|
28
|
-
return unless (range = offense_range(node, begin_pos))
|
29
|
-
|
30
|
-
register_offense(range)
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def offense_range(node, begin_pos)
|
36
25
|
receiver_end_pos = node.receiver.source_range.end_pos
|
37
26
|
selector_begin_pos = node.loc.selector.begin_pos
|
38
27
|
return if receiver_end_pos >= selector_begin_pos
|
39
28
|
return if dot_before_brackets?(node, receiver_end_pos, selector_begin_pos)
|
40
29
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
30
|
+
range = range_between(receiver_end_pos, selector_begin_pos)
|
31
|
+
|
32
|
+
add_offense(range) do |corrector|
|
33
|
+
corrector.remove(range)
|
45
34
|
end
|
46
35
|
end
|
47
36
|
|
37
|
+
private
|
38
|
+
|
48
39
|
def dot_before_brackets?(node, receiver_end_pos, selector_begin_pos)
|
49
40
|
return false unless node.loc.respond_to?(:dot) && (dot = node.loc.dot)
|
50
41
|
|
51
42
|
dot.begin_pos == receiver_end_pos && dot.end_pos == selector_begin_pos
|
52
43
|
end
|
53
|
-
|
54
|
-
def offense_range_for_assignment(node, begin_pos)
|
55
|
-
end_pos = node.receiver.source_range.end_pos
|
56
|
-
|
57
|
-
return if begin_pos - end_pos == 1 ||
|
58
|
-
(range = range_between(end_pos, begin_pos - 1)).source.start_with?('[')
|
59
|
-
|
60
|
-
range
|
61
|
-
end
|
62
|
-
|
63
|
-
def register_offense(range)
|
64
|
-
add_offense(range) { |corrector| corrector.remove(range) }
|
65
|
-
end
|
66
|
-
|
67
|
-
def reference_variable_with_brackets?(node)
|
68
|
-
node.receiver&.variable? && node.method?(:[]) && node.arguments.size == 1
|
69
|
-
end
|
70
44
|
end
|
71
45
|
end
|
72
46
|
end
|
@@ -6,6 +6,8 @@ module RuboCop
|
|
6
6
|
# Checks that brackets used for array literals have or don't have
|
7
7
|
# surrounding space depending on configuration.
|
8
8
|
#
|
9
|
+
# Array pattern matching is handled in the same way.
|
10
|
+
#
|
9
11
|
# @example EnforcedStyle: no_space (default)
|
10
12
|
# # The `no_space` style enforces that array literals have
|
11
13
|
# # no surrounding space.
|
@@ -82,9 +84,10 @@ module RuboCop
|
|
82
84
|
EMPTY_MSG = '%<command>s space inside empty array brackets.'
|
83
85
|
|
84
86
|
def on_array(node)
|
85
|
-
return
|
87
|
+
return if node.array_type? && !node.square_brackets?
|
86
88
|
|
87
89
|
tokens, left, right = array_brackets(node)
|
90
|
+
return unless left && right
|
88
91
|
|
89
92
|
if empty_brackets?(left, right, tokens: tokens)
|
90
93
|
return empty_offenses(node, left, right, EMPTY_MSG)
|
@@ -95,6 +98,7 @@ module RuboCop
|
|
95
98
|
|
96
99
|
issue_offenses(node, left, right, start_ok, end_ok)
|
97
100
|
end
|
101
|
+
alias on_array_pattern on_array
|
98
102
|
|
99
103
|
private
|
100
104
|
|
@@ -6,6 +6,8 @@ module RuboCop
|
|
6
6
|
# Checks that braces used for hash literals have or don't have
|
7
7
|
# surrounding space depending on configuration.
|
8
8
|
#
|
9
|
+
# Hash pattern matching is handled in the same way.
|
10
|
+
#
|
9
11
|
# @example EnforcedStyle: space (default)
|
10
12
|
# # The `space` style enforces that hash literals have
|
11
13
|
# # surrounding space.
|
@@ -87,6 +89,7 @@ module RuboCop
|
|
87
89
|
check(tokens[-2], tokens[-1]) if tokens.size > 2
|
88
90
|
check_whitespace_only_hash(node) if enforce_no_space_style_for_empty_braces?
|
89
91
|
end
|
92
|
+
alias on_hash_pattern on_hash
|
90
93
|
|
91
94
|
private
|
92
95
|
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
48
48
|
|
49
49
|
def on_new_investigation
|
50
50
|
processed_source.lines.each_with_index do |line, index|
|
51
|
-
next unless line.
|
51
|
+
next unless line.match?(/[[:blank:]]\z/)
|
52
52
|
|
53
53
|
process_line(line, index + 1)
|
54
54
|
end
|
@@ -84,7 +84,7 @@ module RuboCop
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def whitespace_is_indentation?(range, level)
|
87
|
-
range.source[/[
|
87
|
+
range.source[/[[:blank:]]+/].length <= level
|
88
88
|
end
|
89
89
|
|
90
90
|
def whitespace_only?(range)
|
@@ -123,7 +123,9 @@ module RuboCop
|
|
123
123
|
end
|
124
124
|
|
125
125
|
def offense_range(lineno, line)
|
126
|
-
source_range(
|
126
|
+
source_range(
|
127
|
+
processed_source.buffer, lineno, (line.sub(/[[:blank:]]+\z/, '').length)...(line.length)
|
128
|
+
)
|
127
129
|
end
|
128
130
|
end
|
129
131
|
end
|
@@ -77,7 +77,7 @@ module RuboCop
|
|
77
77
|
private
|
78
78
|
|
79
79
|
def ambiguous_block_association?(send_node)
|
80
|
-
send_node.last_argument.
|
80
|
+
send_node.last_argument.any_block_type? && !send_node.last_argument.send_node.arguments?
|
81
81
|
end
|
82
82
|
|
83
83
|
def allowed_method_pattern?(node)
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Checks for an array literal interpolated inside a regexp.
|
7
|
+
#
|
8
|
+
# When interpolating an array literal, it is converted to a string. This means
|
9
|
+
# that when inside a regexp, it acts as a character class but with additional
|
10
|
+
# quotes, spaces and commas that are likely not intended. For example,
|
11
|
+
# `/#{%w[a b c]}/` parses as `/["a", "b", "c"]/` (or `/["a, bc]/` without
|
12
|
+
# repeated characters).
|
13
|
+
#
|
14
|
+
# The cop can autocorrect to a character class (if all items in the array are a
|
15
|
+
# single character) or alternation (if the array contains longer items).
|
16
|
+
#
|
17
|
+
# NOTE: This only considers interpolated arrays that contain only strings, symbols,
|
18
|
+
# integers, and floats. Any other type is not easily convertible to a character class
|
19
|
+
# or regexp alternation.
|
20
|
+
#
|
21
|
+
# @safety
|
22
|
+
# Autocorrection is unsafe because it will change the regexp pattern, by
|
23
|
+
# removing the additional quotes, spaces and commas from the character class.
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# # bad
|
27
|
+
# /#{%w[a b c]}/
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# /[abc]/
|
31
|
+
#
|
32
|
+
# # bad
|
33
|
+
# /#{%w[foo bar baz]}/
|
34
|
+
#
|
35
|
+
# # good
|
36
|
+
# /(?:foo|bar|baz)/
|
37
|
+
#
|
38
|
+
# # bad - construct a regexp rather than interpolate an array of identifiers
|
39
|
+
# /#{[foo, bar]}/
|
40
|
+
#
|
41
|
+
class ArrayLiteralInRegexp < Base
|
42
|
+
include Interpolation
|
43
|
+
extend AutoCorrector
|
44
|
+
|
45
|
+
LITERAL_TYPES = %i[str sym int float true false nil].freeze
|
46
|
+
private_constant :LITERAL_TYPES
|
47
|
+
|
48
|
+
MSG_CHARACTER_CLASS = 'Use a character class instead of interpolating an array in a regexp.'
|
49
|
+
MSG_ALTERNATION = 'Use alternation instead of interpolating an array in a regexp.'
|
50
|
+
MSG_UNKNOWN = 'Use alternation or a character class instead of interpolating an array ' \
|
51
|
+
'in a regexp.'
|
52
|
+
|
53
|
+
def on_interpolation(begin_node)
|
54
|
+
return unless (final_node = begin_node.children.last)
|
55
|
+
return unless final_node.array_type?
|
56
|
+
return unless begin_node.parent.regexp_type?
|
57
|
+
|
58
|
+
if array_of_literal_values?(final_node)
|
59
|
+
register_array_of_literal_values(begin_node, final_node)
|
60
|
+
else
|
61
|
+
register_array_of_nonliteral_values(begin_node)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def array_of_literal_values?(node)
|
68
|
+
node.each_value.all? { |value| value.type?(*LITERAL_TYPES) }
|
69
|
+
end
|
70
|
+
|
71
|
+
def register_array_of_literal_values(begin_node, node)
|
72
|
+
array_values = array_values(node)
|
73
|
+
|
74
|
+
if character_class?(array_values)
|
75
|
+
message = MSG_CHARACTER_CLASS
|
76
|
+
replacement = character_class_for(array_values)
|
77
|
+
else
|
78
|
+
message = MSG_ALTERNATION
|
79
|
+
replacement = alternation_for(array_values)
|
80
|
+
end
|
81
|
+
|
82
|
+
add_offense(begin_node, message: message) do |corrector|
|
83
|
+
corrector.replace(begin_node, replacement)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def register_array_of_nonliteral_values(node)
|
88
|
+
# Add offense but do not correct if the array contains any nonliteral values.
|
89
|
+
add_offense(node, message: MSG_UNKNOWN)
|
90
|
+
end
|
91
|
+
|
92
|
+
def array_values(node)
|
93
|
+
node.each_value.map do |value|
|
94
|
+
value.respond_to?(:value) ? value.value : value.source
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def character_class?(values)
|
99
|
+
values.all? { |v| v.to_s.length == 1 }
|
100
|
+
end
|
101
|
+
|
102
|
+
def character_class_for(values)
|
103
|
+
"[#{escape_values(values).join}]"
|
104
|
+
end
|
105
|
+
|
106
|
+
def alternation_for(values)
|
107
|
+
"(?:#{escape_values(values).join('|')})"
|
108
|
+
end
|
109
|
+
|
110
|
+
def escape_values(values)
|
111
|
+
# This may add extraneous escape characters, but they can be cleaned up
|
112
|
+
# by `Style/RedundantRegexpEscape`.
|
113
|
+
values.map { |value| Regexp.escape(value.to_s) }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -53,8 +53,6 @@ module RuboCop
|
|
53
53
|
ASGN_TYPES = [:begin, *AST::Node::EQUALS_ASSIGNMENTS, :send, :csend].freeze
|
54
54
|
|
55
55
|
def on_if(node)
|
56
|
-
return if node.condition.block_type?
|
57
|
-
|
58
56
|
traverse_node(node.condition) do |asgn_node|
|
59
57
|
next :skip_children if skip_children?(asgn_node)
|
60
58
|
next if allowed_construct?(asgn_node)
|
@@ -95,7 +93,7 @@ module RuboCop
|
|
95
93
|
|
96
94
|
def traverse_node(node, &block)
|
97
95
|
# if the node is a block, any assignments are irrelevant
|
98
|
-
return if node.
|
96
|
+
return if node.any_block_type?
|
99
97
|
|
100
98
|
result = yield node if ASGN_TYPES.include?(node.type)
|
101
99
|
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
# Although these can be rewritten in a different way, it should not be necessary to
|
15
15
|
# do so. Operations such as `-` or `/` where the result will always be the same
|
16
16
|
# (`x - x` will always be 0; `x / x` will always be 1) are offenses, but these
|
17
|
-
# are covered by Lint/NumericOperationWithConstantResult instead.
|
17
|
+
# are covered by `Lint/NumericOperationWithConstantResult` instead.
|
18
18
|
#
|
19
19
|
# @safety
|
20
20
|
# This cop is unsafe as it does not consider side effects when calling methods
|
@@ -45,11 +45,10 @@ module RuboCop
|
|
45
45
|
#
|
46
46
|
class BinaryOperatorWithIdenticalOperands < Base
|
47
47
|
MSG = 'Binary operator `%<op>s` has identical operands.'
|
48
|
-
|
48
|
+
RESTRICT_ON_SEND = %i[== != === <=> =~ && || > >= < <= | ^].freeze
|
49
49
|
|
50
50
|
def on_send(node)
|
51
51
|
return unless node.binary_operation?
|
52
|
-
return if MATH_OPERATORS.include?(node.method_name)
|
53
52
|
return unless node.receiver == node.first_argument
|
54
53
|
|
55
54
|
add_offense(node, message: format(MSG, op: node.method_name))
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
48
48
|
def autocorrect(corrector, node)
|
49
49
|
boolean_literal = node.source.delete(':')
|
50
50
|
parent = node.parent
|
51
|
-
if parent&.pair_type? && node.equal?(parent.children[0])
|
51
|
+
if parent&.pair_type? && parent.colon? && node.equal?(parent.children[0])
|
52
52
|
corrector.remove(parent.loc.operator)
|
53
53
|
boolean_literal = "#{node.source} =>"
|
54
54
|
end
|
@@ -6,9 +6,8 @@ module RuboCop
|
|
6
6
|
# Checks for circular argument references in optional keyword
|
7
7
|
# arguments and optional ordinal arguments.
|
8
8
|
#
|
9
|
-
# This
|
10
|
-
#
|
11
|
-
# NOTE: This syntax is no longer valid on Ruby 2.7 or higher.
|
9
|
+
# NOTE: This syntax was made invalid on Ruby 2.7 - Ruby 3.3 but is allowed
|
10
|
+
# again since Ruby 3.4.
|
12
11
|
#
|
13
12
|
# @example
|
14
13
|
#
|
@@ -37,6 +36,8 @@ module RuboCop
|
|
37
36
|
# dry_ingredients.combine
|
38
37
|
# end
|
39
38
|
class CircularArgumentReference < Base
|
39
|
+
extend TargetRubyVersion
|
40
|
+
|
40
41
|
MSG = 'Circular argument reference - `%<arg_name>s`.'
|
41
42
|
|
42
43
|
def on_kwoptarg(node)
|
@@ -68,12 +68,12 @@ module RuboCop
|
|
68
68
|
|
69
69
|
# @!method constant_assigned_in_block?(node)
|
70
70
|
def_node_matcher :constant_assigned_in_block?, <<~PATTERN
|
71
|
-
({^
|
71
|
+
({^any_block [^begin ^^any_block]} nil? ...)
|
72
72
|
PATTERN
|
73
73
|
|
74
74
|
# @!method module_defined_in_block?(node)
|
75
75
|
def_node_matcher :module_defined_in_block?, <<~PATTERN
|
76
|
-
({^
|
76
|
+
({^any_block [^begin ^^any_block]} ...)
|
77
77
|
PATTERN
|
78
78
|
|
79
79
|
def on_casgn(node)
|
@@ -92,7 +92,7 @@ module RuboCop
|
|
92
92
|
private
|
93
93
|
|
94
94
|
def method_name(node)
|
95
|
-
node.ancestors.find(&:
|
95
|
+
node.ancestors.find(&:any_block_type?).method_name
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|