rubocop 1.44.1 → 1.78.0
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 +95 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +660 -117
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +13 -3
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +33 -13
- data/lib/rubocop/cli/command/execute_runner.rb +11 -6
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- 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 +80 -11
- data/lib/rubocop/comment_config.rb +21 -2
- data/lib/rubocop/config.rb +99 -25
- data/lib/rubocop/config_finder.rb +14 -4
- data/lib/rubocop/config_loader.rb +68 -57
- data/lib/rubocop/config_loader_resolver.rb +48 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +58 -11
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +69 -21
- data/lib/rubocop/cop/base.rb +112 -29
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -2
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +6 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +10 -2
- data/lib/rubocop/cop/commissioner.rb +8 -2
- data/lib/rubocop/cop/cop.rb +55 -9
- data/lib/rubocop/cop/corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -15
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -15
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +7 -4
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +12 -2
- 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 +6 -8
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +4 -5
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +10 -2
- 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/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +37 -17
- 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 +51 -25
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +38 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +6 -5
- 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 +129 -35
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/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/processed_source_buffer_name.rb +42 -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_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -22
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +75 -0
- 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 +2 -5
- data/lib/rubocop/cop/internal_affairs.rb +12 -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 +2 -2
- 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 +8 -21
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +59 -28
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
- 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 +2 -6
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +6 -4
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +46 -13
- 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 +34 -14
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +39 -7
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +14 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +23 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -5
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +14 -14
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +25 -34
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +8 -20
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +50 -52
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +38 -55
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +13 -6
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +7 -4
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +16 -16
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +85 -3
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +29 -14
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +19 -9
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/line_length.rb +168 -28
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +8 -27
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +8 -27
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +20 -12
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +21 -6
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +7 -30
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +43 -48
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -10
- 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 +10 -2
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +75 -38
- 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_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +28 -13
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +3 -3
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +4 -4
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +6 -7
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- 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 +14 -4
- 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 +1 -1
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +49 -30
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +6 -6
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -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 +2 -5
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +112 -34
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +48 -23
- 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 +1 -3
- data/lib/rubocop/cop/lint/empty_block.rb +2 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +31 -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 +4 -6
- 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 +27 -27
- 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 +5 -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/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -16
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +24 -13
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
- 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/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +114 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +96 -17
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +63 -5
- data/lib/rubocop/cop/lint/mixed_case_range.rb +113 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +11 -18
- 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 +22 -10
- 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 +13 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +3 -4
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +3 -2
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +11 -14
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -5
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -5
- 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_disable_directive.rb +11 -5
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +9 -7
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -13
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +79 -10
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +10 -9
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +36 -20
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +10 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +6 -3
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +3 -2
- 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/rescue_exception.rb +1 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -10
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +31 -13
- 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 +71 -10
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -13
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +26 -12
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/syntax.rb +14 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +17 -7
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- 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 +17 -11
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +46 -17
- data/lib/rubocop/cop/lint/useless_assignment.rb +104 -15
- 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 +11 -3
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +78 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +7 -3
- 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 +3 -3
- data/lib/rubocop/cop/lint/void.rb +140 -19
- 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 +9 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -16
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +83 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +16 -7
- 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 +2 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +40 -13
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +3 -3
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +10 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -3
- 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 +26 -11
- 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/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- 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 +16 -15
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +62 -43
- 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/heredoc.rb +6 -2
- 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/min_branches_count.rb +40 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +10 -11
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +2 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +71 -35
- data/lib/rubocop/cop/mixin/range_help.rb +16 -10
- 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/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +13 -7
- data/lib/rubocop/cop/mixin/string_help.rb +5 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +24 -8
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +40 -9
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +8 -10
- data/lib/rubocop/cop/naming/file_name.rb +5 -7
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +33 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +38 -24
- data/lib/rubocop/cop/naming/method_name.rb +146 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +303 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +26 -17
- data/lib/rubocop/cop/naming/variable_name.rb +56 -7
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +12 -7
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- 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 +177 -30
- data/lib/rubocop/cop/style/accessor_grouping.rb +69 -21
- data/lib/rubocop/cop/style/alias.rb +11 -9
- 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 +478 -62
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +54 -34
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +3 -3
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_comments.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +60 -19
- data/lib/rubocop/cop/style/case_like_if.rb +34 -20
- data/lib/rubocop/cop/style/class_and_module_children.rb +55 -14
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +59 -41
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +35 -12
- data/lib/rubocop/cop/style/collection_methods.rb +4 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +44 -8
- data/lib/rubocop/cop/style/command_literal.rb +2 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +32 -6
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +13 -4
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -42
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/copyright.rb +37 -24
- data/lib/rubocop/cop/style/data_inheritance.rb +82 -0
- 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/dir.rb +1 -1
- data/lib/rubocop/cop/style/dir_empty.rb +54 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +3 -3
- data/lib/rubocop/cop/style/documentation.rb +36 -30
- data/lib/rubocop/cop/style/documentation_method.rb +30 -4
- data/lib/rubocop/cop/style/double_negation.rb +6 -6
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +4 -5
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- 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_lambda_parameter.rb +1 -1
- 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 +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +27 -35
- data/lib/rubocop/cop/style/exact_regexp_match.rb +69 -0
- 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 +5 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_empty.rb +71 -0
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_read.rb +5 -8
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +3 -6
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +4 -2
- data/lib/rubocop/cop/style/format_string.rb +33 -12
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -4
- 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 +48 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +26 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +111 -34
- data/lib/rubocop/cop/style/hash_except.rb +38 -135
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +38 -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 +57 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +16 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +140 -17
- 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 +10 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +62 -8
- 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 +21 -17
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +58 -12
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +119 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +5 -4
- data/lib/rubocop/cop/style/lambda_call.rb +14 -3
- 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 +31 -7
- data/lib/rubocop/cop/style/map_to_set.rb +6 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +62 -31
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +65 -42
- 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.rb +3 -3
- 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/mixin_grouping.rb +5 -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 +17 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -4
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +66 -59
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +18 -11
- 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 +8 -15
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.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 +31 -6
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +33 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +38 -40
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +3 -4
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.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 +35 -4
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
- 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 +17 -4
- data/lib/rubocop/cop/style/redundant_condition.rb +114 -27
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +50 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +91 -7
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +33 -13
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -16
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
- data/lib/rubocop/cop/style/redundant_format.rb +262 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +3 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +236 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +140 -40
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -9
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +20 -28
- data/lib/rubocop/cop/style/redundant_return.rb +16 -5
- 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 +12 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +14 -13
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +8 -7
- data/lib/rubocop/cop/style/regexp_literal.rb +12 -3
- data/lib/rubocop/cop/style/require_order.rb +13 -9
- data/lib/rubocop/cop/style/rescue_modifier.rb +19 -7
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/return_nil.rb +8 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +137 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +145 -63
- 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 +33 -16
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +22 -6
- 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 +3 -4
- 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 +78 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +10 -8
- data/lib/rubocop/cop/style/slicing_with_range.rb +106 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +50 -90
- data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- 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 +10 -3
- 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 +35 -15
- 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_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_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 +5 -5
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -3
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- 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/word_array.rb +18 -6
- data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +25 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +20 -9
- data/lib/rubocop/cop/style/zero_length_predicate.rb +41 -29
- data/lib/rubocop/cop/team.rb +58 -26
- data/lib/rubocop/cop/util.rb +33 -11
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +66 -6
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/cop/variable_force/variable.rb +18 -5
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +19 -12
- data/lib/rubocop/cops_documentation_generator.rb +138 -55
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +57 -21
- data/lib/rubocop/ext/comment.rb +18 -0
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +7 -21
- data/lib/rubocop/file_finder.rb +11 -9
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -10
- 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 +74 -24
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -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 +189 -0
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +227 -0
- data/lib/rubocop/lsp/runtime.rb +69 -0
- data/lib/rubocop/lsp/server.rb +70 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +24 -14
- data/lib/rubocop/options.rb +78 -23
- 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 +20 -23
- data/lib/rubocop/rspec/cop_helper.rb +21 -3
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +118 -21
- data/lib/rubocop/rspec/support.rb +8 -2
- data/lib/rubocop/runner.rb +80 -17
- data/lib/rubocop/server/cache.rb +66 -8
- data/lib/rubocop/server/cli.rb +39 -20
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +6 -5
- data/lib/rubocop/server/client_command/start.rb +17 -2
- data/lib/rubocop/server/core.rb +29 -9
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -2
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +97 -82
- data/lib/rubocop/target_ruby.rb +105 -79
- data/lib/rubocop/version.rb +74 -12
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +81 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +152 -63
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- 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
@@ -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
|
@@ -3,29 +3,47 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
|
-
# Identifies places where `URI.regexp` is obsolete and should
|
7
|
-
#
|
6
|
+
# Identifies places where `URI.regexp` is obsolete and should not be used.
|
7
|
+
#
|
8
|
+
# For Ruby 3.3 or lower, use `URI::DEFAULT_PARSER.make_regexp`.
|
9
|
+
# For Ruby 3.4 or higher, use `URI::RFC2396_PARSER.make_regexp`.
|
10
|
+
#
|
11
|
+
# NOTE: If you need to support both Ruby 3.3 and lower as well as Ruby 3.4 and higher,
|
12
|
+
# consider manually changing the code as follows:
|
13
|
+
#
|
14
|
+
# [source,ruby]
|
15
|
+
# ----
|
16
|
+
# defined?(URI::RFC2396_PARSER) ? URI::RFC2396_PARSER : URI::DEFAULT_PARSER
|
17
|
+
# ----
|
8
18
|
#
|
9
19
|
# @example
|
10
20
|
# # bad
|
11
21
|
# URI.regexp('http://example.com')
|
12
22
|
#
|
13
|
-
# # good
|
23
|
+
# # good - Ruby 3.3 or lower
|
14
24
|
# URI::DEFAULT_PARSER.make_regexp('http://example.com')
|
15
25
|
#
|
26
|
+
# # good - Ruby 3.4 or higher
|
27
|
+
# URI::RFC2396_PARSER.make_regexp('http://example.com')
|
28
|
+
#
|
16
29
|
class UriRegexp < Base
|
17
30
|
extend AutoCorrector
|
18
31
|
|
19
32
|
MSG = '`%<current>s` is obsolete and should not be used. Instead, use `%<preferred>s`.'
|
20
|
-
URI_CONSTANTS = ['URI', '::URI'].freeze
|
21
33
|
RESTRICT_ON_SEND = %i[regexp].freeze
|
22
34
|
|
35
|
+
# @!method uri_constant?(node)
|
36
|
+
def_node_matcher :uri_constant?, <<~PATTERN
|
37
|
+
(const {cbase nil?} :URI)
|
38
|
+
PATTERN
|
39
|
+
|
23
40
|
def on_send(node)
|
24
|
-
return unless node.receiver
|
25
|
-
return unless URI_CONSTANTS.include?(node.receiver.source)
|
41
|
+
return unless uri_constant?(node.receiver)
|
26
42
|
|
43
|
+
parser = target_ruby_version >= 3.4 ? 'RFC2396_PARSER' : 'DEFAULT_PARSER'
|
27
44
|
argument = node.first_argument ? "(#{node.first_argument.source})" : ''
|
28
|
-
|
45
|
+
|
46
|
+
preferred_method = "#{node.receiver.source}::#{parser}.make_regexp#{argument}"
|
29
47
|
message = format(MSG, current: node.source, preferred: preferred_method)
|
30
48
|
|
31
49
|
add_offense(node.loc.selector, message: message) do |corrector|
|
@@ -4,10 +4,10 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
6
|
# Checks for redundant access modifiers, including those with no
|
7
|
-
# code, those which are repeated,
|
8
|
-
# class or module body.
|
9
|
-
#
|
10
|
-
# are not redundant.
|
7
|
+
# code, those which are repeated, those which are on top-level, and
|
8
|
+
# leading `public` modifiers in a class or module body.
|
9
|
+
# Conditionally-defined methods are considered as always being defined,
|
10
|
+
# and thus access modifiers guarding such methods are not redundant.
|
11
11
|
#
|
12
12
|
# This cop has `ContextCreatingMethods` option. The default setting value
|
13
13
|
# is an empty array that means no method is specified.
|
@@ -58,6 +58,12 @@ module RuboCop
|
|
58
58
|
# private # this is redundant (no following methods are defined)
|
59
59
|
# end
|
60
60
|
#
|
61
|
+
# # bad
|
62
|
+
# private # this is useless (access modifiers have no effect on top-level)
|
63
|
+
#
|
64
|
+
# def method
|
65
|
+
# end
|
66
|
+
#
|
61
67
|
# # good
|
62
68
|
# class Foo
|
63
69
|
# private # this is not redundant (a method is defined)
|
@@ -137,12 +143,24 @@ module RuboCop
|
|
137
143
|
alias on_sclass on_class
|
138
144
|
|
139
145
|
def on_block(node)
|
140
|
-
return unless eval_call?(node)
|
146
|
+
return unless eval_call?(node) || included_block?(node)
|
141
147
|
|
142
148
|
check_node(node.body)
|
143
149
|
end
|
144
150
|
|
145
151
|
alias on_numblock on_block
|
152
|
+
alias on_itblock on_block
|
153
|
+
|
154
|
+
def on_begin(node)
|
155
|
+
return if node.parent
|
156
|
+
|
157
|
+
node.child_nodes.each do |child|
|
158
|
+
next unless child.send_type? && access_modifier?(child)
|
159
|
+
|
160
|
+
# This call always registers an offense for access modifier `child.method_name`
|
161
|
+
check_send_node(child, child.method_name, true)
|
162
|
+
end
|
163
|
+
end
|
146
164
|
|
147
165
|
private
|
148
166
|
|
@@ -159,17 +177,12 @@ module RuboCop
|
|
159
177
|
|
160
178
|
# @!method dynamic_method_definition?(node)
|
161
179
|
def_node_matcher :dynamic_method_definition?, <<~PATTERN
|
162
|
-
{(send nil? :define_method ...) (
|
180
|
+
{(send nil? :define_method ...) (any_block (send nil? :define_method ...) ...)}
|
163
181
|
PATTERN
|
164
182
|
|
165
183
|
# @!method class_or_instance_eval?(node)
|
166
184
|
def_node_matcher :class_or_instance_eval?, <<~PATTERN
|
167
|
-
(
|
168
|
-
PATTERN
|
169
|
-
|
170
|
-
# @!method class_or_module_or_struct_new_call?(node)
|
171
|
-
def_node_matcher :class_or_module_or_struct_new_call?, <<~PATTERN
|
172
|
-
({block numblock} (send (const {nil? cbase} {:Class :Module :Struct}) :new ...) ...)
|
185
|
+
(any_block (send _ {:class_eval :instance_eval}) ...)
|
173
186
|
PATTERN
|
174
187
|
|
175
188
|
def check_node(node)
|
@@ -197,10 +210,13 @@ module RuboCop
|
|
197
210
|
end
|
198
211
|
end
|
199
212
|
|
213
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
200
214
|
def check_child_nodes(node, unused, cur_vis)
|
201
215
|
node.child_nodes.each do |child|
|
202
216
|
if child.send_type? && access_modifier?(child)
|
203
217
|
cur_vis, unused = check_send_node(child, cur_vis, unused)
|
218
|
+
elsif child.block_type? && included_block?(child)
|
219
|
+
next
|
204
220
|
elsif method_definition?(child)
|
205
221
|
unused = nil
|
206
222
|
elsif start_of_new_scope?(child)
|
@@ -212,6 +228,7 @@ module RuboCop
|
|
212
228
|
|
213
229
|
[cur_vis, unused]
|
214
230
|
end
|
231
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
215
232
|
|
216
233
|
def check_send_node(node, cur_vis, unused)
|
217
234
|
if node.bare_access_modifier?
|
@@ -245,6 +262,10 @@ module RuboCop
|
|
245
262
|
[new_vis, unused]
|
246
263
|
end
|
247
264
|
|
265
|
+
def included_block?(block_node)
|
266
|
+
active_support_extensions_enabled? && block_node.method?(:included)
|
267
|
+
end
|
268
|
+
|
248
269
|
def method_definition?(child)
|
249
270
|
static_method_definition?(child) ||
|
250
271
|
dynamic_method_definition?(child) ||
|
@@ -253,7 +274,11 @@ module RuboCop
|
|
253
274
|
|
254
275
|
def any_method_definition?(child)
|
255
276
|
cop_config.fetch('MethodCreatingMethods', []).any? do |m|
|
256
|
-
|
277
|
+
# Some users still have `"included"` in their `MethodCreatingMethods` configurations,
|
278
|
+
# so to prevent Ruby method redefinition warnings let's just skip this value.
|
279
|
+
next if m == 'included'
|
280
|
+
|
281
|
+
matcher_name = :"#{m}_method?"
|
257
282
|
unless respond_to?(matcher_name)
|
258
283
|
self.class.def_node_matcher matcher_name, <<~PATTERN
|
259
284
|
{def (send nil? :#{m} ...)}
|
@@ -265,21 +290,25 @@ module RuboCop
|
|
265
290
|
end
|
266
291
|
|
267
292
|
def start_of_new_scope?(child)
|
268
|
-
child.
|
293
|
+
child.type?(:module, :class, :sclass) || eval_call?(child)
|
269
294
|
end
|
270
295
|
|
271
296
|
def eval_call?(child)
|
272
297
|
class_or_instance_eval?(child) ||
|
273
|
-
|
298
|
+
child.class_constructor? ||
|
274
299
|
any_context_creating_methods?(child)
|
275
300
|
end
|
276
301
|
|
277
302
|
def any_context_creating_methods?(child)
|
303
|
+
# Some users still have `"included"` in their `ContextCreatingMethods` configurations,
|
304
|
+
# so to prevent Ruby method redefinition warnings let's just skip this value.
|
278
305
|
cop_config.fetch('ContextCreatingMethods', []).any? do |m|
|
279
|
-
|
306
|
+
next if m == 'included'
|
307
|
+
|
308
|
+
matcher_name = :"#{m}_block?"
|
280
309
|
unless respond_to?(matcher_name)
|
281
310
|
self.class.def_node_matcher matcher_name, <<~PATTERN
|
282
|
-
(
|
311
|
+
(any_block (send {nil? const} {:#{m}} ...) ...)
|
283
312
|
PATTERN
|
284
313
|
end
|
285
314
|
|
@@ -7,30 +7,41 @@ module RuboCop
|
|
7
7
|
# scope.
|
8
8
|
# The basic idea for this cop was from the warning of `ruby -cw`:
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# [source,console]
|
11
|
+
# ----
|
12
|
+
# assigned but unused variable - foo
|
13
|
+
# ----
|
11
14
|
#
|
12
15
|
# Currently this cop has advanced logic that detects unreferenced
|
13
16
|
# reassignments and properly handles varied cases such as branch, loop,
|
14
17
|
# rescue, ensure, etc.
|
15
18
|
#
|
19
|
+
# This cop's autocorrection avoids cases like `a ||= 1` because removing assignment from
|
20
|
+
# operator assignment can cause `NameError` if this assignment has been used to declare
|
21
|
+
# a local variable. For example, replacing `a ||= 1` with `a || 1` may cause
|
22
|
+
# "undefined local variable or method `a' for main:Object (NameError)".
|
23
|
+
#
|
24
|
+
# NOTE: Given the assignment `foo = 1, bar = 2`, removing unused variables
|
25
|
+
# can lead to a syntax error, so this case is not autocorrected.
|
26
|
+
#
|
16
27
|
# @example
|
17
28
|
#
|
18
29
|
# # bad
|
19
|
-
#
|
20
30
|
# def some_method
|
21
31
|
# some_var = 1
|
22
32
|
# do_something
|
23
33
|
# end
|
24
34
|
#
|
25
|
-
# @example
|
26
|
-
#
|
27
35
|
# # good
|
28
|
-
#
|
29
36
|
# def some_method
|
30
37
|
# some_var = 1
|
31
38
|
# do_something(some_var)
|
32
39
|
# end
|
33
40
|
class UselessAssignment < Base
|
41
|
+
extend AutoCorrector
|
42
|
+
|
43
|
+
include RangeHelp
|
44
|
+
|
34
45
|
MSG = 'Useless assignment to variable - `%<variable>s`.'
|
35
46
|
|
36
47
|
def self.joining_forces
|
@@ -41,23 +52,32 @@ module RuboCop
|
|
41
52
|
scope.variables.each_value { |variable| check_for_unused_assignments(variable) }
|
42
53
|
end
|
43
54
|
|
55
|
+
# rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
44
56
|
def check_for_unused_assignments(variable)
|
45
57
|
return if variable.should_be_unused?
|
46
58
|
|
47
|
-
variable.assignments.
|
48
|
-
|
59
|
+
variable.assignments.reverse_each do |assignment|
|
60
|
+
assignment_node = assignment.node
|
61
|
+
next if assignment.used? || part_of_ignored_node?(assignment_node)
|
49
62
|
|
50
63
|
message = message_for_useless_assignment(assignment)
|
64
|
+
range = offense_range(assignment)
|
65
|
+
|
66
|
+
add_offense(range, message: message) do |corrector|
|
67
|
+
# In cases like `x = 1, y = 2`, where removing a variable would cause a syntax error,
|
68
|
+
# and where changing `x ||= 1` to `x = 1` would cause `NameError`,
|
69
|
+
# the autocorrect will be skipped, even if the variable is unused.
|
70
|
+
if sequential_assignment?(assignment_node) || assignment_node.parent&.or_asgn_type?
|
71
|
+
next
|
72
|
+
end
|
51
73
|
|
52
|
-
|
53
|
-
|
54
|
-
else
|
55
|
-
assignment.node.loc.name
|
56
|
-
end
|
74
|
+
autocorrect(corrector, assignment)
|
75
|
+
end
|
57
76
|
|
58
|
-
|
77
|
+
ignore_node(assignment_node) if chained_assignment?(assignment_node)
|
59
78
|
end
|
60
79
|
end
|
80
|
+
# rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
61
81
|
|
62
82
|
def message_for_useless_assignment(assignment)
|
63
83
|
variable = assignment.variable
|
@@ -65,6 +85,30 @@ module RuboCop
|
|
65
85
|
format(MSG, variable: variable.name) + message_specification(assignment, variable).to_s
|
66
86
|
end
|
67
87
|
|
88
|
+
def offense_range(assignment)
|
89
|
+
if assignment.regexp_named_capture?
|
90
|
+
assignment.node.children.first.source_range
|
91
|
+
else
|
92
|
+
assignment.node.loc.name
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def sequential_assignment?(node)
|
97
|
+
if node.lvasgn_type? && node.expression&.array_type? &&
|
98
|
+
node.each_descendant.any?(&:assignment?)
|
99
|
+
return true
|
100
|
+
end
|
101
|
+
return false unless node.parent
|
102
|
+
|
103
|
+
sequential_assignment?(node.parent)
|
104
|
+
end
|
105
|
+
|
106
|
+
def chained_assignment?(node)
|
107
|
+
return true if node.lvasgn_type? && node.expression&.send_type?
|
108
|
+
|
109
|
+
node.respond_to?(:expression) && node.expression&.lvasgn_type?
|
110
|
+
end
|
111
|
+
|
68
112
|
def message_specification(assignment, variable)
|
69
113
|
if assignment.multiple_assignment?
|
70
114
|
multiple_assignment_message(variable.name)
|
@@ -84,8 +128,7 @@ module RuboCop
|
|
84
128
|
return_value_node = return_value_node_of_scope(scope)
|
85
129
|
return unless assignment.meta_assignment_node.equal?(return_value_node)
|
86
130
|
|
87
|
-
" Use `#{assignment.operator.
|
88
|
-
"instead of `#{assignment.operator}`."
|
131
|
+
" Use `#{assignment.operator.delete_suffix('=')}` instead of `#{assignment.operator}`."
|
89
132
|
end
|
90
133
|
|
91
134
|
def similar_name_message(variable)
|
@@ -119,6 +162,52 @@ module RuboCop
|
|
119
162
|
|
120
163
|
node.receiver.nil? && !node.arguments?
|
121
164
|
end
|
165
|
+
|
166
|
+
# rubocop:disable Metrics/AbcSize
|
167
|
+
def autocorrect(corrector, assignment)
|
168
|
+
if assignment.exception_assignment?
|
169
|
+
remove_exception_assignment_part(corrector, assignment.node)
|
170
|
+
elsif assignment.multiple_assignment? || assignment.rest_assignment? ||
|
171
|
+
assignment.for_assignment?
|
172
|
+
rename_variable_with_underscore(corrector, assignment.node)
|
173
|
+
elsif assignment.operator_assignment?
|
174
|
+
remove_trailing_character_from_operator(corrector, assignment.node)
|
175
|
+
elsif assignment.regexp_named_capture?
|
176
|
+
replace_named_capture_group_with_non_capturing_group(corrector, assignment.node,
|
177
|
+
assignment.variable.name)
|
178
|
+
else
|
179
|
+
remove_local_variable_assignment_part(corrector, assignment.node)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
# rubocop:enable Metrics/AbcSize
|
183
|
+
|
184
|
+
def remove_exception_assignment_part(corrector, node)
|
185
|
+
corrector.remove(
|
186
|
+
range_between(
|
187
|
+
(node.parent.children.first&.source_range || node.parent.location.keyword).end_pos,
|
188
|
+
node.source_range.end_pos
|
189
|
+
)
|
190
|
+
)
|
191
|
+
end
|
192
|
+
|
193
|
+
def rename_variable_with_underscore(corrector, node)
|
194
|
+
corrector.replace(node, '_')
|
195
|
+
end
|
196
|
+
|
197
|
+
def remove_trailing_character_from_operator(corrector, node)
|
198
|
+
corrector.remove(node.parent.location.operator.end.adjust(begin_pos: -1))
|
199
|
+
end
|
200
|
+
|
201
|
+
def replace_named_capture_group_with_non_capturing_group(corrector, node, variable_name)
|
202
|
+
corrector.replace(
|
203
|
+
node.children.first,
|
204
|
+
node.children.first.source.sub(/\(\?<#{variable_name}>/, '(?:')
|
205
|
+
)
|
206
|
+
end
|
207
|
+
|
208
|
+
def remove_local_variable_assignment_part(corrector, node)
|
209
|
+
corrector.replace(node, node.expression.source)
|
210
|
+
end
|
122
211
|
end
|
123
212
|
end
|
124
213
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Checks for useless constant scoping. Private constants must be defined using
|
7
|
+
# `private_constant`. Even if `private` access modifier is used, it is public scope despite
|
8
|
+
# its appearance.
|
9
|
+
#
|
10
|
+
# It does not support autocorrection due to behavior change and multiple ways to fix it.
|
11
|
+
# Or a public constant may be intended.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
#
|
15
|
+
# # bad
|
16
|
+
# class Foo
|
17
|
+
# private
|
18
|
+
# PRIVATE_CONST = 42
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# # good
|
22
|
+
# class Foo
|
23
|
+
# PRIVATE_CONST = 42
|
24
|
+
# private_constant :PRIVATE_CONST
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# class Foo
|
29
|
+
# PUBLIC_CONST = 42 # If private scope is not intended.
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
class UselessConstantScoping < Base
|
33
|
+
MSG = 'Useless `private` access modifier for constant scope.'
|
34
|
+
|
35
|
+
# @!method private_constants(node)
|
36
|
+
def_node_matcher :private_constants, <<~PATTERN
|
37
|
+
(send nil? :private_constant $...)
|
38
|
+
PATTERN
|
39
|
+
|
40
|
+
def on_casgn(node)
|
41
|
+
return unless after_private_modifier?(node.left_siblings)
|
42
|
+
return if private_constantize?(node.right_siblings, node.name)
|
43
|
+
|
44
|
+
add_offense(node)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def after_private_modifier?(left_siblings)
|
50
|
+
access_modifier_candidates = left_siblings.compact.select do |left_sibling|
|
51
|
+
left_sibling.respond_to?(:send_type?) && left_sibling.send_type?
|
52
|
+
end
|
53
|
+
|
54
|
+
access_modifier_candidates.any? do |candidate|
|
55
|
+
candidate.command?(:private) && candidate.arguments.none?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def private_constantize?(right_siblings, const_value)
|
60
|
+
private_constant_arguments = right_siblings.map { |node| private_constants(node) }
|
61
|
+
|
62
|
+
private_constant_values = private_constant_arguments.flatten.filter_map do |constant|
|
63
|
+
constant.value.to_sym if constant.respond_to?(:value)
|
64
|
+
end
|
65
|
+
|
66
|
+
private_constant_values.include?(const_value)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Checks for usage of method `fetch` or `Array.new` with default value argument
|
7
|
+
# and block. In such cases, block will always be used as default value.
|
8
|
+
#
|
9
|
+
# This cop emulates Ruby warning "block supersedes default value argument" which
|
10
|
+
# applies to `Array.new`, `Array#fetch`, `Hash#fetch`, `ENV.fetch` and
|
11
|
+
# `Thread#fetch`.
|
12
|
+
#
|
13
|
+
# A `fetch` call without a receiver is considered a custom method and does not register
|
14
|
+
# an offense.
|
15
|
+
#
|
16
|
+
# @safety
|
17
|
+
# This cop is unsafe because the receiver could have nonstandard implementation
|
18
|
+
# of `fetch`, or be a class other than the one listed above.
|
19
|
+
#
|
20
|
+
# It is also unsafe because default value argument could have side effects:
|
21
|
+
#
|
22
|
+
# [source,ruby]
|
23
|
+
# ----
|
24
|
+
# def x(a) = puts "side effect"
|
25
|
+
# Array.new(5, x(1)) { 2 }
|
26
|
+
# ----
|
27
|
+
#
|
28
|
+
# so removing it would change behavior.
|
29
|
+
#
|
30
|
+
# @example
|
31
|
+
# # bad
|
32
|
+
# x.fetch(key, default_value) { block_value }
|
33
|
+
# Array.new(size, default_value) { block_value }
|
34
|
+
#
|
35
|
+
# # good
|
36
|
+
# x.fetch(key) { block_value }
|
37
|
+
# Array.new(size) { block_value }
|
38
|
+
#
|
39
|
+
# # also good - in case default value argument is desired instead
|
40
|
+
# x.fetch(key, default_value)
|
41
|
+
# Array.new(size, default_value)
|
42
|
+
#
|
43
|
+
# # good - keyword arguments aren't registered as offenses
|
44
|
+
# x.fetch(key, keyword: :arg) { block_value }
|
45
|
+
#
|
46
|
+
# @example AllowedReceivers: ['Rails.cache']
|
47
|
+
# # good
|
48
|
+
# Rails.cache.fetch(name, options) { block }
|
49
|
+
#
|
50
|
+
class UselessDefaultValueArgument < Base
|
51
|
+
include AllowedReceivers
|
52
|
+
extend AutoCorrector
|
53
|
+
|
54
|
+
MSG = 'Block supersedes default value argument.'
|
55
|
+
|
56
|
+
RESTRICT_ON_SEND = %i[fetch new].freeze
|
57
|
+
|
58
|
+
# @!method default_value_argument_and_block(node)
|
59
|
+
def_node_matcher :default_value_argument_and_block, <<~PATTERN
|
60
|
+
(any_block
|
61
|
+
{
|
62
|
+
(call !nil? :fetch $_key $_default_value)
|
63
|
+
(send (const _ :Array) :new $_size $_default_value)
|
64
|
+
}
|
65
|
+
_args
|
66
|
+
_block_body)
|
67
|
+
PATTERN
|
68
|
+
|
69
|
+
def on_send(node)
|
70
|
+
unless (prev_arg_node, default_value_node = default_value_argument_and_block(node.parent))
|
71
|
+
return
|
72
|
+
end
|
73
|
+
return if allowed_receiver?(node.receiver)
|
74
|
+
return if hash_without_braces?(default_value_node)
|
75
|
+
|
76
|
+
add_offense(default_value_node) do |corrector|
|
77
|
+
corrector.remove(prev_arg_node.source_range.end.join(default_value_node.source_range))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
alias on_csend on_send
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def hash_without_braces?(node)
|
85
|
+
node.hash_type? && !node.braces?
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Checks for calls to `defined?` with strings or symbols as the argument.
|
7
|
+
# Such calls will always return `'expression'`, you probably meant to
|
8
|
+
# check for the existence of a constant, method, or variable instead.
|
9
|
+
#
|
10
|
+
# `defined?` is part of the Ruby syntax and doesn't behave like normal methods.
|
11
|
+
# You can safely pass in what you are checking for directly, without encountering
|
12
|
+
# a `NameError`.
|
13
|
+
#
|
14
|
+
# When interpolation is used, oftentimes it is not possible to write the
|
15
|
+
# code with `defined?`. In these cases, switch to one of the more specific methods:
|
16
|
+
#
|
17
|
+
# * `class_variable_defined?`
|
18
|
+
# * `const_defined?`
|
19
|
+
# * `method_defined?`
|
20
|
+
# * `instance_variable_defined?`
|
21
|
+
# * `binding.local_variable_defined?`
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
#
|
25
|
+
# # bad
|
26
|
+
# defined?('FooBar')
|
27
|
+
# defined?(:FooBar)
|
28
|
+
# defined?(:foo_bar)
|
29
|
+
# defined?('foo_bar')
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# defined?(FooBar)
|
33
|
+
# defined?(foo_bar)
|
34
|
+
#
|
35
|
+
# # bad - interpolation
|
36
|
+
# bar = 'Bar'
|
37
|
+
# defined?("Foo::#{bar}::Baz")
|
38
|
+
#
|
39
|
+
# # good
|
40
|
+
# bar = 'Bar'
|
41
|
+
# defined?(Foo) && Foo.const_defined?(bar) && Foo.const_get(bar).const_defined?(:Baz)
|
42
|
+
class UselessDefined < Base
|
43
|
+
MSG = 'Calling `defined?` with a %<type>s argument will always return a truthy value.'
|
44
|
+
TYPES = { str: 'string', dstr: 'string', sym: 'symbol', dsym: 'symbol' }.freeze
|
45
|
+
|
46
|
+
def on_defined?(node)
|
47
|
+
# NOTE: `defined?` always takes one argument. Anything else is a syntax error.
|
48
|
+
return unless (type = TYPES[node.first_argument.type])
|
49
|
+
|
50
|
+
add_offense(node, message: format(MSG, type: type))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -10,17 +10,13 @@ module RuboCop
|
|
10
10
|
# @example
|
11
11
|
#
|
12
12
|
# # bad
|
13
|
-
#
|
14
13
|
# begin
|
15
14
|
# do_something
|
16
15
|
# else
|
17
16
|
# do_something_else # This will never be run.
|
18
17
|
# end
|
19
18
|
#
|
20
|
-
# @example
|
21
|
-
#
|
22
19
|
# # good
|
23
|
-
#
|
24
20
|
# begin
|
25
21
|
# do_something
|
26
22
|
# rescue
|
@@ -29,8 +25,12 @@ module RuboCop
|
|
29
25
|
# do_something_else
|
30
26
|
# end
|
31
27
|
class UselessElseWithoutRescue < Base
|
28
|
+
extend TargetRubyVersion
|
29
|
+
|
32
30
|
MSG = '`else` without `rescue` is useless.'
|
33
31
|
|
32
|
+
maximum_target_ruby_version 2.5
|
33
|
+
|
34
34
|
def on_new_investigation
|
35
35
|
processed_source.diagnostics.each do |diagnostic|
|
36
36
|
next unless diagnostic.reason == :useless_else
|