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
|
@@ -49,12 +49,12 @@ module RuboCop
|
|
|
49
49
|
class DateTime < Base
|
|
50
50
|
extend AutoCorrector
|
|
51
51
|
|
|
52
|
-
CLASS_MSG = 'Prefer Time over DateTime
|
|
53
|
-
COERCION_MSG = 'Do not use
|
|
52
|
+
CLASS_MSG = 'Prefer `Time` over `DateTime`.'
|
|
53
|
+
COERCION_MSG = 'Do not use `#to_datetime`.'
|
|
54
54
|
|
|
55
55
|
# @!method date_time?(node)
|
|
56
56
|
def_node_matcher :date_time?, <<~PATTERN
|
|
57
|
-
(
|
|
57
|
+
(call (const {nil? (cbase)} :DateTime) ...)
|
|
58
58
|
PATTERN
|
|
59
59
|
|
|
60
60
|
# @!method historic_date?(node)
|
|
@@ -64,7 +64,7 @@ module RuboCop
|
|
|
64
64
|
|
|
65
65
|
# @!method to_datetime?(node)
|
|
66
66
|
def_node_matcher :to_datetime?, <<~PATTERN
|
|
67
|
-
(
|
|
67
|
+
(call _ :to_datetime)
|
|
68
68
|
PATTERN
|
|
69
69
|
|
|
70
70
|
def on_send(node)
|
|
@@ -75,6 +75,7 @@ module RuboCop
|
|
|
75
75
|
|
|
76
76
|
add_offense(node, message: message) { |corrector| autocorrect(corrector, node) }
|
|
77
77
|
end
|
|
78
|
+
alias on_csend on_send
|
|
78
79
|
|
|
79
80
|
private
|
|
80
81
|
|
|
@@ -25,10 +25,9 @@ module RuboCop
|
|
|
25
25
|
# # good
|
|
26
26
|
# def foo = do_something
|
|
27
27
|
#
|
|
28
|
-
# # good
|
|
28
|
+
# # good - without parentheses it's a syntax error
|
|
29
29
|
# def foo() do_something end
|
|
30
|
-
#
|
|
31
|
-
# @example
|
|
30
|
+
# def foo()=do_something
|
|
32
31
|
#
|
|
33
32
|
# # bad
|
|
34
33
|
# def Baz.foo()
|
|
@@ -40,19 +39,31 @@ module RuboCop
|
|
|
40
39
|
# do_something
|
|
41
40
|
# end
|
|
42
41
|
class DefWithParentheses < Base
|
|
42
|
+
include RangeHelp
|
|
43
43
|
extend AutoCorrector
|
|
44
44
|
|
|
45
45
|
MSG = "Omit the parentheses in defs when the method doesn't accept any arguments."
|
|
46
46
|
|
|
47
47
|
def on_def(node)
|
|
48
|
-
return
|
|
49
|
-
return
|
|
48
|
+
return unless !node.arguments? && (arguments_range = node.arguments.source_range)
|
|
49
|
+
return if parentheses_required?(node, arguments_range)
|
|
50
50
|
|
|
51
|
-
add_offense(
|
|
52
|
-
corrector.remove(
|
|
51
|
+
add_offense(arguments_range) do |corrector|
|
|
52
|
+
corrector.remove(arguments_range)
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
55
|
alias on_defs on_def
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def parentheses_required?(node, arguments_range)
|
|
60
|
+
return true if node.single_line? && !node.endless?
|
|
61
|
+
|
|
62
|
+
end_pos = arguments_range.end.end_pos
|
|
63
|
+
token_after_argument = range_between(end_pos, end_pos + 1).source
|
|
64
|
+
|
|
65
|
+
token_after_argument == '='
|
|
66
|
+
end
|
|
56
67
|
end
|
|
57
68
|
end
|
|
58
69
|
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for chained `dig` calls that can be collapsed into a single `dig`.
|
|
7
|
+
#
|
|
8
|
+
# @safety
|
|
9
|
+
# This cop is unsafe because it cannot be guaranteed that the receiver
|
|
10
|
+
# is an `Enumerable` or does not have a nonstandard implementation
|
|
11
|
+
# of `dig`.
|
|
12
|
+
#
|
|
13
|
+
# @example
|
|
14
|
+
# # bad
|
|
15
|
+
# x.dig(:foo).dig(:bar).dig(:baz)
|
|
16
|
+
# x.dig(:foo, :bar).dig(:baz)
|
|
17
|
+
# x.dig(:foo, :bar)&.dig(:baz)
|
|
18
|
+
#
|
|
19
|
+
# # good
|
|
20
|
+
# x.dig(:foo, :bar, :baz)
|
|
21
|
+
#
|
|
22
|
+
# # good - `dig`s cannot be combined
|
|
23
|
+
# x.dig(:foo).bar.dig(:baz)
|
|
24
|
+
#
|
|
25
|
+
class DigChain < Base
|
|
26
|
+
extend AutoCorrector
|
|
27
|
+
include CommentsHelp
|
|
28
|
+
include DigHelp
|
|
29
|
+
|
|
30
|
+
MSG = 'Use `%<replacement>s` instead of chaining.'
|
|
31
|
+
RESTRICT_ON_SEND = %i[dig].freeze
|
|
32
|
+
|
|
33
|
+
def on_send(node)
|
|
34
|
+
return if ignored_node?(node)
|
|
35
|
+
return unless node.loc.dot
|
|
36
|
+
return unless dig?(node)
|
|
37
|
+
|
|
38
|
+
range, arguments = inspect_chain(node)
|
|
39
|
+
return if invalid_arguments?(arguments)
|
|
40
|
+
return unless range
|
|
41
|
+
|
|
42
|
+
register_offense(node, range, arguments)
|
|
43
|
+
end
|
|
44
|
+
alias on_csend on_send
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
# Walk up the method chain while the receiver is `dig` with arguments.
|
|
49
|
+
def inspect_chain(node)
|
|
50
|
+
arguments = node.arguments.dup
|
|
51
|
+
end_range = node.source_range.end
|
|
52
|
+
|
|
53
|
+
while dig?(node = node.receiver)
|
|
54
|
+
begin_range = node.loc.selector
|
|
55
|
+
arguments.unshift(*node.arguments)
|
|
56
|
+
ignore_node(node)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
return unless begin_range
|
|
60
|
+
|
|
61
|
+
[begin_range.join(end_range), arguments]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def invalid_arguments?(arguments)
|
|
65
|
+
# If any of the arguments are arguments forwarding (`...`), it can only be the
|
|
66
|
+
# first argument, or else the resulting code will have a syntax error.
|
|
67
|
+
|
|
68
|
+
return false unless arguments&.any?
|
|
69
|
+
|
|
70
|
+
forwarded_args_index = arguments.index(&:forwarded_args_type?)
|
|
71
|
+
forwarded_args_index && forwarded_args_index < (arguments.size - 1)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def register_offense(node, range, arguments)
|
|
75
|
+
arguments = arguments.map(&:source).join(', ')
|
|
76
|
+
replacement = "dig(#{arguments})"
|
|
77
|
+
|
|
78
|
+
add_offense(range, message: format(MSG, replacement: replacement)) do |corrector|
|
|
79
|
+
corrector.replace(range, replacement)
|
|
80
|
+
|
|
81
|
+
comments_in_range(node).reverse_each do |comment|
|
|
82
|
+
corrector.insert_before(node, "#{comment.source}\n")
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -29,36 +29,36 @@ module RuboCop
|
|
|
29
29
|
# end
|
|
30
30
|
#
|
|
31
31
|
# # allowed
|
|
32
|
-
#
|
|
32
|
+
# # Class without body
|
|
33
|
+
# class Person
|
|
34
|
+
# end
|
|
35
|
+
#
|
|
36
|
+
# # Namespace - A namespace can be a class or a module
|
|
37
|
+
# # Containing a class
|
|
38
|
+
# module Namespace
|
|
39
|
+
# # Description/Explanation of Person class
|
|
33
40
|
# class Person
|
|
41
|
+
# # ...
|
|
34
42
|
# end
|
|
43
|
+
# end
|
|
35
44
|
#
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
# # Description/Explanation of Person class
|
|
40
|
-
# class Person
|
|
41
|
-
# # ...
|
|
42
|
-
# end
|
|
45
|
+
# # Containing constant visibility declaration
|
|
46
|
+
# module Namespace
|
|
47
|
+
# class Private
|
|
43
48
|
# end
|
|
44
49
|
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
# class Private
|
|
48
|
-
# end
|
|
49
|
-
#
|
|
50
|
-
# private_constant :Private
|
|
51
|
-
# end
|
|
50
|
+
# private_constant :Private
|
|
51
|
+
# end
|
|
52
52
|
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
#
|
|
53
|
+
# # Containing constant definition
|
|
54
|
+
# module Namespace
|
|
55
|
+
# Public = Class.new
|
|
56
|
+
# end
|
|
57
57
|
#
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
58
|
+
# # Macro calls
|
|
59
|
+
# module Namespace
|
|
60
|
+
# extend Foo
|
|
61
|
+
# end
|
|
62
62
|
#
|
|
63
63
|
# @example AllowedConstants: ['ClassMethods']
|
|
64
64
|
#
|
|
@@ -67,7 +67,7 @@ module RuboCop
|
|
|
67
67
|
# module ClassMethods
|
|
68
68
|
# # ...
|
|
69
69
|
# end
|
|
70
|
-
#
|
|
70
|
+
# end
|
|
71
71
|
#
|
|
72
72
|
class Documentation < Base
|
|
73
73
|
include DocumentationComment
|
|
@@ -186,7 +186,7 @@ module RuboCop
|
|
|
186
186
|
def qualify_const(node)
|
|
187
187
|
return if node.nil?
|
|
188
188
|
|
|
189
|
-
if node.
|
|
189
|
+
if node.type?(:cbase, :self, :call) || node.variable?
|
|
190
190
|
node.source
|
|
191
191
|
else
|
|
192
192
|
[qualify_const(node.namespace), node.short_name].compact
|
|
@@ -95,6 +95,17 @@ module RuboCop
|
|
|
95
95
|
# end
|
|
96
96
|
# end
|
|
97
97
|
#
|
|
98
|
+
# @example AllowedMethods: ['method_missing', 'respond_to_missing?']
|
|
99
|
+
#
|
|
100
|
+
# # good
|
|
101
|
+
# class Foo
|
|
102
|
+
# def method_missing(name, *args)
|
|
103
|
+
# end
|
|
104
|
+
#
|
|
105
|
+
# def respond_to_missing?(symbol, include_private)
|
|
106
|
+
# end
|
|
107
|
+
# end
|
|
108
|
+
#
|
|
98
109
|
class DocumentationMethod < Base
|
|
99
110
|
include DocumentationComment
|
|
100
111
|
include DefNode
|
|
@@ -119,6 +130,7 @@ module RuboCop
|
|
|
119
130
|
def check(node)
|
|
120
131
|
return if non_public?(node) && !require_for_non_public_methods?
|
|
121
132
|
return if documentation_comment?(node)
|
|
133
|
+
return if method_allowed?(node)
|
|
122
134
|
|
|
123
135
|
add_offense(node)
|
|
124
136
|
end
|
|
@@ -126,6 +138,14 @@ module RuboCop
|
|
|
126
138
|
def require_for_non_public_methods?
|
|
127
139
|
cop_config['RequireForNonPublicMethods']
|
|
128
140
|
end
|
|
141
|
+
|
|
142
|
+
def method_allowed?(node)
|
|
143
|
+
allowed_methods.include?(node.method_name)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def allowed_methods
|
|
147
|
+
@allowed_methods ||= cop_config.fetch('AllowedMethods', []).map(&:to_sym)
|
|
148
|
+
end
|
|
129
149
|
end
|
|
130
150
|
end
|
|
131
151
|
end
|
|
@@ -93,23 +93,23 @@ module RuboCop
|
|
|
93
93
|
|
|
94
94
|
if conditional_node
|
|
95
95
|
double_negative_condition_return_value?(node, last_child, conditional_node)
|
|
96
|
-
elsif last_child.
|
|
96
|
+
elsif last_child.type?(:pair, :hash) || last_child.parent.array_type?
|
|
97
97
|
false
|
|
98
98
|
else
|
|
99
|
-
last_child.
|
|
99
|
+
last_child.first_line <= node.first_line
|
|
100
100
|
end
|
|
101
101
|
end
|
|
102
102
|
|
|
103
103
|
def find_def_node_from_ascendant(node)
|
|
104
104
|
return unless (parent = node.parent)
|
|
105
|
-
return parent if parent.
|
|
105
|
+
return parent if parent.any_def_type?
|
|
106
106
|
return node.parent.child_nodes.first if define_method?(parent)
|
|
107
107
|
|
|
108
108
|
find_def_node_from_ascendant(node.parent)
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
def define_method?(node)
|
|
112
|
-
return false unless node.
|
|
112
|
+
return false unless node.any_block_type?
|
|
113
113
|
|
|
114
114
|
child = node.child_nodes.first
|
|
115
115
|
return false unless child.send_type?
|
|
@@ -147,7 +147,7 @@ module RuboCop
|
|
|
147
147
|
def find_parent_not_enumerable(node)
|
|
148
148
|
return unless (parent = node.parent)
|
|
149
149
|
|
|
150
|
-
if parent.
|
|
150
|
+
if parent.type?(:pair, :hash, :array)
|
|
151
151
|
find_parent_not_enumerable(parent)
|
|
152
152
|
else
|
|
153
153
|
parent
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for loops which iterate a constant number of times,
|
|
7
|
-
# using a Range literal and `#each`. This can be done more readably using
|
|
7
|
+
# using a `Range` literal and `#each`. This can be done more readably using
|
|
8
8
|
# `Integer#times`.
|
|
9
9
|
#
|
|
10
10
|
# This check only applies if the block takes no parameters.
|
|
@@ -16,7 +16,6 @@ module RuboCop
|
|
|
16
16
|
# # good
|
|
17
17
|
# 5.times { }
|
|
18
18
|
#
|
|
19
|
-
# @example
|
|
20
19
|
# # bad
|
|
21
20
|
# (0...10).each {}
|
|
22
21
|
#
|
|
@@ -32,30 +31,29 @@ module RuboCop
|
|
|
32
31
|
|
|
33
32
|
send_node = node.send_node
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
add_offense(range) do |corrector|
|
|
34
|
+
add_offense(send_node) do |corrector|
|
|
38
35
|
range_type, min, max = each_range(node)
|
|
39
36
|
|
|
40
37
|
max += 1 if range_type == :irange
|
|
41
38
|
|
|
42
|
-
corrector.replace(
|
|
39
|
+
corrector.replace(send_node, "#{max - min}.times")
|
|
43
40
|
end
|
|
44
41
|
end
|
|
45
42
|
|
|
46
43
|
private
|
|
47
44
|
|
|
48
45
|
def offending?(node)
|
|
46
|
+
return false unless node.arguments.empty?
|
|
47
|
+
|
|
49
48
|
each_range_with_zero_origin?(node) || each_range_without_block_argument?(node)
|
|
50
49
|
end
|
|
51
50
|
|
|
52
51
|
# @!method each_range(node)
|
|
53
52
|
def_node_matcher :each_range, <<~PATTERN
|
|
54
53
|
(block
|
|
55
|
-
(
|
|
54
|
+
(call
|
|
56
55
|
(begin
|
|
57
|
-
($
|
|
58
|
-
(int $_) (int $_)))
|
|
56
|
+
($range (int $_) (int $_)))
|
|
59
57
|
:each)
|
|
60
58
|
(args ...)
|
|
61
59
|
...)
|
|
@@ -64,10 +62,9 @@ module RuboCop
|
|
|
64
62
|
# @!method each_range_with_zero_origin?(node)
|
|
65
63
|
def_node_matcher :each_range_with_zero_origin?, <<~PATTERN
|
|
66
64
|
(block
|
|
67
|
-
(
|
|
65
|
+
(call
|
|
68
66
|
(begin
|
|
69
|
-
(
|
|
70
|
-
(int 0) (int _)))
|
|
67
|
+
(range (int 0) (int _)))
|
|
71
68
|
:each)
|
|
72
69
|
(args ...)
|
|
73
70
|
...)
|
|
@@ -76,10 +73,9 @@ module RuboCop
|
|
|
76
73
|
# @!method each_range_without_block_argument?(node)
|
|
77
74
|
def_node_matcher :each_range_without_block_argument?, <<~PATTERN
|
|
78
75
|
(block
|
|
79
|
-
(
|
|
76
|
+
(call
|
|
80
77
|
(begin
|
|
81
|
-
(
|
|
82
|
-
(int _) (int _)))
|
|
78
|
+
(range (int _) (int _)))
|
|
83
79
|
:each)
|
|
84
80
|
(args)
|
|
85
81
|
...)
|
|
@@ -58,12 +58,12 @@ module RuboCop
|
|
|
58
58
|
|
|
59
59
|
# @!method each_with_object_block_candidate?(node)
|
|
60
60
|
def_node_matcher :each_with_object_block_candidate?, <<~PATTERN
|
|
61
|
-
(block $(
|
|
61
|
+
(block $(call _ {:inject :reduce} _) $(args _ _) $_)
|
|
62
62
|
PATTERN
|
|
63
63
|
|
|
64
64
|
# @!method each_with_object_numblock_candidate?(node)
|
|
65
65
|
def_node_matcher :each_with_object_numblock_candidate?, <<~PATTERN
|
|
66
|
-
(numblock $(
|
|
66
|
+
(numblock $(call _ {:inject :reduce} _) 2 $_)
|
|
67
67
|
PATTERN
|
|
68
68
|
|
|
69
69
|
def autocorrect_block(corrector, node, return_value)
|
|
@@ -71,8 +71,7 @@ module RuboCop
|
|
|
71
71
|
|
|
72
72
|
first_arg, second_arg = *node.arguments
|
|
73
73
|
|
|
74
|
-
corrector.
|
|
75
|
-
corrector.replace(second_arg, first_arg.source)
|
|
74
|
+
corrector.swap(first_arg, second_arg)
|
|
76
75
|
|
|
77
76
|
if return_value_occupies_whole_line?(return_value)
|
|
78
77
|
corrector.remove(whole_line_expression(return_value))
|
|
@@ -131,6 +131,8 @@ module RuboCop
|
|
|
131
131
|
extend AutoCorrector
|
|
132
132
|
|
|
133
133
|
MSG = 'Redundant `else`-clause.'
|
|
134
|
+
NIL_STYLES = %i[nil both].freeze
|
|
135
|
+
EMPTY_STYLES = %i[empty both].freeze
|
|
134
136
|
|
|
135
137
|
def on_normal_if_unless(node)
|
|
136
138
|
check(node)
|
|
@@ -143,18 +145,18 @@ module RuboCop
|
|
|
143
145
|
private
|
|
144
146
|
|
|
145
147
|
def check(node)
|
|
146
|
-
return if cop_config['AllowComments'] && comment_in_else?(node
|
|
148
|
+
return if cop_config['AllowComments'] && comment_in_else?(node)
|
|
147
149
|
|
|
148
150
|
empty_check(node) if empty_style?
|
|
149
151
|
nil_check(node) if nil_style?
|
|
150
152
|
end
|
|
151
153
|
|
|
152
154
|
def nil_style?
|
|
153
|
-
style
|
|
155
|
+
NIL_STYLES.include?(style)
|
|
154
156
|
end
|
|
155
157
|
|
|
156
158
|
def empty_style?
|
|
157
|
-
style
|
|
159
|
+
EMPTY_STYLES.include?(style)
|
|
158
160
|
end
|
|
159
161
|
|
|
160
162
|
def empty_check(node)
|
|
@@ -171,16 +173,17 @@ module RuboCop
|
|
|
171
173
|
|
|
172
174
|
def autocorrect(corrector, node)
|
|
173
175
|
return false if autocorrect_forbidden?(node.type.to_s)
|
|
174
|
-
return false if comment_in_else?(node
|
|
176
|
+
return false if comment_in_else?(node)
|
|
175
177
|
|
|
176
178
|
end_pos = base_node(node).loc.end.begin_pos
|
|
177
179
|
corrector.remove(range_between(node.loc.else.begin_pos, end_pos))
|
|
178
180
|
end
|
|
179
181
|
|
|
180
|
-
def comment_in_else?(
|
|
181
|
-
|
|
182
|
+
def comment_in_else?(node)
|
|
183
|
+
node = node.parent while node.if_type? && node.elsif?
|
|
184
|
+
return false unless node.else?
|
|
182
185
|
|
|
183
|
-
processed_source.contains_comment?(loc.else.join(
|
|
186
|
+
processed_source.contains_comment?(node.loc.else.join(node.source_range.end))
|
|
184
187
|
end
|
|
185
188
|
|
|
186
189
|
def base_node(node)
|
|
@@ -36,6 +36,7 @@ module RuboCop
|
|
|
36
36
|
class EmptyHeredoc < Base
|
|
37
37
|
include Heredoc
|
|
38
38
|
include RangeHelp
|
|
39
|
+
include StringLiteralsHelp
|
|
39
40
|
extend AutoCorrector
|
|
40
41
|
|
|
41
42
|
MSG = 'Use an empty string literal instead of heredoc.'
|
|
@@ -53,20 +54,6 @@ module RuboCop
|
|
|
53
54
|
corrector.remove(range_by_whole_lines(heredoc_end, include_final_newline: true))
|
|
54
55
|
end
|
|
55
56
|
end
|
|
56
|
-
|
|
57
|
-
private
|
|
58
|
-
|
|
59
|
-
def preferred_string_literal
|
|
60
|
-
enforce_double_quotes? ? '""' : "''"
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def enforce_double_quotes?
|
|
64
|
-
string_literals_config['EnforcedStyle'] == 'double_quotes'
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def string_literals_config
|
|
68
|
-
config.for_cop('Style/StringLiterals')
|
|
69
|
-
end
|
|
70
57
|
end
|
|
71
58
|
end
|
|
72
59
|
end
|
|
@@ -6,10 +6,16 @@ module RuboCop
|
|
|
6
6
|
# Checks for the use of a method, the result of which
|
|
7
7
|
# would be a literal, like an empty array, hash, or string.
|
|
8
8
|
#
|
|
9
|
+
# NOTE: When frozen string literals are enabled, `String.new`
|
|
10
|
+
# isn't corrected to an empty string since the former is
|
|
11
|
+
# mutable and the latter would be frozen.
|
|
12
|
+
#
|
|
9
13
|
# @example
|
|
10
14
|
# # bad
|
|
11
15
|
# a = Array.new
|
|
16
|
+
# a = Array[]
|
|
12
17
|
# h = Hash.new
|
|
18
|
+
# h = Hash[]
|
|
13
19
|
# s = String.new
|
|
14
20
|
#
|
|
15
21
|
# # good
|
|
@@ -19,16 +25,17 @@ module RuboCop
|
|
|
19
25
|
class EmptyLiteral < Base
|
|
20
26
|
include FrozenStringLiteral
|
|
21
27
|
include RangeHelp
|
|
28
|
+
include StringLiteralsHelp
|
|
22
29
|
extend AutoCorrector
|
|
23
30
|
|
|
24
|
-
ARR_MSG = 'Use array literal `[]` instead of
|
|
25
|
-
HASH_MSG = 'Use hash literal `{}` instead of
|
|
31
|
+
ARR_MSG = 'Use array literal `[]` instead of `%<current>s`.'
|
|
32
|
+
HASH_MSG = 'Use hash literal `{}` instead of `%<current>s`.'
|
|
26
33
|
STR_MSG = 'Use string literal `%<prefer>s` instead of `String.new`.'
|
|
27
34
|
|
|
28
|
-
RESTRICT_ON_SEND = %i[new].freeze
|
|
35
|
+
RESTRICT_ON_SEND = %i[new [] Array Hash].freeze
|
|
29
36
|
|
|
30
37
|
# @!method array_node(node)
|
|
31
|
-
def_node_matcher :array_node, '(send (const {nil? cbase} :Array) :new)'
|
|
38
|
+
def_node_matcher :array_node, '(send (const {nil? cbase} :Array) :new (array)?)'
|
|
32
39
|
|
|
33
40
|
# @!method hash_node(node)
|
|
34
41
|
def_node_matcher :hash_node, '(send (const {nil? cbase} :Hash) :new)'
|
|
@@ -47,6 +54,22 @@ module RuboCop
|
|
|
47
54
|
}
|
|
48
55
|
PATTERN
|
|
49
56
|
|
|
57
|
+
# @!method array_with_index(node)
|
|
58
|
+
def_node_matcher :array_with_index, <<~PATTERN
|
|
59
|
+
{
|
|
60
|
+
(send (const {nil? cbase} :Array) :[])
|
|
61
|
+
(send nil? :Array (array))
|
|
62
|
+
}
|
|
63
|
+
PATTERN
|
|
64
|
+
|
|
65
|
+
# @!method hash_with_index(node)
|
|
66
|
+
def_node_matcher :hash_with_index, <<~PATTERN
|
|
67
|
+
{
|
|
68
|
+
(send (const {nil? cbase} :Hash) :[])
|
|
69
|
+
(send nil? :Hash (array))
|
|
70
|
+
}
|
|
71
|
+
PATTERN
|
|
72
|
+
|
|
50
73
|
def on_send(node)
|
|
51
74
|
return unless (message = offense_message(node))
|
|
52
75
|
|
|
@@ -59,31 +82,19 @@ module RuboCop
|
|
|
59
82
|
|
|
60
83
|
def offense_message(node)
|
|
61
84
|
if offense_array_node?(node)
|
|
62
|
-
ARR_MSG
|
|
85
|
+
format(ARR_MSG, current: node.source)
|
|
63
86
|
elsif offense_hash_node?(node)
|
|
64
|
-
HASH_MSG
|
|
87
|
+
format(HASH_MSG, current: node.source)
|
|
65
88
|
elsif str_node(node) && !frozen_strings?
|
|
66
89
|
format(STR_MSG, prefer: preferred_string_literal)
|
|
67
90
|
end
|
|
68
91
|
end
|
|
69
92
|
|
|
70
|
-
def preferred_string_literal
|
|
71
|
-
enforce_double_quotes? ? '""' : "''"
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def enforce_double_quotes?
|
|
75
|
-
string_literals_config['EnforcedStyle'] == 'double_quotes'
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def string_literals_config
|
|
79
|
-
config.for_cop('Style/StringLiterals')
|
|
80
|
-
end
|
|
81
|
-
|
|
82
93
|
def first_argument_unparenthesized?(node)
|
|
83
94
|
parent = node.parent
|
|
84
95
|
return false unless parent && %i[send super zsuper].include?(parent.type)
|
|
85
96
|
|
|
86
|
-
node.equal?(parent.
|
|
97
|
+
node.equal?(parent.first_argument) && !parentheses?(node.parent)
|
|
87
98
|
end
|
|
88
99
|
|
|
89
100
|
def replacement_range(node)
|
|
@@ -100,12 +111,12 @@ module RuboCop
|
|
|
100
111
|
end
|
|
101
112
|
|
|
102
113
|
def offense_array_node?(node)
|
|
103
|
-
array_node(node) && !array_with_block(node.parent)
|
|
114
|
+
(array_node(node) && !array_with_block(node.parent)) || array_with_index(node)
|
|
104
115
|
end
|
|
105
116
|
|
|
106
117
|
def offense_hash_node?(node)
|
|
107
118
|
# If Hash.new takes a block, it can't be changed to {}.
|
|
108
|
-
hash_node(node) && !hash_with_block(node.parent)
|
|
119
|
+
(hash_node(node) && !hash_with_block(node.parent)) || hash_with_index(node)
|
|
109
120
|
end
|
|
110
121
|
|
|
111
122
|
def correction(node)
|
|
@@ -129,8 +140,10 @@ module RuboCop
|
|
|
129
140
|
def frozen_strings?
|
|
130
141
|
return true if frozen_string_literals_enabled?
|
|
131
142
|
|
|
132
|
-
frozen_string_cop_enabled = config.
|
|
133
|
-
frozen_string_cop_enabled &&
|
|
143
|
+
frozen_string_cop_enabled = config.cop_enabled?('Style/FrozenStringLiteralComment')
|
|
144
|
+
frozen_string_cop_enabled &&
|
|
145
|
+
!frozen_string_literals_disabled? &&
|
|
146
|
+
string_literals_frozen_by_default?.nil?
|
|
134
147
|
end
|
|
135
148
|
end
|
|
136
149
|
end
|