rubocop 1.71.1 → 1.91.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 +883 -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 +7 -2
- data/lib/rubocop/changed_files.rb +112 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/execute_runner.rb +52 -1
- 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 +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +58 -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 +92 -48
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +72 -49
- data/lib/rubocop/config_loader_resolver.rb +94 -28
- 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 +8 -0
- 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 +64 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +35 -14
- data/lib/rubocop/cop/badge.rb +9 -1
- data/lib/rubocop/cop/base.rb +93 -21
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +79 -10
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_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 +7 -1
- 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 +36 -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 +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- 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 -3
- 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 +14 -15
- 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 +92 -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_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/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 +59 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +163 -35
- 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 +1 -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_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +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 +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- 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 +9 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +105 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +56 -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 +20 -15
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +11 -13
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +157 -10
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +2 -3
- data/lib/rubocop/cop/layout/line_length.rb +160 -23
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +245 -40
- 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 +89 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +14 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -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 +1 -0
- 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 +42 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- 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_precedence.rb +1 -10
- 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 +20 -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 +137 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -19
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +185 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +44 -22
- 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 +19 -10
- 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 +149 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- 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 +36 -10
- 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 +56 -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 +60 -21
- 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/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +3 -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 +3 -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 +27 -9
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +5 -7
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- 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 +44 -16
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +29 -26
- 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/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +62 -6
- data/lib/rubocop/cop/mixin/project_index_help.rb +188 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -5
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +47 -11
- 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 +91 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +24 -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/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} +80 -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 +52 -9
- data/lib/rubocop/cop/registry.rb +233 -64
- 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 +33 -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 +47 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +49 -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 +5 -2
- 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 +7 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +43 -38
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +6 -8
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +135 -21
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -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 +7 -2
- 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 +8 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +54 -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 +122 -14
- 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 +3 -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 +11 -2
- data/lib/rubocop/cop/style/empty_method.rb +12 -8
- 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 +191 -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 +8 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- 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 +25 -17
- data/lib/rubocop/cop/style/for.rb +9 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- 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 +32 -23
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +28 -12
- 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 +105 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +7 -3
- 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 +18 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +25 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +71 -46
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +15 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -6
- 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 +10 -6
- 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 +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +12 -1
- data/lib/rubocop/cop/style/lambda_call.rb +26 -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 +5 -2
- 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 +31 -15
- 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 +34 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -5
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- 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 +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -18
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +111 -12
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -2
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +9 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +41 -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 +5 -1
- 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 +1 -1
- 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 +22 -13
- 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 +4 -0
- 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 +200 -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 +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +63 -5
- 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 +11 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +7 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -10
- 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 +2 -2
- 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 +164 -82
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +8 -8
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -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 +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- 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 +11 -6
- 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 +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -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 +13 -8
- 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 +3 -1
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +31 -15
- 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 +4 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +11 -9
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +11 -0
- 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 +18 -19
- 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 +2 -3
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- 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 +163 -45
- 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 +7 -3
- 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 +28 -10
- 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/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 +3 -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 +11 -6
- 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 +2 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +181 -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 +2 -3
- 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 +23 -8
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +31 -18
- data/lib/rubocop/magic_comment.rb +55 -0
- data/lib/rubocop/mcp/server.rb +199 -0
- data/lib/rubocop/options.rb +129 -21
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +146 -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 +14 -12
- data/lib/rubocop/result_cache.rb +90 -52
- 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 +294 -100
- 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/version.rb +48 -10
- data/lib/rubocop.rb +30 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +116 -19
- 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
|
@@ -53,11 +53,11 @@ module RuboCop
|
|
|
53
53
|
|
|
54
54
|
def on_def(node)
|
|
55
55
|
return if node.body || processed_source.contains_comment?(node.source_range)
|
|
56
|
-
return if correct_style?(node)
|
|
56
|
+
return if correct_style?(node) || compact_style_disallowed?
|
|
57
57
|
|
|
58
58
|
add_offense(node) do |corrector|
|
|
59
59
|
correction = corrected(node)
|
|
60
|
-
next if
|
|
60
|
+
next if correction_exceeds_line_length?(correction)
|
|
61
61
|
|
|
62
62
|
corrector.replace(node, correction)
|
|
63
63
|
end
|
|
@@ -74,6 +74,12 @@ module RuboCop
|
|
|
74
74
|
(compact_style? && compact?(node)) || (expanded_style? && expanded?(node))
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
+
def compact_style_disallowed?
|
|
78
|
+
return false unless compact_style?
|
|
79
|
+
|
|
80
|
+
config.for_enabled_cop('Style/SingleLineMethods')['AllowIfMethodIsEmpty'] == false
|
|
81
|
+
end
|
|
82
|
+
|
|
77
83
|
def corrected(node)
|
|
78
84
|
scope = node.receiver ? "#{node.receiver.source}." : ''
|
|
79
85
|
arguments = if node.arguments?
|
|
@@ -86,6 +92,10 @@ module RuboCop
|
|
|
86
92
|
["def #{signature}", 'end'].join(joint(node))
|
|
87
93
|
end
|
|
88
94
|
|
|
95
|
+
def correction_exceeds_line_length?(correction)
|
|
96
|
+
compact_style? && max_line_length && correction.size > max_line_length
|
|
97
|
+
end
|
|
98
|
+
|
|
89
99
|
def joint(node)
|
|
90
100
|
indent = ' ' * node.loc.column
|
|
91
101
|
|
|
@@ -107,12 +117,6 @@ module RuboCop
|
|
|
107
117
|
def expanded_style?
|
|
108
118
|
style == :expanded
|
|
109
119
|
end
|
|
110
|
-
|
|
111
|
-
def max_line_length
|
|
112
|
-
return unless config.cop_enabled?('Layout/LineLength')
|
|
113
|
-
|
|
114
|
-
config.for_cop('Layout/LineLength')['Max']
|
|
115
|
-
end
|
|
116
120
|
end
|
|
117
121
|
end
|
|
118
122
|
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for empty strings being assigned inside string interpolation.
|
|
7
|
+
#
|
|
8
|
+
# Empty strings are a meaningless outcome inside of string interpolation, so we remove them.
|
|
9
|
+
# Alternatively, when configured to do so, we prioritise using empty strings.
|
|
10
|
+
#
|
|
11
|
+
# While this cop would also apply to variables that are only going to be used as strings,
|
|
12
|
+
# RuboCop can't detect that, so we only check inside of string interpolation.
|
|
13
|
+
#
|
|
14
|
+
# @example EnforcedStyle: trailing_conditional (default)
|
|
15
|
+
# # bad
|
|
16
|
+
# "#{condition ? 'foo' : ''}"
|
|
17
|
+
#
|
|
18
|
+
# # good
|
|
19
|
+
# "#{'foo' if condition}"
|
|
20
|
+
#
|
|
21
|
+
# # bad
|
|
22
|
+
# "#{condition ? '' : 'foo'}"
|
|
23
|
+
#
|
|
24
|
+
# # good
|
|
25
|
+
# "#{'foo' unless condition}"
|
|
26
|
+
#
|
|
27
|
+
# @example EnforcedStyle: ternary
|
|
28
|
+
# # bad
|
|
29
|
+
# "#{'foo' if condition}"
|
|
30
|
+
#
|
|
31
|
+
# # good
|
|
32
|
+
# "#{condition ? 'foo' : ''}"
|
|
33
|
+
#
|
|
34
|
+
# # bad
|
|
35
|
+
# "#{'foo' unless condition}"
|
|
36
|
+
#
|
|
37
|
+
# # good
|
|
38
|
+
# "#{condition ? '' : 'foo'}"
|
|
39
|
+
#
|
|
40
|
+
class EmptyStringInsideInterpolation < Base
|
|
41
|
+
include ConfigurableEnforcedStyle
|
|
42
|
+
include Interpolation
|
|
43
|
+
extend AutoCorrector
|
|
44
|
+
|
|
45
|
+
MSG_TRAILING_CONDITIONAL = 'Do not use trailing conditionals in string interpolation.'
|
|
46
|
+
MSG_TERNARY = 'Do not return empty strings in string interpolation.'
|
|
47
|
+
|
|
48
|
+
def on_interpolation(node)
|
|
49
|
+
node.each_child_node(:if) do |child_node|
|
|
50
|
+
if style == :trailing_conditional
|
|
51
|
+
trailing_conditional_correction(child_node)
|
|
52
|
+
elsif style == :ternary
|
|
53
|
+
ternary_correction(node, child_node)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def trailing_conditional_correction(child_node)
|
|
61
|
+
# A modifier `if`/`unless` is already a trailing conditional and has
|
|
62
|
+
# no `else` branch, so the ternary-to-trailing rewrite does not apply.
|
|
63
|
+
return if child_node.modifier_form?
|
|
64
|
+
|
|
65
|
+
if empty_if_outcome?(child_node)
|
|
66
|
+
ternary_style_autocorrect(child_node, child_node.else_branch.source, 'unless')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
return unless empty_else_outcome?(child_node)
|
|
70
|
+
|
|
71
|
+
ternary_style_autocorrect(child_node, child_node.if_branch.source, 'if')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def ternary_correction(node, child_node)
|
|
75
|
+
return unless child_node.modifier_form?
|
|
76
|
+
|
|
77
|
+
ternary_component = if child_node.unless?
|
|
78
|
+
"'' : #{child_node.if_branch.source}"
|
|
79
|
+
else
|
|
80
|
+
"#{child_node.if_branch.source} : ''"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
add_offense(node, message: MSG_TRAILING_CONDITIONAL) do |corrector|
|
|
84
|
+
corrector.replace(node, "\#{#{child_node.condition.source} ? #{ternary_component}}")
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def empty_if_outcome?(node)
|
|
89
|
+
empty_branch_outcome?(node.if_branch)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def empty_else_outcome?(node)
|
|
93
|
+
empty_branch_outcome?(node.else_branch)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def empty_branch_outcome?(branch)
|
|
97
|
+
return false unless branch
|
|
98
|
+
|
|
99
|
+
branch.nil_type? || (branch.str_type? && branch.value.empty?)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def ternary_style_autocorrect(node, outcome, condition)
|
|
103
|
+
add_offense(node, message: MSG_TERNARY) do |corrector|
|
|
104
|
+
corrector.replace(node, "#{outcome} #{condition} #{node.condition.source}")
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -3,12 +3,18 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks
|
|
6
|
+
# Checks that source files have no utf-8 encoding comments.
|
|
7
|
+
# Since Ruby 2.0, UTF-8 is the default source encoding, so
|
|
8
|
+
# these comments are no longer necessary and just add noise.
|
|
9
|
+
#
|
|
7
10
|
# @example
|
|
8
11
|
# # bad
|
|
9
12
|
# # encoding: UTF-8
|
|
10
13
|
# # coding: UTF-8
|
|
11
14
|
# # -*- coding: UTF-8 -*-
|
|
15
|
+
#
|
|
16
|
+
# # good
|
|
17
|
+
# # No encoding comment needed
|
|
12
18
|
class Encoding < Base
|
|
13
19
|
include RangeHelp
|
|
14
20
|
extend AutoCorrector
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for END blocks.
|
|
6
|
+
# Checks for `END` blocks. `END` blocks are Perl-style constructs
|
|
7
|
+
# and `Kernel#at_exit` is the idiomatic Ruby alternative, as it's
|
|
8
|
+
# explicit and can be used anywhere.
|
|
7
9
|
#
|
|
8
10
|
# @example
|
|
9
11
|
# # bad
|
|
@@ -5,8 +5,11 @@ module RuboCop
|
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for endless methods.
|
|
7
7
|
#
|
|
8
|
-
# It can enforce
|
|
9
|
-
#
|
|
8
|
+
# It can enforce endless method definitions whenever possible or with single line methods.
|
|
9
|
+
# It can also disallow multiline endless method definitions or all endless definitions.
|
|
10
|
+
#
|
|
11
|
+
# `require_single_line` style enforces endless method definitions for single line methods.
|
|
12
|
+
# `require_always` style enforces endless method definitions for single statement methods.
|
|
10
13
|
#
|
|
11
14
|
# Other method definition types are not considered by this cop.
|
|
12
15
|
#
|
|
@@ -15,36 +18,116 @@ module RuboCop
|
|
|
15
18
|
# * allow_single_line (default) - only single line endless method definitions are allowed.
|
|
16
19
|
# * allow_always - all endless method definitions are allowed.
|
|
17
20
|
# * disallow - all endless method definitions are disallowed.
|
|
21
|
+
# * require_single_line - endless method definitions are required for single line methods.
|
|
22
|
+
# * require_always - all endless method definitions are required.
|
|
18
23
|
#
|
|
19
24
|
# NOTE: Incorrect endless method definitions will always be
|
|
20
25
|
# corrected to a multi-line definition.
|
|
21
26
|
#
|
|
22
27
|
# @example EnforcedStyle: allow_single_line (default)
|
|
28
|
+
# # bad, multi-line endless method
|
|
29
|
+
# def my_method = x.foo
|
|
30
|
+
# .bar
|
|
31
|
+
# .baz
|
|
32
|
+
#
|
|
23
33
|
# # good
|
|
24
|
-
# def my_method
|
|
34
|
+
# def my_method
|
|
35
|
+
# x
|
|
36
|
+
# end
|
|
25
37
|
#
|
|
26
|
-
# #
|
|
27
|
-
# def my_method
|
|
28
|
-
#
|
|
29
|
-
#
|
|
38
|
+
# # good
|
|
39
|
+
# def my_method = x
|
|
40
|
+
#
|
|
41
|
+
# # good
|
|
42
|
+
# def my_method
|
|
43
|
+
# x.foo
|
|
44
|
+
# .bar
|
|
45
|
+
# .baz
|
|
46
|
+
# end
|
|
30
47
|
#
|
|
31
48
|
# @example EnforcedStyle: allow_always
|
|
32
49
|
# # good
|
|
33
|
-
# def my_method
|
|
50
|
+
# def my_method
|
|
51
|
+
# x
|
|
52
|
+
# end
|
|
53
|
+
#
|
|
54
|
+
# # good
|
|
55
|
+
# def my_method = x
|
|
34
56
|
#
|
|
35
57
|
# # good
|
|
36
|
-
# def my_method
|
|
37
|
-
#
|
|
38
|
-
#
|
|
58
|
+
# def my_method = x.foo
|
|
59
|
+
# .bar
|
|
60
|
+
# .baz
|
|
61
|
+
#
|
|
62
|
+
# # good
|
|
63
|
+
# def my_method
|
|
64
|
+
# x.foo
|
|
65
|
+
# .bar
|
|
66
|
+
# .baz
|
|
67
|
+
# end
|
|
39
68
|
#
|
|
40
69
|
# @example EnforcedStyle: disallow
|
|
41
70
|
# # bad
|
|
42
|
-
# def my_method
|
|
71
|
+
# def my_method = x
|
|
43
72
|
#
|
|
44
73
|
# # bad
|
|
45
|
-
# def my_method
|
|
46
|
-
#
|
|
47
|
-
#
|
|
74
|
+
# def my_method = x.foo
|
|
75
|
+
# .bar
|
|
76
|
+
# .baz
|
|
77
|
+
#
|
|
78
|
+
# # good
|
|
79
|
+
# def my_method
|
|
80
|
+
# x
|
|
81
|
+
# end
|
|
82
|
+
#
|
|
83
|
+
# # good
|
|
84
|
+
# def my_method
|
|
85
|
+
# x.foo
|
|
86
|
+
# .bar
|
|
87
|
+
# .baz
|
|
88
|
+
# end
|
|
89
|
+
#
|
|
90
|
+
# @example EnforcedStyle: require_single_line
|
|
91
|
+
# # bad
|
|
92
|
+
# def my_method
|
|
93
|
+
# x
|
|
94
|
+
# end
|
|
95
|
+
#
|
|
96
|
+
# # bad
|
|
97
|
+
# def my_method = x.foo
|
|
98
|
+
# .bar
|
|
99
|
+
# .baz
|
|
100
|
+
#
|
|
101
|
+
# # good
|
|
102
|
+
# def my_method = x
|
|
103
|
+
#
|
|
104
|
+
# # good
|
|
105
|
+
# def my_method
|
|
106
|
+
# x.foo
|
|
107
|
+
# .bar
|
|
108
|
+
# .baz
|
|
109
|
+
# end
|
|
110
|
+
#
|
|
111
|
+
# @example EnforcedStyle: require_always
|
|
112
|
+
# # bad
|
|
113
|
+
# def my_method
|
|
114
|
+
# x
|
|
115
|
+
# end
|
|
116
|
+
#
|
|
117
|
+
# # bad
|
|
118
|
+
# def my_method
|
|
119
|
+
# x.foo
|
|
120
|
+
# .bar
|
|
121
|
+
# .baz
|
|
122
|
+
# end
|
|
123
|
+
#
|
|
124
|
+
# # good
|
|
125
|
+
# def my_method = x
|
|
126
|
+
#
|
|
127
|
+
# # good
|
|
128
|
+
# def my_method = x.foo
|
|
129
|
+
# .bar
|
|
130
|
+
# .baz
|
|
48
131
|
#
|
|
49
132
|
class EndlessMethod < Base
|
|
50
133
|
include ConfigurableEnforcedStyle
|
|
@@ -57,14 +140,24 @@ module RuboCop
|
|
|
57
140
|
CORRECTION_STYLES = %w[multiline single_line].freeze
|
|
58
141
|
MSG = 'Avoid endless method definitions.'
|
|
59
142
|
MSG_MULTI_LINE = 'Avoid endless method definitions with multiple lines.'
|
|
143
|
+
MSG_REQUIRE_SINGLE = 'Use endless method definitions for single line methods.'
|
|
144
|
+
MSG_REQUIRE_ALWAYS = 'Use endless method definitions.'
|
|
60
145
|
|
|
61
146
|
def on_def(node)
|
|
62
|
-
if
|
|
63
|
-
|
|
64
|
-
|
|
147
|
+
return if node.assignment_method? || use_heredoc?(node)
|
|
148
|
+
|
|
149
|
+
case style
|
|
150
|
+
when :allow_single_line, :allow_always
|
|
65
151
|
handle_allow_style(node)
|
|
152
|
+
when :disallow
|
|
153
|
+
handle_disallow_style(node)
|
|
154
|
+
when :require_single_line
|
|
155
|
+
handle_require_single_line_style(node)
|
|
156
|
+
when :require_always
|
|
157
|
+
handle_require_always_style(node)
|
|
66
158
|
end
|
|
67
159
|
end
|
|
160
|
+
alias on_defs on_def
|
|
68
161
|
|
|
69
162
|
private
|
|
70
163
|
|
|
@@ -73,14 +166,93 @@ module RuboCop
|
|
|
73
166
|
return if node.single_line? || style == :allow_always
|
|
74
167
|
|
|
75
168
|
add_offense(node, message: MSG_MULTI_LINE) do |corrector|
|
|
169
|
+
next if endless_parent?(node)
|
|
170
|
+
|
|
76
171
|
correct_to_multiline(corrector, node)
|
|
77
172
|
end
|
|
78
173
|
end
|
|
79
174
|
|
|
175
|
+
def handle_require_single_line_style(node)
|
|
176
|
+
if node.endless? && node.multiline?
|
|
177
|
+
add_offense(node, message: MSG_MULTI_LINE) do |corrector|
|
|
178
|
+
correct_to_multiline(corrector, node)
|
|
179
|
+
end
|
|
180
|
+
elsif !node.endless? && can_be_made_endless?(node) && single_line_when_made_endless?(node)
|
|
181
|
+
return if too_long_when_made_endless?(node)
|
|
182
|
+
|
|
183
|
+
add_offense(node, message: MSG_REQUIRE_SINGLE) do |corrector|
|
|
184
|
+
correct_to_endless(corrector, node)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def handle_require_always_style(node)
|
|
190
|
+
return if node.endless? || !can_be_made_endless?(node)
|
|
191
|
+
return if too_long_when_made_endless?(node)
|
|
192
|
+
|
|
193
|
+
add_offense(node, message: MSG_REQUIRE_ALWAYS) do |corrector|
|
|
194
|
+
correct_to_endless(corrector, node)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
80
198
|
def handle_disallow_style(node)
|
|
81
199
|
return unless node.endless?
|
|
82
200
|
|
|
83
|
-
add_offense(node)
|
|
201
|
+
add_offense(node) do |corrector|
|
|
202
|
+
next if endless_parent?(node)
|
|
203
|
+
|
|
204
|
+
correct_to_multiline(corrector, node)
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def endless_parent?(node)
|
|
209
|
+
node.parent&.any_def_type? && node.parent.endless?
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def use_heredoc?(node)
|
|
213
|
+
return false unless (body = node.body)
|
|
214
|
+
return true if body.any_str_type? && body.heredoc?
|
|
215
|
+
|
|
216
|
+
body.each_descendant(:str).any?(&:heredoc?)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def correct_to_endless(corrector, node)
|
|
220
|
+
corrector.replace(signature_to_body_range(node), ' = ')
|
|
221
|
+
corrector.remove(node.body.source_range.end.join(node.loc.end.end))
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def signature_to_body_range(node)
|
|
225
|
+
signature_end = node.arguments.any? ? node.arguments.source_range.end : node.loc.name.end
|
|
226
|
+
|
|
227
|
+
signature_end.join(node.body.source_range.begin)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def endless_replacement(node)
|
|
231
|
+
<<~RUBY.strip
|
|
232
|
+
def #{receiver(node)}#{node.method_name}#{arguments(node)} = #{node.body.source}
|
|
233
|
+
RUBY
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def receiver(node)
|
|
237
|
+
node.receiver ? "#{node.receiver.source}#{node.loc.operator.source}" : ''
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def arguments(node, missing = '')
|
|
241
|
+
node.arguments.any? ? node.arguments.source : missing
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def can_be_made_endless?(node)
|
|
245
|
+
node.body && !node.body.type?(:begin, :kwbegin, :rescue, :ensure)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def single_line_when_made_endless?(node)
|
|
249
|
+
!endless_replacement(node).include?("\n")
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def too_long_when_made_endless?(node)
|
|
253
|
+
return false unless config.cop_enabled?('Layout/LineLength')
|
|
254
|
+
|
|
255
|
+
endless_replacement(node).length + node.loc.column > max_line_length
|
|
84
256
|
end
|
|
85
257
|
end
|
|
86
258
|
end
|
|
@@ -45,6 +45,10 @@ module RuboCop
|
|
|
45
45
|
def on_send(node)
|
|
46
46
|
return unless env_home?(node)
|
|
47
47
|
return if node.arguments.count == 2 && !node.arguments[1].nil_type?
|
|
48
|
+
# `ENV.fetch('HOME') { default }` supplies a fallback, just like
|
|
49
|
+
# `ENV.fetch('HOME', default)`. `Dir.home` ignores the block, so
|
|
50
|
+
# converting would silently drop it.
|
|
51
|
+
return if node.block_node
|
|
48
52
|
|
|
49
53
|
add_offense(node) do |corrector|
|
|
50
54
|
corrector.replace(node, 'Dir.home')
|
|
@@ -4,12 +4,12 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Ensures that eval methods (`eval`, `instance_eval`, `class_eval`
|
|
7
|
-
# and `module_eval`) are given filename and line number values (
|
|
8
|
-
# and
|
|
7
|
+
# and `module_eval`) are given filename and line number values (`+__FILE__+`
|
|
8
|
+
# and `+__LINE__+`). This data is used to ensure that any errors raised
|
|
9
9
|
# within the evaluated code will be given the correct identification
|
|
10
10
|
# in a backtrace.
|
|
11
11
|
#
|
|
12
|
-
# The cop also checks that the line number given relative to
|
|
12
|
+
# The cop also checks that the line number given relative to `+__LINE__+` is
|
|
13
13
|
# correct.
|
|
14
14
|
#
|
|
15
15
|
# This cop will autocorrect incorrect or missing filename and line number
|
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
|
34
34
|
even_odd_candidate?(node) do |base_number, method, arg|
|
|
35
35
|
replacement_method = replacement_method(arg, method)
|
|
36
36
|
add_offense(node, message: format(MSG, method: replacement_method)) do |corrector|
|
|
37
|
-
correction = "#{base_number
|
|
37
|
+
correction = "#{receiver_source(base_number)}.#{replacement_method}?"
|
|
38
38
|
corrector.replace(node, correction)
|
|
39
39
|
end
|
|
40
40
|
end
|
|
@@ -42,6 +42,16 @@ module RuboCop
|
|
|
42
42
|
|
|
43
43
|
private
|
|
44
44
|
|
|
45
|
+
def receiver_source(node)
|
|
46
|
+
# A binary or unary operator receiver (e.g. `a * b`, `-a`) binds looser
|
|
47
|
+
# than the appended method call, so it must be wrapped in parentheses.
|
|
48
|
+
if node.send_type? && node.operator_method? && !node.method?(:[])
|
|
49
|
+
"(#{node.source})"
|
|
50
|
+
else
|
|
51
|
+
node.source
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
45
55
|
def replacement_method(arg, method)
|
|
46
56
|
case arg
|
|
47
57
|
when 0
|
|
@@ -43,7 +43,8 @@ module RuboCop
|
|
|
43
43
|
return unless (parsed_regexp = parse_regexp(regexp))
|
|
44
44
|
return unless exact_match_pattern?(parsed_regexp)
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
string = escape_single_quotes(parsed_regexp[1].text)
|
|
47
|
+
prefer = "#{receiver.source} #{new_method(node)} '#{string}'"
|
|
47
48
|
|
|
48
49
|
add_offense(node, message: format(MSG, prefer: prefer)) do |corrector|
|
|
49
50
|
corrector.replace(node, prefer)
|
|
@@ -53,6 +54,12 @@ module RuboCop
|
|
|
53
54
|
|
|
54
55
|
private
|
|
55
56
|
|
|
57
|
+
# Escape characters that are special inside a single-quoted string so the
|
|
58
|
+
# generated literal (e.g. for `/\Afoo'bar\z/`) stays valid Ruby.
|
|
59
|
+
def escape_single_quotes(text)
|
|
60
|
+
text.gsub(/['\\]/) { |char| "\\#{char}" }
|
|
61
|
+
end
|
|
62
|
+
|
|
56
63
|
def exact_match_pattern?(parsed_regexp)
|
|
57
64
|
tokens = parsed_regexp.map(&:token)
|
|
58
65
|
return false unless tokens[0] == :bos && tokens[1] == :literal && tokens[2] == :eos
|
|
@@ -137,11 +137,11 @@ module RuboCop
|
|
|
137
137
|
|
|
138
138
|
case depth(stripped_current_path)
|
|
139
139
|
when 0
|
|
140
|
-
range = arguments_range(current_path)
|
|
140
|
+
range = arguments_range(current_path.parent)
|
|
141
141
|
|
|
142
142
|
corrector.replace(range, '__FILE__')
|
|
143
143
|
when 1
|
|
144
|
-
range = arguments_range(current_path)
|
|
144
|
+
range = arguments_range(current_path.parent)
|
|
145
145
|
|
|
146
146
|
corrector.replace(range, '__dir__')
|
|
147
147
|
else
|
|
@@ -185,11 +185,6 @@ module RuboCop
|
|
|
185
185
|
corrector.remove(node.loc.dot)
|
|
186
186
|
corrector.remove(node.loc.selector)
|
|
187
187
|
end
|
|
188
|
-
|
|
189
|
-
def arguments_range(node)
|
|
190
|
-
range_between(node.parent.first_argument.source_range.begin_pos,
|
|
191
|
-
node.parent.last_argument.source_range.end_pos)
|
|
192
|
-
end
|
|
193
188
|
end
|
|
194
189
|
end
|
|
195
190
|
end
|
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
|
56
56
|
|
|
57
57
|
def initialize(config = nil, options = nil)
|
|
58
58
|
super
|
|
59
|
-
@def_nodes = Set.new
|
|
59
|
+
@def_nodes = Set.new.compare_by_identity
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
def on_yield(node)
|
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
|
65
65
|
yielding_block?(block_node) do |send_node, block_args, yield_args|
|
|
66
66
|
return unless yielding_arguments?(block_args, yield_args)
|
|
67
67
|
|
|
68
|
-
def_node = block_node.each_ancestor(:
|
|
68
|
+
def_node = block_node.each_ancestor(:any_def).first
|
|
69
69
|
# if `yield` is being called outside of a method context, ignore
|
|
70
70
|
# this is not a valid ruby pattern, but can happen in haml or erb,
|
|
71
71
|
# so this can cause crashes in haml_lint
|
|
@@ -135,7 +135,13 @@ module RuboCop
|
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
def correct_call_node(node, corrector, block_name)
|
|
138
|
-
|
|
138
|
+
new_arguments = if node.zsuper_type?
|
|
139
|
+
args = build_new_arguments_for_zsuper(node) << "&#{block_name}"
|
|
140
|
+
args.join(', ')
|
|
141
|
+
else
|
|
142
|
+
"&#{block_name}"
|
|
143
|
+
end
|
|
144
|
+
corrector.insert_after(node, "(#{new_arguments})")
|
|
139
145
|
return unless node.parenthesized?
|
|
140
146
|
|
|
141
147
|
args_begin = Util.args_begin(node)
|
|
@@ -144,6 +150,13 @@ module RuboCop
|
|
|
144
150
|
corrector.remove(range)
|
|
145
151
|
end
|
|
146
152
|
|
|
153
|
+
def build_new_arguments_for_zsuper(node)
|
|
154
|
+
def_node = node.each_ancestor(:any_def).first
|
|
155
|
+
def_node.arguments.map do |arg|
|
|
156
|
+
arg.optarg_type? ? arg.node_parts[0] : arg.source
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
147
160
|
def block_body_range(block_node, send_node)
|
|
148
161
|
range_between(send_node.source_range.end_pos, block_node.loc.end.end_pos)
|
|
149
162
|
end
|
|
@@ -59,9 +59,10 @@ module RuboCop
|
|
|
59
59
|
#
|
|
60
60
|
class ExponentialNotation < Base
|
|
61
61
|
include ConfigurableEnforcedStyle
|
|
62
|
+
|
|
62
63
|
MESSAGES = {
|
|
63
|
-
scientific: 'Use a mantissa
|
|
64
|
-
engineering: 'Use an exponent divisible by 3 and a mantissa
|
|
64
|
+
scientific: 'Use a mantissa >= 1 and < 10.',
|
|
65
|
+
engineering: 'Use an exponent divisible by 3 and a mantissa >= 0.1 and < 1000.',
|
|
65
66
|
integral: 'Use an integer as mantissa, without trailing zero.'
|
|
66
67
|
}.freeze
|
|
67
68
|
|
|
@@ -87,7 +88,7 @@ module RuboCop
|
|
|
87
88
|
true
|
|
88
89
|
end
|
|
89
90
|
|
|
90
|
-
def integral(node)
|
|
91
|
+
def integral?(node)
|
|
91
92
|
mantissa, = node.source.split('e')
|
|
92
93
|
/^-?[1-9](\d*[1-9])?$/.match?(mantissa)
|
|
93
94
|
end
|
|
@@ -101,7 +102,7 @@ module RuboCop
|
|
|
101
102
|
when :engineering
|
|
102
103
|
!engineering?(node)
|
|
103
104
|
when :integral
|
|
104
|
-
!integral(node)
|
|
105
|
+
!integral?(node)
|
|
105
106
|
else
|
|
106
107
|
false
|
|
107
108
|
end
|