rubocop 1.52.1 → 1.79.2
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 +93 -88
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +596 -91
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +13 -3
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +28 -15
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +26 -3
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +14 -4
- data/lib/rubocop/config_loader.rb +68 -57
- data/lib/rubocop/config_loader_resolver.rb +52 -20
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -25
- data/lib/rubocop/cop/base.rb +80 -19
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -2
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +6 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +10 -2
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +6 -14
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- 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 +5 -7
- 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 +10 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +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 +51 -25
- 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 +6 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +127 -33
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +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_method_dispatch_node.rb +11 -2
- 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 +2 -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 +51 -9
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +2 -6
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +46 -13
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +33 -13
- 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 +14 -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 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +16 -16
- data/lib/rubocop/cop/layout/leading_comment_space.rb +84 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +28 -11
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +8 -2
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +4 -2
- data/lib/rubocop/cop/layout/line_length.rb +168 -28
- data/lib/rubocop/cop/layout/multiline_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 +21 -6
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +40 -44
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +8 -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 +10 -2
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +83 -38
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_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_parens.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- 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 +1 -1
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +45 -10
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -12
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -5
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +47 -20
- 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_block.rb +1 -1
- 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 +3 -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/heredoc_method_call_position.rb +1 -1
- 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 +50 -13
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +33 -7
- data/lib/rubocop/cop/lint/mixed_case_range.rb +113 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +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 +22 -10
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +13 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +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 +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -12
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +178 -10
- 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 +1 -5
- 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 +31 -13
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +71 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +26 -12
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +7 -7
- 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_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +51 -20
- 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 +88 -27
- 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 +8 -6
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +23 -17
- 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 +16 -7
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +39 -12
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/migration/department_name.rb +2 -2
- 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 +24 -15
- 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 -1
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +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/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +10 -11
- 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 +2 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +71 -35
- 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 +5 -3
- 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 +22 -6
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +40 -9
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +5 -7
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +16 -17
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +306 -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/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 +11 -9
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +472 -63
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +94 -44
- 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 +100 -0
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +56 -24
- 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 +8 -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 +4 -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 +25 -9
- 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 +3 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +53 -38
- 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/document_dynamic_eval_definition.rb +1 -1
- 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 +4 -4
- 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_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +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 +18 -5
- 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 +4 -2
- data/lib/rubocop/cop/style/format_string.rb +33 -12
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
- 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 +46 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +26 -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 +57 -9
- 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 +62 -8
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +49 -7
- 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 +5 -4
- data/lib/rubocop/cop/style/lambda_call.rb +14 -3
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +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 +59 -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/mixin_grouping.rb +1 -1
- 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 +6 -4
- 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 +8 -15
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/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 +31 -6
- data/lib/rubocop/cop/style/open_struct_use.rb +6 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +32 -8
- 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/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +35 -4
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +17 -4
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +50 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +89 -5
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +33 -13
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +23 -6
- data/lib/rubocop/cop/style/redundant_format.rb +262 -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 +1 -1
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +73 -20
- data/lib/rubocop/cop/style/redundant_parentheses.rb +155 -40
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +107 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +10 -25
- data/lib/rubocop/cop/style/redundant_return.rb +16 -5
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +12 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +11 -10
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +5 -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 +8 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +137 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +145 -61
- 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 +10 -5
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +3 -4
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +78 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -88
- 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 +15 -15
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +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 +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- 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/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +12 -6
- data/lib/rubocop/cop/style/yoda_expression.rb +10 -8
- 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 +20 -7
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +35 -7
- 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 +40 -19
- data/lib/rubocop/cops_documentation_generator.rb +133 -56
- 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 +7 -21
- data/lib/rubocop/file_finder.rb +11 -9
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -10
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +71 -24
- 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 +189 -0
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +227 -0
- data/lib/rubocop/lsp/runtime.rb +69 -0
- data/lib/rubocop/lsp/server.rb +70 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +24 -14
- data/lib/rubocop/options.rb +54 -23
- data/lib/rubocop/path_util.rb +21 -10
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +29 -30
- 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 +114 -21
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -10
- 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 +4 -4
- 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/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +97 -82
- data/lib/rubocop/target_ruby.rb +102 -77
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +69 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +136 -42
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -17,19 +17,22 @@ module RuboCop
|
|
17
17
|
|
18
18
|
lhs = left_hand_side(node.receiver)
|
19
19
|
rhs = right_hand_side(node)
|
20
|
+
return unless rhs
|
21
|
+
|
20
22
|
range = offending_range(node, lhs, rhs, style)
|
21
23
|
check(range, node, lhs, rhs)
|
22
24
|
end
|
25
|
+
alias on_csend on_send
|
23
26
|
|
24
27
|
private
|
25
28
|
|
26
|
-
# In a chain of method calls, we regard the top
|
29
|
+
# In a chain of method calls, we regard the top call node as the base
|
27
30
|
# for indentation of all lines following the first. For example:
|
28
31
|
# a.
|
29
32
|
# b c { block }. <-- b is indented relative to a
|
30
33
|
# d <-- d is indented relative to a
|
31
34
|
def left_hand_side(lhs)
|
32
|
-
while lhs.parent&.
|
35
|
+
while lhs.parent&.call_type? && lhs.parent.loc.dot && !lhs.parent.assignment_method?
|
33
36
|
lhs = lhs.parent
|
34
37
|
end
|
35
38
|
lhs
|
@@ -120,12 +123,10 @@ module RuboCop
|
|
120
123
|
|
121
124
|
def indented_keyword_expression(node)
|
122
125
|
if node.for_type?
|
123
|
-
|
126
|
+
node.collection
|
124
127
|
else
|
125
|
-
|
128
|
+
node.children.first
|
126
129
|
end
|
127
|
-
|
128
|
-
expression
|
129
130
|
end
|
130
131
|
|
131
132
|
def argument_in_method_call(node, kind) # rubocop:todo Metrics/CyclomaticComplexity
|
@@ -186,12 +187,10 @@ module RuboCop
|
|
186
187
|
|
187
188
|
def assignment_rhs(node)
|
188
189
|
case node.type
|
189
|
-
when :casgn
|
190
|
-
when :
|
191
|
-
|
192
|
-
else _lhs, rhs = *node
|
190
|
+
when :casgn, :op_asgn then node.rhs
|
191
|
+
when :send, :csend then node.last_argument
|
192
|
+
else node.children.last
|
193
193
|
end
|
194
|
-
rhs
|
195
194
|
end
|
196
195
|
|
197
196
|
def not_for_this_cop?(node)
|
@@ -24,7 +24,7 @@ module RuboCop
|
|
24
24
|
gem_canonical_name(string_a) < gem_canonical_name(string_b)
|
25
25
|
end
|
26
26
|
|
27
|
-
def consecutive_lines(previous, current)
|
27
|
+
def consecutive_lines?(previous, current)
|
28
28
|
first_line = get_source_range(current, treat_comments_as_separators).first_line
|
29
29
|
previous.source_range.last_line == first_line - 1
|
30
30
|
end
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
parent = node.parent
|
16
16
|
|
17
17
|
parent&.send_type? && parent.arguments.include?(node) &&
|
18
|
-
!parent.parenthesized? && parent
|
18
|
+
!parent.parenthesized? && parent.block_literal?
|
19
19
|
end
|
20
20
|
|
21
21
|
# Override to determine values that are invalid in a percent array
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def percent_literal?(node)
|
12
|
-
return unless (begin_source = begin_source(node))
|
12
|
+
return false unless (begin_source = begin_source(node))
|
13
13
|
|
14
14
|
begin_source.start_with?('%')
|
15
15
|
end
|
@@ -21,7 +21,7 @@ module RuboCop
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def begin_source(node)
|
24
|
-
node.loc.begin.source if node.loc
|
24
|
+
node.loc.begin.source if node.loc?(:begin)
|
25
25
|
end
|
26
26
|
|
27
27
|
def type(node)
|
@@ -4,7 +4,12 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Common functionality for checking whether an AST node/token is aligned
|
6
6
|
# with something on a preceding or following line
|
7
|
+
# rubocop:disable Metrics/ModuleLength
|
7
8
|
module PrecedingFollowingAlignment
|
9
|
+
# Tokens that end with an `=`, as well as `<<`, that can be aligned together:
|
10
|
+
# `=`, `==`, `===`, `!=`, `<=`, `>=`, `<<` and operator assignment (`+=`, etc).
|
11
|
+
ASSIGNMENT_OR_COMPARISON_TOKENS = %i[tEQL tEQ tEQQ tNEQ tLEQ tGEQ tOP_ASGN tLSHFT].freeze
|
12
|
+
|
8
13
|
private
|
9
14
|
|
10
15
|
def allow_for_alignment?
|
@@ -19,16 +24,20 @@ module RuboCop
|
|
19
24
|
aligned_with_adjacent_line?(range, method(:aligned_operator?))
|
20
25
|
end
|
21
26
|
|
22
|
-
|
27
|
+
# Allows alignment with a preceding operator that ends with an `=`,
|
28
|
+
# including assignment and comparison operators.
|
29
|
+
def aligned_with_preceding_equals_operator(token)
|
23
30
|
preceding_line_range = token.line.downto(1)
|
24
31
|
|
25
|
-
|
32
|
+
aligned_with_equals_sign(token, preceding_line_range)
|
26
33
|
end
|
27
34
|
|
28
|
-
|
35
|
+
# Allows alignment with a subsequent operator that ends with an `=`,
|
36
|
+
# including assignment and comparison operators.
|
37
|
+
def aligned_with_subsequent_equals_operator(token)
|
29
38
|
subsequent_line_range = token.line.upto(processed_source.lines.length)
|
30
39
|
|
31
|
-
|
40
|
+
aligned_with_equals_sign(token, subsequent_line_range)
|
32
41
|
end
|
33
42
|
|
34
43
|
def aligned_with_adjacent_line?(range, predicate)
|
@@ -62,7 +71,7 @@ module RuboCop
|
|
62
71
|
next unless index
|
63
72
|
next if indent && indent != index
|
64
73
|
|
65
|
-
return yield(range, line)
|
74
|
+
return yield(range, line, lineno + 1)
|
66
75
|
end
|
67
76
|
false
|
68
77
|
end
|
@@ -74,41 +83,58 @@ module RuboCop
|
|
74
83
|
end.map(&:line)
|
75
84
|
end
|
76
85
|
|
77
|
-
def aligned_token?(range, line)
|
78
|
-
aligned_words?(range, line) ||
|
79
|
-
aligned_char?(range, line) ||
|
80
|
-
aligned_assignment?(range, line)
|
86
|
+
def aligned_token?(range, line, lineno)
|
87
|
+
aligned_words?(range, line) || aligned_equals_operator?(range, lineno)
|
81
88
|
end
|
82
89
|
|
83
|
-
def aligned_operator?(range, line)
|
84
|
-
|
90
|
+
def aligned_operator?(range, line, lineno)
|
91
|
+
aligned_identical?(range, line) || aligned_equals_operator?(range, lineno)
|
85
92
|
end
|
86
93
|
|
87
94
|
def aligned_words?(range, line)
|
88
|
-
|
95
|
+
left_edge = range.column
|
96
|
+
return true if /\s\S/.match?(line[left_edge - 1, 2])
|
97
|
+
|
98
|
+
token = range.source
|
99
|
+
token == line[left_edge, token.length]
|
89
100
|
end
|
90
101
|
|
91
|
-
def
|
92
|
-
|
102
|
+
def aligned_equals_operator?(range, lineno)
|
103
|
+
# Check that the operator is aligned with a previous assignment or comparison operator
|
104
|
+
# ie. an equals sign, an operator assignment (eg. `+=`), a comparison (`==`, `<=`, etc.).
|
105
|
+
# Since append operators (`<<`) are a type of assignment, they are allowed as well,
|
106
|
+
# despite not ending with a literal equals character.
|
107
|
+
line_range = processed_source.buffer.line_range(lineno)
|
108
|
+
return false unless line_range
|
109
|
+
|
110
|
+
# Find the specific token to avoid matching up to operators inside strings
|
111
|
+
operator_token = processed_source.tokens_within(line_range).detect do |token|
|
112
|
+
ASSIGNMENT_OR_COMPARISON_TOKENS.include?(token.type)
|
113
|
+
end
|
114
|
+
|
115
|
+
aligned_with_preceding_equals?(range, operator_token) ||
|
116
|
+
aligned_with_append_operator?(range, operator_token)
|
93
117
|
end
|
94
118
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
119
|
+
def aligned_with_preceding_equals?(range, token)
|
120
|
+
return false unless token
|
121
|
+
|
122
|
+
range.source[-1] == '=' && range.last_column == token.pos.last_column
|
98
123
|
end
|
99
124
|
|
100
|
-
def aligned_with_append_operator?(range,
|
101
|
-
|
125
|
+
def aligned_with_append_operator?(range, token)
|
126
|
+
return false unless token
|
102
127
|
|
103
|
-
(range.source == '<<' &&
|
104
|
-
(range.source[-1] == '=' &&
|
128
|
+
((range.source == '<<' && token.equal_sign?) ||
|
129
|
+
(range.source[-1] == '=' && token.type == :tLSHFT)) &&
|
130
|
+
token && range.last_column == token.pos.last_column
|
105
131
|
end
|
106
132
|
|
107
133
|
def aligned_identical?(range, line)
|
108
134
|
range.source == line[range.column, range.size]
|
109
135
|
end
|
110
136
|
|
111
|
-
def
|
137
|
+
def aligned_with_equals_sign(token, line_range)
|
112
138
|
token_line_indent = processed_source.line_indentation(token.line)
|
113
139
|
assignment_lines = relevant_assignment_lines(line_range)
|
114
140
|
relevant_line_number = assignment_lines[1]
|
@@ -118,12 +144,9 @@ module RuboCop
|
|
118
144
|
relevant_indent = processed_source.line_indentation(relevant_line_number)
|
119
145
|
|
120
146
|
return :none if relevant_indent < token_line_indent
|
147
|
+
return :none unless processed_source.lines[relevant_line_number - 1]
|
121
148
|
|
122
|
-
|
123
|
-
|
124
|
-
return :none unless assignment_line
|
125
|
-
|
126
|
-
aligned_assignment?(token.pos, assignment_line) ? :yes : :no
|
149
|
+
aligned_equals_operator?(token.pos, relevant_line_number) ? :yes : :no
|
127
150
|
end
|
128
151
|
|
129
152
|
def assignment_lines
|
@@ -134,10 +157,14 @@ module RuboCop
|
|
134
157
|
@assignment_tokens ||= begin
|
135
158
|
tokens = processed_source.tokens.select(&:equal_sign?)
|
136
159
|
|
137
|
-
#
|
138
|
-
#
|
139
|
-
#
|
140
|
-
|
160
|
+
# We don't want to operate on equals signs which are part of an `optarg` in a
|
161
|
+
# method definition, or the separator of an endless method definition.
|
162
|
+
# For example (the equals sign to ignore is highlighted with ^):
|
163
|
+
# def method(optarg = default_val); end
|
164
|
+
# ^
|
165
|
+
# def method = foo
|
166
|
+
# ^
|
167
|
+
tokens = remove_equals_in_def(tokens, processed_source)
|
141
168
|
|
142
169
|
# Only attempt to align the first = on each line
|
143
170
|
Set.new(tokens.uniq(&:line))
|
@@ -173,11 +200,20 @@ module RuboCop
|
|
173
200
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
174
201
|
# rubocop:enable Metrics/PerceivedComplexity, Metrics/MethodLength
|
175
202
|
|
176
|
-
def
|
177
|
-
|
178
|
-
|
179
|
-
|
203
|
+
def remove_equals_in_def(asgn_tokens, processed_source)
|
204
|
+
nodes = processed_source.ast.each_node(:optarg, :def)
|
205
|
+
eqls_to_ignore = nodes.with_object([]) do |node, arr|
|
206
|
+
loc = if node.def_type?
|
207
|
+
node.loc.assignment if node.endless?
|
208
|
+
else
|
209
|
+
node.loc.operator
|
210
|
+
end
|
211
|
+
arr << loc.begin_pos if loc
|
212
|
+
end
|
213
|
+
|
214
|
+
asgn_tokens.reject { |t| eqls_to_ignore.include?(t.begin_pos) }
|
180
215
|
end
|
181
216
|
end
|
217
|
+
# rubocop:enable Metrics/ModuleLength
|
182
218
|
end
|
183
219
|
end
|
@@ -4,9 +4,10 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Methods that calculate and return Parser::Source::Ranges
|
6
6
|
module RangeHelp
|
7
|
-
private
|
8
|
-
|
9
7
|
BYTE_ORDER_MARK = 0xfeff # The Unicode codepoint
|
8
|
+
NOT_GIVEN = Module.new
|
9
|
+
|
10
|
+
private
|
10
11
|
|
11
12
|
def source_range(source_buffer, line_number, column, length = 1)
|
12
13
|
if column.is_a?(Range)
|
@@ -33,6 +34,18 @@ module RuboCop
|
|
33
34
|
range_between(node.loc.begin.end_pos, node.loc.end.begin_pos)
|
34
35
|
end
|
35
36
|
|
37
|
+
# A range containing the first to the last argument
|
38
|
+
# of a method call or method definition.
|
39
|
+
# def foo(a, b:)
|
40
|
+
# ^^^^^
|
41
|
+
# bar(1, 2, 3, &blk)
|
42
|
+
# ^^^^^^^^^^^^^
|
43
|
+
# baz { |x, y:, z:| }
|
44
|
+
# ^^^^^^^^^
|
45
|
+
def arguments_range(node)
|
46
|
+
node.first_argument.source_range.join(node.last_argument.source_range)
|
47
|
+
end
|
48
|
+
|
36
49
|
def range_between(start_pos, end_pos)
|
37
50
|
Parser::Source::Range.new(processed_source.buffer, start_pos, end_pos)
|
38
51
|
end
|
@@ -51,12 +64,10 @@ module RuboCop
|
|
51
64
|
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
52
65
|
end
|
53
66
|
|
54
|
-
NOT_GIVEN = Module.new
|
55
67
|
def range_with_surrounding_space(range_positional = NOT_GIVEN, # rubocop:disable Metrics/ParameterLists
|
56
68
|
range: NOT_GIVEN, side: :both, newlines: true,
|
57
69
|
whitespace: false, continuations: false,
|
58
70
|
buffer: @processed_source.buffer)
|
59
|
-
|
60
71
|
range = range_positional unless range_positional == NOT_GIVEN
|
61
72
|
|
62
73
|
src = buffer.source
|
@@ -18,6 +18,10 @@ module RuboCop
|
|
18
18
|
|
19
19
|
# @deprecated Use ResbodyNode#exceptions instead
|
20
20
|
def rescued_exceptions(resbody)
|
21
|
+
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
22
|
+
`rescued_exceptions` is deprecated. Use `ResbodyNode#exceptions` instead.
|
23
|
+
WARNING
|
24
|
+
|
21
25
|
rescue_group, = *resbody
|
22
26
|
if rescue_group
|
23
27
|
rescue_group.values
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
def_node_matcher :empty_condition?, '(begin)'
|
15
15
|
|
16
16
|
# @!method setter_method?(node)
|
17
|
-
def_node_matcher :setter_method?, '[(
|
17
|
+
def_node_matcher :setter_method?, '[(call ...) setter_method?]'
|
18
18
|
|
19
19
|
# @!method safe_assignment?(node)
|
20
20
|
def_node_matcher :safe_assignment?, '(begin {equals_asgn? #setter_method?})'
|
@@ -5,7 +5,6 @@ module RuboCop
|
|
5
5
|
# Common functionality for modifier cops.
|
6
6
|
module StatementModifier
|
7
7
|
include LineLengthHelp
|
8
|
-
include RangeHelp
|
9
8
|
|
10
9
|
private
|
11
10
|
|
@@ -56,16 +55,23 @@ module RuboCop
|
|
56
55
|
end
|
57
56
|
|
58
57
|
def if_body_source(if_body)
|
59
|
-
if if_body.call_type? &&
|
60
|
-
if_body.last_argument&.hash_type? && if_body.last_argument.pairs.last&.value_omission?
|
58
|
+
if if_body.call_type? && !if_body.method?(:[]=) && omitted_value_in_last_hash_arg?(if_body)
|
61
59
|
"#{method_source(if_body)}(#{if_body.arguments.map(&:source).join(', ')})"
|
62
60
|
else
|
63
61
|
if_body.source
|
64
62
|
end
|
65
63
|
end
|
66
64
|
|
65
|
+
def omitted_value_in_last_hash_arg?(if_body)
|
66
|
+
return false unless (last_argument = if_body.last_argument)
|
67
|
+
|
68
|
+
last_argument.hash_type? && last_argument.pairs.last&.value_omission?
|
69
|
+
end
|
70
|
+
|
67
71
|
def method_source(if_body)
|
68
|
-
|
72
|
+
end_range = if_body.implicit_call? ? if_body.loc.dot.end : if_body.loc.selector
|
73
|
+
|
74
|
+
if_body.source_range.begin.join(end_range).source
|
69
75
|
end
|
70
76
|
|
71
77
|
def first_line_comment(node)
|
@@ -95,7 +101,7 @@ module RuboCop
|
|
95
101
|
end
|
96
102
|
|
97
103
|
def max_line_length
|
98
|
-
return unless config.
|
104
|
+
return unless config.cop_enabled?('Layout/LineLength')
|
99
105
|
|
100
106
|
config.for_cop('Layout/LineLength')['Max']
|
101
107
|
end
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
def on_str(node)
|
11
11
|
# Constants like __FILE__ are handled as strings,
|
12
12
|
# but don't respond to begin.
|
13
|
-
return unless node.loc
|
13
|
+
return unless node.loc?(:begin)
|
14
14
|
return if part_of_ignored_node?(node)
|
15
15
|
|
16
16
|
if offense?(node)
|
@@ -30,8 +30,10 @@ module RuboCop
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def inside_interpolation?(node)
|
33
|
-
# A :begin node inside a :dstr node is an interpolation.
|
34
|
-
node.ancestors
|
33
|
+
# A :begin node inside a :dstr, :dsym, or :regexp node is an interpolation.
|
34
|
+
node.ancestors
|
35
|
+
.drop_while { |a| !a.begin_type? }
|
36
|
+
.any? { |a| a.type?(:dstr, :dsym, :regexp) }
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
@@ -16,6 +16,18 @@ module RuboCop
|
|
16
16
|
!/" | \\[^'\\] | \#[@{$]/x.match?(src)
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
def preferred_string_literal
|
21
|
+
enforce_double_quotes? ? '""' : "''"
|
22
|
+
end
|
23
|
+
|
24
|
+
def enforce_double_quotes?
|
25
|
+
string_literals_config['EnforcedStyle'] == 'double_quotes'
|
26
|
+
end
|
27
|
+
|
28
|
+
def string_literals_config
|
29
|
+
config.for_enabled_cop('Style/StringLiterals')
|
30
|
+
end
|
19
31
|
end
|
20
32
|
end
|
21
33
|
end
|
@@ -8,12 +8,28 @@ module RuboCop
|
|
8
8
|
@minimum_target_ruby_version
|
9
9
|
end
|
10
10
|
|
11
|
+
def required_maximum_ruby_version
|
12
|
+
@maximum_target_ruby_version
|
13
|
+
end
|
14
|
+
|
11
15
|
def minimum_target_ruby_version(version)
|
12
16
|
@minimum_target_ruby_version = version
|
13
17
|
end
|
14
18
|
|
19
|
+
def maximum_target_ruby_version(version)
|
20
|
+
@maximum_target_ruby_version = version
|
21
|
+
end
|
22
|
+
|
15
23
|
def support_target_ruby_version?(version)
|
16
|
-
|
24
|
+
# By default, no minimum or maximum versions of ruby are required
|
25
|
+
# to run any cop. In order to do a simple numerical comparison of
|
26
|
+
# the requested version against any requirements, we use 0 and
|
27
|
+
# Infinity as the default values to indicate no minimum (0) and no
|
28
|
+
# maximum (Infinity).
|
29
|
+
min = required_minimum_ruby_version || 0
|
30
|
+
max = required_maximum_ruby_version || Float::INFINITY
|
31
|
+
|
32
|
+
version.between?(min, max)
|
17
33
|
end
|
18
34
|
end
|
19
35
|
end
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
|
-
# Common methods shared by Style/TrailingCommaInArguments
|
6
|
-
# Style/
|
5
|
+
# Common methods shared by Style/TrailingCommaInArguments,
|
6
|
+
# Style/TrailingCommaInArrayLiteral and Style/TrailingCommaInHashLiteral
|
7
|
+
# rubocop:disable Metrics/ModuleLength
|
7
8
|
module TrailingComma
|
8
9
|
include ConfigurableEnforcedStyle
|
9
10
|
include RangeHelp
|
@@ -57,6 +58,8 @@ module RuboCop
|
|
57
58
|
', unless each item is on its own line'
|
58
59
|
when :consistent_comma
|
59
60
|
', unless items are split onto multiple lines'
|
61
|
+
when :diff_comma
|
62
|
+
', unless that item immediately precedes a newline'
|
60
63
|
else
|
61
64
|
''
|
62
65
|
end
|
@@ -68,6 +71,8 @@ module RuboCop
|
|
68
71
|
multiline?(node) && no_elements_on_same_line?(node)
|
69
72
|
when :consistent_comma
|
70
73
|
multiline?(node) && !method_name_and_arguments_on_same_line?(node)
|
74
|
+
when :diff_comma
|
75
|
+
multiline?(node) && last_item_precedes_newline?(node)
|
71
76
|
else
|
72
77
|
false
|
73
78
|
end
|
@@ -102,11 +107,11 @@ module RuboCop
|
|
102
107
|
# of the argument is not considered multiline, even if the argument
|
103
108
|
# itself might span multiple lines.
|
104
109
|
def allowed_multiline_argument?(node)
|
105
|
-
elements(node).one? && !Util.begins_its_line?(node
|
110
|
+
elements(node).one? && !Util.begins_its_line?(node_end_location(node))
|
106
111
|
end
|
107
112
|
|
108
113
|
def elements(node)
|
109
|
-
return node.children unless
|
114
|
+
return node.children unless node.call_type?
|
110
115
|
|
111
116
|
node.arguments.flat_map do |argument|
|
112
117
|
# For each argument, if it is a multi-line hash without braces,
|
@@ -122,14 +127,24 @@ module RuboCop
|
|
122
127
|
|
123
128
|
def no_elements_on_same_line?(node)
|
124
129
|
items = elements(node).map(&:source_range)
|
125
|
-
items << node
|
130
|
+
items << node_end_location(node)
|
126
131
|
items.each_cons(2).none? { |a, b| on_same_line?(a, b) }
|
127
132
|
end
|
128
133
|
|
134
|
+
def node_end_location(node)
|
135
|
+
node.loc.end || node.source_range.end.adjust(begin_pos: -1)
|
136
|
+
end
|
137
|
+
|
129
138
|
def on_same_line?(range1, range2)
|
130
139
|
range1.last_line == range2.line
|
131
140
|
end
|
132
141
|
|
142
|
+
def last_item_precedes_newline?(node)
|
143
|
+
after_last_item = node.children.last.source_range.end.join(node.loc.end.begin)
|
144
|
+
|
145
|
+
after_last_item.source.start_with?(/,?\s*(#.*)?\n/)
|
146
|
+
end
|
147
|
+
|
133
148
|
def avoid_comma(kind, comma_begin_pos, extra_info)
|
134
149
|
range = range_between(comma_begin_pos, comma_begin_pos + 1)
|
135
150
|
article = kind.include?('array') ? 'an' : 'a'
|
@@ -181,7 +196,7 @@ module RuboCop
|
|
181
196
|
# ...
|
182
197
|
# SOURCE
|
183
198
|
# })
|
184
|
-
return heredoc?(node.children.last) if node.
|
199
|
+
return heredoc?(node.children.last) if node.type?(:pair, :hash)
|
185
200
|
|
186
201
|
false
|
187
202
|
end
|
@@ -205,5 +220,6 @@ module RuboCop
|
|
205
220
|
false
|
206
221
|
end
|
207
222
|
end
|
223
|
+
# rubocop:enable Metrics/ModuleLength
|
208
224
|
end
|
209
225
|
end
|
@@ -3,13 +3,13 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Naming
|
6
|
-
#
|
7
|
-
# to both instance and class methods.
|
6
|
+
# Avoid prefixing accessor method names with `get_` or `set_`.
|
7
|
+
# Applies to both instance and class methods.
|
8
8
|
#
|
9
|
-
# NOTE:
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# one.
|
9
|
+
# NOTE: Method names starting with `get_` or `set_` only register an offense
|
10
|
+
# when the methods match the expected arity for getters and setters respectively.
|
11
|
+
# Getters (`get_attribute`) must have no arguments to be registered,
|
12
|
+
# and setters (`set_attribute(value)`) must have exactly one.
|
13
13
|
#
|
14
14
|
# @example
|
15
15
|
# # bad
|
@@ -40,6 +40,7 @@ module RuboCop
|
|
40
40
|
MSG_WRITER = 'Do not prefix writer method names with `set_`.'
|
41
41
|
|
42
42
|
def on_def(node)
|
43
|
+
return unless proper_attribute_name?(node)
|
43
44
|
return unless bad_reader_name?(node) || bad_writer_name?(node)
|
44
45
|
|
45
46
|
message = message(node)
|
@@ -58,6 +59,10 @@ module RuboCop
|
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
62
|
+
def proper_attribute_name?(node)
|
63
|
+
!node.method_name.to_s.end_with?('!', '?', '=')
|
64
|
+
end
|
65
|
+
|
61
66
|
def bad_reader_name?(node)
|
62
67
|
node.method_name.to_s.start_with?('get_') && !node.arguments?
|
63
68
|
end
|
@@ -13,6 +13,20 @@ module RuboCop
|
|
13
13
|
# The default variable name is `block`. If the name is already in use, it will not be
|
14
14
|
# autocorrected.
|
15
15
|
#
|
16
|
+
# [NOTE]
|
17
|
+
# ====
|
18
|
+
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
19
|
+
# no offense will be registered until Ruby 3.4:
|
20
|
+
#
|
21
|
+
# [source,ruby]
|
22
|
+
# ----
|
23
|
+
# def foo(&block)
|
24
|
+
# # Using an anonymous block would be a syntax error on Ruby 3.3.0
|
25
|
+
# block_method { bar(&block) }
|
26
|
+
# end
|
27
|
+
# ----
|
28
|
+
# ====
|
29
|
+
#
|
16
30
|
# @example EnforcedStyle: anonymous (default)
|
17
31
|
#
|
18
32
|
# # bad
|
@@ -48,23 +62,27 @@ module RuboCop
|
|
48
62
|
MSG = 'Use %<style>s block forwarding.'
|
49
63
|
|
50
64
|
def self.autocorrect_incompatible_with
|
51
|
-
[Lint::AmbiguousOperator]
|
65
|
+
[Lint::AmbiguousOperator, Style::ArgumentsForwarding, Style::ExplicitBlockArgument]
|
52
66
|
end
|
53
67
|
|
54
68
|
def on_def(node)
|
55
69
|
return if node.arguments.empty?
|
56
70
|
|
57
|
-
last_argument = node.
|
71
|
+
last_argument = node.last_argument
|
58
72
|
return if expected_block_forwarding_style?(node, last_argument)
|
59
73
|
|
60
|
-
|
74
|
+
forwarded_args = node.each_descendant(:block_pass).with_object([]) do |block_pass, result|
|
75
|
+
return nil if invalidates_syntax?(block_pass)
|
76
|
+
next unless block_argument_name_matched?(block_pass, last_argument)
|
61
77
|
|
62
|
-
|
63
|
-
|
64
|
-
last_argument.source != block_pass_node.source
|
78
|
+
result << block_pass
|
79
|
+
end
|
65
80
|
|
66
|
-
|
81
|
+
forwarded_args.each do |forwarded_arg|
|
82
|
+
register_offense(forwarded_arg, node)
|
67
83
|
end
|
84
|
+
|
85
|
+
register_offense(last_argument, node)
|
68
86
|
end
|
69
87
|
alias on_defs on_def
|
70
88
|
|
@@ -80,6 +98,19 @@ module RuboCop
|
|
80
98
|
end
|
81
99
|
end
|
82
100
|
|
101
|
+
def block_argument_name_matched?(block_pass_node, last_argument)
|
102
|
+
return false if block_pass_node.children.first&.sym_type?
|
103
|
+
|
104
|
+
last_argument.source == block_pass_node.source
|
105
|
+
end
|
106
|
+
|
107
|
+
# Ruby 3.3.0 had a bug where accessing an anonymous block argument inside of a block
|
108
|
+
# was a syntax error in unambiguous cases: https://bugs.ruby-lang.org/issues/20090
|
109
|
+
# We disallow this also for earlier Ruby versions so that code is forwards compatible.
|
110
|
+
def invalidates_syntax?(block_pass_node)
|
111
|
+
target_ruby_version <= 3.3 && block_pass_node.each_ancestor(:any_block).any?
|
112
|
+
end
|
113
|
+
|
83
114
|
def use_kwarg_in_method_definition?(node)
|
84
115
|
node.arguments.each_descendant(:kwarg, :kwoptarg).any?
|
85
116
|
end
|
@@ -109,9 +140,9 @@ module RuboCop
|
|
109
140
|
end
|
110
141
|
|
111
142
|
def use_block_argument_as_local_variable?(node, last_argument)
|
112
|
-
return if node.body.nil?
|
143
|
+
return false if node.body.nil?
|
113
144
|
|
114
|
-
node.body.
|
145
|
+
node.body.each_node(:lvar, :lvasgn).any? do |lvar|
|
115
146
|
!lvar.parent.block_pass_type? && lvar.node_parts[0].to_s == last_argument
|
116
147
|
end
|
117
148
|
end
|