rubocop 1.57.1 → 1.81.6
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 +92 -89
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +540 -86
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -7
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +28 -4
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +71 -58
- data/lib/rubocop/config_loader_resolver.rb +48 -17
- 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 +56 -9
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
- data/lib/rubocop/cop/base.rb +79 -18
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/documentation.rb +32 -5
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +13 -8
- 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 +3 -4
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +124 -30
- 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 +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -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/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_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- 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/undefined_config.rb +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- 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_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +36 -21
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- 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_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- 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_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
- 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 +177 -29
- 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 +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +32 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -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 +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- 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 +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +30 -8
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
- data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
- 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/empty_interpolation.rb +14 -5
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
- data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -5
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -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/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +72 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
- 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 +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +92 -18
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
- data/lib/rubocop/cop/metrics/block_length.rb +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +21 -15
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +15 -6
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- 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 +8 -9
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +23 -14
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- 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 +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
- 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 +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.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 -4
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
- data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
- data/lib/rubocop/cop/style/alias.rb +2 -1
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +228 -36
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
- data/lib/rubocop/cop/style/case_like_if.rb +14 -17
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +25 -15
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +25 -25
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +3 -4
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- 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 +23 -31
- data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +2 -5
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- 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 +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +110 -12
- data/lib/rubocop/cop/style/hash_except.rb +38 -146
- 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 +35 -7
- 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 +37 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- 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 +8 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +2 -1
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +29 -10
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +52 -25
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
- 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_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
- 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_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +48 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- 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 +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +29 -3
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +41 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
- data/lib/rubocop/cop/style/redundant_return.rb +9 -3
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- 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 +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +30 -7
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +72 -87
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- 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/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
- data/lib/rubocop/cop/style/super_arguments.rb +221 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_do.rb +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +28 -4
- data/lib/rubocop/cop/util.rb +19 -6
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +135 -58
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +54 -18
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +77 -40
- data/lib/rubocop/lsp/runtime.rb +20 -50
- data/lib/rubocop/lsp/server.rb +6 -4
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +12 -4
- data/lib/rubocop/options.rb +43 -22
- data/lib/rubocop/path_util.rb +21 -10
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- 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 +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +29 -34
- data/lib/rubocop/rspec/cop_helper.rb +20 -2
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +112 -18
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +3 -3
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +93 -82
- data/lib/rubocop/target_ruby.rb +111 -81
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +61 -3
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +103 -51
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
# Checks for `Hash` creation with a mutable default value.
|
|
7
|
+
# Creating a `Hash` in such a way will share the default value
|
|
8
|
+
# across all keys, causing unexpected behavior when modifying it.
|
|
9
|
+
#
|
|
10
|
+
# For example, when the `Hash` was created with an `Array` as the argument,
|
|
11
|
+
# calling `hash[:foo] << 'bar'` will also change the value of all
|
|
12
|
+
# other keys that have not been explicitly assigned to.
|
|
13
|
+
#
|
|
14
|
+
# @example
|
|
15
|
+
# # bad
|
|
16
|
+
# Hash.new([])
|
|
17
|
+
# Hash.new({})
|
|
18
|
+
# Hash.new(Array.new)
|
|
19
|
+
# Hash.new(Hash.new)
|
|
20
|
+
#
|
|
21
|
+
# # okay -- In rare cases that intentionally have this behavior,
|
|
22
|
+
# # without disabling the cop, you can set the default explicitly.
|
|
23
|
+
# h = Hash.new
|
|
24
|
+
# h.default = []
|
|
25
|
+
# h[:a] << 1
|
|
26
|
+
# h[:b] << 2
|
|
27
|
+
# h # => {:a => [1, 2], :b => [1, 2]}
|
|
28
|
+
#
|
|
29
|
+
# # okay -- beware this will discard mutations and only remember assignments
|
|
30
|
+
# Hash.new { Array.new }
|
|
31
|
+
# Hash.new { Hash.new }
|
|
32
|
+
# Hash.new { {} }
|
|
33
|
+
# Hash.new { [] }
|
|
34
|
+
#
|
|
35
|
+
# # good - frozen solution will raise an error when mutation attempted
|
|
36
|
+
# Hash.new([].freeze)
|
|
37
|
+
# Hash.new({}.freeze)
|
|
38
|
+
#
|
|
39
|
+
# # good - using a proc will create a new object for each key
|
|
40
|
+
# h = Hash.new
|
|
41
|
+
# h.default_proc = ->(h, k) { [] }
|
|
42
|
+
# h.default_proc = ->(h, k) { {} }
|
|
43
|
+
#
|
|
44
|
+
# # good - using a block will create a new object for each key
|
|
45
|
+
# Hash.new { |h, k| h[k] = [] }
|
|
46
|
+
# Hash.new { |h, k| h[k] = {} }
|
|
47
|
+
class SharedMutableDefault < Base
|
|
48
|
+
MSG = 'Do not create a Hash with a mutable default value ' \
|
|
49
|
+
'as the default value can accidentally be changed.'
|
|
50
|
+
RESTRICT_ON_SEND = %i[new].freeze
|
|
51
|
+
|
|
52
|
+
# @!method hash_initialized_with_mutable_shared_object?(node)
|
|
53
|
+
def_node_matcher :hash_initialized_with_mutable_shared_object?, <<~PATTERN
|
|
54
|
+
{
|
|
55
|
+
(send (const {nil? cbase} :Hash) :new [
|
|
56
|
+
{array hash (send (const {nil? cbase} {:Array :Hash}) :new)}
|
|
57
|
+
!#capacity_keyword_argument?
|
|
58
|
+
])
|
|
59
|
+
(send (const {nil? cbase} :Hash) :new hash #capacity_keyword_argument?)
|
|
60
|
+
}
|
|
61
|
+
PATTERN
|
|
62
|
+
|
|
63
|
+
# @!method capacity_keyword_argument?(node)
|
|
64
|
+
def_node_matcher :capacity_keyword_argument?, <<~PATTERN
|
|
65
|
+
(hash (pair (sym :capacity) _))
|
|
66
|
+
PATTERN
|
|
67
|
+
|
|
68
|
+
def on_send(node)
|
|
69
|
+
return unless hash_initialized_with_mutable_shared_object?(node)
|
|
70
|
+
|
|
71
|
+
add_offense(node)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -116,7 +116,7 @@ module RuboCop
|
|
|
116
116
|
private
|
|
117
117
|
|
|
118
118
|
def comment_between_rescue_and_end?(node)
|
|
119
|
-
ancestor = node.each_ancestor(:kwbegin, :
|
|
119
|
+
ancestor = node.each_ancestor(:kwbegin, :any_def, :any_block).first
|
|
120
120
|
return false unless ancestor
|
|
121
121
|
|
|
122
122
|
end_line = ancestor.loc.end&.line || ancestor.loc.last_line
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
# Checks for cases where exceptions unrelated to the numeric constructors `Integer()`,
|
|
7
|
+
# `Float()`, `BigDecimal()`, `Complex()`, and `Rational()` may be unintentionally swallowed.
|
|
8
|
+
#
|
|
9
|
+
# @safety
|
|
10
|
+
# The cop is unsafe for autocorrection because unexpected errors occurring in the argument
|
|
11
|
+
# passed to numeric constructor (e.g., `Integer()`) can lead to incompatible behavior.
|
|
12
|
+
# For example, changing it to `Integer(potential_exception_method_call, exception: false)`
|
|
13
|
+
# ensures that exceptions raised by `potential_exception_method_call` are not ignored.
|
|
14
|
+
#
|
|
15
|
+
# [source,ruby]
|
|
16
|
+
# ----
|
|
17
|
+
# Integer(potential_exception_method_call) rescue nil
|
|
18
|
+
# ----
|
|
19
|
+
#
|
|
20
|
+
# @example
|
|
21
|
+
#
|
|
22
|
+
# # bad
|
|
23
|
+
# Integer(arg) rescue nil
|
|
24
|
+
#
|
|
25
|
+
# # bad
|
|
26
|
+
# begin
|
|
27
|
+
# Integer(arg)
|
|
28
|
+
# rescue
|
|
29
|
+
# nil
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# # bad
|
|
33
|
+
# begin
|
|
34
|
+
# Integer(arg)
|
|
35
|
+
# rescue
|
|
36
|
+
# end
|
|
37
|
+
#
|
|
38
|
+
# # good
|
|
39
|
+
# Integer(arg, exception: false)
|
|
40
|
+
#
|
|
41
|
+
class SuppressedExceptionInNumberConversion < Base
|
|
42
|
+
extend AutoCorrector
|
|
43
|
+
extend TargetRubyVersion
|
|
44
|
+
|
|
45
|
+
MSG = 'Use `%<prefer>s` instead.'
|
|
46
|
+
EXPECTED_EXCEPTION_CLASSES = %w[ArgumentError TypeError ::ArgumentError ::TypeError].freeze
|
|
47
|
+
|
|
48
|
+
# @!method numeric_constructor_rescue_nil(node)
|
|
49
|
+
def_node_matcher :numeric_constructor_rescue_nil, <<~PATTERN
|
|
50
|
+
(rescue
|
|
51
|
+
$#numeric_method?
|
|
52
|
+
(resbody nil? nil? (nil)) nil?)
|
|
53
|
+
PATTERN
|
|
54
|
+
|
|
55
|
+
# @!method begin_numeric_constructor_rescue_nil(node)
|
|
56
|
+
def_node_matcher :begin_numeric_constructor_rescue_nil, <<~PATTERN
|
|
57
|
+
(kwbegin
|
|
58
|
+
(rescue
|
|
59
|
+
$#numeric_method?
|
|
60
|
+
(resbody $_? nil?
|
|
61
|
+
{(nil) nil?}) nil?))
|
|
62
|
+
PATTERN
|
|
63
|
+
|
|
64
|
+
# @!method numeric_method?(node)
|
|
65
|
+
def_node_matcher :numeric_method?, <<~PATTERN
|
|
66
|
+
{
|
|
67
|
+
(call #constructor_receiver? {:Integer :BigDecimal :Complex :Rational}
|
|
68
|
+
_ _?)
|
|
69
|
+
(call #constructor_receiver? :Float
|
|
70
|
+
_)
|
|
71
|
+
}
|
|
72
|
+
PATTERN
|
|
73
|
+
|
|
74
|
+
# @!method constructor_receiver?(node)
|
|
75
|
+
def_node_matcher :constructor_receiver?, <<~PATTERN
|
|
76
|
+
{nil? (const {nil? cbase} :Kernel)}
|
|
77
|
+
PATTERN
|
|
78
|
+
|
|
79
|
+
minimum_target_ruby_version 2.6
|
|
80
|
+
|
|
81
|
+
# rubocop:disable Metrics/AbcSize
|
|
82
|
+
def on_rescue(node)
|
|
83
|
+
if (method, exception_classes = begin_numeric_constructor_rescue_nil(node.parent))
|
|
84
|
+
return unless expected_exception_classes_only?(exception_classes)
|
|
85
|
+
|
|
86
|
+
node = node.parent
|
|
87
|
+
else
|
|
88
|
+
return unless (method = numeric_constructor_rescue_nil(node))
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
arguments = method.arguments.map(&:source) << 'exception: false'
|
|
92
|
+
prefer = "#{method.method_name}(#{arguments.join(', ')})"
|
|
93
|
+
prefer = "#{method.receiver.source}#{method.loc.dot.source}#{prefer}" if method.receiver
|
|
94
|
+
|
|
95
|
+
add_offense(node, message: format(MSG, prefer: prefer)) do |corrector|
|
|
96
|
+
corrector.replace(node, prefer)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
# rubocop:enable Metrics/AbcSize
|
|
100
|
+
|
|
101
|
+
private
|
|
102
|
+
|
|
103
|
+
def expected_exception_classes_only?(exception_classes)
|
|
104
|
+
return true unless (arguments = exception_classes.first)
|
|
105
|
+
|
|
106
|
+
(arguments.values.map(&:source) - EXPECTED_EXCEPTION_CLASSES).none?
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -19,6 +19,7 @@ module RuboCop
|
|
|
19
19
|
# 'underscored_string'.to_sym
|
|
20
20
|
# :'underscored_symbol'
|
|
21
21
|
# 'hyphenated-string'.to_sym
|
|
22
|
+
# "string_#{interpolation}".to_sym
|
|
22
23
|
#
|
|
23
24
|
# # good
|
|
24
25
|
# :string
|
|
@@ -26,6 +27,7 @@ module RuboCop
|
|
|
26
27
|
# :underscored_string
|
|
27
28
|
# :underscored_symbol
|
|
28
29
|
# :'hyphenated-string'
|
|
30
|
+
# :"string_#{interpolation}"
|
|
29
31
|
#
|
|
30
32
|
# @example EnforcedStyle: strict (default)
|
|
31
33
|
#
|
|
@@ -75,9 +77,12 @@ module RuboCop
|
|
|
75
77
|
|
|
76
78
|
def on_send(node)
|
|
77
79
|
return unless node.receiver
|
|
78
|
-
return unless node.receiver.str_type? || node.receiver.sym_type?
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
if node.receiver.type?(:str, :sym)
|
|
82
|
+
register_offense(node, correction: node.receiver.value.to_sym.inspect)
|
|
83
|
+
elsif node.receiver.dstr_type?
|
|
84
|
+
register_offense(node, correction: ":\"#{node.receiver.value.to_sym}\"")
|
|
85
|
+
end
|
|
81
86
|
end
|
|
82
87
|
|
|
83
88
|
def on_sym(node)
|
|
@@ -136,7 +141,7 @@ module RuboCop
|
|
|
136
141
|
end
|
|
137
142
|
|
|
138
143
|
def in_percent_literal_array?(node)
|
|
139
|
-
node.parent&.array_type? && node.parent
|
|
144
|
+
node.parent&.array_type? && node.parent.percent_literal?
|
|
140
145
|
end
|
|
141
146
|
|
|
142
147
|
def correct_hash_key(node)
|
|
@@ -6,9 +6,12 @@ module RuboCop
|
|
|
6
6
|
# Repacks Parser's diagnostics/errors
|
|
7
7
|
# into RuboCop's offenses.
|
|
8
8
|
class Syntax < Base
|
|
9
|
+
LEVELS = %i[error fatal].freeze
|
|
10
|
+
|
|
9
11
|
def on_other_file
|
|
10
12
|
add_offense_from_error(processed_source.parser_error) if processed_source.parser_error
|
|
11
|
-
processed_source.diagnostics.
|
|
13
|
+
syntax_errors = processed_source.diagnostics.select { |d| LEVELS.include?(d.level) }
|
|
14
|
+
syntax_errors.each do |diagnostic|
|
|
12
15
|
add_offense_from_diagnostic(diagnostic, processed_source.ruby_version)
|
|
13
16
|
end
|
|
14
17
|
super
|
|
@@ -17,9 +20,12 @@ module RuboCop
|
|
|
17
20
|
private
|
|
18
21
|
|
|
19
22
|
def add_offense_from_diagnostic(diagnostic, ruby_version)
|
|
20
|
-
message =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
message = if LSP.enabled?
|
|
24
|
+
diagnostic.message
|
|
25
|
+
else
|
|
26
|
+
"#{diagnostic.message}\n(Using Ruby #{ruby_version} parser; " \
|
|
27
|
+
'configure using `TargetRubyVersion` parameter, under `AllCops`)'
|
|
28
|
+
end
|
|
23
29
|
add_offense(diagnostic.location, message: message, severity: diagnostic.level)
|
|
24
30
|
end
|
|
25
31
|
|
|
@@ -45,13 +45,11 @@ module RuboCop
|
|
|
45
45
|
PATTERN
|
|
46
46
|
|
|
47
47
|
def on_send(node)
|
|
48
|
-
def_node = node.each_ancestor(:
|
|
48
|
+
def_node = node.each_ancestor(:any_def).first
|
|
49
49
|
return unless def_node
|
|
50
50
|
|
|
51
51
|
enum_conversion_call?(node) do |method_node, arguments|
|
|
52
|
-
next if method_node.
|
|
53
|
-
!method_node.method?(:__method__) && !method_node.method?(:__callee__)
|
|
54
|
-
next if method_name?(method_node, def_node.method_name) &&
|
|
52
|
+
next if !method_name?(method_node, def_node.method_name) ||
|
|
55
53
|
arguments_match?(arguments, def_node)
|
|
56
54
|
|
|
57
55
|
add_offense(node)
|
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
|
40
40
|
# top-level return node's ancestors should not be of block, def, or
|
|
41
41
|
# defs type.
|
|
42
42
|
def top_level_return?(return_node)
|
|
43
|
-
return_node.each_ancestor(:block, :
|
|
43
|
+
return_node.each_ancestor(:block, :any_def).none?
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
end
|
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
|
34
34
|
MSG = 'Avoid leaving a trailing comma in attribute declarations.'
|
|
35
35
|
|
|
36
36
|
def on_send(node)
|
|
37
|
-
return unless node.attribute_accessor? && node.
|
|
37
|
+
return unless node.attribute_accessor? && node.last_argument.def_type?
|
|
38
38
|
|
|
39
39
|
trailing_comma = trailing_comma_range(node)
|
|
40
40
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
# Checks for Regexpes (both literals and via `Regexp.new` / `Regexp.compile`)
|
|
7
|
+
# that contain unescaped `]` characters.
|
|
8
|
+
#
|
|
9
|
+
# It emulates the following Ruby warning:
|
|
10
|
+
#
|
|
11
|
+
# [source,ruby]
|
|
12
|
+
# ----
|
|
13
|
+
# $ ruby -e '/abc]123/'
|
|
14
|
+
# -e:1: warning: regular expression has ']' without escape: /abc]123/
|
|
15
|
+
# ----
|
|
16
|
+
#
|
|
17
|
+
# @example
|
|
18
|
+
# # bad
|
|
19
|
+
# /abc]123/
|
|
20
|
+
# %r{abc]123}
|
|
21
|
+
# Regexp.new('abc]123')
|
|
22
|
+
# Regexp.compile('abc]123')
|
|
23
|
+
#
|
|
24
|
+
# # good
|
|
25
|
+
# /abc\]123/
|
|
26
|
+
# %r{abc\]123}
|
|
27
|
+
# Regexp.new('abc\]123')
|
|
28
|
+
# Regexp.compile('abc\]123')
|
|
29
|
+
#
|
|
30
|
+
class UnescapedBracketInRegexp < Base
|
|
31
|
+
extend AutoCorrector
|
|
32
|
+
|
|
33
|
+
MSG = 'Regular expression has `]` without escape.'
|
|
34
|
+
RESTRICT_ON_SEND = %i[new compile].freeze
|
|
35
|
+
|
|
36
|
+
# @!method regexp_constructor(node)
|
|
37
|
+
def_node_search :regexp_constructor, <<~PATTERN
|
|
38
|
+
(send
|
|
39
|
+
(const {nil? cbase} :Regexp) {:new :compile}
|
|
40
|
+
$str
|
|
41
|
+
...
|
|
42
|
+
)
|
|
43
|
+
PATTERN
|
|
44
|
+
|
|
45
|
+
def on_regexp(node)
|
|
46
|
+
RuboCop::Util.silence_warnings do
|
|
47
|
+
node.parsed_tree&.each_expression do |expr|
|
|
48
|
+
detect_offenses(node, expr)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def on_send(node)
|
|
54
|
+
# Ignore nodes that contain interpolation
|
|
55
|
+
return if node.each_descendant(:dstr).any?
|
|
56
|
+
|
|
57
|
+
regexp_constructor(node) do |text|
|
|
58
|
+
parse_regexp(text.value)&.each_expression do |expr|
|
|
59
|
+
detect_offenses(text, expr)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def detect_offenses(node, expr)
|
|
67
|
+
return unless expr.type?(:literal)
|
|
68
|
+
|
|
69
|
+
expr.text.scan(/(?<!\\)\]/) do
|
|
70
|
+
pos = Regexp.last_match.begin(0)
|
|
71
|
+
next if pos.zero? # if the unescaped bracket is the first character, Ruby does not warn
|
|
72
|
+
|
|
73
|
+
location = range_at_index(node, expr.ts, pos)
|
|
74
|
+
|
|
75
|
+
add_offense(location) do |corrector|
|
|
76
|
+
corrector.replace(location, '\]')
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def range_at_index(node, index, offset)
|
|
82
|
+
adjustment = index + offset
|
|
83
|
+
node.loc.begin.end.adjust(begin_pos: adjustment, end_pos: adjustment + 1)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -53,6 +53,7 @@ module RuboCop
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
alias on_numblock on_block
|
|
56
|
+
alias on_itblock on_block
|
|
56
57
|
|
|
57
58
|
private
|
|
58
59
|
|
|
@@ -74,6 +75,7 @@ module RuboCop
|
|
|
74
75
|
|
|
75
76
|
def arg_count(node)
|
|
76
77
|
return node.children[1] if node.numblock_type? # the maximum numbered param for the block
|
|
78
|
+
return 1 if node.itblock_type? # `it` block parameter is always one
|
|
77
79
|
|
|
78
80
|
# Only `arg`, `optarg` and `mlhs` (destructuring) count as arguments that
|
|
79
81
|
# can be used. Keyword arguments are not used for these methods so are
|
|
@@ -81,7 +83,7 @@ module RuboCop
|
|
|
81
83
|
node.arguments.count do |arg|
|
|
82
84
|
return Float::INFINITY if arg.restarg_type?
|
|
83
85
|
|
|
84
|
-
arg.
|
|
86
|
+
arg.type?(:arg, :optarg, :mlhs)
|
|
85
87
|
end
|
|
86
88
|
end
|
|
87
89
|
end
|
|
@@ -69,8 +69,8 @@ module RuboCop
|
|
|
69
69
|
# @!method reduce_with_block?(node)
|
|
70
70
|
def_node_matcher :reduce_with_block?, <<~PATTERN
|
|
71
71
|
{
|
|
72
|
-
(block (
|
|
73
|
-
(numblock (
|
|
72
|
+
(block (call _recv {:reduce :inject} ...) args ...)
|
|
73
|
+
(numblock (call _recv {:reduce :inject} ...) ...)
|
|
74
74
|
}
|
|
75
75
|
PATTERN
|
|
76
76
|
|
|
@@ -113,6 +113,7 @@ module RuboCop
|
|
|
113
113
|
PATTERN
|
|
114
114
|
|
|
115
115
|
def on_block(node)
|
|
116
|
+
return unless node.body
|
|
116
117
|
return unless reduce_with_block?(node)
|
|
117
118
|
return unless node.argument_list.length >= 2
|
|
118
119
|
|
|
@@ -129,7 +130,7 @@ module RuboCop
|
|
|
129
130
|
|
|
130
131
|
block_body_node.each_descendant(:next, :break) do |n|
|
|
131
132
|
# Ignore `next`/`break` inside an inner block
|
|
132
|
-
next if n.each_ancestor(:
|
|
133
|
+
next if n.each_ancestor(:any_block).first != block_body_node.parent
|
|
133
134
|
next unless n.first_argument
|
|
134
135
|
|
|
135
136
|
nodes << n.first_argument
|
|
@@ -10,14 +10,12 @@ module RuboCop
|
|
|
10
10
|
# @example
|
|
11
11
|
#
|
|
12
12
|
# # bad
|
|
13
|
-
#
|
|
14
13
|
# def some_method
|
|
15
14
|
# return
|
|
16
15
|
# do_something
|
|
17
16
|
# end
|
|
18
17
|
#
|
|
19
18
|
# # bad
|
|
20
|
-
#
|
|
21
19
|
# def some_method
|
|
22
20
|
# if cond
|
|
23
21
|
# return
|
|
@@ -27,16 +25,30 @@ module RuboCop
|
|
|
27
25
|
# do_something
|
|
28
26
|
# end
|
|
29
27
|
#
|
|
30
|
-
# @example
|
|
31
|
-
#
|
|
32
28
|
# # good
|
|
33
|
-
#
|
|
34
29
|
# def some_method
|
|
35
30
|
# do_something
|
|
36
31
|
# end
|
|
37
32
|
class UnreachableCode < Base
|
|
38
33
|
MSG = 'Unreachable code detected.'
|
|
39
34
|
|
|
35
|
+
def initialize(config = nil, options = nil)
|
|
36
|
+
super
|
|
37
|
+
@redefined = []
|
|
38
|
+
@instance_eval_count = 0
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def on_block(node)
|
|
42
|
+
@instance_eval_count += 1 if instance_eval_block?(node)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
alias on_numblock on_block
|
|
46
|
+
alias on_itblock on_block
|
|
47
|
+
|
|
48
|
+
def after_block(node)
|
|
49
|
+
@instance_eval_count -= 1 if instance_eval_block?(node)
|
|
50
|
+
end
|
|
51
|
+
|
|
40
52
|
def on_begin(node)
|
|
41
53
|
expressions = *node
|
|
42
54
|
|
|
@@ -51,19 +63,23 @@ module RuboCop
|
|
|
51
63
|
|
|
52
64
|
private
|
|
53
65
|
|
|
66
|
+
def redefinable_flow_method?(method)
|
|
67
|
+
%i[raise fail throw exit exit! abort].include? method
|
|
68
|
+
end
|
|
69
|
+
|
|
54
70
|
# @!method flow_command?(node)
|
|
55
71
|
def_node_matcher :flow_command?, <<~PATTERN
|
|
56
72
|
{
|
|
57
73
|
return next break retry redo
|
|
58
74
|
(send
|
|
59
75
|
{nil? (const {nil? cbase} :Kernel)}
|
|
60
|
-
|
|
76
|
+
#redefinable_flow_method?
|
|
61
77
|
...)
|
|
62
78
|
}
|
|
63
79
|
PATTERN
|
|
64
80
|
|
|
65
81
|
def flow_expression?(node)
|
|
66
|
-
return
|
|
82
|
+
return report_on_flow_command?(node) if flow_command?(node)
|
|
67
83
|
|
|
68
84
|
case node.type
|
|
69
85
|
when :begin, :kwbegin
|
|
@@ -71,8 +87,10 @@ module RuboCop
|
|
|
71
87
|
expressions.any? { |expr| flow_expression?(expr) }
|
|
72
88
|
when :if
|
|
73
89
|
check_if(node)
|
|
74
|
-
when :case
|
|
90
|
+
when :case, :case_match
|
|
75
91
|
check_case(node)
|
|
92
|
+
when :def
|
|
93
|
+
register_redefinition(node)
|
|
76
94
|
else
|
|
77
95
|
false
|
|
78
96
|
end
|
|
@@ -89,7 +107,36 @@ module RuboCop
|
|
|
89
107
|
return false unless else_branch
|
|
90
108
|
return false unless flow_expression?(else_branch)
|
|
91
109
|
|
|
92
|
-
node.
|
|
110
|
+
branches = node.case_type? ? node.when_branches : node.in_pattern_branches
|
|
111
|
+
|
|
112
|
+
branches.all? { |branch| branch.body && flow_expression?(branch.body) }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def register_redefinition(node)
|
|
116
|
+
@redefined << node.method_name if redefinable_flow_method? node.method_name
|
|
117
|
+
false
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def instance_eval_block?(node)
|
|
121
|
+
node.any_block_type? && node.method?(:instance_eval)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def report_on_flow_command?(node)
|
|
125
|
+
return true unless node.send_type?
|
|
126
|
+
|
|
127
|
+
# By the contract of this function, this case means that
|
|
128
|
+
# the method is called on `Kernel` in which case we
|
|
129
|
+
# always want to report a warning.
|
|
130
|
+
return true if node.receiver
|
|
131
|
+
|
|
132
|
+
# Inside an `instance_eval` we have no way to tell the
|
|
133
|
+
# type of `self` just by looking at the AST, so we can't
|
|
134
|
+
# tell if the give function that's called has been
|
|
135
|
+
# redefined or not, so to avoid false positives, we silence
|
|
136
|
+
# the warning.
|
|
137
|
+
return false if @instance_eval_count.positive?
|
|
138
|
+
|
|
139
|
+
!@redefined.include? node.method_name
|
|
93
140
|
end
|
|
94
141
|
end
|
|
95
142
|
end
|
|
@@ -101,14 +101,13 @@ module RuboCop
|
|
|
101
101
|
check(node) if loop_method?(node)
|
|
102
102
|
end
|
|
103
103
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
end
|
|
104
|
+
alias on_numblock on_block
|
|
105
|
+
alias on_itblock on_block
|
|
107
106
|
|
|
108
107
|
private
|
|
109
108
|
|
|
110
109
|
def loop_method?(node)
|
|
111
|
-
return false unless node.
|
|
110
|
+
return false unless node.any_block_type?
|
|
112
111
|
|
|
113
112
|
send_node = node.send_node
|
|
114
113
|
loopable = send_node.enumerable_method? || send_node.enumerator_method? ||
|
|
@@ -160,7 +159,7 @@ module RuboCop
|
|
|
160
159
|
break_statement && !preceded_by_continue_statement?(break_statement)
|
|
161
160
|
when :if
|
|
162
161
|
check_if(node)
|
|
163
|
-
when :case
|
|
162
|
+
when :case, :case_match
|
|
164
163
|
check_case(node)
|
|
165
164
|
else
|
|
166
165
|
false
|
|
@@ -178,13 +177,20 @@ module RuboCop
|
|
|
178
177
|
return false unless else_branch
|
|
179
178
|
return false unless break_statement?(else_branch)
|
|
180
179
|
|
|
181
|
-
|
|
180
|
+
branches = if node.case_type?
|
|
181
|
+
node.when_branches
|
|
182
|
+
else
|
|
183
|
+
node.in_pattern_branches
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
branches.all? { |branch| branch.body && break_statement?(branch.body) }
|
|
182
187
|
end
|
|
183
188
|
|
|
184
189
|
def preceded_by_continue_statement?(break_statement)
|
|
185
190
|
break_statement.left_siblings.any? do |sibling|
|
|
186
|
-
# Numblocks have the arguments count as a number
|
|
187
|
-
|
|
191
|
+
# Numblocks have the arguments count as a number or,
|
|
192
|
+
# itblocks have `:it` symbol in the AST.
|
|
193
|
+
next if sibling.is_a?(Integer) || sibling.is_a?(Symbol)
|
|
188
194
|
next if sibling.loop_keyword? || loop_method?(sibling)
|
|
189
195
|
|
|
190
196
|
sibling.each_descendant(*CONTINUE_KEYWORDS).any?
|
|
@@ -39,6 +39,8 @@ module RuboCop
|
|
|
39
39
|
# end
|
|
40
40
|
#
|
|
41
41
|
# @example IgnoreNotImplementedMethods: true (default)
|
|
42
|
+
# # with default value of `NotImplementedExceptions: ['NotImplementedError']`
|
|
43
|
+
#
|
|
42
44
|
# # good
|
|
43
45
|
# def do_something(unused)
|
|
44
46
|
# raise NotImplementedError
|
|
@@ -48,6 +50,14 @@ module RuboCop
|
|
|
48
50
|
# fail "TODO"
|
|
49
51
|
# end
|
|
50
52
|
#
|
|
53
|
+
# @example IgnoreNotImplementedMethods: true
|
|
54
|
+
# # with `NotImplementedExceptions: ['AbstractMethodError']`
|
|
55
|
+
#
|
|
56
|
+
# # good
|
|
57
|
+
# def do_something(unused)
|
|
58
|
+
# raise AbstractMethodError
|
|
59
|
+
# end
|
|
60
|
+
#
|
|
51
61
|
# @example IgnoreNotImplementedMethods: false
|
|
52
62
|
# # bad
|
|
53
63
|
# def do_something(unused)
|
|
@@ -57,14 +67,13 @@ module RuboCop
|
|
|
57
67
|
# def do_something_else(unused)
|
|
58
68
|
# fail "TODO"
|
|
59
69
|
# end
|
|
60
|
-
#
|
|
61
70
|
class UnusedMethodArgument < Base
|
|
62
71
|
include UnusedArgument
|
|
63
72
|
extend AutoCorrector
|
|
64
73
|
|
|
65
74
|
# @!method not_implemented?(node)
|
|
66
75
|
def_node_matcher :not_implemented?, <<~PATTERN
|
|
67
|
-
{(send nil? :raise
|
|
76
|
+
{(send nil? :raise #allowed_exception_class? ...)
|
|
68
77
|
(send nil? :fail ...)}
|
|
69
78
|
PATTERN
|
|
70
79
|
|
|
@@ -115,6 +124,13 @@ module RuboCop
|
|
|
115
124
|
|
|
116
125
|
message
|
|
117
126
|
end
|
|
127
|
+
|
|
128
|
+
def allowed_exception_class?(node)
|
|
129
|
+
return false unless node.const_type?
|
|
130
|
+
|
|
131
|
+
allowed_class_names = Array(cop_config.fetch('NotImplementedExceptions', []))
|
|
132
|
+
allowed_class_names.include?(node.const_name)
|
|
133
|
+
end
|
|
118
134
|
end
|
|
119
135
|
end
|
|
120
136
|
end
|