rubocop 1.71.1 → 1.92.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +885 -168
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +47 -4
- data/exe/rubocop +2 -9
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +50 -5
- data/lib/rubocop/changed_files.rb +134 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/cop_names.rb +57 -0
- data/lib/rubocop/cli/command/execute_runner.rb +54 -3
- data/lib/rubocop/cli/command/explain.rb +34 -0
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +8 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +59 -17
- data/lib/rubocop/comment_config/directive_range.rb +34 -0
- data/lib/rubocop/comment_config/disable_next.rb +143 -0
- data/lib/rubocop/comment_config/push_pop.rb +55 -0
- data/lib/rubocop/comment_config.rb +98 -45
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +75 -49
- data/lib/rubocop/config_loader_resolver.rb +124 -33
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +47 -3
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +75 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +43 -17
- data/lib/rubocop/cop/badge.rb +9 -1
- data/lib/rubocop/cop/base.rb +128 -35
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -11
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop_documentation.rb +81 -0
- data/lib/rubocop/cop/cop_explanation.rb +140 -0
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +92 -11
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +22 -7
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +29 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +73 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +3 -4
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -9
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +16 -20
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +86 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
- data/lib/rubocop/cop/layout/class_structure.rb +172 -36
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +3 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +27 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +14 -5
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +14 -3
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +20 -8
- data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +57 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +25 -18
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +20 -18
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +5 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +159 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
- data/lib/rubocop/cop/layout/line_length.rb +201 -30
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +11 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +63 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +259 -40
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +111 -7
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +29 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +20 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +30 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +55 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +32 -8
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
- data/lib/rubocop/cop/lint/ambiguous_range.rb +6 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +240 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +506 -41
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +22 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +152 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
- data/lib/rubocop/cop/lint/loop.rb +24 -2
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +60 -23
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +20 -11
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -25
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +5 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +28 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +9 -5
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +73 -5
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +54 -11
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +16 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +31 -6
- data/lib/rubocop/cop/lint/useless_assignment.rb +63 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +13 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +68 -22
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/class_length.rb +4 -2
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
- data/lib/rubocop/cop/metrics/method_length.rb +3 -2
- data/lib/rubocop/cop/metrics/module_length.rb +4 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +7 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +44 -23
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +10 -8
- data/lib/rubocop/cop/mixin/code_length.rb +10 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +2 -3
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +13 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_body_help.rb +69 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +59 -17
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +52 -25
- data/lib/rubocop/cop/mixin/hash_subset.rb +28 -6
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +52 -11
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
- data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
- data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -5
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +66 -10
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +23 -6
- data/lib/rubocop/cop/mixin.rb +93 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +7 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -6
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +65 -8
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -6
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +108 -9
- data/lib/rubocop/cop/registry.rb +234 -65
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +45 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/severity.rb +12 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +54 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- data/lib/rubocop/cop/style/alias.rb +33 -8
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/and_or.rb +6 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +52 -37
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +136 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +8 -6
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +13 -5
- data/lib/rubocop/cop/style/block_delimiters.rb +71 -40
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +12 -11
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +179 -27
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +19 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +88 -9
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +53 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +58 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +23 -12
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +25 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +304 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +184 -20
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +53 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -12
- data/lib/rubocop/cop/style/double_negation.rb +14 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +12 -3
- data/lib/rubocop/cop/style/empty_method.rb +15 -9
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +252 -19
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +62 -9
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +6 -4
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +43 -15
- data/lib/rubocop/cop/style/for.rb +48 -1
- data/lib/rubocop/cop/style/format_string.rb +44 -9
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +5 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +41 -24
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +52 -16
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +23 -6
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +39 -11
- data/lib/rubocop/cop/style/if_inside_else.rb +46 -21
- data/lib/rubocop/cop/style/if_unless_modifier.rb +90 -66
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +19 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +34 -8
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +150 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +23 -11
- data/lib/rubocop/cop/style/lambda.rb +30 -1
- data/lib/rubocop/cop/style/lambda_call.rb +31 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +6 -4
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -5
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +75 -24
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +58 -6
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_else.rb +7 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +47 -5
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +15 -22
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +139 -13
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
- data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
- data/lib/rubocop/cop/style/next.rb +68 -10
- data/lib/rubocop/cop/style/nil_comparison.rb +53 -13
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
- data/lib/rubocop/cop/style/not.rb +12 -3
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +22 -6
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +35 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +58 -27
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -1
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +9 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +58 -6
- data/lib/rubocop/cop/style/redundant_condition.rb +93 -18
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +22 -4
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +11 -11
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +12 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +83 -119
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +176 -83
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +15 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -0
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +107 -29
- data/lib/rubocop/cop/style/require_order.rb +9 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +10 -12
- data/lib/rubocop/cop/style/return_nil.rb +19 -4
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +76 -20
- data/lib/rubocop/cop/style/sample.rb +19 -13
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +54 -22
- data/lib/rubocop/cop/style/self_assignment.rb +13 -16
- data/lib/rubocop/cop/style/semicolon.rb +56 -14
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +22 -8
- data/lib/rubocop/cop/style/single_line_methods.rb +28 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -104
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +32 -6
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +38 -16
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +38 -2
- data/lib/rubocop/cop/style/super_arguments.rb +7 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +34 -14
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
- 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/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/style.rb +311 -0
- data/lib/rubocop/cop/team.rb +172 -49
- data/lib/rubocop/cop/util.rb +7 -10
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +8 -4
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +42 -11
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +49 -15
- data/lib/rubocop/directive_comment.rb +147 -5
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/base_formatter.rb +22 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +57 -14
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +7 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +3 -5
- data/lib/rubocop/formatter/json_formatter.rb +82 -7
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +5 -4
- data/lib/rubocop/formatter/pacman_formatter.rb +5 -2
- data/lib/rubocop/formatter/sarif_formatter.rb +186 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +8 -3
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +5 -4
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -41
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +136 -33
- data/lib/rubocop/lsp/runtime.rb +66 -15
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +38 -19
- data/lib/rubocop/lsp.rb +5 -2
- data/lib/rubocop/magic_comment.rb +55 -0
- data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
- data/lib/rubocop/mcp/explain_tool.rb +68 -0
- data/lib/rubocop/mcp/scope.rb +65 -0
- data/lib/rubocop/mcp/server.rb +307 -0
- data/lib/rubocop/mcp/source_files.rb +35 -0
- data/lib/rubocop/offense_limit.rb +30 -0
- data/lib/rubocop/options.rb +166 -23
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +153 -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/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +6 -4
- data/lib/rubocop/remote_config.rb +18 -13
- data/lib/rubocop/result_cache.rb +110 -65
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +11 -7
- data/lib/rubocop/rspec/shared_contexts.rb +85 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +368 -106
- data/lib/rubocop/server/cache.rb +67 -48
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +25 -11
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/util.rb +69 -0
- data/lib/rubocop/version.rb +48 -10
- data/lib/rubocop.rb +35 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +129 -21
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
|
@@ -6,25 +6,29 @@ module RuboCop
|
|
|
6
6
|
# Checks whether certain expressions, e.g. method calls, that could fit
|
|
7
7
|
# completely on a single line, are broken up into multiple lines unnecessarily.
|
|
8
8
|
#
|
|
9
|
-
# @example
|
|
9
|
+
# @example
|
|
10
10
|
# # bad
|
|
11
11
|
# foo(
|
|
12
12
|
# a,
|
|
13
13
|
# b
|
|
14
14
|
# )
|
|
15
15
|
#
|
|
16
|
+
# # good
|
|
17
|
+
# foo(a, b)
|
|
18
|
+
#
|
|
19
|
+
# # bad
|
|
16
20
|
# puts 'string that fits on ' \
|
|
17
21
|
# 'a single line'
|
|
18
22
|
#
|
|
23
|
+
# # good
|
|
24
|
+
# puts 'string that fits on a single line'
|
|
25
|
+
#
|
|
26
|
+
# # bad
|
|
19
27
|
# things
|
|
20
28
|
# .select { |thing| thing.cond? }
|
|
21
29
|
# .join('-')
|
|
22
30
|
#
|
|
23
31
|
# # good
|
|
24
|
-
# foo(a, b)
|
|
25
|
-
#
|
|
26
|
-
# puts 'string that fits on a single line'
|
|
27
|
-
#
|
|
28
32
|
# things.select { |thing| thing.cond? }.join('-')
|
|
29
33
|
#
|
|
30
34
|
# @example InspectBlocks: false (default)
|
|
@@ -45,10 +49,16 @@ module RuboCop
|
|
|
45
49
|
class RedundantLineBreak < Base
|
|
46
50
|
include CheckAssignment
|
|
47
51
|
include CheckSingleLineSuitability
|
|
52
|
+
include ReparsedEquivalence
|
|
48
53
|
extend AutoCorrector
|
|
49
54
|
|
|
50
55
|
MSG = 'Redundant line break detected.'
|
|
51
56
|
|
|
57
|
+
def on_new_investigation
|
|
58
|
+
super
|
|
59
|
+
@offense_line_ranges = []
|
|
60
|
+
end
|
|
61
|
+
|
|
52
62
|
def on_lvasgn(node)
|
|
53
63
|
super unless end_with_percent_blank_string?(processed_source)
|
|
54
64
|
end
|
|
@@ -72,16 +82,108 @@ module RuboCop
|
|
|
72
82
|
end
|
|
73
83
|
|
|
74
84
|
def check_assignment(node, _rhs)
|
|
75
|
-
return unless offense?(node)
|
|
85
|
+
return unless offense?(node) && !part_of_ignored_node?(node)
|
|
76
86
|
|
|
77
87
|
register_offense(node)
|
|
78
88
|
end
|
|
79
89
|
|
|
80
90
|
def register_offense(node)
|
|
91
|
+
line_range = joined_line_range(node)
|
|
92
|
+
return if too_long_as_single_line?(line_range)
|
|
93
|
+
|
|
94
|
+
# The exact single-line correction is verified to parse equivalently
|
|
95
|
+
# before the offense is registered, so a join that would change how
|
|
96
|
+
# the code parses is never reported or offered.
|
|
97
|
+
return if verified_by_reparse([node], oversized: :verify).empty?
|
|
98
|
+
|
|
81
99
|
add_offense(node) do |corrector|
|
|
82
100
|
corrector.replace(node, to_single_line(node.source).strip)
|
|
83
101
|
end
|
|
84
102
|
ignore_node(node)
|
|
103
|
+
@offense_line_ranges.reject! { |range| line_range.cover?(range) }
|
|
104
|
+
@offense_line_ranges << line_range
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Offenses registered in the same pass that share a line with `node`
|
|
108
|
+
# get joined onto that line too, so the combined line has to fit.
|
|
109
|
+
def joined_line_range(node)
|
|
110
|
+
sharing_ranges = @offense_line_ranges.select do |range|
|
|
111
|
+
range.begin <= node.last_line && node.first_line <= range.end
|
|
112
|
+
end
|
|
113
|
+
lines = [node.first_line, node.last_line, *sharing_ranges.flat_map(&:minmax)]
|
|
114
|
+
|
|
115
|
+
lines.min..lines.max
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def apply_reparse_correction(corrector, node)
|
|
119
|
+
corrector.replace(node, to_single_line(node.source).strip)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Joining lines shifts the value of any later `__LINE__`, exactly as
|
|
123
|
+
# any other line-removing correction does; neutralize it on both sides
|
|
124
|
+
# with an identifier, which stays valid in every position the keyword
|
|
125
|
+
# can appear in.
|
|
126
|
+
def preprocess_reparsed_source(source)
|
|
127
|
+
source.gsub(/\b__LINE__\b/, '__LINE0__')
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def normalize_reparsed_ast(node)
|
|
131
|
+
fold_string_concatenation(node)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Joining lines merges split string literals (`"a" \<newline> "b"` into
|
|
135
|
+
# `"ab"`) and turns mixed-quote pairs into `+` concatenation, which
|
|
136
|
+
# changes the tree but not the resulting string. Normalize all string
|
|
137
|
+
# concatenation to a canonical form before comparing: nested
|
|
138
|
+
# concatenations are flattened and adjacent literal parts merged.
|
|
139
|
+
def fold_string_concatenation(node)
|
|
140
|
+
return node unless node.is_a?(::Parser::AST::Node)
|
|
141
|
+
|
|
142
|
+
children = node.children.map { |child| fold_string_concatenation(child) }
|
|
143
|
+
node = node.updated(nil, children)
|
|
144
|
+
|
|
145
|
+
parts = string_concatenation_parts(node)
|
|
146
|
+
return node unless parts
|
|
147
|
+
|
|
148
|
+
merged = merge_string_parts(parts)
|
|
149
|
+
if merged.one? && merged.first.str_type?
|
|
150
|
+
node.updated(:str, merged.first.children)
|
|
151
|
+
else
|
|
152
|
+
node.updated(:dstr, merged)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def string_concatenation_parts(node)
|
|
157
|
+
case node.type
|
|
158
|
+
when :dstr
|
|
159
|
+
node.children
|
|
160
|
+
when :send
|
|
161
|
+
parts = [node.receiver, *node.arguments]
|
|
162
|
+
parts if node.method?(:+) && parts.all? { |part| stringish?(part) }
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def merge_string_parts(parts)
|
|
167
|
+
flattened = parts.flat_map do |part|
|
|
168
|
+
part.is_a?(::Parser::AST::Node) && part.dstr_type? ? part.children : [part]
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
flattened.chunk_while { |left, right| plain_string?(left) && plain_string?(right) }
|
|
172
|
+
.map { |chunk| merge_plain_strings(chunk) }
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def merge_plain_strings(chunk)
|
|
176
|
+
return chunk.first if chunk.one?
|
|
177
|
+
|
|
178
|
+
chunk.first.updated(:str, [chunk.map { |part| part.children.first }.join])
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def stringish?(node)
|
|
182
|
+
node.is_a?(::Parser::AST::Node) && %i[str dstr].include?(node.type)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def plain_string?(node)
|
|
186
|
+
node.is_a?(::Parser::AST::Node) && node.str_type? && node.children.one?
|
|
85
187
|
end
|
|
86
188
|
|
|
87
189
|
def offense?(node)
|
|
@@ -110,7 +212,9 @@ module RuboCop
|
|
|
110
212
|
|
|
111
213
|
def other_cop_takes_precedence?(node)
|
|
112
214
|
single_line_block_chain_enabled? && any_descendant?(node, :any_block) do |block_node|
|
|
113
|
-
|
|
215
|
+
next unless (parent = block_node.parent)
|
|
216
|
+
|
|
217
|
+
parent.call_type? && parent.loc.dot && block_node.single_line?
|
|
114
218
|
end
|
|
115
219
|
end
|
|
116
220
|
|
|
@@ -22,6 +22,7 @@ module RuboCop
|
|
|
22
22
|
# puts 'error'
|
|
23
23
|
# end
|
|
24
24
|
class RescueEnsureAlignment < Base
|
|
25
|
+
include Alignment
|
|
25
26
|
include RangeHelp
|
|
26
27
|
include EndKeywordAlignment
|
|
27
28
|
extend AutoCorrector
|
|
@@ -29,8 +30,7 @@ module RuboCop
|
|
|
29
30
|
MSG = '`%<kw_loc>s` at %<kw_loc_line>d, %<kw_loc_column>d is not ' \
|
|
30
31
|
'aligned with `%<beginning>s` at ' \
|
|
31
32
|
'%<begin_loc_line>d, %<begin_loc_column>d.'
|
|
32
|
-
ANCESTOR_TYPES = %i[kwbegin
|
|
33
|
-
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS = %i[def defs].freeze
|
|
33
|
+
ANCESTOR_TYPES = %i[kwbegin any_def class module sclass any_block].freeze
|
|
34
34
|
ALTERNATIVE_ACCESS_MODIFIERS = %i[public_class_method private_class_method].freeze
|
|
35
35
|
|
|
36
36
|
def on_resbody(node)
|
|
@@ -75,9 +75,10 @@ module RuboCop
|
|
|
75
75
|
# Some inline node is sitting before current node.
|
|
76
76
|
return nil unless whitespace.source.strip.empty?
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
indentation = alignment_indentation(alignment_location)
|
|
79
|
+
return nil if indentation.nil?
|
|
79
80
|
|
|
80
|
-
corrector.replace(whitespace,
|
|
81
|
+
corrector.replace(whitespace, indentation)
|
|
81
82
|
end
|
|
82
83
|
|
|
83
84
|
def format_message(alignment_node, alignment_loc, kw_loc)
|
|
@@ -92,15 +93,28 @@ module RuboCop
|
|
|
92
93
|
)
|
|
93
94
|
end
|
|
94
95
|
|
|
95
|
-
#
|
|
96
|
+
# A run of spaces sized to the target column would be turned back into tabs by
|
|
97
|
+
# `Layout/IndentationStyle`, generally landing on a different column, so under
|
|
98
|
+
# tabs the target line's own indentation is reused. There is nothing to reuse
|
|
99
|
+
# when the target does not start its line.
|
|
100
|
+
def alignment_indentation(location)
|
|
101
|
+
return ' ' * location.column unless using_tabs?
|
|
102
|
+
return unless begins_its_line?(location)
|
|
103
|
+
|
|
104
|
+
location.source_line[/\A\s*/]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/MethodLength
|
|
96
108
|
def alignment_source(node, starting_loc)
|
|
97
109
|
ending_loc =
|
|
98
110
|
case node.type
|
|
99
|
-
when :block, :numblock, :kwbegin
|
|
111
|
+
when :block, :numblock, :itblock, :kwbegin
|
|
100
112
|
node.loc.begin
|
|
101
113
|
when :def, :defs, :class, :module,
|
|
102
114
|
:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
|
|
103
115
|
node.loc.name
|
|
116
|
+
when :sclass
|
|
117
|
+
node.identifier.source_range
|
|
104
118
|
when :masgn
|
|
105
119
|
node.lhs.source_range
|
|
106
120
|
else
|
|
@@ -110,7 +124,6 @@ module RuboCop
|
|
|
110
124
|
|
|
111
125
|
range_between(starting_loc.begin_pos, ending_loc.end_pos).source
|
|
112
126
|
end
|
|
113
|
-
# rubocop:enable Metrics/AbcSize
|
|
114
127
|
|
|
115
128
|
# We will use ancestor or wrapper with access modifier.
|
|
116
129
|
|
|
@@ -162,8 +175,7 @@ module RuboCop
|
|
|
162
175
|
end
|
|
163
176
|
|
|
164
177
|
def access_modifier_node(node)
|
|
165
|
-
return nil unless
|
|
166
|
-
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS.include?(node.type)
|
|
178
|
+
return nil unless node.any_def_type?
|
|
167
179
|
|
|
168
180
|
access_modifier_node = node.ancestors.first
|
|
169
181
|
return nil unless access_modifier?(access_modifier_node)
|
|
@@ -196,6 +208,14 @@ module RuboCop
|
|
|
196
208
|
def alignment_location(alignment_node)
|
|
197
209
|
if begin_end_alignment_style == 'start_of_line'
|
|
198
210
|
start_line_range(alignment_node)
|
|
211
|
+
elsif alignment_node.any_block_type?
|
|
212
|
+
# If the alignment node is a block, the `rescue`/`ensure` keyword should
|
|
213
|
+
# be aligned to the start of the block. It is possible that the block's
|
|
214
|
+
# `send_node` spans multiple lines, in which case it should align to the
|
|
215
|
+
# start of the last line.
|
|
216
|
+
send_node = alignment_node.send_node
|
|
217
|
+
range = processed_source.buffer.line_range(send_node.last_line)
|
|
218
|
+
range.adjust(begin_pos: range.source =~ /\S/)
|
|
199
219
|
else
|
|
200
220
|
alignment_node.source_range
|
|
201
221
|
end
|
|
@@ -25,13 +25,17 @@ module RuboCop
|
|
|
25
25
|
|
|
26
26
|
MSG = 'Put method call on a separate line if chained to a single line block.'
|
|
27
27
|
|
|
28
|
+
# `Style/FloatDivision` and `Style/NilComparison` rewrite a method chained to the block
|
|
29
|
+
# in the same pass, which must not start a line of its own.
|
|
28
30
|
def self.autocorrect_incompatible_with
|
|
29
|
-
[Style::MapToHash]
|
|
31
|
+
[Style::FloatDivision, Style::MapToHash, Style::NilComparison]
|
|
30
32
|
end
|
|
31
33
|
|
|
32
34
|
def on_send(node)
|
|
33
35
|
range = offending_range(node)
|
|
34
|
-
|
|
36
|
+
return if !range || heredoc_opened_before?(node.receiver, range)
|
|
37
|
+
|
|
38
|
+
add_offense(range) { |corrector| corrector.insert_before(range, "\n") }
|
|
35
39
|
end
|
|
36
40
|
alias on_csend on_send
|
|
37
41
|
|
|
@@ -63,6 +67,10 @@ module RuboCop
|
|
|
63
67
|
# l.(1) has no selector, so we use the opening parenthesis instead
|
|
64
68
|
node.loc.selector || node.loc.begin
|
|
65
69
|
end
|
|
70
|
+
|
|
71
|
+
def heredoc_opened_before?(receiver, range)
|
|
72
|
+
receiver.each_node(:any_str).any? { |str| str.heredoc? && str.first_line == range.line }
|
|
73
|
+
end
|
|
66
74
|
end
|
|
67
75
|
end
|
|
68
76
|
end
|
|
@@ -23,16 +23,8 @@ module RuboCop
|
|
|
23
23
|
cfg['EnforcedStyle'] || 'space'
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
def kind(token)
|
|
27
|
-
'comma' if token.comma? && !
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def before_semicolon?(token)
|
|
33
|
-
tokens = processed_source.tokens
|
|
34
|
-
|
|
35
|
-
tokens[tokens.index(token) + 1].semicolon?
|
|
26
|
+
def kind(token, next_token)
|
|
27
|
+
'comma' if token.comma? && !next_token.semicolon?
|
|
36
28
|
end
|
|
37
29
|
end
|
|
38
30
|
end
|
|
@@ -20,6 +20,7 @@ module RuboCop
|
|
|
20
20
|
|
|
21
21
|
def on_send(node)
|
|
22
22
|
return unless node.prefix_bang? && whitespace_after_operator?(node)
|
|
23
|
+
return if unary_tilde?(node.receiver)
|
|
23
24
|
|
|
24
25
|
add_offense(node) do |corrector|
|
|
25
26
|
corrector.remove(
|
|
@@ -33,6 +34,10 @@ module RuboCop
|
|
|
33
34
|
def whitespace_after_operator?(node)
|
|
34
35
|
node.receiver.source_range.begin_pos - node.source_range.begin_pos > 1
|
|
35
36
|
end
|
|
37
|
+
|
|
38
|
+
def unary_tilde?(receiver)
|
|
39
|
+
receiver.send_type? && receiver.unary_operation? && receiver.method?(:~)
|
|
40
|
+
end
|
|
36
41
|
end
|
|
37
42
|
end
|
|
38
43
|
end
|
|
@@ -20,9 +20,19 @@ module RuboCop
|
|
|
20
20
|
cfg['EnforcedStyle'] || 'space'
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def kind(token)
|
|
23
|
+
def kind(token, _next_token)
|
|
24
24
|
'semicolon' if token.semicolon?
|
|
25
25
|
end
|
|
26
|
+
|
|
27
|
+
def space_missing?(token1, token2)
|
|
28
|
+
super && !semicolon_sequence?(token1, token2)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def semicolon_sequence?(token, next_token)
|
|
34
|
+
token.semicolon? && next_token.semicolon?
|
|
35
|
+
end
|
|
26
36
|
end
|
|
27
37
|
end
|
|
28
38
|
end
|
|
@@ -5,7 +5,9 @@ module RuboCop
|
|
|
5
5
|
module Layout
|
|
6
6
|
# Checks the spacing inside and after block parameters pipes. Line breaks
|
|
7
7
|
# inside parameter pipes are checked by `Layout/MultilineBlockLayout` and
|
|
8
|
-
# not by this cop.
|
|
8
|
+
# not by this cop. Spaces inside a lambda's parameter parentheses are left
|
|
9
|
+
# to `Layout/SpaceInsideParens` when that cop is enabled, so the examples
|
|
10
|
+
# below apply to a lambda only when it is not.
|
|
9
11
|
#
|
|
10
12
|
# @example EnforcedStyleInsidePipes: no_space (default)
|
|
11
13
|
# # bad
|
|
@@ -29,12 +31,12 @@ module RuboCop
|
|
|
29
31
|
include RangeHelp
|
|
30
32
|
extend AutoCorrector
|
|
31
33
|
|
|
32
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
34
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler -- checks spacing inside a block parameter list
|
|
33
35
|
arguments = node.arguments
|
|
34
36
|
|
|
35
37
|
return unless node.arguments? && pipes?(arguments)
|
|
36
38
|
|
|
37
|
-
check_inside_pipes(arguments)
|
|
39
|
+
check_inside_pipes(arguments) unless checked_by_space_inside_parens?(arguments)
|
|
38
40
|
check_after_closing_pipe(arguments) if node.body
|
|
39
41
|
check_each_arg(arguments)
|
|
40
42
|
end
|
|
@@ -53,6 +55,10 @@ module RuboCop
|
|
|
53
55
|
'EnforcedStyleInsidePipes'
|
|
54
56
|
end
|
|
55
57
|
|
|
58
|
+
def checked_by_space_inside_parens?(arguments)
|
|
59
|
+
arguments.loc.begin.source == '(' && config.cop_enabled?('Layout/SpaceInsideParens')
|
|
60
|
+
end
|
|
61
|
+
|
|
56
62
|
def check_inside_pipes(arguments)
|
|
57
63
|
case style
|
|
58
64
|
when :no_space
|
|
@@ -142,7 +148,7 @@ module RuboCop
|
|
|
142
148
|
if node
|
|
143
149
|
corrector.insert_before(node, ' ')
|
|
144
150
|
else
|
|
145
|
-
corrector.insert_after(
|
|
151
|
+
corrector.insert_after(range_between(space_begin_pos, space_begin_pos), ' ')
|
|
146
152
|
end
|
|
147
153
|
end
|
|
148
154
|
end
|
|
@@ -16,6 +16,8 @@ module RuboCop
|
|
|
16
16
|
#
|
|
17
17
|
# something = 123if test
|
|
18
18
|
#
|
|
19
|
+
# return(foo + bar)
|
|
20
|
+
#
|
|
19
21
|
# # good
|
|
20
22
|
# something 'test' do |x|
|
|
21
23
|
# end
|
|
@@ -24,6 +26,9 @@ module RuboCop
|
|
|
24
26
|
# end
|
|
25
27
|
#
|
|
26
28
|
# something = 123 if test
|
|
29
|
+
#
|
|
30
|
+
# return (foo + bar)
|
|
31
|
+
#
|
|
27
32
|
class SpaceAroundKeyword < Base
|
|
28
33
|
extend AutoCorrector
|
|
29
34
|
|
|
@@ -33,7 +38,7 @@ module RuboCop
|
|
|
33
38
|
DO = 'do'
|
|
34
39
|
SAFE_NAVIGATION = '&.'
|
|
35
40
|
NAMESPACE_OPERATOR = '::'
|
|
36
|
-
ACCEPT_LEFT_PAREN = %w[break defined? next not rescue
|
|
41
|
+
ACCEPT_LEFT_PAREN = %w[break defined? next not rescue super yield].freeze
|
|
37
42
|
ACCEPT_LEFT_SQUARE_BRACKET = %w[super yield].freeze
|
|
38
43
|
ACCEPT_NAMESPACE_OPERATOR = 'super'
|
|
39
44
|
RESTRICT_ON_SEND = %i[!].freeze
|
|
@@ -42,9 +47,11 @@ module RuboCop
|
|
|
42
47
|
check(node, [:operator].freeze) if node.keyword?
|
|
43
48
|
end
|
|
44
49
|
|
|
45
|
-
def on_block(node)
|
|
50
|
+
def on_block(node)
|
|
46
51
|
check(node, %i[begin end].freeze)
|
|
47
52
|
end
|
|
53
|
+
alias on_numblock on_block
|
|
54
|
+
alias on_itblock on_block
|
|
48
55
|
|
|
49
56
|
def on_break(node)
|
|
50
57
|
check(node, [:keyword].freeze)
|
|
@@ -162,7 +169,7 @@ module RuboCop
|
|
|
162
169
|
|
|
163
170
|
def check(node, locations, begin_keyword = DO)
|
|
164
171
|
locations.each do |loc|
|
|
165
|
-
next unless node.loc
|
|
172
|
+
next unless node.loc?(loc)
|
|
166
173
|
|
|
167
174
|
range = node.loc.public_send(loc)
|
|
168
175
|
next unless range
|
|
@@ -202,6 +209,7 @@ module RuboCop
|
|
|
202
209
|
end
|
|
203
210
|
|
|
204
211
|
return unless space_after_missing?(range)
|
|
212
|
+
return if block_brace_with_no_space_style?(node, range)
|
|
205
213
|
|
|
206
214
|
add_offense(range, message: format(MSG_AFTER, range: range.source)) do |corrector|
|
|
207
215
|
corrector.insert_after(range, ' ')
|
|
@@ -226,6 +234,15 @@ module RuboCop
|
|
|
226
234
|
!/[\s;,#\\)}\].]/.match?(char)
|
|
227
235
|
end
|
|
228
236
|
|
|
237
|
+
def block_brace_with_no_space_style?(node, range)
|
|
238
|
+
return false unless (parent = node.parent)
|
|
239
|
+
return false unless parent.any_block_type? && parent.loc.begin&.begin_pos == range.end_pos
|
|
240
|
+
|
|
241
|
+
space_before_block_braces_config = config.for_cop('Layout/SpaceBeforeBlockBraces')
|
|
242
|
+
space_before_block_braces_config.fetch('Enabled', true) &&
|
|
243
|
+
space_before_block_braces_config['EnforcedStyle'] == 'no_space'
|
|
244
|
+
end
|
|
245
|
+
|
|
229
246
|
def accepted_opening_delimiter?(range, char)
|
|
230
247
|
return true unless char
|
|
231
248
|
|
|
@@ -129,6 +129,12 @@ module RuboCop
|
|
|
129
129
|
check_operator(:class, node.loc.operator, rhs)
|
|
130
130
|
end
|
|
131
131
|
|
|
132
|
+
def on_def(node)
|
|
133
|
+
return unless node.endless?
|
|
134
|
+
|
|
135
|
+
check_operator(:assignment, node.loc.assignment, node.body)
|
|
136
|
+
end
|
|
137
|
+
|
|
132
138
|
def on_binary(node)
|
|
133
139
|
rhs = node.rhs
|
|
134
140
|
|
|
@@ -151,6 +157,14 @@ module RuboCop
|
|
|
151
157
|
check_operator(:match_pattern, node.loc.operator, node)
|
|
152
158
|
end
|
|
153
159
|
|
|
160
|
+
def on_match_alt(node)
|
|
161
|
+
check_operator(:match_alt, node.loc.operator, node)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def on_match_as(node)
|
|
165
|
+
check_operator(:match_as, node.loc.operator, node)
|
|
166
|
+
end
|
|
167
|
+
|
|
154
168
|
alias on_or on_binary
|
|
155
169
|
alias on_and on_binary
|
|
156
170
|
alias on_lvasgn on_assignment
|
|
@@ -162,6 +176,7 @@ module RuboCop
|
|
|
162
176
|
alias on_or_asgn on_assignment
|
|
163
177
|
alias on_and_asgn on_assignment
|
|
164
178
|
alias on_op_asgn on_assignment
|
|
179
|
+
alias on_defs on_def
|
|
165
180
|
|
|
166
181
|
private
|
|
167
182
|
|
|
@@ -196,10 +211,14 @@ module RuboCop
|
|
|
196
211
|
|
|
197
212
|
def autocorrect(corrector, range, right_operand)
|
|
198
213
|
range_source = range.source
|
|
214
|
+
# Match the operator exactly, not by substring, so compound assignments
|
|
215
|
+
# like `**=` and `/=` are not mistaken for `**` and `/` (which would drop
|
|
216
|
+
# the `=` and silently change the program's behavior).
|
|
217
|
+
operator = range_source.strip
|
|
199
218
|
|
|
200
|
-
if
|
|
219
|
+
if operator == '**' && !space_around_exponent_operator?
|
|
201
220
|
corrector.replace(range, '**')
|
|
202
|
-
elsif
|
|
221
|
+
elsif operator == '/' && !space_around_slash_operator?(right_operand)
|
|
203
222
|
corrector.replace(range, '/')
|
|
204
223
|
elsif range_source.end_with?("\n")
|
|
205
224
|
corrector.replace(range, " #{range_source.strip}\n")
|
|
@@ -239,7 +258,7 @@ module RuboCop
|
|
|
239
258
|
return false unless allow_for_alignment?
|
|
240
259
|
return false unless with_space.source.start_with?(EXCESSIVE_SPACE)
|
|
241
260
|
|
|
242
|
-
return !aligned_with_operator?(operator) unless type
|
|
261
|
+
return !aligned_with_operator?(operator) unless grouped_alignment_type?(type)
|
|
243
262
|
|
|
244
263
|
token = Token.new(operator, nil, operator.source)
|
|
245
264
|
align_preceding = aligned_with_preceding_equals_operator(token)
|
|
@@ -250,6 +269,10 @@ module RuboCop
|
|
|
250
269
|
aligned_with_subsequent_equals_operator(token) != :yes
|
|
251
270
|
end
|
|
252
271
|
|
|
272
|
+
def grouped_alignment_type?(type)
|
|
273
|
+
type == :assignment || (type == :special_asgn && force_equal_sign_alignment?)
|
|
274
|
+
end
|
|
275
|
+
|
|
253
276
|
def excess_trailing_space?(right_operand, with_space)
|
|
254
277
|
with_space.source.end_with?(EXCESSIVE_SPACE) &&
|
|
255
278
|
(!allow_for_alignment? || !aligned_with_something?(right_operand))
|
|
@@ -260,7 +283,10 @@ module RuboCop
|
|
|
260
283
|
end
|
|
261
284
|
|
|
262
285
|
def hash_table_style?
|
|
263
|
-
|
|
286
|
+
return false unless align_hash_cop_config
|
|
287
|
+
|
|
288
|
+
enforced_styles = Array(align_hash_cop_config['EnforcedHashRocketStyle'])
|
|
289
|
+
enforced_styles.include?('table')
|
|
264
290
|
end
|
|
265
291
|
|
|
266
292
|
def space_around_exponent_operator?
|
|
@@ -49,8 +49,11 @@ module RuboCop
|
|
|
49
49
|
MISSING_MSG = 'Space missing to the left of {.'
|
|
50
50
|
DETECTED_MSG = 'Space detected to the left of {.'
|
|
51
51
|
|
|
52
|
+
# `Style/BlockDelimiters` decides whether to put a space before the `do`
|
|
53
|
+
# it writes by looking at the source before this cop removed the space,
|
|
54
|
+
# so the two corrections cannot be applied in the same pass.
|
|
52
55
|
def self.autocorrect_incompatible_with
|
|
53
|
-
[Style::SymbolProc]
|
|
56
|
+
[Style::BlockDelimiters, Style::SymbolProc]
|
|
54
57
|
end
|
|
55
58
|
|
|
56
59
|
def on_block(node)
|
|
@@ -77,6 +80,7 @@ module RuboCop
|
|
|
77
80
|
end
|
|
78
81
|
|
|
79
82
|
alias on_numblock on_block
|
|
83
|
+
alias on_itblock on_block
|
|
80
84
|
|
|
81
85
|
private
|
|
82
86
|
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Layout
|
|
6
6
|
# Checks for space between the name of a receiver and a left
|
|
7
|
-
#
|
|
7
|
+
# bracket.
|
|
8
8
|
#
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
@@ -22,50 +22,17 @@ module RuboCop
|
|
|
22
22
|
RESTRICT_ON_SEND = %i[[] []=].freeze
|
|
23
23
|
|
|
24
24
|
def on_send(node)
|
|
25
|
-
return
|
|
25
|
+
return if node.loc.dot
|
|
26
26
|
|
|
27
|
-
begin_pos = first_argument.source_range.begin_pos
|
|
28
|
-
return unless (range = offense_range(node, begin_pos))
|
|
29
|
-
|
|
30
|
-
register_offense(range)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
private
|
|
34
|
-
|
|
35
|
-
def offense_range(node, begin_pos)
|
|
36
27
|
receiver_end_pos = node.receiver.source_range.end_pos
|
|
37
28
|
selector_begin_pos = node.loc.selector.begin_pos
|
|
38
29
|
return if receiver_end_pos >= selector_begin_pos
|
|
39
|
-
return if dot_before_brackets?(node, receiver_end_pos, selector_begin_pos)
|
|
40
|
-
|
|
41
|
-
if reference_variable_with_brackets?(node)
|
|
42
|
-
range_between(receiver_end_pos, selector_begin_pos)
|
|
43
|
-
elsif node.method?(:[]=)
|
|
44
|
-
offense_range_for_assignment(node, begin_pos)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def dot_before_brackets?(node, receiver_end_pos, selector_begin_pos)
|
|
49
|
-
return false unless node.loc.respond_to?(:dot) && (dot = node.loc.dot)
|
|
50
30
|
|
|
51
|
-
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def offense_range_for_assignment(node, begin_pos)
|
|
55
|
-
end_pos = node.receiver.source_range.end_pos
|
|
56
|
-
|
|
57
|
-
return if begin_pos - end_pos == 1 ||
|
|
58
|
-
(range = range_between(end_pos, begin_pos - 1)).source.start_with?('[')
|
|
59
|
-
|
|
60
|
-
range
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def register_offense(range)
|
|
64
|
-
add_offense(range) { |corrector| corrector.remove(range) }
|
|
65
|
-
end
|
|
31
|
+
range = range_between(receiver_end_pos, selector_begin_pos)
|
|
66
32
|
|
|
67
|
-
|
|
68
|
-
|
|
33
|
+
add_offense(range) do |corrector|
|
|
34
|
+
corrector.remove(range)
|
|
35
|
+
end
|
|
69
36
|
end
|
|
70
37
|
end
|
|
71
38
|
end
|