rubocop 1.79.2 → 1.87.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 +185 -20
- data/config/obsoletion.yml +9 -0
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -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 +8 -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/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/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_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -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 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +1 -1
- 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 +1 -1
- 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/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +7 -2
- data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18 -9
- 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 +4 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -6
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23 -9
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +23 -6
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +3 -3
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +3 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +15 -6
- 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/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_json.rb +12 -16
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -0
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
- 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 +48 -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 +1 -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/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 +14 -2
- data/lib/rubocop/cop/style/and_or.rb +1 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +25 -7
- data/lib/rubocop/cop/style/array_intersect.rb +46 -12
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -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 +27 -34
- data/lib/rubocop/cop/style/case_equality.rb +15 -13
- 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/collection_compact.rb +36 -16
- data/lib/rubocop/cop/style/colon_method_call.rb +3 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -18
- data/lib/rubocop/cop/style/constant_visibility.rb +17 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- 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/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +18 -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_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 +57 -17
- 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 +1 -1
- 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 +6 -2
- 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 +26 -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 +25 -7
- 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_modifier.rb +16 -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/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 +24 -7
- 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 +2 -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
|
@@ -27,67 +27,67 @@ module RuboCop
|
|
|
27
27
|
# line as the last element of the array.
|
|
28
28
|
#
|
|
29
29
|
# @example EnforcedStyle: symmetrical (default)
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
30
|
+
# # bad
|
|
31
|
+
# [ :a,
|
|
32
|
+
# :b
|
|
33
|
+
# ]
|
|
34
|
+
#
|
|
35
|
+
# # bad
|
|
36
|
+
# [
|
|
37
|
+
# :a,
|
|
38
|
+
# :b ]
|
|
39
|
+
#
|
|
40
|
+
# # good
|
|
41
|
+
# [ :a,
|
|
42
|
+
# :b ]
|
|
43
|
+
#
|
|
44
|
+
# # good
|
|
45
|
+
# [
|
|
46
|
+
# :a,
|
|
47
|
+
# :b
|
|
48
|
+
# ]
|
|
49
49
|
#
|
|
50
50
|
# @example EnforcedStyle: new_line
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
#
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
51
|
+
# # bad
|
|
52
|
+
# [
|
|
53
|
+
# :a,
|
|
54
|
+
# :b ]
|
|
55
|
+
#
|
|
56
|
+
# # bad
|
|
57
|
+
# [ :a,
|
|
58
|
+
# :b ]
|
|
59
|
+
#
|
|
60
|
+
# # good
|
|
61
|
+
# [ :a,
|
|
62
|
+
# :b
|
|
63
|
+
# ]
|
|
64
|
+
#
|
|
65
|
+
# # good
|
|
66
|
+
# [
|
|
67
|
+
# :a,
|
|
68
|
+
# :b
|
|
69
|
+
# ]
|
|
70
70
|
#
|
|
71
71
|
# @example EnforcedStyle: same_line
|
|
72
|
-
#
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
#
|
|
79
|
-
#
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
#
|
|
85
|
-
#
|
|
86
|
-
#
|
|
87
|
-
#
|
|
88
|
-
#
|
|
89
|
-
#
|
|
90
|
-
#
|
|
72
|
+
# # bad
|
|
73
|
+
# [ :a,
|
|
74
|
+
# :b
|
|
75
|
+
# ]
|
|
76
|
+
#
|
|
77
|
+
# # bad
|
|
78
|
+
# [
|
|
79
|
+
# :a,
|
|
80
|
+
# :b
|
|
81
|
+
# ]
|
|
82
|
+
#
|
|
83
|
+
# # good
|
|
84
|
+
# [
|
|
85
|
+
# :a,
|
|
86
|
+
# :b ]
|
|
87
|
+
#
|
|
88
|
+
# # good
|
|
89
|
+
# [ :a,
|
|
90
|
+
# :b ]
|
|
91
91
|
class MultilineArrayBraceLayout < Base
|
|
92
92
|
include MultilineLiteralBraceLayout
|
|
93
93
|
extend AutoCorrector
|
|
@@ -69,14 +69,18 @@ module RuboCop
|
|
|
69
69
|
SAME_LINE_OFFENSE = 'Right hand side of multi-line assignment is not ' \
|
|
70
70
|
'on the same line as the assignment operator `=`.'
|
|
71
71
|
|
|
72
|
+
BLOCK_TYPES = %i[block numblock itblock].freeze
|
|
73
|
+
|
|
74
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
72
75
|
def check_assignment(node, rhs)
|
|
73
76
|
return if node.send_type? && node.loc.operator&.source != '='
|
|
74
77
|
return unless rhs
|
|
75
78
|
return unless supported_types.include?(rhs.type)
|
|
76
|
-
return if rhs.single_line?
|
|
79
|
+
return if rhs.single_line? && (!rhs.block_type? || same_line?(node, rhs.loc.begin))
|
|
77
80
|
|
|
78
81
|
check_by_enforced_style(node, rhs)
|
|
79
82
|
end
|
|
83
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
80
84
|
|
|
81
85
|
def check_by_enforced_style(node, rhs)
|
|
82
86
|
case style
|
|
@@ -109,7 +113,10 @@ module RuboCop
|
|
|
109
113
|
private
|
|
110
114
|
|
|
111
115
|
def supported_types
|
|
112
|
-
@supported_types ||= cop_config['SupportedTypes'].
|
|
116
|
+
@supported_types ||= cop_config['SupportedTypes'].flat_map do |type|
|
|
117
|
+
sym = type.to_sym
|
|
118
|
+
sym == :block ? BLOCK_TYPES : sym
|
|
119
|
+
end
|
|
113
120
|
end
|
|
114
121
|
end
|
|
115
122
|
end
|
|
@@ -28,66 +28,66 @@ module RuboCop
|
|
|
28
28
|
#
|
|
29
29
|
# @example EnforcedStyle: symmetrical (default)
|
|
30
30
|
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
31
|
+
# # bad
|
|
32
|
+
# { a: 1,
|
|
33
|
+
# b: 2
|
|
34
|
+
# }
|
|
35
|
+
# # bad
|
|
36
|
+
# {
|
|
37
|
+
# a: 1,
|
|
38
|
+
# b: 2 }
|
|
39
|
+
#
|
|
40
|
+
# # good
|
|
41
|
+
# { a: 1,
|
|
42
|
+
# b: 2 }
|
|
43
|
+
#
|
|
44
|
+
# # good
|
|
45
|
+
# {
|
|
46
|
+
# a: 1,
|
|
47
|
+
# b: 2
|
|
48
|
+
# }
|
|
49
49
|
#
|
|
50
50
|
# @example EnforcedStyle: new_line
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
#
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
51
|
+
# # bad
|
|
52
|
+
# {
|
|
53
|
+
# a: 1,
|
|
54
|
+
# b: 2 }
|
|
55
|
+
#
|
|
56
|
+
# # bad
|
|
57
|
+
# { a: 1,
|
|
58
|
+
# b: 2 }
|
|
59
|
+
#
|
|
60
|
+
# # good
|
|
61
|
+
# { a: 1,
|
|
62
|
+
# b: 2
|
|
63
|
+
# }
|
|
64
|
+
#
|
|
65
|
+
# # good
|
|
66
|
+
# {
|
|
67
|
+
# a: 1,
|
|
68
|
+
# b: 2
|
|
69
|
+
# }
|
|
70
70
|
#
|
|
71
71
|
# @example EnforcedStyle: same_line
|
|
72
|
-
#
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
#
|
|
79
|
-
#
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
#
|
|
85
|
-
#
|
|
86
|
-
#
|
|
87
|
-
#
|
|
88
|
-
#
|
|
89
|
-
#
|
|
90
|
-
#
|
|
72
|
+
# # bad
|
|
73
|
+
# { a: 1,
|
|
74
|
+
# b: 2
|
|
75
|
+
# }
|
|
76
|
+
#
|
|
77
|
+
# # bad
|
|
78
|
+
# {
|
|
79
|
+
# a: 1,
|
|
80
|
+
# b: 2
|
|
81
|
+
# }
|
|
82
|
+
#
|
|
83
|
+
# # good
|
|
84
|
+
# {
|
|
85
|
+
# a: 1,
|
|
86
|
+
# b: 2 }
|
|
87
|
+
#
|
|
88
|
+
# # good
|
|
89
|
+
# { a: 1,
|
|
90
|
+
# b: 2 }
|
|
91
91
|
class MultilineHashBraceLayout < Base
|
|
92
92
|
include MultilineLiteralBraceLayout
|
|
93
93
|
extend AutoCorrector
|
|
@@ -46,10 +46,12 @@ module RuboCop
|
|
|
46
46
|
# .a
|
|
47
47
|
# .b
|
|
48
48
|
# .c
|
|
49
|
-
|
|
49
|
+
#
|
|
50
|
+
class MultilineMethodCallIndentation < Base # rubocop:disable Metrics/ClassLength
|
|
50
51
|
include ConfigurableEnforcedStyle
|
|
51
52
|
include Alignment
|
|
52
53
|
include MultilineExpressionIndentation
|
|
54
|
+
include RangeHelp
|
|
53
55
|
extend AutoCorrector
|
|
54
56
|
|
|
55
57
|
def validate_config
|
|
@@ -64,8 +66,39 @@ module RuboCop
|
|
|
64
66
|
|
|
65
67
|
private
|
|
66
68
|
|
|
69
|
+
def find_base_receiver(node)
|
|
70
|
+
base_receiver = node
|
|
71
|
+
base_receiver = base_receiver.receiver while base_receiver.receiver
|
|
72
|
+
base_receiver
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def find_pair_ancestor(node)
|
|
76
|
+
node.each_ancestor.find(&:pair_type?)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def unwrap_block_node(node)
|
|
80
|
+
node&.any_block_type? ? node.send_node : node
|
|
81
|
+
end
|
|
82
|
+
|
|
67
83
|
def autocorrect(corrector, node)
|
|
68
|
-
|
|
84
|
+
if @send_node.block_node
|
|
85
|
+
correct_selector_only(corrector, node)
|
|
86
|
+
correct_block(corrector, @send_node.block_node)
|
|
87
|
+
else
|
|
88
|
+
AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def correct_selector_only(corrector, node)
|
|
93
|
+
selector_line = processed_source.buffer.line_range(node.first_line)
|
|
94
|
+
selector_range = range_between(selector_line.begin_pos, selector_line.end_pos)
|
|
95
|
+
AlignmentCorrector.correct(corrector, processed_source, selector_range, @column_delta)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def correct_block(corrector, block_node)
|
|
99
|
+
AlignmentCorrector.correct(corrector, processed_source, block_node.body, @column_delta)
|
|
100
|
+
end_range = range_by_whole_lines(block_node.loc.end, include_final_newline: false)
|
|
101
|
+
AlignmentCorrector.correct(corrector, processed_source, end_range, @column_delta)
|
|
69
102
|
end
|
|
70
103
|
|
|
71
104
|
def relevant_node?(send_node)
|
|
@@ -86,27 +119,138 @@ module RuboCop
|
|
|
86
119
|
|
|
87
120
|
def offending_range(node, lhs, rhs, given_style)
|
|
88
121
|
return false unless begins_its_line?(rhs)
|
|
89
|
-
return false if not_for_this_cop?(node)
|
|
90
122
|
|
|
123
|
+
@send_node = node # Store for use in autocorrect
|
|
124
|
+
pair_ancestor = find_pair_ancestor(node)
|
|
125
|
+
if hash_pair_aligned?(pair_ancestor, given_style)
|
|
126
|
+
return check_hash_pair_indentation(node, lhs, rhs)
|
|
127
|
+
end
|
|
128
|
+
if hash_pair_indented?(node, pair_ancestor, given_style)
|
|
129
|
+
return check_hash_pair_indented_style(rhs, pair_ancestor)
|
|
130
|
+
end
|
|
131
|
+
return false if skip_for_context?(node, pair_ancestor)
|
|
132
|
+
|
|
133
|
+
check_regular_indentation(node, lhs, rhs, given_style)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def skip_for_context?(node, pair_ancestor)
|
|
137
|
+
pair_ancestor ? inside_multiline_chain_arg?(node) : not_for_this_cop?(node)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def hash_pair_aligned?(pair_ancestor, given_style)
|
|
141
|
+
pair_ancestor && given_style == :aligned
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def hash_pair_indented?(node, pair_ancestor, given_style)
|
|
145
|
+
pair_ancestor && given_style == :indented && find_base_receiver(node).hash_type?
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def check_hash_pair_indented_style(rhs, pair_ancestor)
|
|
149
|
+
pair_key = pair_ancestor.key
|
|
150
|
+
double_indentation = configured_indentation_width * 2
|
|
151
|
+
correct_column = pair_key.source_range.column + double_indentation
|
|
152
|
+
@hash_pair_base_column = pair_key.source_range.column + configured_indentation_width
|
|
153
|
+
|
|
154
|
+
calculate_column_delta_offense(rhs, correct_column)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def check_hash_pair_indentation(node, lhs, rhs)
|
|
158
|
+
@base = find_hash_pair_alignment_base(node)
|
|
159
|
+
return false if !@base && inside_multiline_chain_arg?(node)
|
|
160
|
+
|
|
161
|
+
@base ||= first_dot_alignment_base(node, rhs) || lhs.source_range
|
|
162
|
+
return if aligned_with_first_line_dot?(node, rhs)
|
|
163
|
+
|
|
164
|
+
calculate_column_delta_offense(rhs, @base.column)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def find_hash_pair_alignment_base(node)
|
|
168
|
+
base_receiver = find_base_receiver(node.receiver)
|
|
169
|
+
return unless base_receiver.hash_type?
|
|
170
|
+
|
|
171
|
+
first_call = first_call_has_a_dot(node)
|
|
172
|
+
first_call.loc.dot.join(first_call.loc.selector)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def first_dot_alignment_base(node, rhs)
|
|
176
|
+
return unless rhs.source.start_with?('.', '&.')
|
|
177
|
+
|
|
178
|
+
first_call = first_call_has_a_dot(node)
|
|
179
|
+
dot = first_call.loc.dot
|
|
180
|
+
return unless dot
|
|
181
|
+
return if first_call == node
|
|
182
|
+
|
|
183
|
+
after_block_base = after_multiline_block_base(first_call, node)
|
|
184
|
+
return after_block_base if after_block_base
|
|
185
|
+
|
|
186
|
+
return unless same_line?(dot, first_call.receiver.source_range)
|
|
187
|
+
|
|
188
|
+
dot.join(first_call.loc.selector)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def after_multiline_block_base(first_call, node)
|
|
192
|
+
return unless first_call.block_node&.multiline?
|
|
193
|
+
|
|
194
|
+
after_block = first_call.block_node.parent
|
|
195
|
+
return unless after_block&.call_type? && after_block.loc?(:dot) && after_block != node
|
|
196
|
+
|
|
197
|
+
after_block.loc.dot.join(after_block.loc.selector)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def inside_multiline_chain_arg?(node)
|
|
201
|
+
enclosing_call = find_enclosing_chain_call(node)
|
|
202
|
+
return false unless enclosing_call
|
|
203
|
+
|
|
204
|
+
!same_line?(enclosing_call.loc.selector, enclosing_call.receiver.source_range)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def find_enclosing_chain_call(node)
|
|
208
|
+
hash_ancestor = find_pair_ancestor(node).parent
|
|
209
|
+
enclosing_call = hash_ancestor.parent
|
|
210
|
+
return unless hash_arg_in_chain?(enclosing_call, hash_ancestor)
|
|
211
|
+
|
|
212
|
+
enclosing_call
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def hash_arg_in_chain?(call, hash_node)
|
|
216
|
+
call&.call_type? && call.receiver != hash_node && call.loc?(:dot)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def aligned_with_first_line_dot?(node, rhs)
|
|
220
|
+
return false unless rhs.source.start_with?('.', '&.')
|
|
221
|
+
|
|
222
|
+
first_call = first_call_has_a_dot(node)
|
|
223
|
+
return false if first_call == node.receiver
|
|
224
|
+
|
|
225
|
+
dot = first_call.loc.dot
|
|
226
|
+
dot.line == node.first_line && dot.column == rhs.column
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def check_regular_indentation(node, lhs, rhs, given_style)
|
|
91
230
|
@base = alignment_base(node, rhs, given_style)
|
|
92
231
|
correct_column = if @base
|
|
93
|
-
|
|
232
|
+
parent = node.parent
|
|
233
|
+
parent = parent.parent if parent&.any_block_type?
|
|
234
|
+
@base.column + extra_indentation(given_style, parent)
|
|
94
235
|
else
|
|
95
236
|
indentation(lhs) + correct_indentation(node)
|
|
96
237
|
end
|
|
238
|
+
|
|
239
|
+
calculate_column_delta_offense(rhs, correct_column)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def calculate_column_delta_offense(rhs, correct_column)
|
|
97
243
|
@column_delta = correct_column - rhs.column
|
|
98
244
|
rhs if @column_delta.nonzero?
|
|
99
245
|
end
|
|
100
246
|
|
|
101
247
|
def extra_indentation(given_style, parent)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
configured_indentation_width
|
|
107
|
-
end
|
|
248
|
+
return 0 unless given_style == :indented_relative_to_receiver
|
|
249
|
+
|
|
250
|
+
if parent&.type?(:splat, :kwsplat)
|
|
251
|
+
configured_indentation_width - parent.loc.operator.length
|
|
108
252
|
else
|
|
109
|
-
|
|
253
|
+
configured_indentation_width
|
|
110
254
|
end
|
|
111
255
|
end
|
|
112
256
|
|
|
@@ -125,7 +269,7 @@ module RuboCop
|
|
|
125
269
|
end
|
|
126
270
|
|
|
127
271
|
def should_align_with_base?
|
|
128
|
-
@base && style
|
|
272
|
+
@base && style == :aligned
|
|
129
273
|
end
|
|
130
274
|
|
|
131
275
|
def relative_to_receiver_message(rhs)
|
|
@@ -142,10 +286,16 @@ module RuboCop
|
|
|
142
286
|
end
|
|
143
287
|
|
|
144
288
|
def no_base_message(lhs, rhs, node)
|
|
145
|
-
|
|
289
|
+
if @hash_pair_base_column
|
|
290
|
+
used_indentation = rhs.column - @hash_pair_base_column
|
|
291
|
+
expected_indentation = configured_indentation_width
|
|
292
|
+
else
|
|
293
|
+
used_indentation = rhs.column - indentation(lhs)
|
|
294
|
+
expected_indentation = correct_indentation(node)
|
|
295
|
+
end
|
|
146
296
|
what = operation_description(node, rhs)
|
|
147
297
|
|
|
148
|
-
"Use #{
|
|
298
|
+
"Use #{expected_indentation} (not #{used_indentation}) " \
|
|
149
299
|
"spaces for indenting #{what} spanning multiple lines."
|
|
150
300
|
end
|
|
151
301
|
|
|
@@ -153,8 +303,6 @@ module RuboCop
|
|
|
153
303
|
case given_style
|
|
154
304
|
when :aligned
|
|
155
305
|
semantic_alignment_base(node, rhs) || syntactic_alignment_base(node, rhs)
|
|
156
|
-
when :indented
|
|
157
|
-
nil
|
|
158
306
|
when :indented_relative_to_receiver
|
|
159
307
|
receiver_alignment_base(node)
|
|
160
308
|
end
|
|
@@ -182,7 +330,7 @@ module RuboCop
|
|
|
182
330
|
return unless rhs.source.start_with?('.', '&.')
|
|
183
331
|
|
|
184
332
|
node = semantic_alignment_node(node)
|
|
185
|
-
return unless node&.loc
|
|
333
|
+
return unless node&.loc?(:selector) && node.loc.dot
|
|
186
334
|
|
|
187
335
|
node.loc.dot.join(node.loc.selector)
|
|
188
336
|
end
|
|
@@ -191,29 +339,55 @@ module RuboCop
|
|
|
191
339
|
# .b
|
|
192
340
|
# .c
|
|
193
341
|
def receiver_alignment_base(node)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
node = node.parent until node.loc.dot
|
|
342
|
+
hash_method_base = find_hash_method_base_in_receiver_chain(node)
|
|
343
|
+
return hash_method_base if hash_method_base
|
|
197
344
|
|
|
198
|
-
node
|
|
345
|
+
first_call = first_call_has_a_dot(node)
|
|
346
|
+
first_call.receiver.source_range
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def find_hash_method_base_in_receiver_chain(node)
|
|
350
|
+
receiver_chain = unwrap_block_node(node.receiver)
|
|
351
|
+
while receiver_chain&.call_type?
|
|
352
|
+
base_receiver = unwrap_block_node(receiver_chain.receiver)
|
|
353
|
+
if alignment_base_for_chained_receiver?(receiver_chain, base_receiver)
|
|
354
|
+
return receiver_chain.loc.dot.join(receiver_chain.loc.selector)
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
receiver_chain = base_receiver
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
def alignment_base_for_chained_receiver?(receiver_chain, base_receiver)
|
|
362
|
+
base_receiver&.hash_type? ||
|
|
363
|
+
method_on_receiver_last_line?(receiver_chain, base_receiver, :begin)
|
|
199
364
|
end
|
|
200
365
|
|
|
201
366
|
def semantic_alignment_node(node)
|
|
202
367
|
return if argument_in_method_call(node, :with_parentheses)
|
|
203
368
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return multiline_block_chain_node
|
|
209
|
-
end
|
|
369
|
+
get_dot_right_above(node) ||
|
|
370
|
+
find_multiline_block_chain_node(node) ||
|
|
371
|
+
first_call_alignment_node(node)
|
|
372
|
+
end
|
|
210
373
|
|
|
374
|
+
def first_call_alignment_node(node)
|
|
211
375
|
node = first_call_has_a_dot(node)
|
|
376
|
+
base_receiver = find_base_receiver(node)
|
|
377
|
+
|
|
378
|
+
return node if method_on_receiver_last_line?(node, base_receiver, :array)
|
|
212
379
|
return if node.loc.dot.line != node.first_line
|
|
380
|
+
return if method_on_receiver_last_line?(node, base_receiver, :begin)
|
|
213
381
|
|
|
214
382
|
node
|
|
215
383
|
end
|
|
216
384
|
|
|
385
|
+
def method_on_receiver_last_line?(node, base_receiver, type)
|
|
386
|
+
return false unless base_receiver
|
|
387
|
+
|
|
388
|
+
same_line?(node.loc.dot, base_receiver.source_range.end) && base_receiver.type?(type)
|
|
389
|
+
end
|
|
390
|
+
|
|
217
391
|
def get_dot_right_above(node)
|
|
218
392
|
node.each_ancestor.find do |a|
|
|
219
393
|
dot = a.loc.dot if a.loc?(:dot)
|
|
@@ -224,23 +398,39 @@ module RuboCop
|
|
|
224
398
|
end
|
|
225
399
|
|
|
226
400
|
def find_multiline_block_chain_node(node)
|
|
227
|
-
return
|
|
228
|
-
return unless block_node.multiline? && block_node.parent.call_type?
|
|
401
|
+
return find_continuation_node(node) if node.block_node
|
|
229
402
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
403
|
+
handle_descendant_block(node)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
def find_continuation_node(node)
|
|
407
|
+
receiver = node.receiver
|
|
408
|
+
return receiver.send_node if single_line_block_receiver?(receiver)
|
|
409
|
+
return unless receiver.call_type? && receiver.loc.dot
|
|
410
|
+
return receiver if receiver.receiver.begin_type? && node.block_node.single_line?
|
|
411
|
+
return unless receiver.loc.dot.line > receiver.receiver.last_line
|
|
412
|
+
|
|
413
|
+
receiver
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
def single_line_block_receiver?(receiver)
|
|
417
|
+
receiver.single_line? && receiver.any_block_type?
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
def handle_descendant_block(node)
|
|
421
|
+
receiver = node.receiver
|
|
422
|
+
return receiver.send_node if single_line_block_receiver?(receiver)
|
|
423
|
+
|
|
424
|
+
block_node = node.each_descendant(:any_block).first
|
|
425
|
+
return unless block_node&.multiline?
|
|
426
|
+
|
|
427
|
+
receiver.call_type? ? receiver : block_node.parent
|
|
235
428
|
end
|
|
236
429
|
|
|
237
430
|
def first_call_has_a_dot(node)
|
|
238
|
-
|
|
239
|
-
node =
|
|
240
|
-
# ascend to first call which has a dot
|
|
241
|
-
node = node.parent
|
|
431
|
+
base = find_base_receiver(node)
|
|
432
|
+
node = base.parent
|
|
242
433
|
node = node.parent until node.loc?(:dot)
|
|
243
|
-
|
|
244
434
|
node
|
|
245
435
|
end
|
|
246
436
|
|
|
@@ -10,6 +10,8 @@ module RuboCop
|
|
|
10
10
|
# condition, an explicit `return` statement, etc. In other contexts, the second operand should
|
|
11
11
|
# be indented regardless of enforced style.
|
|
12
12
|
#
|
|
13
|
+
# In both styles, operators should be aligned when an assignment begins on the next line.
|
|
14
|
+
#
|
|
13
15
|
# @example EnforcedStyle: aligned (default)
|
|
14
16
|
# # bad
|
|
15
17
|
# if a +
|
|
@@ -100,10 +102,12 @@ module RuboCop
|
|
|
100
102
|
return true if begins_its_line?(assignment_rhs.source_range)
|
|
101
103
|
end
|
|
102
104
|
|
|
103
|
-
given_style == :aligned
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
return false unless given_style == :aligned
|
|
106
|
+
return true if kw_node_with_special_indentation(node) || assignment_node
|
|
107
|
+
|
|
108
|
+
node = argument_in_method_call(node, :with_or_without_parentheses)
|
|
109
|
+
|
|
110
|
+
node.respond_to?(:def_modifier?) && !node.def_modifier?
|
|
107
111
|
end
|
|
108
112
|
|
|
109
113
|
def message(node, lhs, rhs)
|