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
|
@@ -3,31 +3,40 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for uses of the case equality operator(
|
|
6
|
+
# Checks for uses of the case equality operator (`===`).
|
|
7
|
+
# The `===` operator has different behavior depending on the
|
|
8
|
+
# receiver and its use outside of `case`/`when` is confusing.
|
|
9
|
+
# Prefer more explicit alternatives like `is_a?`, `include?`,
|
|
10
|
+
# or `match?`.
|
|
7
11
|
#
|
|
8
12
|
# If `AllowOnConstant` option is enabled, the cop will ignore violations when the receiver of
|
|
9
13
|
# the case equality operator is a constant.
|
|
10
|
-
|
|
14
|
+
#
|
|
11
15
|
# If `AllowOnSelfClass` option is enabled, the cop will ignore violations when the receiver of
|
|
12
16
|
# the case equality operator is `self.class`. Note intermediate variables are not accepted.
|
|
13
17
|
#
|
|
18
|
+
# NOTE: Regexp case equality (`/regexp/ === var`) is allowed because changing it to
|
|
19
|
+
# `/regexp/.match?(var)` needs to take into account `Regexp.last_match?`, `$~`, `$1`, etc.
|
|
20
|
+
# This potentially incompatible transformation is handled by `Performance/RegexpMatch` cop.
|
|
21
|
+
#
|
|
14
22
|
# @example
|
|
15
23
|
# # bad
|
|
16
24
|
# (1..100) === 7
|
|
17
|
-
# /something/ === some_string
|
|
18
25
|
#
|
|
19
26
|
# # good
|
|
20
|
-
# something.is_a?(Array)
|
|
21
27
|
# (1..100).include?(7)
|
|
22
|
-
# /something/.match?(some_string)
|
|
23
28
|
#
|
|
24
29
|
# @example AllowOnConstant: false (default)
|
|
25
30
|
# # bad
|
|
26
31
|
# Array === something
|
|
27
32
|
#
|
|
33
|
+
# # good
|
|
34
|
+
# something.is_a?(Array)
|
|
35
|
+
#
|
|
28
36
|
# @example AllowOnConstant: true
|
|
29
37
|
# # good
|
|
30
38
|
# Array === something
|
|
39
|
+
# something.is_a?(Array)
|
|
31
40
|
#
|
|
32
41
|
# @example AllowOnSelfClass: false (default)
|
|
33
42
|
# # bad
|
|
@@ -51,7 +60,7 @@ module RuboCop
|
|
|
51
60
|
|
|
52
61
|
def on_send(node)
|
|
53
62
|
case_equality?(node) do |lhs, rhs|
|
|
54
|
-
return if lhs.const_type? && !lhs.module_name?
|
|
63
|
+
return if lhs.regexp_type? || (lhs.const_type? && !lhs.module_name?)
|
|
55
64
|
|
|
56
65
|
add_offense(node.loc.selector) do |corrector|
|
|
57
66
|
replacement = replacement(lhs, rhs)
|
|
@@ -71,13 +80,6 @@ module RuboCop
|
|
|
71
80
|
|
|
72
81
|
def replacement(lhs, rhs)
|
|
73
82
|
case lhs.type
|
|
74
|
-
when :regexp
|
|
75
|
-
# The automatic correction from `a === b` to `a.match?(b)` needs to
|
|
76
|
-
# consider `Regexp.last_match?`, `$~`, `$1`, and etc.
|
|
77
|
-
# This correction is expected to be supported by `Performance/Regexp` cop.
|
|
78
|
-
# See: https://github.com/rubocop/rubocop-performance/issues/152
|
|
79
|
-
#
|
|
80
|
-
# So here is noop.
|
|
81
83
|
when :begin
|
|
82
84
|
begin_replacement(lhs, rhs)
|
|
83
85
|
when :const
|
|
@@ -94,13 +96,25 @@ module RuboCop
|
|
|
94
96
|
end
|
|
95
97
|
|
|
96
98
|
def const_replacement(lhs, rhs)
|
|
97
|
-
"#{rhs
|
|
99
|
+
"#{parenthesize_if_needed(rhs)}.is_a?(#{lhs.source})"
|
|
98
100
|
end
|
|
99
101
|
|
|
100
102
|
def send_replacement(lhs, rhs)
|
|
101
103
|
return unless self_class?(lhs)
|
|
102
104
|
|
|
103
|
-
"#{rhs
|
|
105
|
+
"#{parenthesize_if_needed(rhs)}.is_a?(#{lhs.source})"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# `Array === a + b` must become `(a + b).is_a?(Array)`, not
|
|
109
|
+
# `a + b.is_a?(Array)` (which parses as `a + (b.is_a?(Array))`).
|
|
110
|
+
def parenthesize_if_needed(node)
|
|
111
|
+
requires_parentheses?(node) ? "(#{node.source})" : node.source
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def requires_parentheses?(node)
|
|
115
|
+
return true if node.type?(:and, :or, :if, :range) || node.assignment?
|
|
116
|
+
|
|
117
|
+
node.send_type? && (node.operator_method? || node.unary_operation?)
|
|
104
118
|
end
|
|
105
119
|
end
|
|
106
120
|
end
|
|
@@ -54,6 +54,10 @@ module RuboCop
|
|
|
54
54
|
|
|
55
55
|
MSG = 'Convert `if-elsif` to `case-when`.'
|
|
56
56
|
|
|
57
|
+
def self.autocorrect_incompatible_with
|
|
58
|
+
[Style::IfInsideElse]
|
|
59
|
+
end
|
|
60
|
+
|
|
57
61
|
def on_if(node)
|
|
58
62
|
return unless should_check?(node)
|
|
59
63
|
|
|
@@ -98,7 +102,7 @@ module RuboCop
|
|
|
98
102
|
node.elsif_conditional? && min_branches_count?(node)
|
|
99
103
|
end
|
|
100
104
|
|
|
101
|
-
# rubocop:disable Metrics/MethodLength
|
|
105
|
+
# rubocop:disable-next Metrics/MethodLength
|
|
102
106
|
def find_target(node)
|
|
103
107
|
case node.type
|
|
104
108
|
when :begin
|
|
@@ -106,7 +110,7 @@ module RuboCop
|
|
|
106
110
|
when :or
|
|
107
111
|
find_target(node.lhs)
|
|
108
112
|
when :match_with_lvasgn
|
|
109
|
-
lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
113
|
+
lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring -- `match_with_lvasgn` has no named operand accessors
|
|
110
114
|
if lhs.regexp_type?
|
|
111
115
|
rhs
|
|
112
116
|
elsif rhs.regexp_type?
|
|
@@ -116,7 +120,6 @@ module RuboCop
|
|
|
116
120
|
find_target_in_send_node(node)
|
|
117
121
|
end
|
|
118
122
|
end
|
|
119
|
-
# rubocop:enable Metrics/MethodLength
|
|
120
123
|
|
|
121
124
|
def find_target_in_send_node(node)
|
|
122
125
|
case node.method_name
|
|
@@ -172,7 +175,7 @@ module RuboCop
|
|
|
172
175
|
return collect_conditions(node.lhs, target, conditions) &&
|
|
173
176
|
collect_conditions(node.rhs, target, conditions)
|
|
174
177
|
when :match_with_lvasgn
|
|
175
|
-
lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
178
|
+
lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring -- `match_with_lvasgn` has no named operand accessors
|
|
176
179
|
condition_from_binary_op(lhs, rhs, target)
|
|
177
180
|
when :send
|
|
178
181
|
condition_from_send_node(node, target)
|
|
@@ -181,7 +184,7 @@ module RuboCop
|
|
|
181
184
|
conditions << condition if condition
|
|
182
185
|
end
|
|
183
186
|
|
|
184
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
187
|
+
# rubocop:disable-next Metrics/CyclomaticComplexity
|
|
185
188
|
def condition_from_send_node(node, target)
|
|
186
189
|
case node.method_name
|
|
187
190
|
when :is_a?
|
|
@@ -196,7 +199,6 @@ module RuboCop
|
|
|
196
199
|
condition_from_include_or_cover_node(node, target)
|
|
197
200
|
end
|
|
198
201
|
end
|
|
199
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
200
202
|
|
|
201
203
|
def condition_from_equality_node(node, target)
|
|
202
204
|
condition = condition_from_binary_op(node.receiver, node.first_argument, target)
|
|
@@ -226,10 +228,9 @@ module RuboCop
|
|
|
226
228
|
end
|
|
227
229
|
|
|
228
230
|
def branch_conditions(node)
|
|
229
|
-
conditions = []
|
|
230
|
-
while node&.if_type? &&
|
|
231
|
+
conditions = [node.condition]
|
|
232
|
+
while (node = node.else_branch)&.if_type? && node.elsif?
|
|
231
233
|
conditions << node.condition
|
|
232
|
-
node = node.else_branch
|
|
233
234
|
end
|
|
234
235
|
conditions
|
|
235
236
|
end
|
|
@@ -260,7 +261,7 @@ module RuboCop
|
|
|
260
261
|
def regexp_with_working_captures?(node)
|
|
261
262
|
case node.type
|
|
262
263
|
when :match_with_lvasgn
|
|
263
|
-
lhs, _rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
264
|
+
lhs, _rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring -- `match_with_lvasgn` has no named operand accessors
|
|
264
265
|
node.loc.selector.source == '=~' && regexp_with_named_captures?(lhs)
|
|
265
266
|
when :send
|
|
266
267
|
node.method?(:match) &&
|
|
@@ -269,7 +270,7 @@ module RuboCop
|
|
|
269
270
|
end
|
|
270
271
|
|
|
271
272
|
def regexp_with_named_captures?(node)
|
|
272
|
-
node.regexp_type? && node.each_capture(named: true).
|
|
273
|
+
node.regexp_type? && node.each_capture(named: true).any?
|
|
273
274
|
end
|
|
274
275
|
end
|
|
275
276
|
end
|
|
@@ -8,8 +8,8 @@ module RuboCop
|
|
|
8
8
|
# essentially one-character strings, so this syntax
|
|
9
9
|
# is mostly redundant at this point.
|
|
10
10
|
#
|
|
11
|
-
#
|
|
12
|
-
# That's a good use case of
|
|
11
|
+
# A `?` character literal can be used to express meta and control characters.
|
|
12
|
+
# That's a good use case of a `?` literal so it doesn't count as an offense.
|
|
13
13
|
#
|
|
14
14
|
# @example
|
|
15
15
|
# # bad
|
|
@@ -3,29 +3,54 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks
|
|
7
|
-
#
|
|
6
|
+
# Checks that namespaced classes and modules are defined with a consistent style.
|
|
7
|
+
#
|
|
8
|
+
# With `nested` style, classes and modules should be defined separately (one constant
|
|
9
|
+
# on each line, without `::`). With `compact` style, classes and modules should be
|
|
10
|
+
# defined with fully qualified names (using `::` for namespaces).
|
|
11
|
+
#
|
|
12
|
+
# NOTE: The style chosen will affect `Module.nesting` for the class or module. Using
|
|
13
|
+
# `nested` style will result in each level being added, whereas `compact` style will
|
|
14
|
+
# only include the fully qualified class or module name.
|
|
15
|
+
#
|
|
16
|
+
# By default, `EnforcedStyle` applies to both classes and modules. If desired, separate
|
|
17
|
+
# styles can be defined for classes and modules by using `EnforcedStyleForClasses` and
|
|
18
|
+
# `EnforcedStyleForModules` respectively. If not set, or set to nil, the `EnforcedStyle`
|
|
19
|
+
# value will be used.
|
|
8
20
|
#
|
|
9
21
|
# @safety
|
|
10
22
|
# Autocorrection is unsafe.
|
|
11
23
|
#
|
|
12
|
-
# Moving from compact to nested children requires knowledge of whether the
|
|
13
|
-
# outer parent is a module or a class. Moving from nested to compact requires
|
|
14
|
-
# verification that the outer parent is defined elsewhere. RuboCop does
|
|
15
|
-
# have the knowledge to perform either operation safely and thus requires
|
|
24
|
+
# Moving from `compact` to `nested` children requires knowledge of whether the
|
|
25
|
+
# outer parent is a module or a class. Moving from `nested` to `compact` requires
|
|
26
|
+
# verification that the outer parent is defined elsewhere. By default RuboCop does
|
|
27
|
+
# not have the knowledge to perform either operation safely and thus requires
|
|
16
28
|
# manual oversight.
|
|
17
29
|
#
|
|
30
|
+
# When `AllCops/UseProjectIndex` is enabled and the `rubydex` gem is installed,
|
|
31
|
+
# the project-wide index is consulted to resolve whether the outer parent is a
|
|
32
|
+
# class or a module, and compacting is skipped when the outer parent is not
|
|
33
|
+
# defined elsewhere.
|
|
34
|
+
#
|
|
18
35
|
# @example EnforcedStyle: nested (default)
|
|
36
|
+
# # bad
|
|
37
|
+
# class Foo::Bar
|
|
38
|
+
# end
|
|
39
|
+
#
|
|
19
40
|
# # good
|
|
20
|
-
# # have each child on its own line
|
|
21
41
|
# class Foo
|
|
22
42
|
# class Bar
|
|
23
43
|
# end
|
|
24
44
|
# end
|
|
25
45
|
#
|
|
26
46
|
# @example EnforcedStyle: compact
|
|
47
|
+
# # bad
|
|
48
|
+
# class Foo
|
|
49
|
+
# class Bar
|
|
50
|
+
# end
|
|
51
|
+
# end
|
|
52
|
+
#
|
|
27
53
|
# # good
|
|
28
|
-
# # combine definitions as much as possible
|
|
29
54
|
# class Foo::Bar
|
|
30
55
|
# end
|
|
31
56
|
#
|
|
@@ -33,25 +58,34 @@ module RuboCop
|
|
|
33
58
|
class ClassAndModuleChildren < Base
|
|
34
59
|
include Alignment
|
|
35
60
|
include ConfigurableEnforcedStyle
|
|
61
|
+
include ProjectIndexHelp
|
|
36
62
|
include RangeHelp
|
|
37
63
|
extend AutoCorrector
|
|
38
64
|
|
|
39
65
|
NESTED_MSG = 'Use nested module/class definitions instead of compact style.'
|
|
40
66
|
COMPACT_MSG = 'Use compact module/class definition instead of nested style.'
|
|
41
67
|
|
|
68
|
+
# `Style/StructInheritance` turns a class definition into a constant assignment in
|
|
69
|
+
# the same pass, which the compacted `class` keyword would then precede.
|
|
70
|
+
def self.autocorrect_incompatible_with
|
|
71
|
+
[Style::StructInheritance]
|
|
72
|
+
end
|
|
73
|
+
|
|
42
74
|
def on_class(node)
|
|
43
|
-
return if node.parent_class &&
|
|
75
|
+
return if node.parent_class && style_for_classes != :nested
|
|
44
76
|
|
|
45
|
-
check_style(node, node.body)
|
|
77
|
+
check_style(node, node.body, style_for_classes)
|
|
46
78
|
end
|
|
47
79
|
|
|
48
80
|
def on_module(node)
|
|
49
|
-
check_style(node, node.body)
|
|
81
|
+
check_style(node, node.body, style_for_modules)
|
|
50
82
|
end
|
|
51
83
|
|
|
52
84
|
private
|
|
53
85
|
|
|
54
86
|
def nest_or_compact(corrector, node)
|
|
87
|
+
style = style_for_kind(node.type)
|
|
88
|
+
|
|
55
89
|
if style == :nested
|
|
56
90
|
nest_definition(corrector, node)
|
|
57
91
|
else
|
|
@@ -60,21 +94,43 @@ module RuboCop
|
|
|
60
94
|
end
|
|
61
95
|
|
|
62
96
|
def nest_definition(corrector, node)
|
|
97
|
+
keyword = namespace_keyword(node)
|
|
98
|
+
# A namespace wrapper whose style resolves to `compact` would itself violate
|
|
99
|
+
# that style, making autocorrection ping-pong between the two forms.
|
|
100
|
+
return if style_for_kind(keyword.to_sym) == :compact
|
|
101
|
+
|
|
63
102
|
padding = indentation(node) + leading_spaces(node)
|
|
64
103
|
padding_for_trailing_end = padding.sub(' ' * node.loc.end.column, '')
|
|
65
104
|
|
|
66
|
-
|
|
105
|
+
corrector.replace(node.loc.keyword, keyword)
|
|
67
106
|
split_on_double_colon(corrector, node, padding)
|
|
68
107
|
add_trailing_end(corrector, node, padding_for_trailing_end)
|
|
69
108
|
end
|
|
70
109
|
|
|
71
|
-
def
|
|
72
|
-
|
|
110
|
+
def namespace_keyword(node)
|
|
111
|
+
indexed_namespace_keyword(node) || heuristic_namespace_keyword(node)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def indexed_namespace_keyword(node)
|
|
115
|
+
return nil unless project_index
|
|
116
|
+
|
|
117
|
+
declaration = resolve_constant_in_index(node.identifier.namespace)
|
|
118
|
+
|
|
119
|
+
case declaration
|
|
120
|
+
when Rubydex::Class then 'class'
|
|
121
|
+
when Rubydex::Module then 'module'
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def heuristic_namespace_keyword(node)
|
|
126
|
+
left_sibling = node.left_sibling
|
|
127
|
+
return 'module' unless left_sibling.is_a?(AST::Node)
|
|
128
|
+
|
|
129
|
+
class_definition = left_sibling.each_node(:class).find do |class_node|
|
|
73
130
|
class_node.identifier == node.identifier.namespace
|
|
74
131
|
end
|
|
75
|
-
namespace_keyword = class_definition ? 'class' : 'module'
|
|
76
132
|
|
|
77
|
-
|
|
133
|
+
class_definition ? 'class' : 'module'
|
|
78
134
|
end
|
|
79
135
|
|
|
80
136
|
def split_on_double_colon(corrector, node, padding)
|
|
@@ -92,11 +148,41 @@ module RuboCop
|
|
|
92
148
|
end
|
|
93
149
|
|
|
94
150
|
def compact_definition(corrector, node)
|
|
151
|
+
# Compacting produces a definition whose type's style resolves to `nested`,
|
|
152
|
+
# making autocorrection ping-pong between the two forms.
|
|
153
|
+
return if style_for_kind(node.body.type) == :nested
|
|
154
|
+
return unless compactible_namespace?(node)
|
|
155
|
+
|
|
95
156
|
compact_node(corrector, node)
|
|
96
157
|
remove_end(corrector, node.body)
|
|
97
158
|
unindent(corrector, node)
|
|
98
159
|
end
|
|
99
160
|
|
|
161
|
+
# Compacting removes this definition of the namespace, so the result raises
|
|
162
|
+
# `NameError` at load time unless the namespace is also defined somewhere else.
|
|
163
|
+
# With the project index this is verified before correcting; without it the
|
|
164
|
+
# correction is performed regardless (the cop's autocorrection is unsafe).
|
|
165
|
+
def compactible_namespace?(node)
|
|
166
|
+
return true unless project_index
|
|
167
|
+
|
|
168
|
+
declaration = resolve_constant_in_index(node.identifier)
|
|
169
|
+
return false unless declaration.is_a?(Rubydex::Namespace)
|
|
170
|
+
|
|
171
|
+
declaration.definitions.any? { |definition| definition_elsewhere?(definition, node) }
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def definition_elsewhere?(definition, node)
|
|
175
|
+
location = definition.location
|
|
176
|
+
return true unless location.uri.start_with?(FILE_URI_PREFIX)
|
|
177
|
+
|
|
178
|
+
!same_file?(location.to_file_path, processed_source.file_path) ||
|
|
179
|
+
location.to_display.start_line != node.first_line
|
|
180
|
+
rescue StandardError
|
|
181
|
+
# A path that cannot be converted or compared cannot prove the
|
|
182
|
+
# namespace is defined elsewhere; err on not correcting.
|
|
183
|
+
false
|
|
184
|
+
end
|
|
185
|
+
|
|
100
186
|
def compact_node(corrector, node)
|
|
101
187
|
range = range_between(node.loc.keyword.begin_pos, node.body.loc.name.end_pos)
|
|
102
188
|
corrector.replace(range, compact_replacement(node))
|
|
@@ -118,31 +204,77 @@ module RuboCop
|
|
|
118
204
|
end
|
|
119
205
|
|
|
120
206
|
def remove_end(corrector, body)
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
207
|
+
range = if same_line?(body.loc.name, body.loc.end)
|
|
208
|
+
single_line_end_range(body)
|
|
209
|
+
else
|
|
210
|
+
multiline_end_range(body)
|
|
211
|
+
end
|
|
124
212
|
|
|
125
213
|
corrector.remove(range)
|
|
126
214
|
end
|
|
127
215
|
|
|
216
|
+
def single_line_end_range(body)
|
|
217
|
+
raw = processed_source.raw_source
|
|
218
|
+
pos = body.loc.end.begin_pos
|
|
219
|
+
pos -= 1 while raw[pos - 1] == ' '
|
|
220
|
+
pos -= 1 if raw[pos - 1] == ';'
|
|
221
|
+
range_between(pos, body.loc.end.end_pos)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def multiline_end_range(body)
|
|
225
|
+
remove_begin_pos = body.loc.end.begin_pos - leading_spaces(body).size
|
|
226
|
+
adjustment = processed_source.raw_source[remove_begin_pos] == ';' ? 0 : 1
|
|
227
|
+
range_between(remove_begin_pos, body.loc.end.end_pos + adjustment)
|
|
228
|
+
end
|
|
229
|
+
|
|
128
230
|
def unindent(corrector, node)
|
|
129
|
-
|
|
231
|
+
column_delta = unindent_column_delta(node)
|
|
232
|
+
return unless column_delta&.negative?
|
|
233
|
+
|
|
234
|
+
range = unindentable_range(node.body)
|
|
235
|
+
return unless range
|
|
236
|
+
|
|
237
|
+
AlignmentCorrector.correct(
|
|
238
|
+
corrector, processed_source, range, column_delta, tab_indentation: true
|
|
239
|
+
)
|
|
240
|
+
end
|
|
130
241
|
|
|
131
|
-
|
|
132
|
-
|
|
242
|
+
def unindent_column_delta(node)
|
|
243
|
+
body = node.body.children.last
|
|
244
|
+
return unless body
|
|
133
245
|
|
|
134
|
-
|
|
135
|
-
|
|
246
|
+
node_indentation = spaces_size(leading_spaces(node))
|
|
247
|
+
body_indentation = spaces_size(leading_spaces(body))
|
|
136
248
|
|
|
137
|
-
|
|
249
|
+
node_indentation + configured_indentation_width - body_indentation
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def unindentable_range(body)
|
|
253
|
+
first_line = body.loc.name.line + 1
|
|
254
|
+
last_line = body.loc.end.line - 1
|
|
255
|
+
return if first_line > last_line
|
|
256
|
+
|
|
257
|
+
buffer = processed_source.buffer
|
|
258
|
+
range_between(buffer.line_range(first_line).begin_pos,
|
|
259
|
+
buffer.line_range(last_line).end_pos)
|
|
138
260
|
end
|
|
139
261
|
|
|
140
262
|
def leading_spaces(node)
|
|
141
263
|
node.source_range.source_line[/\A\s*/]
|
|
142
264
|
end
|
|
143
265
|
|
|
144
|
-
|
|
266
|
+
# A tab counts as `configured_indentation_width` columns, matching the
|
|
267
|
+
# width `AlignmentCorrector` uses to convert `column_delta` back into
|
|
268
|
+
# tabs. Using `Layout/IndentationStyle`'s own `IndentationWidth` here
|
|
269
|
+
# would make the delta and the correction disagree.
|
|
270
|
+
def spaces_size(spaces_string)
|
|
271
|
+
mapping = { "\t" => configured_indentation_width }
|
|
272
|
+
spaces_string.chars.sum { |character| mapping.fetch(character, 1) }
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def check_style(node, body, style)
|
|
145
276
|
return if node.identifier.namespace&.cbase_type?
|
|
277
|
+
return unless const_namespace?(node.identifier.namespace)
|
|
146
278
|
|
|
147
279
|
if style == :nested
|
|
148
280
|
check_nested_style(node)
|
|
@@ -151,8 +283,16 @@ module RuboCop
|
|
|
151
283
|
end
|
|
152
284
|
end
|
|
153
285
|
|
|
286
|
+
def const_namespace?(node)
|
|
287
|
+
return true if node.nil? || node.cbase_type?
|
|
288
|
+
return false unless node.const_type?
|
|
289
|
+
|
|
290
|
+
const_namespace?(node.namespace)
|
|
291
|
+
end
|
|
292
|
+
|
|
154
293
|
def check_nested_style(node)
|
|
155
294
|
return unless compact_node_name?(node)
|
|
295
|
+
return if node.parent&.type?(:class, :module)
|
|
156
296
|
|
|
157
297
|
add_offense(node.loc.name, message: NESTED_MSG) do |corrector|
|
|
158
298
|
autocorrect(corrector, node)
|
|
@@ -171,7 +311,7 @@ module RuboCop
|
|
|
171
311
|
end
|
|
172
312
|
|
|
173
313
|
def autocorrect(corrector, node)
|
|
174
|
-
return if node.class_type? && node.parent_class &&
|
|
314
|
+
return if node.class_type? && node.parent_class && style_for_classes != :nested
|
|
175
315
|
|
|
176
316
|
nest_or_compact(corrector, node)
|
|
177
317
|
end
|
|
@@ -183,6 +323,18 @@ module RuboCop
|
|
|
183
323
|
def compact_node_name?(node)
|
|
184
324
|
node.identifier.source.include?('::')
|
|
185
325
|
end
|
|
326
|
+
|
|
327
|
+
def style_for_kind(kind)
|
|
328
|
+
kind == :class ? style_for_classes : style_for_modules
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def style_for_classes
|
|
332
|
+
cop_config['EnforcedStyleForClasses']&.to_sym || style
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def style_for_modules
|
|
336
|
+
cop_config['EnforcedStyleForModules']&.to_sym || style
|
|
337
|
+
end
|
|
186
338
|
end
|
|
187
339
|
end
|
|
188
340
|
end
|
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
|
68
68
|
PATTERN
|
|
69
69
|
|
|
70
70
|
def on_send(node)
|
|
71
|
-
def_node = node.each_ancestor(:
|
|
71
|
+
def_node = node.each_ancestor(:any_def).first
|
|
72
72
|
return if def_node &&
|
|
73
73
|
(allowed_method?(def_node.method_name) ||
|
|
74
74
|
matches_allowed_pattern?(def_node.method_name))
|
|
@@ -90,25 +90,33 @@ module RuboCop
|
|
|
90
90
|
private
|
|
91
91
|
|
|
92
92
|
def class_name(class_node, node)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
unless class_name_method?(node.children.first.method_name)
|
|
94
|
+
# `var.class == 'Foo'` compares a `Class` to a `String` (always false) and
|
|
95
|
+
# has no valid `instance_of?` rewrite, so don't suggest one.
|
|
96
|
+
return if class_node.str_type?
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
# When a variable or return value of a method is used, it returns nil
|
|
104
|
-
# because the type is not known and cannot be suggested.
|
|
105
|
-
return
|
|
106
|
-
end
|
|
98
|
+
return class_node.source
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
if (receiver = class_node.receiver) && class_name_method?(class_node.method_name)
|
|
102
|
+
return receiver.source
|
|
107
103
|
end
|
|
108
104
|
|
|
105
|
+
return string_class_name(class_node) if class_node.str_type?
|
|
106
|
+
# When a variable or return value of a method is used, the type is not known
|
|
107
|
+
# and cannot be suggested.
|
|
108
|
+
return if unable_to_determine_type?(class_node)
|
|
109
|
+
|
|
109
110
|
class_node.source
|
|
110
111
|
end
|
|
111
112
|
|
|
113
|
+
def string_class_name(class_node)
|
|
114
|
+
value = trim_string_quotes(class_node)
|
|
115
|
+
# Avoid `::::Foo` when the name is already fully qualified.
|
|
116
|
+
value.prepend('::') if require_cbase?(class_node) && !value.start_with?('::')
|
|
117
|
+
value
|
|
118
|
+
end
|
|
119
|
+
|
|
112
120
|
def class_name_method?(method_name)
|
|
113
121
|
CLASS_NAME_METHODS.include?(method_name)
|
|
114
122
|
end
|
|
@@ -72,6 +72,7 @@ module RuboCop
|
|
|
72
72
|
return unless def_self_style?
|
|
73
73
|
return unless node.identifier.self_type?
|
|
74
74
|
return unless all_methods_public?(node)
|
|
75
|
+
return unless def_nodes(node).all? { |def_node| no_code_after?(def_node.source_range) }
|
|
75
76
|
|
|
76
77
|
add_offense(node, message: MSG_SCLASS) do |corrector|
|
|
77
78
|
autocorrect_sclass(node, corrector)
|
|
@@ -112,6 +113,13 @@ module RuboCop
|
|
|
112
113
|
end
|
|
113
114
|
end
|
|
114
115
|
|
|
116
|
+
def no_code_after?(range)
|
|
117
|
+
trailing = processed_source.lines[range.last_line - 1][range.last_column..].to_s.strip
|
|
118
|
+
trailing = trailing.sub(/\A;+\s*/, '')
|
|
119
|
+
|
|
120
|
+
trailing.empty? || trailing.start_with?('#')
|
|
121
|
+
end
|
|
122
|
+
|
|
115
123
|
def autocorrect_sclass(node, corrector)
|
|
116
124
|
rewritten_defs = []
|
|
117
125
|
|
|
@@ -140,15 +148,21 @@ module RuboCop
|
|
|
140
148
|
|
|
141
149
|
def extract_def_from_sclass(def_node, sclass_node)
|
|
142
150
|
range = source_range_with_comment(def_node)
|
|
143
|
-
source = range
|
|
144
|
-
"def #{def_node.method_name}",
|
|
145
|
-
"def self.#{def_node.method_name}"
|
|
146
|
-
)
|
|
147
|
-
|
|
151
|
+
source = prefix_def_with_self(range, def_node)
|
|
148
152
|
source = source.gsub(/^ {#{indentation_diff(def_node, sclass_node)}}/, '')
|
|
149
153
|
[range, source.chomp]
|
|
150
154
|
end
|
|
151
155
|
|
|
156
|
+
# Splice in `self.` at the actual `def` keyword rather than substituting the
|
|
157
|
+
# first textual `def <name>`, which may appear inside a preceding comment.
|
|
158
|
+
def prefix_def_with_self(range, def_node)
|
|
159
|
+
keyword_offset = def_node.loc.keyword.begin_pos - range.begin_pos
|
|
160
|
+
name_end_offset = def_node.loc.name.end_pos - range.begin_pos
|
|
161
|
+
source = range.source.dup
|
|
162
|
+
source[keyword_offset...name_end_offset] = "def self.#{def_node.method_name}"
|
|
163
|
+
source
|
|
164
|
+
end
|
|
165
|
+
|
|
152
166
|
def indentation_diff(node1, node2)
|
|
153
167
|
node1.loc.column - node2.loc.column
|
|
154
168
|
end
|