rubocop 1.80.2 → 1.86.1
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 +170 -19
- data/config/obsoletion.yml +9 -0
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +3 -3
- 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 +1 -1
- data/lib/rubocop/cli.rb +28 -6
- data/lib/rubocop/comment_config.rb +62 -17
- data/lib/rubocop/config.rb +14 -10
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +20 -21
- data/lib/rubocop/config_loader_resolver.rb +9 -7
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
- data/lib/rubocop/config_store.rb +6 -1
- data/lib/rubocop/config_validator.rb +1 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +8 -4
- 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 +22 -6
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/documentation.rb +2 -3
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +1 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +10 -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 +28 -2
- 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/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +13 -6
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +12 -2
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +31 -13
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +1 -1
- 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 +8 -1
- 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 +111 -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_indentation.rb +204 -39
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -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_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/constant_reassignment.rb +59 -9
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- 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_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/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/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 +16 -6
- 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 +3 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23 -9
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +0 -9
- 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/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 +10 -2
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- 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/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +5 -3
- 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/useless_assignment.rb +45 -17
- 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/utils/nil_receiver_checker.rb +24 -9
- data/lib/rubocop/cop/lint/void.rb +39 -12
- data/lib/rubocop/cop/message_annotator.rb +1 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- 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/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/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/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +4 -2
- data/lib/rubocop/cop/naming/predicate_method.rb +27 -4
- data/lib/rubocop/cop/naming/predicate_prefix.rb +11 -11
- data/lib/rubocop/cop/offense.rb +9 -1
- data/lib/rubocop/cop/registry.rb +20 -13
- data/lib/rubocop/cop/security/eval.rb +15 -2
- 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 +4 -1
- 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 +2 -2
- 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/block_delimiters.rb +27 -34
- data/lib/rubocop/cop/style/case_equality.rb +15 -13
- data/lib/rubocop/cop/style/class_and_module_children.rb +11 -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 +1 -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/float_division.rb +15 -1
- data/lib/rubocop/cop/style/for.rb +3 -0
- 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_lookup_method.rb +101 -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 +1 -5
- 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/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 +2 -2
- 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/module_member_existence_check.rb +107 -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 +184 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +3 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -2
- 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 +26 -22
- 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_escape.rb +8 -0
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- 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/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +7 -7
- 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/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 +8 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- data/lib/rubocop/cop/style/super_arguments.rb +2 -2
- data/lib/rubocop/cop/style/symbol_proc.rb +4 -3
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- 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/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/team.rb +4 -4
- 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/cops_documentation_generator.rb +4 -4
- data/lib/rubocop/directive_comment.rb +48 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -1
- 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 +12 -5
- data/lib/rubocop/lsp/runtime.rb +13 -3
- 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 +10 -1
- data/lib/rubocop/path_util.rb +14 -2
- data/lib/rubocop/plugin/loader.rb +1 -1
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/remote_config.rb +10 -8
- data/lib/rubocop/result_cache.rb +60 -37
- data/lib/rubocop/rspec/cop_helper.rb +8 -0
- data/lib/rubocop/rspec/shared_contexts.rb +18 -5
- data/lib/rubocop/rspec/support.rb +2 -1
- data/lib/rubocop/runner.rb +12 -3
- data/lib/rubocop/server/cache.rb +6 -29
- data/lib/rubocop/server/core.rb +2 -0
- data/lib/rubocop/target_finder.rb +1 -1
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/version.rb +2 -2
- data/lib/rubocop.rb +20 -0
- data/lib/ruby_lsp/rubocop/addon.rb +23 -8
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +49 -15
- metadata +33 -9
|
@@ -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,113 @@ 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 ||= 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 inside_multiline_chain_arg?(node)
|
|
176
|
+
enclosing_call = find_enclosing_chain_call(node)
|
|
177
|
+
return false unless enclosing_call
|
|
178
|
+
|
|
179
|
+
!same_line?(enclosing_call.loc.selector, enclosing_call.receiver.source_range)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def find_enclosing_chain_call(node)
|
|
183
|
+
hash_ancestor = find_pair_ancestor(node).parent
|
|
184
|
+
enclosing_call = hash_ancestor.parent
|
|
185
|
+
return unless hash_arg_in_chain?(enclosing_call, hash_ancestor)
|
|
186
|
+
|
|
187
|
+
enclosing_call
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def hash_arg_in_chain?(call, hash_node)
|
|
191
|
+
call&.call_type? && call.receiver != hash_node && call.loc?(:dot)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def aligned_with_first_line_dot?(node, rhs)
|
|
195
|
+
return false unless rhs.source.start_with?('.', '&.')
|
|
196
|
+
|
|
197
|
+
first_call = first_call_has_a_dot(node)
|
|
198
|
+
return false if first_call == node.receiver
|
|
199
|
+
|
|
200
|
+
dot = first_call.loc.dot
|
|
201
|
+
dot.line == node.first_line && dot.column == rhs.column
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def check_regular_indentation(node, lhs, rhs, given_style)
|
|
91
205
|
@base = alignment_base(node, rhs, given_style)
|
|
92
206
|
correct_column = if @base
|
|
93
|
-
|
|
207
|
+
parent = node.parent
|
|
208
|
+
parent = parent.parent if parent&.any_block_type?
|
|
209
|
+
@base.column + extra_indentation(given_style, parent)
|
|
94
210
|
else
|
|
95
211
|
indentation(lhs) + correct_indentation(node)
|
|
96
212
|
end
|
|
213
|
+
|
|
214
|
+
calculate_column_delta_offense(rhs, correct_column)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def calculate_column_delta_offense(rhs, correct_column)
|
|
97
218
|
@column_delta = correct_column - rhs.column
|
|
98
219
|
rhs if @column_delta.nonzero?
|
|
99
220
|
end
|
|
100
221
|
|
|
101
222
|
def extra_indentation(given_style, parent)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
configured_indentation_width
|
|
107
|
-
end
|
|
223
|
+
return 0 unless given_style == :indented_relative_to_receiver
|
|
224
|
+
|
|
225
|
+
if parent&.type?(:splat, :kwsplat)
|
|
226
|
+
configured_indentation_width - parent.loc.operator.length
|
|
108
227
|
else
|
|
109
|
-
|
|
228
|
+
configured_indentation_width
|
|
110
229
|
end
|
|
111
230
|
end
|
|
112
231
|
|
|
@@ -125,7 +244,7 @@ module RuboCop
|
|
|
125
244
|
end
|
|
126
245
|
|
|
127
246
|
def should_align_with_base?
|
|
128
|
-
@base && style
|
|
247
|
+
@base && style == :aligned
|
|
129
248
|
end
|
|
130
249
|
|
|
131
250
|
def relative_to_receiver_message(rhs)
|
|
@@ -142,10 +261,16 @@ module RuboCop
|
|
|
142
261
|
end
|
|
143
262
|
|
|
144
263
|
def no_base_message(lhs, rhs, node)
|
|
145
|
-
|
|
264
|
+
if @hash_pair_base_column
|
|
265
|
+
used_indentation = rhs.column - @hash_pair_base_column
|
|
266
|
+
expected_indentation = configured_indentation_width
|
|
267
|
+
else
|
|
268
|
+
used_indentation = rhs.column - indentation(lhs)
|
|
269
|
+
expected_indentation = correct_indentation(node)
|
|
270
|
+
end
|
|
146
271
|
what = operation_description(node, rhs)
|
|
147
272
|
|
|
148
|
-
"Use #{
|
|
273
|
+
"Use #{expected_indentation} (not #{used_indentation}) " \
|
|
149
274
|
"spaces for indenting #{what} spanning multiple lines."
|
|
150
275
|
end
|
|
151
276
|
|
|
@@ -153,8 +278,6 @@ module RuboCop
|
|
|
153
278
|
case given_style
|
|
154
279
|
when :aligned
|
|
155
280
|
semantic_alignment_base(node, rhs) || syntactic_alignment_base(node, rhs)
|
|
156
|
-
when :indented
|
|
157
|
-
nil
|
|
158
281
|
when :indented_relative_to_receiver
|
|
159
282
|
receiver_alignment_base(node)
|
|
160
283
|
end
|
|
@@ -182,7 +305,7 @@ module RuboCop
|
|
|
182
305
|
return unless rhs.source.start_with?('.', '&.')
|
|
183
306
|
|
|
184
307
|
node = semantic_alignment_node(node)
|
|
185
|
-
return unless node&.loc
|
|
308
|
+
return unless node&.loc?(:selector) && node.loc.dot
|
|
186
309
|
|
|
187
310
|
node.loc.dot.join(node.loc.selector)
|
|
188
311
|
end
|
|
@@ -191,29 +314,55 @@ module RuboCop
|
|
|
191
314
|
# .b
|
|
192
315
|
# .c
|
|
193
316
|
def receiver_alignment_base(node)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
317
|
+
hash_method_base = find_hash_method_base_in_receiver_chain(node)
|
|
318
|
+
return hash_method_base if hash_method_base
|
|
319
|
+
|
|
320
|
+
first_call = first_call_has_a_dot(node)
|
|
321
|
+
first_call.receiver.source_range
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def find_hash_method_base_in_receiver_chain(node)
|
|
325
|
+
receiver_chain = unwrap_block_node(node.receiver)
|
|
326
|
+
while receiver_chain&.call_type?
|
|
327
|
+
base_receiver = unwrap_block_node(receiver_chain.receiver)
|
|
328
|
+
if alignment_base_for_chained_receiver?(receiver_chain, base_receiver)
|
|
329
|
+
return receiver_chain.loc.dot.join(receiver_chain.loc.selector)
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
receiver_chain = base_receiver
|
|
333
|
+
end
|
|
334
|
+
end
|
|
197
335
|
|
|
198
|
-
|
|
336
|
+
def alignment_base_for_chained_receiver?(receiver_chain, base_receiver)
|
|
337
|
+
base_receiver&.hash_type? ||
|
|
338
|
+
method_on_receiver_last_line?(receiver_chain, base_receiver, :begin)
|
|
199
339
|
end
|
|
200
340
|
|
|
201
341
|
def semantic_alignment_node(node)
|
|
202
342
|
return if argument_in_method_call(node, :with_parentheses)
|
|
203
343
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return multiline_block_chain_node
|
|
209
|
-
end
|
|
344
|
+
get_dot_right_above(node) ||
|
|
345
|
+
find_multiline_block_chain_node(node) ||
|
|
346
|
+
first_call_alignment_node(node)
|
|
347
|
+
end
|
|
210
348
|
|
|
349
|
+
def first_call_alignment_node(node)
|
|
211
350
|
node = first_call_has_a_dot(node)
|
|
351
|
+
base_receiver = find_base_receiver(node)
|
|
352
|
+
|
|
353
|
+
return node if method_on_receiver_last_line?(node, base_receiver, :array)
|
|
212
354
|
return if node.loc.dot.line != node.first_line
|
|
355
|
+
return if method_on_receiver_last_line?(node, base_receiver, :begin)
|
|
213
356
|
|
|
214
357
|
node
|
|
215
358
|
end
|
|
216
359
|
|
|
360
|
+
def method_on_receiver_last_line?(node, base_receiver, type)
|
|
361
|
+
return false unless base_receiver
|
|
362
|
+
|
|
363
|
+
same_line?(node.loc.dot, base_receiver.source_range.end) && base_receiver.type?(type)
|
|
364
|
+
end
|
|
365
|
+
|
|
217
366
|
def get_dot_right_above(node)
|
|
218
367
|
node.each_ancestor.find do |a|
|
|
219
368
|
dot = a.loc.dot if a.loc?(:dot)
|
|
@@ -224,23 +373,39 @@ module RuboCop
|
|
|
224
373
|
end
|
|
225
374
|
|
|
226
375
|
def find_multiline_block_chain_node(node)
|
|
227
|
-
return
|
|
228
|
-
return unless block_node.multiline? && block_node.parent.call_type?
|
|
376
|
+
return find_continuation_node(node) if node.block_node
|
|
229
377
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
378
|
+
handle_descendant_block(node)
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
def find_continuation_node(node)
|
|
382
|
+
receiver = node.receiver
|
|
383
|
+
return receiver.send_node if single_line_block_receiver?(receiver)
|
|
384
|
+
return unless receiver.call_type? && receiver.loc.dot
|
|
385
|
+
return receiver if receiver.receiver.begin_type? && node.block_node.single_line?
|
|
386
|
+
return unless receiver.loc.dot.line > receiver.receiver.last_line
|
|
387
|
+
|
|
388
|
+
receiver
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
def single_line_block_receiver?(receiver)
|
|
392
|
+
receiver.single_line? && receiver.any_block_type?
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
def handle_descendant_block(node)
|
|
396
|
+
receiver = node.receiver
|
|
397
|
+
return receiver.send_node if single_line_block_receiver?(receiver)
|
|
398
|
+
|
|
399
|
+
block_node = node.each_descendant(:any_block).first
|
|
400
|
+
return unless block_node&.multiline?
|
|
401
|
+
|
|
402
|
+
receiver.call_type? ? receiver : block_node.parent
|
|
235
403
|
end
|
|
236
404
|
|
|
237
405
|
def first_call_has_a_dot(node)
|
|
238
|
-
|
|
239
|
-
node =
|
|
240
|
-
# ascend to first call which has a dot
|
|
241
|
-
node = node.parent
|
|
406
|
+
base = find_base_receiver(node)
|
|
407
|
+
node = base.parent
|
|
242
408
|
node = node.parent until node.loc?(:dot)
|
|
243
|
-
|
|
244
409
|
node
|
|
245
410
|
end
|
|
246
411
|
|
|
@@ -102,10 +102,12 @@ module RuboCop
|
|
|
102
102
|
return true if begins_its_line?(assignment_rhs.source_range)
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
-
given_style == :aligned
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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?
|
|
109
111
|
end
|
|
110
112
|
|
|
111
113
|
def message(node, lhs, rhs)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Layout
|
|
6
|
-
#
|
|
6
|
+
# Checks that the parameters on a multi-line method call or definition are aligned.
|
|
7
7
|
#
|
|
8
8
|
# To set the alignment of the first argument, use the
|
|
9
9
|
# `Layout/FirstParameterIndentation` cop.
|
|
@@ -114,7 +114,7 @@ module RuboCop
|
|
|
114
114
|
|
|
115
115
|
def other_cop_takes_precedence?(node)
|
|
116
116
|
single_line_block_chain_enabled? && any_descendant?(node, :any_block) do |block_node|
|
|
117
|
-
block_node.parent.send_type? && block_node.parent.loc.dot &&
|
|
117
|
+
block_node.parent.send_type? && block_node.parent.loc.dot && block_node.single_line?
|
|
118
118
|
end
|
|
119
119
|
end
|
|
120
120
|
|
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
|
29
29
|
MSG = '`%<kw_loc>s` at %<kw_loc_line>d, %<kw_loc_column>d is not ' \
|
|
30
30
|
'aligned with `%<beginning>s` at ' \
|
|
31
31
|
'%<begin_loc_line>d, %<begin_loc_column>d.'
|
|
32
|
-
ANCESTOR_TYPES = %i[kwbegin any_def class module any_block].freeze
|
|
32
|
+
ANCESTOR_TYPES = %i[kwbegin any_def class module sclass any_block].freeze
|
|
33
33
|
ALTERNATIVE_ACCESS_MODIFIERS = %i[public_class_method private_class_method].freeze
|
|
34
34
|
|
|
35
35
|
def on_resbody(node)
|
|
@@ -91,7 +91,7 @@ module RuboCop
|
|
|
91
91
|
)
|
|
92
92
|
end
|
|
93
93
|
|
|
94
|
-
# rubocop:disable Metrics/AbcSize
|
|
94
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
95
95
|
def alignment_source(node, starting_loc)
|
|
96
96
|
ending_loc =
|
|
97
97
|
case node.type
|
|
@@ -100,6 +100,8 @@ module RuboCop
|
|
|
100
100
|
when :def, :defs, :class, :module,
|
|
101
101
|
:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
|
|
102
102
|
node.loc.name
|
|
103
|
+
when :sclass
|
|
104
|
+
node.identifier.source_range
|
|
103
105
|
when :masgn
|
|
104
106
|
node.lhs.source_range
|
|
105
107
|
else
|
|
@@ -109,7 +111,7 @@ module RuboCop
|
|
|
109
111
|
|
|
110
112
|
range_between(starting_loc.begin_pos, ending_loc.end_pos).source
|
|
111
113
|
end
|
|
112
|
-
# rubocop:enable Metrics/AbcSize
|
|
114
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
113
115
|
|
|
114
116
|
# We will use ancestor or wrapper with access modifier.
|
|
115
117
|
|
|
@@ -194,6 +196,14 @@ module RuboCop
|
|
|
194
196
|
def alignment_location(alignment_node)
|
|
195
197
|
if begin_end_alignment_style == 'start_of_line'
|
|
196
198
|
start_line_range(alignment_node)
|
|
199
|
+
elsif alignment_node.any_block_type?
|
|
200
|
+
# If the alignment node is a block, the `rescue`/`ensure` keyword should
|
|
201
|
+
# be aligned to the start of the block. It is possible that the block's
|
|
202
|
+
# `send_node` spans multiple lines, in which case it should align to the
|
|
203
|
+
# start of the last line.
|
|
204
|
+
send_node = alignment_node.send_node
|
|
205
|
+
range = processed_source.buffer.line_range(send_node.last_line)
|
|
206
|
+
range.adjust(begin_pos: range.source =~ /\S/)
|
|
197
207
|
else
|
|
198
208
|
alignment_node.source_range
|
|
199
209
|
end
|
|
@@ -23,16 +23,8 @@ module RuboCop
|
|
|
23
23
|
cfg['EnforcedStyle'] || 'space'
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
def kind(token)
|
|
27
|
-
'comma' if token.comma? && !
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def before_semicolon?(token)
|
|
33
|
-
tokens = processed_source.tokens
|
|
34
|
-
|
|
35
|
-
tokens[tokens.index(token) + 1].semicolon?
|
|
26
|
+
def kind(token, next_token)
|
|
27
|
+
'comma' if token.comma? && !next_token.semicolon?
|
|
36
28
|
end
|
|
37
29
|
end
|
|
38
30
|
end
|
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
|
29
29
|
include RangeHelp
|
|
30
30
|
extend AutoCorrector
|
|
31
31
|
|
|
32
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
32
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
|
|
33
33
|
arguments = node.arguments
|
|
34
34
|
|
|
35
35
|
return unless node.arguments? && pipes?(arguments)
|
|
@@ -47,9 +47,11 @@ module RuboCop
|
|
|
47
47
|
check(node, [:operator].freeze) if node.keyword?
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
def on_block(node)
|
|
50
|
+
def on_block(node)
|
|
51
51
|
check(node, %i[begin end].freeze)
|
|
52
52
|
end
|
|
53
|
+
alias on_numblock on_block
|
|
54
|
+
alias on_itblock on_block
|
|
53
55
|
|
|
54
56
|
def on_break(node)
|
|
55
57
|
check(node, [:keyword].freeze)
|
|
@@ -167,7 +169,7 @@ module RuboCop
|
|
|
167
169
|
|
|
168
170
|
def check(node, locations, begin_keyword = DO)
|
|
169
171
|
locations.each do |loc|
|
|
170
|
-
next unless node.loc
|
|
172
|
+
next unless node.loc?(loc)
|
|
171
173
|
|
|
172
174
|
range = node.loc.public_send(loc)
|
|
173
175
|
next unless range
|
|
@@ -7,18 +7,18 @@ module RuboCop
|
|
|
7
7
|
# parenthesis (`(`) in lambda literals.
|
|
8
8
|
#
|
|
9
9
|
# @example EnforcedStyle: require_no_space (default)
|
|
10
|
-
#
|
|
11
|
-
#
|
|
10
|
+
# # bad
|
|
11
|
+
# a = -> (x, y) { x + y }
|
|
12
12
|
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
13
|
+
# # good
|
|
14
|
+
# a = ->(x, y) { x + y }
|
|
15
15
|
#
|
|
16
16
|
# @example EnforcedStyle: require_space
|
|
17
|
-
#
|
|
18
|
-
#
|
|
17
|
+
# # bad
|
|
18
|
+
# a = ->(x, y) { x + y }
|
|
19
19
|
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
20
|
+
# # good
|
|
21
|
+
# a = -> (x, y) { x + y }
|
|
22
22
|
class SpaceInLambdaLiteral < Base
|
|
23
23
|
include ConfigurableEnforcedStyle
|
|
24
24
|
include RangeHelp
|
|
@@ -26,6 +26,7 @@ module RuboCop
|
|
|
26
26
|
|
|
27
27
|
MSG_REQUIRE_SPACE = 'Use a space between `->` and `(` in lambda literals.'
|
|
28
28
|
MSG_REQUIRE_NO_SPACE = 'Do not use spaces between `->` and `(` in lambda literals.'
|
|
29
|
+
RESTRICT_ON_SEND = %i[lambda].freeze
|
|
29
30
|
|
|
30
31
|
def on_send(node)
|
|
31
32
|
return unless arrow_lambda_with_args?(node)
|
|
@@ -35,6 +35,26 @@ module RuboCop
|
|
|
35
35
|
# def cook(dry_ingredients = self.dry_ingredients)
|
|
36
36
|
# dry_ingredients.combine
|
|
37
37
|
# end
|
|
38
|
+
#
|
|
39
|
+
# # bad
|
|
40
|
+
# def foo(pie = pie = pie)
|
|
41
|
+
# pie.heat_up
|
|
42
|
+
# end
|
|
43
|
+
#
|
|
44
|
+
# # good
|
|
45
|
+
# def foo(pie)
|
|
46
|
+
# pie.heat_up
|
|
47
|
+
# end
|
|
48
|
+
#
|
|
49
|
+
# # bad
|
|
50
|
+
# def foo(pie = cake = pie)
|
|
51
|
+
# [pie, cake].each(&:heat_up)
|
|
52
|
+
# end
|
|
53
|
+
#
|
|
54
|
+
# # good
|
|
55
|
+
# def foo(cake = pie)
|
|
56
|
+
# [pie, cake].each(&:heat_up)
|
|
57
|
+
# end
|
|
38
58
|
class CircularArgumentReference < Base
|
|
39
59
|
extend TargetRubyVersion
|
|
40
60
|
|
|
@@ -51,11 +71,35 @@ module RuboCop
|
|
|
51
71
|
private
|
|
52
72
|
|
|
53
73
|
def check_for_circular_argument_references(arg_name, arg_value)
|
|
54
|
-
|
|
55
|
-
|
|
74
|
+
if arg_value.lvar_type? && arg_value.to_a == [arg_name]
|
|
75
|
+
add_offense(arg_value, message: format(MSG, arg_name: arg_name))
|
|
76
|
+
|
|
77
|
+
return
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
check_assignment_chain(arg_name, arg_value)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# rubocop:disable Metrics/AbcSize
|
|
84
|
+
def check_assignment_chain(arg_name, node)
|
|
85
|
+
return unless node.lvasgn_type?
|
|
86
|
+
|
|
87
|
+
seen_variables = Set[]
|
|
88
|
+
current_node = node
|
|
89
|
+
|
|
90
|
+
while current_node.lvasgn_type?
|
|
91
|
+
seen_variables << current_node.children.first if current_node.lvasgn_type?
|
|
92
|
+
current_node = current_node.children.last
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
return unless current_node.lvar_type?
|
|
96
|
+
|
|
97
|
+
variable_node = current_node.children.first
|
|
98
|
+
return unless seen_variables.include?(variable_node) || variable_node == arg_name
|
|
56
99
|
|
|
57
|
-
add_offense(
|
|
100
|
+
add_offense(current_node, message: format(MSG, arg_name: arg_name))
|
|
58
101
|
end
|
|
102
|
+
# rubocop:enable Metrics/AbcSize
|
|
59
103
|
end
|
|
60
104
|
end
|
|
61
105
|
end
|
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
|
31
31
|
|
|
32
32
|
# @!method overwritten_constant(node)
|
|
33
33
|
def_node_matcher :overwritten_constant, <<~PATTERN
|
|
34
|
-
(resbody nil? (casgn
|
|
34
|
+
(resbody nil? $(casgn _ _) nil?)
|
|
35
35
|
PATTERN
|
|
36
36
|
|
|
37
37
|
def self.autocorrect_incompatible_with
|
|
@@ -41,7 +41,8 @@ module RuboCop
|
|
|
41
41
|
def on_resbody(node)
|
|
42
42
|
return unless (constant = overwritten_constant(node))
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
message = format(MSG, constant: constant.source)
|
|
45
|
+
add_offense(node.loc.assoc, message: message) do |corrector|
|
|
45
46
|
corrector.remove(range_between(node.loc.keyword.end_pos, node.loc.assoc.end_pos))
|
|
46
47
|
end
|
|
47
48
|
end
|