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
|
@@ -8,12 +8,13 @@ module RuboCop
|
|
|
8
8
|
# The maximum allowed length is configurable.
|
|
9
9
|
#
|
|
10
10
|
# You can set constructs you want to fold with `CountAsOne`.
|
|
11
|
-
#
|
|
12
|
-
#
|
|
11
|
+
#
|
|
12
|
+
# Available are: 'array', 'hash', 'heredoc', and 'method_call'.
|
|
13
|
+
# Each construct will be counted as one line regardless of its actual size.
|
|
13
14
|
#
|
|
14
15
|
# NOTE: This cop also applies for `Struct` definitions.
|
|
15
16
|
#
|
|
16
|
-
# @example CountAsOne: ['array', 'heredoc', 'method_call']
|
|
17
|
+
# @example CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
|
|
17
18
|
#
|
|
18
19
|
# class Foo
|
|
19
20
|
# ARRAY = [ # +1
|
|
@@ -21,7 +22,7 @@ module RuboCop
|
|
|
21
22
|
# 2
|
|
22
23
|
# ]
|
|
23
24
|
#
|
|
24
|
-
# HASH = { # +
|
|
25
|
+
# HASH = { # +1
|
|
25
26
|
# key: 'value'
|
|
26
27
|
# }
|
|
27
28
|
#
|
|
@@ -34,7 +35,7 @@ module RuboCop
|
|
|
34
35
|
# 1,
|
|
35
36
|
# 2
|
|
36
37
|
# )
|
|
37
|
-
# end #
|
|
38
|
+
# end # 4 points
|
|
38
39
|
#
|
|
39
40
|
class ClassLength < Base
|
|
40
41
|
include CodeLength
|
|
@@ -42,18 +43,15 @@ module RuboCop
|
|
|
42
43
|
def on_class(node)
|
|
43
44
|
check_code_length(node)
|
|
44
45
|
end
|
|
45
|
-
alias on_sclass on_class
|
|
46
46
|
|
|
47
|
-
def
|
|
48
|
-
|
|
47
|
+
def on_sclass(node)
|
|
48
|
+
return if node.each_ancestor(:class).any?
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
_scope, _name, block_node = *node
|
|
56
|
-
end
|
|
50
|
+
on_class(node)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def on_casgn(node)
|
|
54
|
+
block_node = node.expression || find_expression_within_parent(node.parent)
|
|
57
55
|
|
|
58
56
|
return unless block_node.respond_to?(:class_definition?) && block_node.class_definition?
|
|
59
57
|
|
|
@@ -65,6 +63,14 @@ module RuboCop
|
|
|
65
63
|
def message(length, max_length)
|
|
66
64
|
format('Class has too many lines. [%<length>d/%<max>d]', length: length, max: max_length)
|
|
67
65
|
end
|
|
66
|
+
|
|
67
|
+
def find_expression_within_parent(parent)
|
|
68
|
+
if parent&.assignment?
|
|
69
|
+
parent.expression
|
|
70
|
+
elsif parent&.parent&.masgn_type?
|
|
71
|
+
parent.parent.expression
|
|
72
|
+
end
|
|
73
|
+
end
|
|
68
74
|
end
|
|
69
75
|
end
|
|
70
76
|
end
|
|
@@ -52,12 +52,19 @@ module RuboCop
|
|
|
52
52
|
'Prefer reading the data from an external source.'
|
|
53
53
|
RESTRICT_ON_SEND = [:[]].freeze
|
|
54
54
|
|
|
55
|
+
# @!method set_const?(node)
|
|
56
|
+
def_node_matcher :set_const?, <<~PATTERN
|
|
57
|
+
(const {cbase nil?} :Set)
|
|
58
|
+
PATTERN
|
|
59
|
+
|
|
55
60
|
def on_array(node)
|
|
56
61
|
add_offense(node) if node.children.length >= collection_threshold
|
|
57
62
|
end
|
|
58
63
|
alias on_hash on_array
|
|
59
64
|
|
|
60
65
|
def on_index(node)
|
|
66
|
+
return unless set_const?(node.receiver)
|
|
67
|
+
|
|
61
68
|
add_offense(node) if node.arguments.length >= collection_threshold
|
|
62
69
|
end
|
|
63
70
|
|
|
@@ -14,11 +14,14 @@ module RuboCop
|
|
|
14
14
|
# and ||/or is shorthand for a sequence of ifs, so they also add one.
|
|
15
15
|
# Loops can be said to have an exit condition, so they add one.
|
|
16
16
|
# Blocks that are calls to builtin iteration methods
|
|
17
|
-
# (e.g. `ary.map{...}) also add one, others are ignored.
|
|
17
|
+
# (e.g. `ary.map{...}`) also add one, others are ignored.
|
|
18
|
+
#
|
|
19
|
+
# @example
|
|
18
20
|
#
|
|
19
21
|
# def each_child_node(*types) # count begins: 1
|
|
20
22
|
# unless block_given? # unless: +1
|
|
21
23
|
# return to_enum(__method__, *types)
|
|
24
|
+
# end
|
|
22
25
|
#
|
|
23
26
|
# children.each do |child| # each{}: +1
|
|
24
27
|
# next unless child.is_a?(Node) # unless: +1
|
|
@@ -33,7 +36,7 @@ module RuboCop
|
|
|
33
36
|
include MethodComplexity
|
|
34
37
|
include Utils::IteratingBlock
|
|
35
38
|
|
|
36
|
-
MSG = 'Cyclomatic complexity for
|
|
39
|
+
MSG = 'Cyclomatic complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
|
|
37
40
|
COUNTED_NODES = %i[if while until for csend block block_pass
|
|
38
41
|
rescue when in_pattern and or or_asgn and_asgn].freeze
|
|
39
42
|
|
|
@@ -8,15 +8,16 @@ module RuboCop
|
|
|
8
8
|
# The maximum allowed length is configurable.
|
|
9
9
|
#
|
|
10
10
|
# You can set constructs you want to fold with `CountAsOne`.
|
|
11
|
-
#
|
|
12
|
-
#
|
|
11
|
+
#
|
|
12
|
+
# Available are: 'array', 'hash', 'heredoc', and 'method_call'.
|
|
13
|
+
# Each construct will be counted as one line regardless of its actual size.
|
|
13
14
|
#
|
|
14
15
|
# NOTE: The `ExcludedMethods` and `IgnoredMethods` configuration is
|
|
15
16
|
# deprecated and only kept for backwards compatibility.
|
|
16
17
|
# Please use `AllowedMethods` and `AllowedPatterns` instead.
|
|
17
18
|
# By default, there are no methods to allowed.
|
|
18
19
|
#
|
|
19
|
-
# @example CountAsOne: ['array', 'heredoc', 'method_call']
|
|
20
|
+
# @example CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
|
|
20
21
|
#
|
|
21
22
|
# def m
|
|
22
23
|
# array = [ # +1
|
|
@@ -24,7 +25,7 @@ module RuboCop
|
|
|
24
25
|
# 2
|
|
25
26
|
# ]
|
|
26
27
|
#
|
|
27
|
-
# hash = { # +
|
|
28
|
+
# hash = { # +1
|
|
28
29
|
# key: 'value'
|
|
29
30
|
# }
|
|
30
31
|
#
|
|
@@ -37,7 +38,7 @@ module RuboCop
|
|
|
37
38
|
# 1,
|
|
38
39
|
# 2
|
|
39
40
|
# )
|
|
40
|
-
# end #
|
|
41
|
+
# end # 4 points
|
|
41
42
|
#
|
|
42
43
|
class MethodLength < Base
|
|
43
44
|
include CodeLength
|
|
@@ -47,7 +48,7 @@ module RuboCop
|
|
|
47
48
|
LABEL = 'Method'
|
|
48
49
|
|
|
49
50
|
def on_def(node)
|
|
50
|
-
return if
|
|
51
|
+
return if allowed?(node.method_name)
|
|
51
52
|
|
|
52
53
|
check_code_length(node)
|
|
53
54
|
end
|
|
@@ -56,15 +57,23 @@ module RuboCop
|
|
|
56
57
|
def on_block(node)
|
|
57
58
|
return unless node.method?(:define_method)
|
|
58
59
|
|
|
60
|
+
method_name = node.send_node.first_argument
|
|
61
|
+
return if method_name.basic_literal? && allowed?(method_name.value)
|
|
62
|
+
|
|
59
63
|
check_code_length(node)
|
|
60
64
|
end
|
|
61
65
|
alias on_numblock on_block
|
|
66
|
+
alias on_itblock on_block
|
|
62
67
|
|
|
63
68
|
private
|
|
64
69
|
|
|
65
70
|
def cop_label
|
|
66
71
|
LABEL
|
|
67
72
|
end
|
|
73
|
+
|
|
74
|
+
def allowed?(method_name)
|
|
75
|
+
allowed_method?(method_name) || matches_allowed_pattern?(method_name)
|
|
76
|
+
end
|
|
68
77
|
end
|
|
69
78
|
end
|
|
70
79
|
end
|
|
@@ -8,10 +8,11 @@ module RuboCop
|
|
|
8
8
|
# The maximum allowed length is configurable.
|
|
9
9
|
#
|
|
10
10
|
# You can set constructs you want to fold with `CountAsOne`.
|
|
11
|
-
# Available are: 'array', 'hash', 'heredoc', and 'method_call'. Each construct
|
|
12
|
-
# will be counted as one line regardless of its actual size.
|
|
13
11
|
#
|
|
14
|
-
#
|
|
12
|
+
# Available are: 'array', 'hash', 'heredoc', and 'method_call'.
|
|
13
|
+
# Each construct will be counted as one line regardless of its actual size.
|
|
14
|
+
#
|
|
15
|
+
# @example CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
|
|
15
16
|
#
|
|
16
17
|
# module M
|
|
17
18
|
# ARRAY = [ # +1
|
|
@@ -19,7 +20,7 @@ module RuboCop
|
|
|
19
20
|
# 2
|
|
20
21
|
# ]
|
|
21
22
|
#
|
|
22
|
-
# HASH = { # +
|
|
23
|
+
# HASH = { # +1
|
|
23
24
|
# key: 'value'
|
|
24
25
|
# }
|
|
25
26
|
#
|
|
@@ -32,7 +33,7 @@ module RuboCop
|
|
|
32
33
|
# 1,
|
|
33
34
|
# 2
|
|
34
35
|
# )
|
|
35
|
-
# end #
|
|
36
|
+
# end # 4 points
|
|
36
37
|
#
|
|
37
38
|
class ModuleLength < Base
|
|
38
39
|
include CodeLength
|
|
@@ -49,7 +50,7 @@ module RuboCop
|
|
|
49
50
|
|
|
50
51
|
# @!method module_definition?(node)
|
|
51
52
|
def_node_matcher :module_definition?, <<~PATTERN
|
|
52
|
-
(casgn nil? _ (
|
|
53
|
+
(casgn nil? _ (any_block (send (const {nil? cbase} :Module) :new) ...))
|
|
53
54
|
PATTERN
|
|
54
55
|
|
|
55
56
|
def message(length, max_length)
|
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
|
27
27
|
# end # ===
|
|
28
28
|
# end # 7 complexity points
|
|
29
29
|
class PerceivedComplexity < CyclomaticComplexity
|
|
30
|
-
MSG = 'Perceived complexity for
|
|
30
|
+
MSG = 'Perceived complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
|
|
31
31
|
|
|
32
32
|
COUNTED_NODES = (CyclomaticComplexity::COUNTED_NODES - [:when] + [:case]).freeze
|
|
33
33
|
|
|
@@ -95,7 +95,7 @@ module RuboCop
|
|
|
95
95
|
def compound_assignment(node)
|
|
96
96
|
# Methods setter cannot be detected for multiple assignments
|
|
97
97
|
# and shorthand assigns, so we'll count them here instead
|
|
98
|
-
children = node.masgn_type? ? node.
|
|
98
|
+
children = node.masgn_type? ? node.assignments : node.children
|
|
99
99
|
|
|
100
100
|
will_be_miscounted = children.count do |child|
|
|
101
101
|
child.respond_to?(:setter_method?) && !child.setter_method?
|
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
|
9
9
|
extend NodePattern::Macros
|
|
10
10
|
include Util
|
|
11
11
|
|
|
12
|
-
FOLDABLE_TYPES = %i[array hash heredoc
|
|
12
|
+
FOLDABLE_TYPES = %i[array hash heredoc method_call].freeze
|
|
13
13
|
CLASSLIKE_TYPES = %i[class module].freeze
|
|
14
14
|
private_constant :FOLDABLE_TYPES, :CLASSLIKE_TYPES
|
|
15
15
|
|
|
@@ -43,16 +43,16 @@ module RuboCop
|
|
|
43
43
|
types.map do |type|
|
|
44
44
|
case type
|
|
45
45
|
when :array
|
|
46
|
-
|
|
46
|
+
lambda(&:array_type?)
|
|
47
47
|
when :hash
|
|
48
|
-
|
|
48
|
+
lambda(&:hash_type?)
|
|
49
49
|
when :heredoc
|
|
50
50
|
->(node) { heredoc_node?(node) }
|
|
51
51
|
when :method_call
|
|
52
|
-
|
|
52
|
+
lambda(&:call_type?)
|
|
53
53
|
else
|
|
54
|
-
raise
|
|
55
|
-
|
|
54
|
+
raise Warning, "Unknown foldable type: #{type.inspect}. " \
|
|
55
|
+
"Valid foldable types are: #{FOLDABLE_TYPES.join(', ')}."
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
end
|
|
@@ -145,11 +145,10 @@ module RuboCop
|
|
|
145
145
|
|
|
146
146
|
def extract_body(node)
|
|
147
147
|
case node.type
|
|
148
|
-
when :class, :module, :sclass, :block, :numblock, :def, :defs
|
|
148
|
+
when :class, :module, :sclass, :block, :numblock, :itblock, :def, :defs
|
|
149
149
|
node.body
|
|
150
150
|
when :casgn
|
|
151
|
-
|
|
152
|
-
extract_body(value)
|
|
151
|
+
extract_body(node.expression)
|
|
153
152
|
else
|
|
154
153
|
node
|
|
155
154
|
end
|
|
@@ -26,6 +26,13 @@ module RuboCop
|
|
|
26
26
|
extend NodePattern::Macros
|
|
27
27
|
include RuboCop::AST::Sexp
|
|
28
28
|
|
|
29
|
+
VAR_SETTER_TO_GETTER = {
|
|
30
|
+
lvasgn: :lvar,
|
|
31
|
+
ivasgn: :ivar,
|
|
32
|
+
cvasgn: :cvar,
|
|
33
|
+
gvasgn: :gvar
|
|
34
|
+
}.freeze
|
|
35
|
+
|
|
29
36
|
# Plug into the calculator
|
|
30
37
|
def initialize(node, discount_repeated_attributes: false)
|
|
31
38
|
super(node)
|
|
@@ -114,13 +121,6 @@ module RuboCop
|
|
|
114
121
|
calls.fetch(value) { yield [calls, value] }
|
|
115
122
|
end
|
|
116
123
|
|
|
117
|
-
VAR_SETTER_TO_GETTER = {
|
|
118
|
-
lvasgn: :lvar,
|
|
119
|
-
ivasgn: :ivar,
|
|
120
|
-
cvasgn: :cvar,
|
|
121
|
-
gvasgn: :gvar
|
|
122
|
-
}.freeze
|
|
123
|
-
|
|
124
124
|
# @returns `[receiver, method | nil]` for the given setter `node`
|
|
125
125
|
# or `nil` if it is not a setter.
|
|
126
126
|
def setter_to_getter(node)
|
|
@@ -5,10 +5,10 @@ module RuboCop
|
|
|
5
5
|
# This module checks for nodes that should be aligned to the left or right.
|
|
6
6
|
# This amount is determined by the instance variable @column_delta.
|
|
7
7
|
module Alignment
|
|
8
|
-
private
|
|
9
|
-
|
|
10
8
|
SPACE = ' '
|
|
11
9
|
|
|
10
|
+
private
|
|
11
|
+
|
|
12
12
|
attr_reader :column_delta
|
|
13
13
|
|
|
14
14
|
def configured_indentation_width
|
|
@@ -65,8 +65,12 @@ module RuboCop
|
|
|
65
65
|
inner.begin_pos >= outer.begin_pos && inner.end_pos <= outer.end_pos
|
|
66
66
|
end
|
|
67
67
|
|
|
68
|
-
# @deprecated Use processed_source.
|
|
69
|
-
def end_of_line_comment(line)
|
|
68
|
+
# @deprecated Use processed_source.line_with_comment?(line)
|
|
69
|
+
def end_of_line_comment(line) # rubocop:disable Naming/PredicateMethod
|
|
70
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
71
|
+
`end_of_line_comment` is deprecated. Use `processed_source.line_with_comment?` instead.
|
|
72
|
+
WARNING
|
|
73
|
+
|
|
70
74
|
processed_source.line_with_comment?(line)
|
|
71
75
|
end
|
|
72
76
|
|
|
@@ -15,7 +15,13 @@ module RuboCop
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
# @deprecated Use allowed_method? instead
|
|
18
|
-
|
|
18
|
+
def ignored_method?
|
|
19
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
20
|
+
`ignored_method?` is deprecated. Use `allowed_method?` instead.
|
|
21
|
+
WARNING
|
|
22
|
+
|
|
23
|
+
allowed_method?
|
|
24
|
+
end
|
|
19
25
|
|
|
20
26
|
# @api public
|
|
21
27
|
def allowed_methods
|
|
@@ -18,14 +18,26 @@ module RuboCop
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# @deprecated Use allowed_line? instead
|
|
21
|
-
|
|
21
|
+
def ignored_line?(line)
|
|
22
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
23
|
+
`ignored_line?` is deprecated. Use `allowed_line?` instead.
|
|
24
|
+
WARNING
|
|
25
|
+
|
|
26
|
+
allowed_line?(line)
|
|
27
|
+
end
|
|
22
28
|
|
|
23
29
|
def matches_allowed_pattern?(line)
|
|
24
30
|
allowed_patterns.any? { |pattern| Regexp.new(pattern).match?(line) }
|
|
25
31
|
end
|
|
26
32
|
|
|
27
|
-
# @deprecated Use matches_allowed_pattern
|
|
28
|
-
|
|
33
|
+
# @deprecated Use matches_allowed_pattern? instead
|
|
34
|
+
def matches_ignored_pattern?(line)
|
|
35
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
|
36
|
+
`matches_ignored_pattern?` is deprecated. Use `matches_allowed_pattern?` instead.
|
|
37
|
+
WARNING
|
|
38
|
+
|
|
39
|
+
matches_allowed_pattern?(line)
|
|
40
|
+
end
|
|
29
41
|
|
|
30
42
|
def allowed_patterns
|
|
31
43
|
# Since there could be a pattern specified in the default config, merge the two
|
|
@@ -4,8 +4,6 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
# Representation of an annotation comment in source code (eg. `# TODO: blah blah blah`).
|
|
6
6
|
class AnnotationComment
|
|
7
|
-
extend Forwardable
|
|
8
|
-
|
|
9
7
|
attr_reader :comment, :margin, :keyword, :colon, :space, :note
|
|
10
8
|
|
|
11
9
|
# @param [Parser::Source::Comment] comment
|
|
@@ -17,9 +17,7 @@ module RuboCop
|
|
|
17
17
|
alias on_and_asgn on_lvasgn
|
|
18
18
|
|
|
19
19
|
def on_send(node)
|
|
20
|
-
rhs = extract_rhs(node)
|
|
21
|
-
|
|
22
|
-
return unless rhs
|
|
20
|
+
return unless (rhs = extract_rhs(node))
|
|
23
21
|
|
|
24
22
|
check_assignment(node, rhs)
|
|
25
23
|
end
|
|
@@ -27,17 +25,11 @@ module RuboCop
|
|
|
27
25
|
module_function
|
|
28
26
|
|
|
29
27
|
def extract_rhs(node)
|
|
30
|
-
if node.
|
|
31
|
-
|
|
32
|
-
elsif node.op_asgn_type?
|
|
33
|
-
_lhs, _op, rhs = *node
|
|
34
|
-
elsif node.call_type?
|
|
35
|
-
rhs = node.last_argument
|
|
28
|
+
if node.call_type?
|
|
29
|
+
node.last_argument
|
|
36
30
|
elsif node.assignment?
|
|
37
|
-
|
|
31
|
+
node.expression
|
|
38
32
|
end
|
|
39
|
-
|
|
40
|
-
rhs
|
|
41
33
|
end
|
|
42
34
|
end
|
|
43
35
|
end
|
|
@@ -43,12 +43,14 @@ module RuboCop
|
|
|
43
43
|
# (Note: Passes may not happen exactly in this sequence.)
|
|
44
44
|
module CheckLineBreakable
|
|
45
45
|
def extract_breakable_node(node, max)
|
|
46
|
-
if node.
|
|
46
|
+
if node.call_type?
|
|
47
|
+
return if chained_to_heredoc?(node)
|
|
48
|
+
|
|
47
49
|
args = process_args(node.arguments)
|
|
48
50
|
return extract_breakable_node_from_elements(node, args, max)
|
|
49
|
-
elsif node.
|
|
51
|
+
elsif node.any_def_type?
|
|
50
52
|
return extract_breakable_node_from_elements(node, node.arguments, max)
|
|
51
|
-
elsif node.
|
|
53
|
+
elsif node.type?(:array, :hash)
|
|
52
54
|
return extract_breakable_node_from_elements(node, node.children, max)
|
|
53
55
|
end
|
|
54
56
|
nil
|
|
@@ -72,9 +74,9 @@ module RuboCop
|
|
|
72
74
|
def extract_first_element_over_column_limit(node, elements, max)
|
|
73
75
|
line = node.first_line
|
|
74
76
|
|
|
75
|
-
# If a `send` node is not parenthesized, don't move the first element, because it
|
|
77
|
+
# If a `send` or `csend` node is not parenthesized, don't move the first element, because it
|
|
76
78
|
# can result in changed behavior or a syntax error.
|
|
77
|
-
if node.
|
|
79
|
+
if node.call_type? && !node.parenthesized? && !first_argument_is_heredoc?(node)
|
|
78
80
|
elements = elements.drop(1)
|
|
79
81
|
end
|
|
80
82
|
|
|
@@ -96,10 +98,10 @@ module RuboCop
|
|
|
96
98
|
end
|
|
97
99
|
|
|
98
100
|
# @api private
|
|
99
|
-
# If a send node contains a heredoc argument, splitting cannot happen
|
|
101
|
+
# If a `send` or `csend` node contains a heredoc argument, splitting cannot happen
|
|
100
102
|
# after the heredoc or else it will cause a syntax error.
|
|
101
103
|
def shift_elements_for_heredoc_arg(node, elements, index)
|
|
102
|
-
return index unless node.
|
|
104
|
+
return index unless node.type?(:call, :array)
|
|
103
105
|
|
|
104
106
|
heredoc_index = elements.index { |arg| arg.respond_to?(:heredoc?) && arg.heredoc? }
|
|
105
107
|
return index unless heredoc_index
|
|
@@ -152,9 +154,9 @@ module RuboCop
|
|
|
152
154
|
# Ignore ancestors on different lines.
|
|
153
155
|
break if ancestor.first_line != node.first_line
|
|
154
156
|
|
|
155
|
-
if ancestor.
|
|
157
|
+
if ancestor.type?(:hash, :array)
|
|
156
158
|
elements = ancestor.children
|
|
157
|
-
elsif ancestor.
|
|
159
|
+
elsif ancestor.call_type?
|
|
158
160
|
elements = process_args(ancestor.arguments)
|
|
159
161
|
else
|
|
160
162
|
next
|
|
@@ -169,12 +171,12 @@ module RuboCop
|
|
|
169
171
|
# @api private
|
|
170
172
|
def contained_by_multiline_collection_that_could_be_broken_up?(node)
|
|
171
173
|
node.each_ancestor.find do |ancestor|
|
|
172
|
-
if
|
|
174
|
+
if ancestor.type?(:hash, :array) &&
|
|
173
175
|
breakable_collection?(ancestor, ancestor.children)
|
|
174
176
|
return children_could_be_broken_up?(ancestor.children)
|
|
175
177
|
end
|
|
176
178
|
|
|
177
|
-
next unless ancestor.
|
|
179
|
+
next unless ancestor.call_type?
|
|
178
180
|
|
|
179
181
|
args = process_args(ancestor.arguments)
|
|
180
182
|
return children_could_be_broken_up?(args) if breakable_collection?(ancestor, args)
|
|
@@ -218,10 +220,18 @@ module RuboCop
|
|
|
218
220
|
|
|
219
221
|
# @api private
|
|
220
222
|
def already_on_multiple_lines?(node)
|
|
221
|
-
return node.first_line != node.
|
|
223
|
+
return node.first_line != node.last_argument.last_line if node.any_def_type?
|
|
222
224
|
|
|
223
225
|
!node.single_line?
|
|
224
226
|
end
|
|
227
|
+
|
|
228
|
+
def chained_to_heredoc?(node)
|
|
229
|
+
while (node = node.receiver)
|
|
230
|
+
return true if node.any_str_type? && node.heredoc?
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
false
|
|
234
|
+
end
|
|
225
235
|
end
|
|
226
236
|
end
|
|
227
237
|
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Checks for code on multiple lines that could be rewritten on a single line
|
|
6
|
+
# without changing semantics or exceeding the `Max` parameter of `Layout/LineLength`.
|
|
7
|
+
module CheckSingleLineSuitability
|
|
8
|
+
def suitable_as_single_line?(node)
|
|
9
|
+
!too_long?(node) &&
|
|
10
|
+
!comment_within?(node) &&
|
|
11
|
+
safe_to_split?(node)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def too_long?(node)
|
|
17
|
+
lines = processed_source.lines[(node.first_line - 1)...node.last_line]
|
|
18
|
+
to_single_line(lines.join("\n")).length > max_line_length
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_single_line(source)
|
|
22
|
+
source
|
|
23
|
+
.gsub(/" *\\\n\s*'/, %q(" + ')) # Double quote, backslash, and then single quote
|
|
24
|
+
.gsub(/' *\\\n\s*"/, %q(' + ")) # Single quote, backslash, and then double quote
|
|
25
|
+
.gsub(/(["']) *\\\n\s*\1/, '') # Double or single quote, backslash, then same quote
|
|
26
|
+
.gsub(/\n\s*(?=(&)?\.\w)/, '') # Extra space within method chaining which includes `&.`
|
|
27
|
+
.gsub(/\s*\\?\n\s*/, ' ') # Any other line break, with or without backslash
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def max_line_length
|
|
31
|
+
config.for_cop('Layout/LineLength')['Max']
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def comment_within?(node)
|
|
35
|
+
comment_line_numbers = processed_source.comments.map { |comment| comment.loc.line }
|
|
36
|
+
|
|
37
|
+
comment_line_numbers.any? do |comment_line_number|
|
|
38
|
+
comment_line_number.between?(node.first_line, node.last_line)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def safe_to_split?(node)
|
|
43
|
+
node.each_descendant(:if, :case, :kwbegin, :any_def).none? &&
|
|
44
|
+
node.each_descendant(:dstr, :str).none? { |n| n.heredoc? || n.value.include?("\n") } &&
|
|
45
|
+
node.each_descendant(:begin, :sym).none? { |b| !b.single_line? }
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
|
36
36
|
length = calculator.calculate
|
|
37
37
|
return if length <= max_length
|
|
38
38
|
|
|
39
|
-
location = node
|
|
39
|
+
location = location(node)
|
|
40
40
|
|
|
41
41
|
add_offense(location, message: message(length, max_length)) { self.max = length }
|
|
42
42
|
end
|
|
@@ -54,6 +54,17 @@ module RuboCop
|
|
|
54
54
|
foldable_types: count_as_one
|
|
55
55
|
)
|
|
56
56
|
end
|
|
57
|
+
|
|
58
|
+
def location(node)
|
|
59
|
+
return node.loc.name if node.casgn_type?
|
|
60
|
+
|
|
61
|
+
if LSP.enabled?
|
|
62
|
+
end_range = node.loc.respond_to?(:name) ? node.loc.name : node.loc.begin
|
|
63
|
+
node.source_range.begin.join(end_range)
|
|
64
|
+
else
|
|
65
|
+
node.source_range
|
|
66
|
+
end
|
|
67
|
+
end
|
|
57
68
|
end
|
|
58
69
|
end
|
|
59
70
|
end
|
|
@@ -16,6 +16,8 @@ module RuboCop
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def comments_in_range(node)
|
|
19
|
+
return [] unless node.source_range
|
|
20
|
+
|
|
19
21
|
start_line = node.source_range.line
|
|
20
22
|
end_line = find_end_line(node)
|
|
21
23
|
|
|
@@ -62,25 +64,32 @@ module RuboCop
|
|
|
62
64
|
# Returns the end line of a node, which might be a comment and not part of the AST
|
|
63
65
|
# End line is considered either the line at which another node starts, or
|
|
64
66
|
# the line at which the parent node ends.
|
|
65
|
-
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
67
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
66
68
|
def find_end_line(node)
|
|
67
|
-
if node.if_type?
|
|
68
|
-
node.
|
|
69
|
-
|
|
70
|
-
node.
|
|
71
|
-
|
|
72
|
-
node.
|
|
73
|
-
|
|
69
|
+
if node.if_type?
|
|
70
|
+
if node.else?
|
|
71
|
+
node.loc.else.line
|
|
72
|
+
elsif node.ternary?
|
|
73
|
+
node.else_branch.loc.line
|
|
74
|
+
elsif node.elsif?
|
|
75
|
+
node.each_ancestor(:if).find(&:if?).loc.end.line
|
|
76
|
+
elsif node.if? && node.parent && parentheses?(node.parent)
|
|
77
|
+
node.parent.loc.end.line
|
|
78
|
+
end
|
|
79
|
+
elsif node.any_block_type?
|
|
74
80
|
node.loc.end.line
|
|
75
|
-
elsif (next_sibling = node.right_sibling) && next_sibling.is_a?(AST::Node)
|
|
81
|
+
elsif (next_sibling = node.right_sibling) && next_sibling.is_a?(AST::Node) &&
|
|
82
|
+
next_sibling.source_range
|
|
76
83
|
next_sibling.loc.line
|
|
77
84
|
elsif (parent = node.parent)
|
|
78
|
-
parent.loc
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
85
|
+
if parent.loc?(:end)
|
|
86
|
+
parent.loc.end.line
|
|
87
|
+
else
|
|
88
|
+
parent.loc.line
|
|
89
|
+
end
|
|
90
|
+
end || node.loc.end.line
|
|
82
91
|
end
|
|
83
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
92
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
84
93
|
end
|
|
85
94
|
end
|
|
86
95
|
end
|