rubocop 1.69.2 → 1.75.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 +4 -4
- data/config/default.yml +154 -23
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +3 -1
- 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 +20 -9
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/base.rb +6 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -3
- 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/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_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/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 +7 -1
- 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 +4 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/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 +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 +28 -1
- 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 +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 +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
- 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/redundant_line_break.rb +16 -11
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
- 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 +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_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -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 +119 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -14
- 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/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +6 -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/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
- 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 -3
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -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/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 +258 -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/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +4 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
- 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 +2 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -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_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +12 -9
- 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/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 +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
- data/lib/rubocop/cop/mixin/dig_help.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 +1 -1
- 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/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
- 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 +15 -3
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
- 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 +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
- 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 +39 -23
- 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 +9 -21
- data/lib/rubocop/cop/style/class_and_module_children.rb +35 -10
- 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/commented_keyword.rb +10 -3
- data/lib/rubocop/cop/style/comparable_between.rb +75 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
- 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 +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- 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 +1 -1
- 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 +24 -148
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +105 -0
- 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 +10 -13
- data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- 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 +100 -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/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +2 -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 +22 -15
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
- 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_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
- 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 +14 -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/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_begin.rb +2 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +47 -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 +257 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
- data/lib/rubocop/cop/style/redundant_parentheses.rb +30 -15
- 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 +1 -0
- 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/rescue_modifier.rb +3 -0
- 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 +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 +41 -106
- data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
- 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/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 +4 -1
- 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/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +9 -2
- 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 +25 -14
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- 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 +18 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- 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 +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +39 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +10 -7
- data/lib/rubocop/server/cache.rb +35 -2
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +16 -1
- data/lib/rubocop/version.rb +30 -8
- data/lib/rubocop.rb +16 -1
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +59 -16
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -55,6 +55,22 @@ module RuboCop
|
|
55
55
|
MSG = 'Avoid comparing a variable with multiple items ' \
|
56
56
|
'in a conditional, use `Array#include?` instead.'
|
57
57
|
|
58
|
+
# @!method simple_double_comparison?(node)
|
59
|
+
def_node_matcher :simple_double_comparison?, <<~PATTERN
|
60
|
+
(send lvar :== lvar)
|
61
|
+
PATTERN
|
62
|
+
|
63
|
+
# @!method simple_comparison_lhs(node)
|
64
|
+
def_node_matcher :simple_comparison_lhs, <<~PATTERN
|
65
|
+
(send ${lvar call} :== $_)
|
66
|
+
PATTERN
|
67
|
+
|
68
|
+
# @!method simple_comparison_rhs(node)
|
69
|
+
def_node_matcher :simple_comparison_rhs, <<~PATTERN
|
70
|
+
(send $_ :== ${lvar call})
|
71
|
+
PATTERN
|
72
|
+
|
73
|
+
# rubocop:disable Metrics/AbcSize
|
58
74
|
def on_or(node)
|
59
75
|
root_of_or_node = root_of_or_node(node)
|
60
76
|
return unless node == root_of_or_node
|
@@ -67,27 +83,16 @@ module RuboCop
|
|
67
83
|
|
68
84
|
add_offense(range) do |corrector|
|
69
85
|
elements = values.map(&:source).join(', ')
|
70
|
-
|
86
|
+
argument = variable.lvar_type? ? variable_name(variable) : variable.source
|
87
|
+
prefer_method = "[#{elements}].include?(#{argument})"
|
71
88
|
|
72
89
|
corrector.replace(range, prefer_method)
|
73
90
|
end
|
74
91
|
end
|
92
|
+
# rubocop:enable Metrics/AbcSize
|
75
93
|
|
76
94
|
private
|
77
95
|
|
78
|
-
# @!method simple_double_comparison?(node)
|
79
|
-
def_node_matcher :simple_double_comparison?, '(send $lvar :== $lvar)'
|
80
|
-
|
81
|
-
# @!method simple_comparison_lhs?(node)
|
82
|
-
def_node_matcher :simple_comparison_lhs?, <<~PATTERN
|
83
|
-
(send $lvar :== $_)
|
84
|
-
PATTERN
|
85
|
-
|
86
|
-
# @!method simple_comparison_rhs?(node)
|
87
|
-
def_node_matcher :simple_comparison_rhs?, <<~PATTERN
|
88
|
-
(send $_ :== $lvar)
|
89
|
-
PATTERN
|
90
|
-
|
91
96
|
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
92
97
|
def find_offending_var(node, variables = Set.new, values = [])
|
93
98
|
if node.or_type?
|
@@ -95,8 +100,8 @@ module RuboCop
|
|
95
100
|
find_offending_var(node.rhs, variables, values)
|
96
101
|
elsif simple_double_comparison?(node)
|
97
102
|
return
|
98
|
-
elsif (var, obj = simple_comparison
|
99
|
-
return if allow_method_comparison? && obj.
|
103
|
+
elsif (var, obj = simple_comparison(node))
|
104
|
+
return if allow_method_comparison? && obj.call_type?
|
100
105
|
|
101
106
|
variables << var
|
102
107
|
return if variables.size > 1
|
@@ -125,12 +130,13 @@ module RuboCop
|
|
125
130
|
end
|
126
131
|
|
127
132
|
def comparison?(node)
|
128
|
-
simple_comparison
|
133
|
+
!!simple_comparison(node) || nested_comparison?(node)
|
129
134
|
end
|
130
135
|
|
131
|
-
def simple_comparison
|
132
|
-
if (var, obj = simple_comparison_lhs
|
133
|
-
|
136
|
+
def simple_comparison(node)
|
137
|
+
if (var, obj = simple_comparison_lhs(node)) || (obj, var = simple_comparison_rhs(node))
|
138
|
+
return if var.call_type? && !allow_method_comparison?
|
139
|
+
|
134
140
|
[var, obj]
|
135
141
|
end
|
136
142
|
end
|
@@ -19,7 +19,7 @@ module RuboCop
|
|
19
19
|
# acceptable value other than none, it will suppress the offenses
|
20
20
|
# raised by this cop. It enforces frozen state.
|
21
21
|
#
|
22
|
-
# NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
|
22
|
+
# NOTE: `Regexp` and `Range` literals are frozen objects since Ruby 3.0.
|
23
23
|
#
|
24
24
|
# NOTE: From Ruby 3.0, interpolated strings are not frozen when
|
25
25
|
# `# frozen-string-literal: true` is used, so this cop enforces explicit
|
@@ -197,7 +197,7 @@ module RuboCop
|
|
197
197
|
end
|
198
198
|
|
199
199
|
def frozen_regexp_or_range_literals?(node)
|
200
|
-
target_ruby_version >= 3.0 &&
|
200
|
+
target_ruby_version >= 3.0 && node.type?(:regexp, :range)
|
201
201
|
end
|
202
202
|
|
203
203
|
def requires_parentheses?(node)
|
@@ -238,7 +238,7 @@ module RuboCop
|
|
238
238
|
|
239
239
|
# @!method range_enclosed_in_parentheses?(node)
|
240
240
|
def_node_matcher :range_enclosed_in_parentheses?, <<~PATTERN
|
241
|
-
(begin (
|
241
|
+
(begin (range _ _))
|
242
242
|
PATTERN
|
243
243
|
end
|
244
244
|
end
|
@@ -46,6 +46,38 @@ module RuboCop
|
|
46
46
|
# next unless a == 1
|
47
47
|
# puts a
|
48
48
|
# end
|
49
|
+
#
|
50
|
+
# @example AllowConsecutiveConditionals: false (default)
|
51
|
+
# # bad
|
52
|
+
# [1, 2].each do |a|
|
53
|
+
# if a == 1
|
54
|
+
# puts a
|
55
|
+
# end
|
56
|
+
# if a == 2
|
57
|
+
# puts a
|
58
|
+
# end
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# # good
|
62
|
+
# [1, 2].each do |a|
|
63
|
+
# if a == 1
|
64
|
+
# puts a
|
65
|
+
# end
|
66
|
+
# next unless a == 2
|
67
|
+
# puts a
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# @example AllowConsecutiveConditionals: true
|
71
|
+
# # good
|
72
|
+
# [1, 2].each do |a|
|
73
|
+
# if a == 1
|
74
|
+
# puts a
|
75
|
+
# end
|
76
|
+
# if a == 2
|
77
|
+
# puts a
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
#
|
49
81
|
class Next < Base
|
50
82
|
include ConfigurableEnforcedStyle
|
51
83
|
include MinBodyLength
|
@@ -72,6 +104,7 @@ module RuboCop
|
|
72
104
|
end
|
73
105
|
|
74
106
|
alias on_numblock on_block
|
107
|
+
alias on_itblock on_block
|
75
108
|
|
76
109
|
def on_while(node)
|
77
110
|
check(node)
|
@@ -86,6 +119,9 @@ module RuboCop
|
|
86
119
|
|
87
120
|
offending_node = offense_node(node.body)
|
88
121
|
|
122
|
+
return if allowed_consecutive_conditionals? &&
|
123
|
+
consecutive_conditionals?(offending_node)
|
124
|
+
|
89
125
|
add_offense(offense_location(offending_node)) do |corrector|
|
90
126
|
if offending_node.modifier_form?
|
91
127
|
autocorrect_modifier(corrector, offending_node)
|
@@ -227,6 +263,14 @@ module RuboCop
|
|
227
263
|
|
228
264
|
corrector.remove_leading(buffer.line_range(lineno), adjustment) if adjustment.positive?
|
229
265
|
end
|
266
|
+
|
267
|
+
def consecutive_conditionals?(if_node)
|
268
|
+
if_node.parent&.begin_type? && if_node.left_sibling&.if_type?
|
269
|
+
end
|
270
|
+
|
271
|
+
def allowed_consecutive_conditionals?
|
272
|
+
cop_config.fetch('AllowConsecutiveConditionals', false)
|
273
|
+
end
|
230
274
|
end
|
231
275
|
end
|
232
276
|
end
|
@@ -33,39 +33,38 @@ module RuboCop
|
|
33
33
|
RESTRICT_ON_SEND = %i[then yield_self].freeze
|
34
34
|
|
35
35
|
def on_block(node)
|
36
|
+
return unless RESTRICT_ON_SEND.include?(node.method_name)
|
37
|
+
|
36
38
|
check_method_node(node.send_node)
|
37
39
|
end
|
38
|
-
|
39
40
|
alias on_numblock on_block
|
41
|
+
alias on_itblock on_block
|
40
42
|
|
41
43
|
def on_send(node)
|
42
44
|
return unless node.arguments.one? && node.first_argument.block_pass_type?
|
43
45
|
|
44
46
|
check_method_node(node)
|
45
47
|
end
|
48
|
+
alias on_csend on_send
|
46
49
|
|
47
50
|
private
|
48
51
|
|
49
52
|
def check_method_node(node)
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
if preferred_method?(node)
|
54
|
+
correct_style_detected
|
55
|
+
else
|
56
|
+
opposite_style_detected
|
57
|
+
message = message(node)
|
58
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
59
|
+
prefer = style == :then && node.receiver.nil? ? 'self.then' : style
|
55
60
|
|
56
|
-
|
61
|
+
corrector.replace(node.loc.selector, prefer)
|
62
|
+
end
|
57
63
|
end
|
58
64
|
end
|
59
65
|
|
60
66
|
def preferred_method?(node)
|
61
|
-
|
62
|
-
when :then
|
63
|
-
node.method?(:yield_self)
|
64
|
-
when :yield_self
|
65
|
-
node.method?(:then)
|
66
|
-
else
|
67
|
-
false
|
68
|
-
end
|
67
|
+
node.method?(style)
|
69
68
|
end
|
70
69
|
|
71
70
|
def message(node)
|
@@ -3,15 +3,15 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Flags uses of OpenStruct
|
6
|
+
# Flags uses of `OpenStruct`, as it is now officially discouraged
|
7
7
|
# to be used for performance, version compatibility, and potential security issues.
|
8
8
|
#
|
9
9
|
# @safety
|
10
|
-
#
|
11
10
|
# Note that this cop may flag false positives; for instance, the following legal
|
12
11
|
# use of a hand-rolled `OpenStruct` type would be considered an offense:
|
13
12
|
#
|
14
|
-
#
|
13
|
+
# [source,ruby]
|
14
|
+
# -----
|
15
15
|
# module MyNamespace
|
16
16
|
# class OpenStruct # not the OpenStruct we're looking for
|
17
17
|
# end
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
# OpenStruct.new # resolves to MyNamespace::OpenStruct
|
21
21
|
# end
|
22
22
|
# end
|
23
|
-
#
|
23
|
+
# -----
|
24
24
|
#
|
25
25
|
# @example
|
26
26
|
#
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
def custom_class_or_module_definition?(node)
|
62
62
|
parent = node.parent
|
63
63
|
|
64
|
-
|
64
|
+
parent.type?(:class, :module) && node.left_siblings.empty?
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -69,11 +69,7 @@ module RuboCop
|
|
69
69
|
elements = Array(node).compact
|
70
70
|
|
71
71
|
# Account for edge case of `Constant::CONSTANT`
|
72
|
-
!node.array_type? ||
|
73
|
-
end
|
74
|
-
|
75
|
-
def return_of_method_call?(node)
|
76
|
-
node.block_type? || node.send_type?
|
72
|
+
!node.array_type? || elements.any?(&:splat_type?)
|
77
73
|
end
|
78
74
|
|
79
75
|
def assignment_corrector(node, rhs, order)
|
@@ -94,8 +94,8 @@ module RuboCop
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def require_parentheses?(node, condition_body)
|
97
|
-
return false
|
98
|
-
return false
|
97
|
+
return false unless node.type?(:while, :until)
|
98
|
+
return false unless condition_body.any_block_type?
|
99
99
|
|
100
100
|
condition_body.send_node.block_literal? && condition_body.keywords?
|
101
101
|
end
|
@@ -19,8 +19,7 @@ module RuboCop
|
|
19
19
|
MSG = 'Use `proc` instead of `Proc.new`.'
|
20
20
|
|
21
21
|
# @!method proc_new?(node)
|
22
|
-
def_node_matcher :proc_new?,
|
23
|
-
'({block numblock} $(send (const {nil? cbase} :Proc) :new) ...)'
|
22
|
+
def_node_matcher :proc_new?, '(any_block $(send (const {nil? cbase} :Proc) :new) ...)'
|
24
23
|
|
25
24
|
def on_block(node)
|
26
25
|
proc_new?(node) do |block_method|
|
@@ -31,6 +30,7 @@ module RuboCop
|
|
31
30
|
end
|
32
31
|
|
33
32
|
alias on_numblock on_block
|
33
|
+
alias on_itblock on_block
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -98,7 +98,7 @@ module RuboCop
|
|
98
98
|
|
99
99
|
def style
|
100
100
|
return super unless super == :same_as_string_literals
|
101
|
-
return :single_quotes unless
|
101
|
+
return :single_quotes unless config.cop_enabled?('Style/StringLiterals')
|
102
102
|
|
103
103
|
string_literals_config['EnforcedStyle'].to_sym
|
104
104
|
end
|
@@ -3,18 +3,18 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks the args passed to `fail` and `raise`.
|
7
|
-
# style (default), it recommends passing the exception class and message
|
8
|
-
# to `raise`, rather than construct an instance of the error. It will
|
9
|
-
# still allow passing just a message, or the construction of an error
|
10
|
-
# with more than one argument.
|
6
|
+
# Checks the args passed to `fail` and `raise`.
|
11
7
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
8
|
+
# Exploded style (default) enforces passing the exception class and message
|
9
|
+
# arguments separately, rather than constructing an instance of the error.
|
10
|
+
#
|
11
|
+
# Compact style enforces constructing an error instance.
|
12
|
+
#
|
13
|
+
# Both styles allow passing just a message, or an error instance when there is more
|
14
|
+
# than one argument.
|
15
15
|
#
|
16
16
|
# The exploded style has an `AllowedCompactTypes` configuration
|
17
|
-
# option that takes an Array of exception name Strings.
|
17
|
+
# option that takes an `Array` of exception name Strings.
|
18
18
|
#
|
19
19
|
# @safety
|
20
20
|
# This cop is unsafe because `raise Foo` calls `Foo.exception`, not `Foo.new`.
|
@@ -50,6 +50,9 @@ module RuboCop
|
|
50
50
|
|
51
51
|
EXPLODED_MSG = 'Provide an exception class and message as arguments to `%<method>s`.'
|
52
52
|
COMPACT_MSG = 'Provide an exception object as an argument to `%<method>s`.'
|
53
|
+
ACCEPTABLE_ARG_TYPES = %i[
|
54
|
+
hash forwarded_restarg splat forwarded_restarg forwarded_args
|
55
|
+
].freeze
|
53
56
|
|
54
57
|
RESTRICT_ON_SEND = %i[raise fail].freeze
|
55
58
|
|
@@ -138,9 +141,8 @@ module RuboCop
|
|
138
141
|
|
139
142
|
arg = args.first
|
140
143
|
|
141
|
-
# Allow
|
142
|
-
|
143
|
-
arg.hash_type? || arg.splat_type?
|
144
|
+
# Allow nodes that may forward more than one argument
|
145
|
+
ACCEPTABLE_ARG_TYPES.include?(arg.type)
|
144
146
|
end
|
145
147
|
|
146
148
|
def allowed_non_exploded_type?(arg)
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
36
36
|
(send
|
37
37
|
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
38
38
|
:rand
|
39
|
-
{int (
|
39
|
+
{int (range int int)}))
|
40
40
|
PATTERN
|
41
41
|
|
42
42
|
# @!method rand_op_integer?(node)
|
@@ -45,7 +45,7 @@ module RuboCop
|
|
45
45
|
(send
|
46
46
|
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
47
47
|
:rand
|
48
|
-
{int (
|
48
|
+
{int (range int int)})
|
49
49
|
{:+ :-}
|
50
50
|
int)
|
51
51
|
PATTERN
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
56
56
|
(send
|
57
57
|
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
58
58
|
:rand
|
59
|
-
{int (
|
59
|
+
{int (range int int)})
|
60
60
|
{:succ :pred :next})
|
61
61
|
PATTERN
|
62
62
|
|
@@ -95,6 +95,7 @@ module RuboCop
|
|
95
95
|
end
|
96
96
|
|
97
97
|
alias on_numblock on_block
|
98
|
+
alias on_itblock on_block
|
98
99
|
|
99
100
|
def on_kwbegin(node)
|
100
101
|
return unless (target_node = offensive_kwbegins(node).to_a.last)
|
@@ -185,7 +186,7 @@ module RuboCop
|
|
185
186
|
def contain_rescue_or_ensure?(node)
|
186
187
|
first_child = node.children.first
|
187
188
|
|
188
|
-
first_child.
|
189
|
+
first_child.type?(:rescue, :ensure)
|
189
190
|
end
|
190
191
|
|
191
192
|
def valid_context_using_only_begin?(node)
|
@@ -42,7 +42,28 @@ module RuboCop
|
|
42
42
|
# c
|
43
43
|
# end
|
44
44
|
#
|
45
|
+
# # bad
|
46
|
+
# a.nil? ? true : a
|
47
|
+
#
|
48
|
+
# # good
|
49
|
+
# a.nil? || a
|
50
|
+
#
|
51
|
+
# # bad
|
52
|
+
# if a.nil?
|
53
|
+
# true
|
54
|
+
# else
|
55
|
+
# a
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# # good
|
59
|
+
# a.nil? || a
|
60
|
+
#
|
61
|
+
# @example AllowedMethods: ['nonzero?'] (default)
|
62
|
+
# # good
|
63
|
+
# num.nonzero? ? true : false
|
64
|
+
#
|
45
65
|
class RedundantCondition < Base
|
66
|
+
include AllowedMethods
|
46
67
|
include CommentsHelp
|
47
68
|
include RangeHelp
|
48
69
|
extend AutoCorrector
|
@@ -128,6 +149,16 @@ module RuboCop
|
|
128
149
|
# end
|
129
150
|
return true if condition == if_branch
|
130
151
|
|
152
|
+
# e.g.
|
153
|
+
# a.nil? ? true : a
|
154
|
+
# or
|
155
|
+
# if a.nil?
|
156
|
+
# true
|
157
|
+
# else
|
158
|
+
# a
|
159
|
+
# end
|
160
|
+
return true if if_branch_is_true_type_and_else_is_not?(node)
|
161
|
+
|
131
162
|
# e.g.
|
132
163
|
# if foo
|
133
164
|
# @value = foo
|
@@ -146,6 +177,18 @@ module RuboCop
|
|
146
177
|
!use_hash_key_access?(if_branch)
|
147
178
|
end
|
148
179
|
|
180
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
181
|
+
def if_branch_is_true_type_and_else_is_not?(node)
|
182
|
+
return false unless node.ternary? || node.if?
|
183
|
+
|
184
|
+
cond = node.condition
|
185
|
+
return false unless cond.call_type?
|
186
|
+
return false if !cond.predicate_method? || allowed_method?(cond.method_name)
|
187
|
+
|
188
|
+
node.if_branch&.true_type? && node.else_branch && !node.else_branch.true_type?
|
189
|
+
end
|
190
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
191
|
+
|
149
192
|
def branches_have_assignment?(node)
|
150
193
|
_condition, if_branch, else_branch = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
151
194
|
|
@@ -157,7 +200,7 @@ module RuboCop
|
|
157
200
|
end
|
158
201
|
|
159
202
|
def asgn_type?(node)
|
160
|
-
node.
|
203
|
+
node.type?(:lvasgn, :ivasgn, :cvasgn, :gvasgn)
|
161
204
|
end
|
162
205
|
|
163
206
|
def branches_have_method?(node)
|
@@ -184,7 +227,7 @@ module RuboCop
|
|
184
227
|
return false unless argument.hash_type?
|
185
228
|
return false unless (node = argument.children.first)
|
186
229
|
|
187
|
-
node.
|
230
|
+
node.type?(:kwsplat, :forwarded_kwrestarg)
|
188
231
|
end
|
189
232
|
|
190
233
|
def if_source(if_branch, arithmetic_operation)
|
@@ -194,6 +237,8 @@ module RuboCop
|
|
194
237
|
argument_source = if_branch.first_argument.source
|
195
238
|
|
196
239
|
"#{if_branch.receiver.source} #{if_branch.method_name} (#{argument_source}"
|
240
|
+
elsif if_branch.true_type?
|
241
|
+
if_branch.parent.condition.source
|
197
242
|
else
|
198
243
|
if_branch.source
|
199
244
|
end
|
@@ -3,7 +3,8 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks for
|
6
|
+
# Checks for paths given to `require_relative` that start with
|
7
|
+
# the current directory (`./`), which can be omitted.
|
7
8
|
#
|
8
9
|
# @example
|
9
10
|
#
|
@@ -19,20 +20,30 @@ module RuboCop
|
|
19
20
|
|
20
21
|
MSG = 'Remove the redundant current directory path.'
|
21
22
|
RESTRICT_ON_SEND = %i[require_relative].freeze
|
22
|
-
|
23
|
+
CURRENT_DIRECTORY_PREFIX = %r{./+}.freeze
|
24
|
+
REDUNDANT_CURRENT_DIRECTORY_PREFIX = /\A#{CURRENT_DIRECTORY_PREFIX}/.freeze
|
23
25
|
|
24
26
|
def on_send(node)
|
25
27
|
return unless (first_argument = node.first_argument)
|
26
|
-
return unless first_argument.
|
27
|
-
return unless (
|
28
|
+
return unless (index = first_argument.source.index(CURRENT_DIRECTORY_PREFIX))
|
29
|
+
return unless (redundant_length = redundant_path_length(first_argument.str_content))
|
28
30
|
|
29
31
|
begin_pos = first_argument.source_range.begin.begin_pos + index
|
30
|
-
|
32
|
+
end_pos = begin_pos + redundant_length
|
33
|
+
range = range_between(begin_pos, end_pos)
|
31
34
|
|
32
35
|
add_offense(range) do |corrector|
|
33
36
|
corrector.remove(range)
|
34
37
|
end
|
35
38
|
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def redundant_path_length(path)
|
43
|
+
return unless (match = path&.match(REDUNDANT_CURRENT_DIRECTORY_PREFIX))
|
44
|
+
|
45
|
+
match[0].length
|
46
|
+
end
|
36
47
|
end
|
37
48
|
end
|
38
49
|
end
|
@@ -25,11 +25,11 @@ module RuboCop
|
|
25
25
|
MSG = 'Remove the redundant double splat and braces, use keyword arguments directly.'
|
26
26
|
MERGE_METHODS = %i[merge merge!].freeze
|
27
27
|
|
28
|
-
# rubocop:disable Metrics/
|
28
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
29
29
|
def on_hash(node)
|
30
30
|
return if node.pairs.empty? || node.pairs.any?(&:hash_rocket?)
|
31
31
|
return unless (parent = node.parent)
|
32
|
-
return unless parent.
|
32
|
+
return unless parent.type?(:call, :kwsplat)
|
33
33
|
return unless mergeable?(parent)
|
34
34
|
return unless (kwsplat = node.each_ancestor(:kwsplat).first)
|
35
35
|
return if !node.braces? || allowed_double_splat_receiver?(kwsplat)
|
@@ -38,13 +38,13 @@ module RuboCop
|
|
38
38
|
autocorrect(corrector, node, kwsplat)
|
39
39
|
end
|
40
40
|
end
|
41
|
-
# rubocop:enable Metrics/
|
41
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
42
42
|
|
43
43
|
private
|
44
44
|
|
45
45
|
def allowed_double_splat_receiver?(kwsplat)
|
46
46
|
first_child = kwsplat.children.first
|
47
|
-
return true if first_child.
|
47
|
+
return true if first_child.any_block_type?
|
48
48
|
return false unless first_child.call_type?
|
49
49
|
|
50
50
|
root_receiver = root_receiver(first_child)
|
@@ -73,7 +73,7 @@ module RuboCop
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def select_merge_method_nodes(kwsplat)
|
76
|
-
|
76
|
+
kwsplat.each_descendant(:call).select do |node|
|
77
77
|
mergeable?(node)
|
78
78
|
end
|
79
79
|
end
|
@@ -89,7 +89,7 @@ module RuboCop
|
|
89
89
|
def autocorrect_merge_methods(corrector, merge_methods, kwsplat)
|
90
90
|
range = range_of_merge_methods(merge_methods)
|
91
91
|
|
92
|
-
new_kwsplat_arguments =
|
92
|
+
new_kwsplat_arguments = kwsplat.each_descendant(:call).map do |descendant|
|
93
93
|
convert_to_new_arguments(descendant)
|
94
94
|
end
|
95
95
|
new_source = new_kwsplat_arguments.compact.reverse.unshift('').join(', ')
|
@@ -104,10 +104,6 @@ module RuboCop
|
|
104
104
|
begin_merge_method.loc.dot.begin.join(end_merge_method.source_range.end)
|
105
105
|
end
|
106
106
|
|
107
|
-
def extract_send_methods(kwsplat)
|
108
|
-
kwsplat.each_descendant(:send, :csend)
|
109
|
-
end
|
110
|
-
|
111
107
|
def convert_to_new_arguments(node)
|
112
108
|
return unless mergeable?(node)
|
113
109
|
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
65
65
|
return if node.last_argument&.block_pass_type?
|
66
66
|
|
67
67
|
if node.method?(:each) && !node.parent&.block_type?
|
68
|
-
ancestor_node = node.each_ancestor(:
|
68
|
+
ancestor_node = node.each_ancestor(:call).detect do |ancestor|
|
69
69
|
ancestor.receiver == node &&
|
70
70
|
(RESTRICT_ON_SEND.include?(ancestor.method_name) || ancestor.method?(:reverse_each))
|
71
71
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks for RuntimeError as the argument of raise
|
6
|
+
# Checks for `RuntimeError` as the argument of `raise`/`fail`.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
# # bad
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def string_message?(message)
|
54
|
-
message.
|
54
|
+
message.type?(:str, :dstr, :xstr)
|
55
55
|
end
|
56
56
|
|
57
57
|
def fix_compact(node)
|