rubocop 1.79.2 → 1.88.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 +2 -2
- data/config/default.yml +259 -90
- data/config/obsoletion.yml +30 -1
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- 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 +1 -1
- data/lib/rubocop/cli.rb +35 -9
- data/lib/rubocop/comment_config.rb +59 -17
- data/lib/rubocop/config.rb +14 -10
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +37 -23
- data/lib/rubocop/config_loader_resolver.rb +20 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +1 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +10 -5
- data/lib/rubocop/cop/base.rb +25 -4
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -2
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +26 -7
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +33 -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/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +5 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- 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 +28 -2
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +9 -9
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -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 +41 -4
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +14 -7
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +26 -7
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +31 -13
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +10 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +34 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +7 -1
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- 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 +123 -7
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +26 -9
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -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 +229 -39
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +8 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +3 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +13 -3
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +4 -2
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +45 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +93 -11
- data/lib/rubocop/cop/lint/constant_resolution.rb +6 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +14 -8
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +0 -3
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -12
- 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 +6 -1
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +11 -0
- 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 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +19 -10
- data/lib/rubocop/cop/lint/multiple_comparison.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 +1 -1
- 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 +3 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +36 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +10 -3
- data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -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 +2 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +18 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- 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 +39 -7
- 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 +14 -0
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +12 -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 +28 -1
- data/lib/rubocop/cop/lint/to_json.rb +12 -16
- 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 +4 -2
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +7 -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/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_assignment.rb +53 -25
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +4 -4
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
- data/lib/rubocop/cop/lint/useless_or.rb +15 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +8 -4
- 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 +37 -11
- data/lib/rubocop/cop/lint/void.rb +39 -12
- data/lib/rubocop/cop/message_annotator.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -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 +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +12 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +4 -6
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +5 -5
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -60
- data/lib/rubocop/cop/mixin/line_length_help.rb +21 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/project_index_help.rb +48 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +0 -6
- data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -5
- data/lib/rubocop/cop/mixin.rb +86 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +5 -3
- data/lib/rubocop/cop/naming/predicate_method.rb +32 -8
- data/lib/rubocop/cop/naming/predicate_prefix.rb +12 -12
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/offense.rb +17 -1
- data/lib/rubocop/cop/registry.rb +62 -38
- data/lib/rubocop/cop/security/eval.rb +15 -2
- data/lib/rubocop/cop/security/io_methods.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +15 -4
- data/lib/rubocop/cop/style/accessor_grouping.rb +4 -2
- 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 +25 -7
- data/lib/rubocop/cop/style/array_first_last.rb +12 -1
- data/lib/rubocop/cop/style/array_intersect.rb +50 -12
- 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 +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +39 -32
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +19 -2
- data/lib/rubocop/cop/style/class_equality_comparison.rb +21 -13
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +36 -16
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +5 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +14 -19
- data/lib/rubocop/cop/style/constant_visibility.rb +20 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/dig_chain.rb +5 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +6 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -8
- data/lib/rubocop/cop/style/double_negation.rb +1 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +2 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_class_definition.rb +119 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- 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 +23 -5
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- 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 +15 -1
- data/lib/rubocop/cop/style/for.rb +3 -0
- data/lib/rubocop/cop/style/format_string.rb +4 -3
- data/lib/rubocop/cop/style/format_string_token.rb +49 -5
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +27 -22
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
- data/lib/rubocop/cop/style/hash_lookup_method.rb +106 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
- data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +16 -7
- data/lib/rubocop/cop/style/if_unless_modifier.rb +58 -18
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -12
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +4 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/lambda_call.rb +8 -8
- data/lib/rubocop/cop/style/magic_comment_format.rb +3 -3
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- 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 +17 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/min_max_comparison.rb +1 -1
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +4 -4
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -4
- data/lib/rubocop/cop/style/mutable_constant.rb +106 -12
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +21 -12
- data/lib/rubocop/cop/style/operator_method_call.rb +11 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +14 -3
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -0
- 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 +3 -2
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- 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_begin.rb +37 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +6 -3
- data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
- data/lib/rubocop/cop/style/redundant_each.rb +3 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +27 -5
- data/lib/rubocop/cop/style/redundant_interpolation.rb +11 -2
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +16 -0
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +36 -30
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +9 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -0
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- 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_struct_keyword_init.rb +114 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +31 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -3
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +25 -8
- 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 +51 -21
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +41 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +12 -3
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +17 -13
- data/lib/rubocop/cop/style/struct_inheritance.rb +13 -0
- data/lib/rubocop/cop/style/super_arguments.rb +2 -2
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +7 -6
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +11 -11
- 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 -0
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- 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/team.rb +87 -36
- data/lib/rubocop/cop/util.rb +2 -3
- data/lib/rubocop/cop/utils/format_string.rb +10 -0
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/variable.rb +1 -1
- data/lib/rubocop/cop/variable_force.rb +9 -7
- data/lib/rubocop/cops_documentation_generator.rb +4 -4
- data/lib/rubocop/directive_comment.rb +48 -4
- 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 +38 -14
- data/lib/rubocop/formatter/formatter_set.rb +2 -2
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +0 -2
- data/lib/rubocop/formatter/tap_formatter.rb +5 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lsp/diagnostic.rb +18 -33
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +43 -7
- data/lib/rubocop/lsp/runtime.rb +13 -4
- data/lib/rubocop/lsp/stdin_runner.rb +8 -17
- data/lib/rubocop/magic_comment.rb +20 -0
- data/lib/rubocop/mcp/server.rb +200 -0
- data/lib/rubocop/options.rb +35 -4
- data/lib/rubocop/path_util.rb +14 -2
- data/lib/rubocop/plugin/loader.rb +1 -1
- data/lib/rubocop/project_index_loader.rb +66 -0
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/remote_config.rb +10 -8
- data/lib/rubocop/result_cache.rb +61 -38
- data/lib/rubocop/rspec/cop_helper.rb +8 -0
- data/lib/rubocop/rspec/shared_contexts.rb +39 -5
- data/lib/rubocop/rspec/support.rb +2 -1
- data/lib/rubocop/runner.rb +134 -57
- data/lib/rubocop/server/cache.rb +6 -29
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/target_finder.rb +17 -10
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/version.rb +21 -3
- data/lib/rubocop.rb +28 -96
- data/lib/ruby_lsp/rubocop/addon.rb +23 -8
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +49 -15
- metadata +38 -9
|
@@ -16,6 +16,12 @@ module RuboCop
|
|
|
16
16
|
# enumerator.each { |item| item >= 2 } #=> [2, 3]
|
|
17
17
|
# ----
|
|
18
18
|
#
|
|
19
|
+
# NOTE: Return values in assignment method definitions such as `def foo=(arg)` are
|
|
20
|
+
# detected because they are in a void context. However, autocorrection does not remove
|
|
21
|
+
# the return value, as that would change behavior. In such cases, whether to remove
|
|
22
|
+
# the return value or rename the method to something more appropriate should be left to
|
|
23
|
+
# the user.
|
|
24
|
+
#
|
|
19
25
|
# @example CheckForMethodsWithNoSideEffects: false (default)
|
|
20
26
|
# # bad
|
|
21
27
|
# def some_method
|
|
@@ -81,8 +87,9 @@ module RuboCop
|
|
|
81
87
|
def on_block(node)
|
|
82
88
|
return unless node.body && !node.body.begin_type?
|
|
83
89
|
return unless in_void_context?(node.body)
|
|
90
|
+
return if node.method?(:each)
|
|
84
91
|
|
|
85
|
-
check_void_op(node.body)
|
|
92
|
+
check_void_op(node.body)
|
|
86
93
|
check_expression(node.body)
|
|
87
94
|
end
|
|
88
95
|
alias on_numblock on_block
|
|
@@ -101,22 +108,23 @@ module RuboCop
|
|
|
101
108
|
|
|
102
109
|
def check_begin(node)
|
|
103
110
|
expressions = *node
|
|
104
|
-
|
|
111
|
+
inside_each_block = node.each_ancestor(:any_block).first&.method?(:each)
|
|
112
|
+
expressions.pop if !in_void_context?(node) || inside_each_block
|
|
105
113
|
expressions.each do |expr|
|
|
106
|
-
check_void_op(expr)
|
|
107
|
-
block_node = node.each_ancestor(:any_block).first
|
|
108
|
-
|
|
109
|
-
block_node&.method?(:each)
|
|
110
|
-
end
|
|
111
|
-
|
|
114
|
+
check_void_op(expr) { inside_each_block }
|
|
112
115
|
check_expression(expr)
|
|
113
116
|
end
|
|
114
117
|
end
|
|
115
118
|
|
|
116
119
|
def check_expression(expr)
|
|
117
|
-
|
|
118
|
-
return
|
|
120
|
+
return check_if_expression(expr) if expr.if_type?
|
|
121
|
+
return check_case_expression(expr) if expr.case_type?
|
|
122
|
+
return check_case_match_expression(expr) if expr.case_match_type?
|
|
119
123
|
|
|
124
|
+
check_void_expression_nodes(expr)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def check_void_expression_nodes(expr)
|
|
120
128
|
check_literal(expr)
|
|
121
129
|
check_var(expr)
|
|
122
130
|
check_self(expr)
|
|
@@ -126,6 +134,22 @@ module RuboCop
|
|
|
126
134
|
check_nonmutating(expr)
|
|
127
135
|
end
|
|
128
136
|
|
|
137
|
+
def check_if_expression(if_node)
|
|
138
|
+
check_void_expression_nodes(if_node.body) if if_node.body
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def check_case_expression(case_node)
|
|
142
|
+
case_node.each_when { |when_node| check_expression(when_node.body) if when_node.body }
|
|
143
|
+
check_expression(case_node.else_branch) if case_node.else_branch
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def check_case_match_expression(case_node)
|
|
147
|
+
case_node.each_in_pattern do |in_pattern_node|
|
|
148
|
+
check_expression(in_pattern_node.body) if in_pattern_node.body
|
|
149
|
+
end
|
|
150
|
+
check_expression(case_node.else_branch) if case_node.else_branch
|
|
151
|
+
end
|
|
152
|
+
|
|
129
153
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
130
154
|
def check_void_op(node, &block)
|
|
131
155
|
node = node.children.first while node&.begin_type?
|
|
@@ -162,7 +186,9 @@ module RuboCop
|
|
|
162
186
|
end
|
|
163
187
|
|
|
164
188
|
def check_literal(node)
|
|
165
|
-
|
|
189
|
+
if !entirely_literal?(node) || node.xstr_type? || node.range_type? || node.nil_type?
|
|
190
|
+
return
|
|
191
|
+
end
|
|
166
192
|
|
|
167
193
|
add_offense(node, message: format(LIT_MSG, lit: node.source)) do |corrector|
|
|
168
194
|
autocorrect_void_expression(corrector, node)
|
|
@@ -232,7 +258,8 @@ module RuboCop
|
|
|
232
258
|
end
|
|
233
259
|
|
|
234
260
|
def autocorrect_void_expression(corrector, node)
|
|
235
|
-
return if node.parent.
|
|
261
|
+
return if node.parent.type?(:if, :case, :when, :case_match, :in_pattern)
|
|
262
|
+
return if (def_node = node.each_ancestor(:any_def).first) && def_node.assignment_method?
|
|
236
263
|
|
|
237
264
|
corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
|
|
238
265
|
end
|
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
|
17
17
|
#
|
|
18
18
|
# NOTE: The `ExcludedMethods` configuration is deprecated and only kept
|
|
19
19
|
# for backwards compatibility. Please use `AllowedMethods` and `AllowedPatterns`
|
|
20
|
-
# instead. By default, there are no methods
|
|
20
|
+
# instead. By default, there are no allowed methods.
|
|
21
21
|
#
|
|
22
22
|
# @example CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
|
|
23
23
|
#
|
|
@@ -4,6 +4,8 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Metrics
|
|
6
6
|
# Checks for excessive nesting of conditional and looping constructs.
|
|
7
|
+
# Deeply nested code is harder to read, understand, and maintain.
|
|
8
|
+
# Extracting nested logic into methods improves clarity.
|
|
7
9
|
#
|
|
8
10
|
# You can configure if blocks are considered using the `CountBlocks` and `CountModifierForms`
|
|
9
11
|
# options. When both are set to `false` (the default) blocks and modifier forms are not
|
|
@@ -11,6 +13,27 @@ module RuboCop
|
|
|
11
13
|
# calculation as well.
|
|
12
14
|
#
|
|
13
15
|
# The maximum level of nesting allowed is configurable.
|
|
16
|
+
#
|
|
17
|
+
# @example Max: 3 (default)
|
|
18
|
+
# # bad
|
|
19
|
+
# if condition1
|
|
20
|
+
# if condition2
|
|
21
|
+
# if condition3
|
|
22
|
+
# if condition4
|
|
23
|
+
# do_something
|
|
24
|
+
# end
|
|
25
|
+
# end
|
|
26
|
+
# end
|
|
27
|
+
# end
|
|
28
|
+
#
|
|
29
|
+
# # good
|
|
30
|
+
# if condition1
|
|
31
|
+
# if condition2
|
|
32
|
+
# if condition3
|
|
33
|
+
# do_something
|
|
34
|
+
# end
|
|
35
|
+
# end
|
|
36
|
+
# end
|
|
14
37
|
class BlockNesting < Base
|
|
15
38
|
NESTING_BLOCKS = %i[case case_match if while while_post until until_post for resbody].freeze
|
|
16
39
|
|
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
|
15
15
|
# NOTE: The `ExcludedMethods` and `IgnoredMethods` configuration is
|
|
16
16
|
# deprecated and only kept for backwards compatibility.
|
|
17
17
|
# Please use `AllowedMethods` and `AllowedPatterns` instead.
|
|
18
|
-
# By default, there are no methods
|
|
18
|
+
# By default, there are no allowed methods.
|
|
19
19
|
#
|
|
20
20
|
# @example CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
|
|
21
21
|
#
|
|
@@ -84,7 +84,10 @@ module RuboCop
|
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
def assignment?(node)
|
|
87
|
-
|
|
87
|
+
if node.masgn_type? || node.shorthand_asgn?
|
|
88
|
+
compound_assignment(node)
|
|
89
|
+
return false
|
|
90
|
+
end
|
|
88
91
|
|
|
89
92
|
node.for_type? ||
|
|
90
93
|
(node.respond_to?(:setter_method?) && node.setter_method?) ||
|
|
@@ -101,8 +104,6 @@ module RuboCop
|
|
|
101
104
|
child.respond_to?(:setter_method?) && !child.setter_method?
|
|
102
105
|
end
|
|
103
106
|
@assignment += will_be_miscounted
|
|
104
|
-
|
|
105
|
-
false
|
|
106
107
|
end
|
|
107
108
|
|
|
108
109
|
def simple_assignment?(node)
|
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
# Returns true
|
|
46
|
+
# Returns true only when name is a known iterating type (e.g. :each, :transform_values).
|
|
47
47
|
def iterating_method?(name)
|
|
48
48
|
KNOWN_ITERATING_METHODS.include? name
|
|
49
49
|
end
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# Lint/RedundantCopDisableDirective needs to be disabled so as
|
|
4
|
+
# to be able to provide examples of rubocop:disable comments.
|
|
5
|
+
# rubocop:disable Lint/RedundantCopDisableDirective
|
|
3
6
|
module RuboCop
|
|
4
7
|
module Cop
|
|
5
8
|
module Migration
|
|
6
|
-
#
|
|
9
|
+
# Checks that cop names in rubocop:disable comments are given with
|
|
7
10
|
# department name.
|
|
11
|
+
#
|
|
12
|
+
# @example
|
|
13
|
+
# # bad
|
|
14
|
+
# # rubocop:disable AbcSize
|
|
15
|
+
#
|
|
16
|
+
# # good
|
|
17
|
+
# # rubocop:disable Metrics/AbcSize
|
|
8
18
|
class DepartmentName < Base
|
|
9
19
|
include RangeHelp
|
|
10
20
|
extend AutoCorrector
|
|
@@ -79,3 +89,4 @@ module RuboCop
|
|
|
79
89
|
end
|
|
80
90
|
end
|
|
81
91
|
end
|
|
92
|
+
# rubocop:enable Lint/RedundantCopDisableDirective
|
|
@@ -222,12 +222,12 @@ module RuboCop
|
|
|
222
222
|
def already_on_multiple_lines?(node)
|
|
223
223
|
return node.first_line != node.last_argument.last_line if node.any_def_type?
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
node.multiline?
|
|
226
226
|
end
|
|
227
227
|
|
|
228
228
|
def chained_to_heredoc?(node)
|
|
229
229
|
while (node = node.receiver)
|
|
230
|
-
return true if node.
|
|
230
|
+
return true if node.any_str_type? && node.heredoc?
|
|
231
231
|
end
|
|
232
232
|
|
|
233
233
|
false
|
|
@@ -14,6 +14,8 @@ module RuboCop
|
|
|
14
14
|
private
|
|
15
15
|
|
|
16
16
|
def too_long?(node)
|
|
17
|
+
return false unless max_line_length
|
|
18
|
+
|
|
17
19
|
lines = processed_source.lines[(node.first_line - 1)...node.last_line]
|
|
18
20
|
to_single_line(lines.join("\n")).length > max_line_length
|
|
19
21
|
end
|
|
@@ -27,10 +29,6 @@ module RuboCop
|
|
|
27
29
|
.gsub(/\s*\\?\n\s*/, ' ') # Any other line break, with or without backslash
|
|
28
30
|
end
|
|
29
31
|
|
|
30
|
-
def max_line_length
|
|
31
|
-
config.for_cop('Layout/LineLength')['Max']
|
|
32
|
-
end
|
|
33
|
-
|
|
34
32
|
def comment_within?(node)
|
|
35
33
|
comment_line_numbers = processed_source.comments.map { |comment| comment.loc.line }
|
|
36
34
|
|
|
@@ -40,9 +38,9 @@ module RuboCop
|
|
|
40
38
|
end
|
|
41
39
|
|
|
42
40
|
def safe_to_split?(node)
|
|
43
|
-
node.each_descendant(:if, :case, :kwbegin, :any_def).none? &&
|
|
41
|
+
node.each_descendant(:if, :case, :kwbegin, :any_def, :rescue, :ensure).none? &&
|
|
44
42
|
node.each_descendant(:dstr, :str).none? { |n| n.heredoc? || n.value.include?("\n") } &&
|
|
45
|
-
node.each_descendant(:begin, :sym).none?
|
|
43
|
+
node.each_descendant(:begin, :sym).none?(&:multiline?)
|
|
46
44
|
end
|
|
47
45
|
end
|
|
48
46
|
end
|
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
|
59
59
|
return node.loc.name if node.casgn_type?
|
|
60
60
|
|
|
61
61
|
if LSP.enabled?
|
|
62
|
-
end_range = node.loc
|
|
62
|
+
end_range = node.loc?(:name) ? node.loc.name : node.loc.begin
|
|
63
63
|
node.source_range.begin.join(end_range)
|
|
64
64
|
else
|
|
65
65
|
node.source_range
|
|
@@ -13,11 +13,12 @@ module RuboCop
|
|
|
13
13
|
`max=` is deprecated. Use `exclude_limit <ParameterName>` instead.
|
|
14
14
|
WARNING
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
cop_dir = RuboCop::ExcludeLimit.cop_dir_for(self.class.badge.to_s)
|
|
17
|
+
return unless cop_dir
|
|
18
|
+
|
|
19
|
+
cop_dir.mkpath
|
|
20
|
+
filepath = cop_dir.join(max_parameter_name)
|
|
21
|
+
filepath.write("#{value}\n", mode: 'a')
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
def max_parameter_name
|
|
@@ -19,8 +19,7 @@ module RuboCop
|
|
|
19
19
|
def check_end_kw_alignment(node, align_ranges)
|
|
20
20
|
return if ignored_node?(node)
|
|
21
21
|
|
|
22
|
-
end_loc = node.loc.end
|
|
23
|
-
return if accept_end_kw_alignment?(end_loc)
|
|
22
|
+
return unless (end_loc = node.loc.end)
|
|
24
23
|
|
|
25
24
|
matching = matching_ranges(end_loc, align_ranges)
|
|
26
25
|
|
|
@@ -57,11 +56,6 @@ module RuboCop
|
|
|
57
56
|
add_offense(end_loc, message: msg) { |corrector| autocorrect(corrector, node) }
|
|
58
57
|
end
|
|
59
58
|
|
|
60
|
-
def accept_end_kw_alignment?(end_loc)
|
|
61
|
-
end_loc.nil? || # Discard modifier forms of if/while/until.
|
|
62
|
-
!/\A[ \t]*end/.match?(processed_source.lines[end_loc.line - 1])
|
|
63
|
-
end
|
|
64
|
-
|
|
65
59
|
def style_parameter_name
|
|
66
60
|
'EnforcedStyleAlignWith'
|
|
67
61
|
end
|
|
@@ -13,7 +13,7 @@ module RuboCop
|
|
|
13
13
|
|
|
14
14
|
DefNode = Struct.new(:node) do
|
|
15
15
|
def selector
|
|
16
|
-
if node.loc
|
|
16
|
+
if node.loc?(:selector)
|
|
17
17
|
node.loc.selector
|
|
18
18
|
else
|
|
19
19
|
node.loc.keyword
|
|
@@ -125,7 +125,7 @@ module RuboCop
|
|
|
125
125
|
return if dispatch_node.assignment_method?
|
|
126
126
|
return if dispatch_node.parenthesized?
|
|
127
127
|
return if dispatch_node.parent && parentheses?(dispatch_node.parent)
|
|
128
|
-
return if last_expression?(dispatch_node) && !
|
|
128
|
+
return if last_expression?(dispatch_node) && !requires_parentheses_context?(dispatch_node)
|
|
129
129
|
|
|
130
130
|
def_node = node.each_ancestor(:call, :super, :yield).first
|
|
131
131
|
|
|
@@ -164,11 +164,11 @@ module RuboCop
|
|
|
164
164
|
!assignment_node.right_sibling
|
|
165
165
|
end
|
|
166
166
|
|
|
167
|
-
def
|
|
168
|
-
parent =
|
|
167
|
+
def requires_parentheses_context?(node)
|
|
168
|
+
parent = node.parent
|
|
169
169
|
return false unless parent
|
|
170
170
|
|
|
171
|
-
parent.type?(:call, :super, :yield)
|
|
171
|
+
parent.type?(:call, :if, :super, :until, :while, :yield)
|
|
172
172
|
end
|
|
173
173
|
|
|
174
174
|
def breakdown_value_types_of_hash(hash_node)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module HashTransformMethod
|
|
6
|
+
# Internal helper class to hold autocorrect data
|
|
7
|
+
Autocorrection = Struct.new(:match, :block_node, :leading, :trailing) do
|
|
8
|
+
def self.from_each_with_object(node, match)
|
|
9
|
+
new(match, node, 0, 0)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.from_hash_brackets_map(node, match)
|
|
13
|
+
new(match, node.children.last, 'Hash['.length, ']'.length)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.from_map_to_h(node, match)
|
|
17
|
+
if node.parent&.block_type? && node.parent.send_node == node
|
|
18
|
+
strip_trailing_chars = 0
|
|
19
|
+
else
|
|
20
|
+
map_range = node.children.first.source_range
|
|
21
|
+
node_range = node.source_range
|
|
22
|
+
strip_trailing_chars = node_range.end_pos - map_range.end_pos
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
new(match, node.children.first, 0, strip_trailing_chars)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.from_to_h(node, match)
|
|
29
|
+
new(match, node, 0, 0)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def strip_prefix_and_suffix(node, corrector)
|
|
33
|
+
expression = node.source_range
|
|
34
|
+
corrector.remove_leading(expression, leading)
|
|
35
|
+
corrector.remove_trailing(expression, trailing)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def set_new_method_name(new_method_name, corrector)
|
|
39
|
+
range = block_node.send_node.loc.selector
|
|
40
|
+
if (send_end = block_node.send_node.loc.end)
|
|
41
|
+
# If there are arguments (only true in the `each_with_object`
|
|
42
|
+
# case)
|
|
43
|
+
range = range.begin.join(send_end)
|
|
44
|
+
end
|
|
45
|
+
corrector.replace(range, new_method_name)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def set_new_arg_name(transformed_argname, corrector)
|
|
49
|
+
corrector.replace(block_node.arguments, "|#{transformed_argname}|")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def set_new_body_expression(transforming_body_expr, corrector)
|
|
53
|
+
body_source = transforming_body_expr.source
|
|
54
|
+
if transforming_body_expr.hash_type? && !transforming_body_expr.braces?
|
|
55
|
+
body_source = "{ #{body_source} }"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
corrector.replace(block_node.body, body_source)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'hash_transform_method/autocorrection'
|
|
4
|
+
|
|
3
5
|
module RuboCop
|
|
4
6
|
module Cop
|
|
5
7
|
# Common functionality for Style/HashTransformKeys and
|
|
@@ -27,68 +29,16 @@ module RuboCop
|
|
|
27
29
|
end
|
|
28
30
|
end
|
|
29
31
|
|
|
30
|
-
#
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
new(match, node.children.last, 'Hash['.length, ']'.length)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def self.from_map_to_h(node, match)
|
|
41
|
-
if node.parent&.block_type? && node.parent.send_node == node
|
|
42
|
-
strip_trailing_chars = 0
|
|
43
|
-
else
|
|
44
|
-
map_range = node.children.first.source_range
|
|
45
|
-
node_range = node.source_range
|
|
46
|
-
strip_trailing_chars = node_range.end_pos - map_range.end_pos
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
new(match, node.children.first, 0, strip_trailing_chars)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def self.from_to_h(node, match)
|
|
53
|
-
new(match, node, 0, 0)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def strip_prefix_and_suffix(node, corrector)
|
|
57
|
-
expression = node.source_range
|
|
58
|
-
corrector.remove_leading(expression, leading)
|
|
59
|
-
corrector.remove_trailing(expression, trailing)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def set_new_method_name(new_method_name, corrector)
|
|
63
|
-
range = block_node.send_node.loc.selector
|
|
64
|
-
if (send_end = block_node.send_node.loc.end)
|
|
65
|
-
# If there are arguments (only true in the `each_with_object`
|
|
66
|
-
# case)
|
|
67
|
-
range = range.begin.join(send_end)
|
|
68
|
-
end
|
|
69
|
-
corrector.replace(range, new_method_name)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def set_new_arg_name(transformed_argname, corrector)
|
|
73
|
-
corrector.replace(block_node.arguments, "|#{transformed_argname}|")
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def set_new_body_expression(transforming_body_expr, corrector)
|
|
77
|
-
body_source = transforming_body_expr.source
|
|
78
|
-
if transforming_body_expr.hash_type? && !transforming_body_expr.braces?
|
|
79
|
-
body_source = "{ #{body_source} }"
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
corrector.replace(block_node.body, body_source)
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# @!method array_receiver?(node)
|
|
87
|
-
def_node_matcher :array_receiver?, <<~PATTERN
|
|
88
|
-
{(array ...) (send _ :each_with_index) (send _ :with_index _ ?) (send _ :zip ...)}
|
|
32
|
+
# @!method hash_receiver?(node)
|
|
33
|
+
def_node_matcher :hash_receiver?, <<~PATTERN
|
|
34
|
+
{(hash ...)
|
|
35
|
+
(send _ {:to_h :to_hash :merge :merge! :update :invert :except :tally} ...)
|
|
36
|
+
(block (send _ {:group_by :to_h :tally :transform_keys :transform_keys!
|
|
37
|
+
:transform_values :transform_values!}) ...)
|
|
38
|
+
(block (send _ :each_with_object (hash)) ...)}
|
|
89
39
|
PATTERN
|
|
90
40
|
|
|
91
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
41
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
|
|
92
42
|
on_bad_each_with_object(node) do |*match|
|
|
93
43
|
handle_possible_offense(node, match, 'each_with_object')
|
|
94
44
|
end
|
|
@@ -8,8 +8,27 @@ module RuboCop
|
|
|
8
8
|
|
|
9
9
|
private
|
|
10
10
|
|
|
11
|
-
def
|
|
12
|
-
config.for_cop('Layout/LineLength')['
|
|
11
|
+
def allow_rbs_inline_annotation?
|
|
12
|
+
config.for_cop('Layout/LineLength')['AllowRBSInlineAnnotation']
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def rbs_inline_annotation_on_source_line?(line_index)
|
|
16
|
+
source_line_number = line_index + processed_source.buffer.first_line
|
|
17
|
+
comment = processed_source.comment_at_line(source_line_number)
|
|
18
|
+
|
|
19
|
+
return false unless comment
|
|
20
|
+
|
|
21
|
+
comment.text.start_with?(/#:|#\[.+\]|#\|/)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def allow_cop_directives?
|
|
25
|
+
# TODO: This logic for backward compatibility with deprecated `IgnoreCopDirectives` option.
|
|
26
|
+
# The following three lines will be removed in RuboCop 2.0.
|
|
27
|
+
ignore_cop_directives = config.for_cop('Layout/LineLength')['IgnoreCopDirectives']
|
|
28
|
+
return true if ignore_cop_directives
|
|
29
|
+
return false if ignore_cop_directives == false
|
|
30
|
+
|
|
31
|
+
config.for_cop('Layout/LineLength')['AllowCopDirectives']
|
|
13
32
|
end
|
|
14
33
|
|
|
15
34
|
def directive_on_source_line?(line_index)
|
|
@@ -73,7 +73,7 @@ module RuboCop
|
|
|
73
73
|
|
|
74
74
|
def location(node)
|
|
75
75
|
if LSP.enabled?
|
|
76
|
-
end_range = node.loc
|
|
76
|
+
end_range = node.loc?(:name) ? node.loc.name : node.loc.begin
|
|
77
77
|
node.source_range.begin.join(end_range)
|
|
78
78
|
else
|
|
79
79
|
node.source_range
|
|
@@ -200,7 +200,7 @@ module RuboCop
|
|
|
200
200
|
end
|
|
201
201
|
|
|
202
202
|
def grouped_expression?(node)
|
|
203
|
-
node.begin_type? && node.loc
|
|
203
|
+
node.begin_type? && node.loc?(:begin) && node.loc.begin
|
|
204
204
|
end
|
|
205
205
|
|
|
206
206
|
def inside_arg_list_parentheses?(node, ancestor)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Common helpers for cops that consult the project-wide static-analysis index
|
|
6
|
+
# via `Cop::Base#project_index`.
|
|
7
|
+
#
|
|
8
|
+
# Mixed-in cops gain the `external_dependency_checksum` override that invalidates
|
|
9
|
+
# the `ResultCache` whenever the indexed project files change on disk.
|
|
10
|
+
# To run index-backed analysis, cops should simply check whether `project_index` is non-nil;
|
|
11
|
+
# the runner only exposes a non-nil index when the user opted in via `AllCops/UseProjectIndex`
|
|
12
|
+
# and the underlying gem is available.
|
|
13
|
+
module ProjectIndexHelp
|
|
14
|
+
BUILTIN_DOCUMENT_URI = 'rubydex:built-in'
|
|
15
|
+
FILE_URI_PREFIX = 'file://'
|
|
16
|
+
# Matches the spurious leading slash before a Windows drive letter that
|
|
17
|
+
# remains after stripping `file://` from a `file:///C:/...` URI.
|
|
18
|
+
WINDOWS_DRIVE_PREFIX = %r{\A/(?=[A-Za-z]:[/\\])}.freeze
|
|
19
|
+
|
|
20
|
+
def external_dependency_checksum
|
|
21
|
+
return nil unless project_index
|
|
22
|
+
|
|
23
|
+
@external_dependency_checksum ||= Digest::SHA1.hexdigest(
|
|
24
|
+
project_index_signature.join("\n")
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def project_index_signature
|
|
31
|
+
project_index.documents.filter_map do |doc|
|
|
32
|
+
uri = doc.uri
|
|
33
|
+
next if uri == BUILTIN_DOCUMENT_URI
|
|
34
|
+
|
|
35
|
+
path = uri.delete_prefix(FILE_URI_PREFIX).sub(WINDOWS_DRIVE_PREFIX, '')
|
|
36
|
+
mtime, size = begin
|
|
37
|
+
stat = File.stat(path)
|
|
38
|
+
[stat.mtime.to_f, stat.size]
|
|
39
|
+
rescue StandardError
|
|
40
|
+
[0, 0]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
"#{path}:#{mtime}:#{size}"
|
|
44
|
+
end.sort
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -8,8 +8,8 @@ module RuboCop
|
|
|
8
8
|
MSG = 'Space missing after %<token>s.'
|
|
9
9
|
|
|
10
10
|
def on_new_investigation
|
|
11
|
-
each_missing_space(processed_source.tokens) do |token|
|
|
12
|
-
add_offense(token.pos, message: format(MSG, token: kind
|
|
11
|
+
each_missing_space(processed_source.tokens) do |token, kind|
|
|
12
|
+
add_offense(token.pos, message: format(MSG, token: kind)) do |corrector|
|
|
13
13
|
PunctuationCorrector.add_space(corrector, token)
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -19,11 +19,12 @@ module RuboCop
|
|
|
19
19
|
|
|
20
20
|
def each_missing_space(tokens)
|
|
21
21
|
tokens.each_cons(2) do |token1, token2|
|
|
22
|
-
|
|
22
|
+
kind = kind(token1, token2)
|
|
23
|
+
next unless kind
|
|
23
24
|
next unless space_missing?(token1, token2)
|
|
24
25
|
next unless space_required_before?(token2)
|
|
25
26
|
|
|
26
|
-
yield token1
|
|
27
|
+
yield token1, kind
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
30
|
|
|
@@ -100,12 +100,6 @@ module RuboCop
|
|
|
100
100
|
node.parent.send_type?
|
|
101
101
|
end
|
|
102
102
|
|
|
103
|
-
def max_line_length
|
|
104
|
-
return unless config.cop_enabled?('Layout/LineLength')
|
|
105
|
-
|
|
106
|
-
config.for_cop('Layout/LineLength')['Max']
|
|
107
|
-
end
|
|
108
|
-
|
|
109
103
|
def comment_disables_cop?(comment)
|
|
110
104
|
regexp_pattern = "# rubocop : (disable|todo) ([^,],)* (all|#{cop_name})"
|
|
111
105
|
Regexp.new(regexp_pattern.gsub(' ', '\s*')).match?(comment)
|