rubocop 1.91.0 → 1.92.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/README.md +1 -1
- data/config/default.yml +4 -1
- data/lib/rubocop/cached_data.rb +47 -7
- data/lib/rubocop/changed_files.rb +35 -13
- data/lib/rubocop/cli/command/cop_names.rb +57 -0
- data/lib/rubocop/cli/command/execute_runner.rb +2 -2
- data/lib/rubocop/cli/command/explain.rb +34 -0
- data/lib/rubocop/cli/command/show_cops.rb +6 -0
- data/lib/rubocop/cli/command/show_docs_url.rb +6 -4
- data/lib/rubocop/cli.rb +3 -2
- data/lib/rubocop/comment_config.rb +17 -8
- data/lib/rubocop/config_loader.rb +6 -3
- data/lib/rubocop/config_loader_resolver.rb +37 -12
- data/lib/rubocop/config_obsoletion/removed_cop.rb +1 -1
- data/lib/rubocop/config_validator.rb +11 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +10 -5
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +42 -21
- data/lib/rubocop/cop/bundler/gem_comment.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +0 -8
- data/lib/rubocop/cop/cop_documentation.rb +81 -0
- data/lib/rubocop/cop/cop_explanation.rb +140 -0
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +13 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +37 -7
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +25 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +45 -8
- data/lib/rubocop/cop/documentation.rb +1 -1
- data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +0 -6
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +2 -5
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +0 -7
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
- data/lib/rubocop/cop/layout/argument_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +27 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +25 -9
- data/lib/rubocop/cop/layout/class_structure.rb +29 -7
- data/lib/rubocop/cop/layout/def_end_alignment.rb +4 -0
- data/lib/rubocop/cop/layout/dot_position.rb +25 -15
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +21 -8
- data/lib/rubocop/cop/layout/empty_lines.rb +5 -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 +9 -3
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +19 -17
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -0
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +27 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +15 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +16 -8
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +16 -12
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +7 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +15 -0
- data/lib/rubocop/cop/layout/indentation_consistency.rb +22 -5
- data/lib/rubocop/cop/layout/indentation_style.rb +4 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +2 -2
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +8 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
- data/lib/rubocop/cop/layout/line_length.rb +153 -21
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +12 -0
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +8 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +9 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +6 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +30 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/redundant_line_break.rb +22 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +15 -2
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
- data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -11
- data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +4 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +15 -2
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +31 -8
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -12
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +2 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +6 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +3 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +4 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +15 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +63 -19
- data/lib/rubocop/cop/lint/loop.rb +24 -2
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +71 -11
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +3 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +12 -1
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +13 -2
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +47 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -0
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +18 -1
- data/lib/rubocop/cop/lint/useless_assignment.rb +14 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +7 -4
- data/lib/rubocop/cop/lint/void.rb +8 -1
- data/lib/rubocop/cop/metrics/class_length.rb +4 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
- data/lib/rubocop/cop/metrics/module_length.rb +4 -2
- data/lib/rubocop/cop/mixin/alignment.rb +4 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +23 -19
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +8 -2
- data/lib/rubocop/cop/mixin/code_length.rb +10 -2
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -1
- data/lib/rubocop/cop/mixin/endless_method_body_help.rb +105 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +2 -2
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +24 -5
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +26 -2
- data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +9 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +17 -2
- data/lib/rubocop/cop/mixin/project_index_help.rb +15 -0
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +13 -3
- data/lib/rubocop/cop/mixin/statement_modifier.rb +25 -4
- data/lib/rubocop/cop/mixin/visibility_help.rb +2 -1
- data/lib/rubocop/cop/mixin.rb +2 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +0 -16
- data/lib/rubocop/cop/naming/block_forwarding.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
- data/lib/rubocop/cop/naming/predicate_prefix.rb +7 -22
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/offense.rb +59 -3
- data/lib/rubocop/cop/registry.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +16 -4
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +37 -2
- data/lib/rubocop/cop/style/alias.rb +18 -5
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/and_or.rb +6 -2
- data/lib/rubocop/cop/style/arguments_forwarding.rb +32 -3
- data/lib/rubocop/cop/style/attr.rb +3 -4
- data/lib/rubocop/cop/style/bitwise_predicate.rb +6 -4
- data/lib/rubocop/cop/style/block_delimiters.rb +35 -3
- data/lib/rubocop/cop/style/case_like_if.rb +6 -3
- data/lib/rubocop/cop/style/class_and_module_children.rb +56 -16
- data/lib/rubocop/cop/style/class_methods_definitions.rb +15 -0
- data/lib/rubocop/cop/style/collection_querying.rb +79 -46
- data/lib/rubocop/cop/style/combinable_loops.rb +89 -11
- data/lib/rubocop/cop/style/concat_array_literals.rb +58 -7
- data/lib/rubocop/cop/style/conditional_assignment.rb +4 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +65 -9
- data/lib/rubocop/cop/style/double_negation.rb +11 -0
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +3 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +53 -11
- data/lib/rubocop/cop/style/endless_method.rb +71 -6
- data/lib/rubocop/cop/style/exact_regexp_match.rb +45 -8
- data/lib/rubocop/cop/style/explicit_block_argument.rb +50 -10
- data/lib/rubocop/cop/style/float_division.rb +22 -2
- data/lib/rubocop/cop/style/for.rb +53 -2
- data/lib/rubocop/cop/style/format_string.rb +28 -6
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
- data/lib/rubocop/cop/style/guard_clause.rb +31 -22
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +4 -0
- data/lib/rubocop/cop/style/hash_conversion.rb +28 -8
- data/lib/rubocop/cop/style/hash_lookup_method.rb +32 -9
- data/lib/rubocop/cop/style/hash_syntax.rb +16 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +21 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +32 -26
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +47 -4
- data/lib/rubocop/cop/style/inverse_methods.rb +24 -2
- data/lib/rubocop/cop/style/it_block_parameter.rb +94 -4
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +3 -1
- data/lib/rubocop/cop/style/lambda.rb +34 -1
- data/lib/rubocop/cop/style/lambda_call.rb +7 -2
- data/lib/rubocop/cop/style/map_into_array.rb +1 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +80 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -2
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +26 -3
- data/lib/rubocop/cop/style/method_def_parentheses.rb +29 -3
- data/lib/rubocop/cop/style/missing_else.rb +7 -1
- data/lib/rubocop/cop/style/mixin_grouping.rb +12 -3
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +45 -5
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -5
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
- data/lib/rubocop/cop/style/mutable_constant.rb +52 -7
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +2 -1
- data/lib/rubocop/cop/style/negative_array_index.rb +9 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +27 -8
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
- data/lib/rubocop/cop/style/next.rb +24 -10
- data/lib/rubocop/cop/style/nil_comparison.rb +16 -4
- data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
- data/lib/rubocop/cop/style/not.rb +10 -5
- data/lib/rubocop/cop/style/numeric_predicate.rb +21 -5
- data/lib/rubocop/cop/style/one_line_conditional.rb +13 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -3
- data/lib/rubocop/cop/style/raise_args.rb +19 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +17 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +22 -4
- data/lib/rubocop/cop/style/redundant_condition.rb +30 -13
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -0
- data/lib/rubocop/cop/style/redundant_exception.rb +15 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +9 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +11 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +24 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +12 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +7 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +20 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +4 -0
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +28 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +38 -4
- data/lib/rubocop/cop/style/regexp_literal.rb +75 -26
- data/lib/rubocop/cop/style/require_order.rb +25 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +11 -9
- data/lib/rubocop/cop/style/return_nil.rb +17 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
- data/lib/rubocop/cop/style/sample.rb +9 -8
- data/lib/rubocop/cop/style/self_assignment.rb +12 -15
- data/lib/rubocop/cop/style/semicolon.rb +16 -5
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +4 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +21 -4
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +29 -5
- data/lib/rubocop/cop/style/string_concatenation.rb +9 -3
- data/lib/rubocop/cop/style/struct_inheritance.rb +6 -0
- data/lib/rubocop/cop/style/super_arguments.rb +3 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +24 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +23 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +23 -19
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +24 -9
- data/lib/rubocop/cop/style/yoda_expression.rb +10 -1
- data/lib/rubocop/cop/team.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -1
- data/lib/rubocop/formatter/base_formatter.rb +22 -0
- data/lib/rubocop/formatter/formatter_set.rb +4 -0
- data/lib/rubocop/formatter/json_formatter.rb +71 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +3 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +3 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +12 -7
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +3 -1
- data/lib/rubocop/lsp/routes.rb +23 -23
- data/lib/rubocop/lsp/runtime.rb +47 -11
- data/lib/rubocop/lsp/stdin_runner.rb +11 -5
- data/lib/rubocop/lsp.rb +5 -2
- data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
- data/lib/rubocop/mcp/explain_tool.rb +68 -0
- data/lib/rubocop/mcp/scope.rb +65 -0
- data/lib/rubocop/mcp/server.rb +184 -76
- data/lib/rubocop/mcp/source_files.rb +35 -0
- data/lib/rubocop/offense_limit.rb +30 -0
- data/lib/rubocop/options.rb +45 -10
- data/lib/rubocop/plugin/configuration_integrator.rb +12 -5
- data/lib/rubocop/remote_config.rb +4 -1
- data/lib/rubocop/result_cache.rb +20 -13
- data/lib/rubocop/runner.rb +109 -41
- data/lib/rubocop/server/cache.rb +6 -6
- data/lib/rubocop/target_ruby.rb +21 -9
- data/lib/rubocop/util.rb +69 -0
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +5 -0
- metadata +16 -5
|
@@ -46,13 +46,6 @@ module RuboCop
|
|
|
46
46
|
|
|
47
47
|
private
|
|
48
48
|
|
|
49
|
-
def arguments_range(node)
|
|
50
|
-
range_between(
|
|
51
|
-
node.first_argument.source_range.begin_pos,
|
|
52
|
-
node.last_argument.source_range.end_pos
|
|
53
|
-
)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
49
|
def group_satisfied?(group_types, symbol_args)
|
|
57
50
|
group_types.all? { |type| symbol_args.any? { |arg| arg.value == type } }
|
|
58
51
|
end
|
|
@@ -31,15 +31,9 @@ module RuboCop
|
|
|
31
31
|
dup_arguments = arguments.dup
|
|
32
32
|
dup_arguments.delete(config_node)
|
|
33
33
|
|
|
34
|
-
corrector.replace(
|
|
34
|
+
corrector.replace(arguments_range(node), dup_arguments.map(&:source).join(', '))
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
|
-
|
|
38
|
-
private
|
|
39
|
-
|
|
40
|
-
def offense_range(arguments)
|
|
41
|
-
range_between(arguments.first.source_range.begin_pos, arguments.last.source_range.end_pos)
|
|
42
|
-
end
|
|
43
37
|
end
|
|
44
38
|
end
|
|
45
39
|
end
|
|
@@ -109,7 +109,7 @@ module RuboCop
|
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
def on_if(node)
|
|
112
|
-
|
|
112
|
+
node.condition.each_node(:send) do |cond|
|
|
113
113
|
add_offense(cond, message: MSG_FOR_CONDITIONAL_USE) if style_detected_api_used?(cond)
|
|
114
114
|
end
|
|
115
115
|
end
|
|
@@ -134,12 +134,6 @@ module RuboCop
|
|
|
134
134
|
no_acceptable_style_check(node) ||
|
|
135
135
|
style_detected_check(node)
|
|
136
136
|
end
|
|
137
|
-
|
|
138
|
-
def traverse_condition(condition, &block)
|
|
139
|
-
yield condition if condition.send_type?
|
|
140
|
-
|
|
141
|
-
condition.each_child_node { |child| traverse_condition(child, &block) }
|
|
142
|
-
end
|
|
143
137
|
end
|
|
144
138
|
end
|
|
145
139
|
end
|
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
|
53
53
|
|
|
54
54
|
def on_send(node)
|
|
55
55
|
return if !multiple_arguments?(node) || (node.call_type? && node.method?(:[]=)) ||
|
|
56
|
-
autocorrect_incompatible_with_other_cops?
|
|
56
|
+
binary_operator_call?(node) || autocorrect_incompatible_with_other_cops?
|
|
57
57
|
|
|
58
58
|
items = flattened_arguments(node)
|
|
59
59
|
|
|
@@ -64,6 +64,10 @@ module RuboCop
|
|
|
64
64
|
|
|
65
65
|
private
|
|
66
66
|
|
|
67
|
+
def binary_operator_call?(node)
|
|
68
|
+
node.binary_operation? && !node.method?(:[]) && !node.loc.dot
|
|
69
|
+
end
|
|
70
|
+
|
|
67
71
|
def autocorrect_incompatible_with_other_cops?
|
|
68
72
|
with_first_argument_style? && enforce_hash_argument_with_separator?
|
|
69
73
|
end
|
|
@@ -68,6 +68,7 @@ module RuboCop
|
|
|
68
68
|
# end
|
|
69
69
|
#
|
|
70
70
|
class BlockAlignment < Base
|
|
71
|
+
include Alignment
|
|
71
72
|
include ConfigurableEnforcedStyle
|
|
72
73
|
include RangeHelp
|
|
73
74
|
extend AutoCorrector
|
|
@@ -154,6 +155,32 @@ module RuboCop
|
|
|
154
155
|
else
|
|
155
156
|
start_for_line_node(node)
|
|
156
157
|
end
|
|
158
|
+
|
|
159
|
+
if using_tabs? && (indentation = anchor_indentation(ancestor_node, node))
|
|
160
|
+
replace_end_indentation(corrector, node, indentation)
|
|
161
|
+
else
|
|
162
|
+
shift_end_to_start_col(corrector, ancestor_node, node)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def anchor_indentation(ancestor_node, node)
|
|
167
|
+
if style == :start_of_block
|
|
168
|
+
do_line_anchor_loc(node, node.loc.begin).source_line[/\A\s*/]
|
|
169
|
+
else
|
|
170
|
+
anchor_loc = (ancestor_node || node).source_range
|
|
171
|
+
anchor_loc.source_line[/\A\s*/] if begins_its_line?(anchor_loc)
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def replace_end_indentation(corrector, node, indentation)
|
|
176
|
+
loc_end = node.loc.end
|
|
177
|
+
whitespace = range_between(loc_end.begin_pos - loc_end.column, loc_end.begin_pos)
|
|
178
|
+
return if whitespace.source == indentation
|
|
179
|
+
|
|
180
|
+
corrector.replace(whitespace, indentation)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def shift_end_to_start_col(corrector, ancestor_node, node)
|
|
157
184
|
start_col = compute_start_col(ancestor_node, node)
|
|
158
185
|
loc_end = node.loc.end
|
|
159
186
|
delta = start_col - loc_end.column
|
|
@@ -164,8 +164,12 @@ module RuboCop
|
|
|
164
164
|
cop_config['IndentOneStep']
|
|
165
165
|
end
|
|
166
166
|
|
|
167
|
+
# Under tabs one step is a single tab character, which counts as one column
|
|
168
|
+
# regardless of the configured indentation width.
|
|
167
169
|
def indentation_width
|
|
168
|
-
|
|
170
|
+
return 0 unless indent_one_step?
|
|
171
|
+
|
|
172
|
+
using_tabs? ? 1 : configured_indentation_width
|
|
169
173
|
end
|
|
170
174
|
|
|
171
175
|
def incorrect_style(when_node, branch_type)
|
|
@@ -176,8 +180,10 @@ module RuboCop
|
|
|
176
180
|
detect_incorrect_style(when_node)
|
|
177
181
|
|
|
178
182
|
whitespace = whitespace_range(when_node)
|
|
183
|
+
next unless whitespace.source.strip.empty?
|
|
179
184
|
|
|
180
|
-
|
|
185
|
+
indentation = replacement(when_node)
|
|
186
|
+
corrector.replace(whitespace, indentation) if indentation
|
|
181
187
|
end
|
|
182
188
|
end
|
|
183
189
|
|
|
@@ -193,10 +199,7 @@ module RuboCop
|
|
|
193
199
|
end
|
|
194
200
|
|
|
195
201
|
def base_column(case_node, base)
|
|
196
|
-
|
|
197
|
-
when :case then case_node.location.keyword.column
|
|
198
|
-
when :end then case_node.location.end.column
|
|
199
|
-
end
|
|
202
|
+
base_location(case_node, base)&.column
|
|
200
203
|
end
|
|
201
204
|
|
|
202
205
|
def whitespace_range(node)
|
|
@@ -207,13 +210,26 @@ module RuboCop
|
|
|
207
210
|
end
|
|
208
211
|
|
|
209
212
|
def replacement(node)
|
|
213
|
+
base_loc = configured_base_location(node)
|
|
214
|
+
|
|
215
|
+
return ' ' * (base_loc.column + indentation_width) unless using_tabs?
|
|
216
|
+
return unless begins_its_line?(base_loc)
|
|
217
|
+
|
|
218
|
+
base_loc.source_line[/\A\s*/] + ("\t" * indentation_width)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def configured_base_location(node)
|
|
210
222
|
case_node = node.each_ancestor(:case, :case_match).first
|
|
211
223
|
base_type = cop_config[style_parameter_name] == 'end' ? :end : :case
|
|
212
224
|
|
|
213
|
-
|
|
214
|
-
|
|
225
|
+
base_location(case_node, base_type)
|
|
226
|
+
end
|
|
215
227
|
|
|
216
|
-
|
|
228
|
+
def base_location(case_node, base)
|
|
229
|
+
case base
|
|
230
|
+
when :case then case_node.location.keyword
|
|
231
|
+
when :end then case_node.location.end
|
|
232
|
+
end
|
|
217
233
|
end
|
|
218
234
|
end
|
|
219
235
|
end
|
|
@@ -188,6 +188,14 @@ module RuboCop
|
|
|
188
188
|
|
|
189
189
|
MSG = '`%<category>s` is supposed to appear before `%<previous>s`.'
|
|
190
190
|
|
|
191
|
+
# A moved element is inserted before the line break that precedes its anchor.
|
|
192
|
+
# When the anchor follows a blank line, `Layout/EmptyLines`,
|
|
193
|
+
# `Layout/EmptyLinesAroundAccessModifier` or `Layout/EmptyLinesAroundClassBody`
|
|
194
|
+
# may remove that line break in the same pass.
|
|
195
|
+
def self.autocorrect_incompatible_with
|
|
196
|
+
[Layout::EmptyLines, Layout::EmptyLinesAroundAccessModifier, Layout::EmptyLinesAroundClassBody]
|
|
197
|
+
end
|
|
198
|
+
|
|
191
199
|
# Validates code style on class declaration.
|
|
192
200
|
# Add offense when find a node out of expected order.
|
|
193
201
|
# A node is out of order when its category is expected earlier than
|
|
@@ -333,9 +341,26 @@ module RuboCop
|
|
|
333
341
|
|
|
334
342
|
return "#{node_visibility(node)}_methods"
|
|
335
343
|
end
|
|
344
|
+
return class_method_category(node) if node.defs_type?
|
|
345
|
+
|
|
336
346
|
HUMANIZED_NODE_TYPE[node.type] || node.type
|
|
337
347
|
end
|
|
338
348
|
|
|
349
|
+
# Only `private_class_method` reaches a singleton method; a bare `private` does not.
|
|
350
|
+
# Such a call follows the definition it names, so only right siblings are searched.
|
|
351
|
+
def class_method_category(node)
|
|
352
|
+
modifier = node.right_siblings.reverse.find do |sibling|
|
|
353
|
+
class_method_visibility_modifier?(sibling, method_name: node.method_name)
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
modifier ? :"#{modifier.method_name}s" : HUMANIZED_NODE_TYPE[node.type]
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# @!method class_method_visibility_modifier?(node, method_name:)
|
|
360
|
+
def_node_matcher :class_method_visibility_modifier?, <<~PATTERN
|
|
361
|
+
(send nil? {:private_class_method :public_class_method} <(sym %method_name) ...>)
|
|
362
|
+
PATTERN
|
|
363
|
+
|
|
339
364
|
def dynamic_constant?(node)
|
|
340
365
|
return false unless node.casgn_type? && node.namespace.nil?
|
|
341
366
|
|
|
@@ -421,12 +446,9 @@ module RuboCop
|
|
|
421
446
|
end
|
|
422
447
|
|
|
423
448
|
def end_position_for(node)
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
return heredoc.location.heredoc_end.end_pos + 1 if heredoc
|
|
427
|
-
end
|
|
449
|
+
heredoc_end_lines = heredocs(node).map { |heredoc| heredoc.loc.heredoc_end.line }
|
|
450
|
+
end_line = [node.last_line, *heredoc_end_lines].max
|
|
428
451
|
|
|
429
|
-
end_line = buffer.line_for_position(node.source_range.end_pos)
|
|
430
452
|
buffer.line_range(end_line).end_pos
|
|
431
453
|
end
|
|
432
454
|
|
|
@@ -449,8 +471,8 @@ module RuboCop
|
|
|
449
471
|
buffer.line_range(node.loc.line).begin_pos - 1
|
|
450
472
|
end
|
|
451
473
|
|
|
452
|
-
def
|
|
453
|
-
node.each_node(:any_str).
|
|
474
|
+
def heredocs(node)
|
|
475
|
+
node.each_node(:any_str).select(&:heredoc?)
|
|
454
476
|
end
|
|
455
477
|
|
|
456
478
|
def buffer
|
|
@@ -49,6 +49,10 @@ module RuboCop
|
|
|
49
49
|
return unless node.def_modifier?
|
|
50
50
|
|
|
51
51
|
method_def = node.each_descendant(:any_def).first
|
|
52
|
+
# A single-line `def` has nothing to align, even when a line
|
|
53
|
+
# continuation puts it on a later line than the modifier.
|
|
54
|
+
return if method_def.single_line?
|
|
55
|
+
|
|
52
56
|
expr = node.source_range
|
|
53
57
|
|
|
54
58
|
line_start = range_between(expr.begin_pos, method_def.loc.keyword.end_pos)
|
|
@@ -27,10 +27,6 @@ module RuboCop
|
|
|
27
27
|
include RangeHelp
|
|
28
28
|
extend AutoCorrector
|
|
29
29
|
|
|
30
|
-
def self.autocorrect_incompatible_with
|
|
31
|
-
[Style::RedundantSelf]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
30
|
def on_send(node)
|
|
35
31
|
return unless node.dot? || node.safe_navigation?
|
|
36
32
|
|
|
@@ -46,21 +42,35 @@ module RuboCop
|
|
|
46
42
|
|
|
47
43
|
private
|
|
48
44
|
|
|
45
|
+
# The dot and the gap it moves across are replaced in one action, so that another
|
|
46
|
+
# correction that rewrites a range spanning the dot clashes with this one instead of
|
|
47
|
+
# leaving the moved dot behind.
|
|
49
48
|
def autocorrect(corrector, dot, node)
|
|
50
|
-
dot_range =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
case style
|
|
57
|
-
when :leading
|
|
58
|
-
corrector.insert_before(selector_range(node), dot.source)
|
|
59
|
-
when :trailing
|
|
60
|
-
corrector.insert_after(node.receiver, dot.source)
|
|
49
|
+
dot_range = removed_dot_range(dot)
|
|
50
|
+
|
|
51
|
+
if style == :leading
|
|
52
|
+
move_dot_before_selector(corrector, dot, dot_range, selector_range(node))
|
|
53
|
+
else
|
|
54
|
+
move_dot_after_receiver(corrector, dot, dot_range, node.receiver)
|
|
61
55
|
end
|
|
62
56
|
end
|
|
63
57
|
|
|
58
|
+
def removed_dot_range(dot)
|
|
59
|
+
return dot unless processed_source[dot.line - 1].strip == '.'
|
|
60
|
+
|
|
61
|
+
range_by_whole_lines(dot, include_final_newline: true)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def move_dot_before_selector(corrector, dot, dot_range, selector)
|
|
65
|
+
gap = range_between(dot_range.end_pos, selector.begin_pos)
|
|
66
|
+
corrector.replace(dot_range.join(gap), "#{gap.source}#{dot.source}")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def move_dot_after_receiver(corrector, dot, dot_range, receiver)
|
|
70
|
+
gap = range_between(receiver.source_range.end_pos, dot_range.begin_pos)
|
|
71
|
+
corrector.replace(gap.join(dot_range), "#{dot.source}#{gap.source}")
|
|
72
|
+
end
|
|
73
|
+
|
|
64
74
|
def message(dot)
|
|
65
75
|
"Place the #{dot.source} on the " +
|
|
66
76
|
case style
|
|
@@ -61,21 +61,23 @@ module RuboCop
|
|
|
61
61
|
return if node.ternary?
|
|
62
62
|
|
|
63
63
|
if node.modifier_form?
|
|
64
|
-
check_condition(node.condition) if node
|
|
64
|
+
check_condition(node.condition, node.right_sibling) if followed_by_statement?(node)
|
|
65
65
|
else
|
|
66
|
-
check_condition(node.condition)
|
|
66
|
+
check_condition(node.condition, node.if_branch)
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
def on_while(node)
|
|
71
|
-
|
|
71
|
+
return if node.modifier_form? && !followed_by_statement?(node)
|
|
72
|
+
|
|
73
|
+
check_condition(node.condition, node.modifier_form? ? node.right_sibling : node.body)
|
|
72
74
|
end
|
|
73
75
|
alias on_until on_while
|
|
74
76
|
|
|
75
77
|
def on_while_post(node)
|
|
76
|
-
return unless node
|
|
78
|
+
return unless followed_by_statement?(node)
|
|
77
79
|
|
|
78
|
-
check_condition(node.condition)
|
|
80
|
+
check_condition(node.condition, node.right_sibling)
|
|
79
81
|
end
|
|
80
82
|
alias on_until_post on_while_post
|
|
81
83
|
|
|
@@ -84,7 +86,8 @@ module RuboCop
|
|
|
84
86
|
last_condition = when_node.conditions.last
|
|
85
87
|
|
|
86
88
|
next if !multiline_when_condition?(when_node) ||
|
|
87
|
-
next_line_empty?(last_condition.last_line)
|
|
89
|
+
next_line_empty?(last_condition.last_line) ||
|
|
90
|
+
body_on_line?(when_node.body, last_condition.last_line)
|
|
88
91
|
|
|
89
92
|
add_offense(when_node, &autocorrect(last_condition))
|
|
90
93
|
end
|
|
@@ -94,7 +97,8 @@ module RuboCop
|
|
|
94
97
|
node.resbody_branches.each do |resbody|
|
|
95
98
|
rescued_exceptions = resbody.exceptions
|
|
96
99
|
next if !multiline_rescue_exceptions?(rescued_exceptions) ||
|
|
97
|
-
next_line_empty?(rescued_exceptions.last.last_line)
|
|
100
|
+
next_line_empty?(rescued_exceptions.last.last_line) ||
|
|
101
|
+
body_on_line?(resbody.body, rescued_exceptions.last.last_line)
|
|
98
102
|
|
|
99
103
|
add_offense(resbody, &autocorrect(rescued_exceptions.last))
|
|
100
104
|
end
|
|
@@ -102,9 +106,14 @@ module RuboCop
|
|
|
102
106
|
|
|
103
107
|
private
|
|
104
108
|
|
|
105
|
-
def
|
|
109
|
+
def followed_by_statement?(node)
|
|
110
|
+
node.parent&.type?(:begin, :kwbegin) && node.right_sibling
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def check_condition(condition, following_node)
|
|
106
114
|
return unless condition.multiline?
|
|
107
115
|
return if next_line_empty?(condition.last_line)
|
|
116
|
+
return if body_on_line?(following_node, condition.last_line)
|
|
108
117
|
|
|
109
118
|
add_offense(condition, &autocorrect(condition))
|
|
110
119
|
end
|
|
@@ -113,6 +122,10 @@ module RuboCop
|
|
|
113
122
|
processed_source[line].blank?
|
|
114
123
|
end
|
|
115
124
|
|
|
125
|
+
def body_on_line?(body, line)
|
|
126
|
+
body&.first_line == line
|
|
127
|
+
end
|
|
128
|
+
|
|
116
129
|
def multiline_when_condition?(when_node)
|
|
117
130
|
when_node.conditions.first.first_line != when_node.conditions.last.last_line
|
|
118
131
|
end
|
|
@@ -27,8 +27,7 @@ module RuboCop
|
|
|
27
27
|
|
|
28
28
|
def on_new_investigation
|
|
29
29
|
return if processed_source.tokens.empty?
|
|
30
|
-
|
|
31
|
-
return unless processed_source.raw_source.include?("\n\n\n")
|
|
30
|
+
return unless consecutive_blank_lines_possible?
|
|
32
31
|
|
|
33
32
|
lines = Set.new
|
|
34
33
|
processed_source.tokens.each { |token| lines << token.line }
|
|
@@ -42,6 +41,10 @@ module RuboCop
|
|
|
42
41
|
|
|
43
42
|
private
|
|
44
43
|
|
|
44
|
+
def consecutive_blank_lines_possible?
|
|
45
|
+
processed_source.buffer.source.include?("\n\n\n")
|
|
46
|
+
end
|
|
47
|
+
|
|
45
48
|
def each_extra_empty_line(lines)
|
|
46
49
|
prev_line = 1
|
|
47
50
|
|
|
@@ -38,13 +38,19 @@ module RuboCop
|
|
|
38
38
|
KIND = 'block'
|
|
39
39
|
|
|
40
40
|
def on_block(node)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
check(node, node.body, adjusted_first_line: first_line)
|
|
41
|
+
check(node, node.body, adjusted_first_line: body_start_line(node))
|
|
44
42
|
end
|
|
45
43
|
|
|
46
44
|
alias on_numblock on_block
|
|
47
45
|
alias on_itblock on_block
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def body_start_line(node)
|
|
50
|
+
return node.loc.begin.line unless node.arguments?
|
|
51
|
+
|
|
52
|
+
[node.loc.begin.line, node.arguments.last_line].max
|
|
53
|
+
end
|
|
48
54
|
end
|
|
49
55
|
end
|
|
50
56
|
end
|
|
@@ -85,8 +85,12 @@ module RuboCop
|
|
|
85
85
|
next if line == line_of_def_or_kwbegin || last_body_and_end_on_same_line?(body)
|
|
86
86
|
|
|
87
87
|
keyword = loc.source
|
|
88
|
+
|
|
88
89
|
# below the keyword
|
|
89
|
-
|
|
90
|
+
unless left_to_block_body_cop?(body, line)
|
|
91
|
+
check_line(style, line, message('after', keyword), &:empty?)
|
|
92
|
+
end
|
|
93
|
+
|
|
90
94
|
# above the keyword
|
|
91
95
|
check_line(style, line - 2, message('before', keyword), &:empty?)
|
|
92
96
|
end
|
|
@@ -122,6 +126,15 @@ module RuboCop
|
|
|
122
126
|
end
|
|
123
127
|
end
|
|
124
128
|
|
|
129
|
+
def left_to_block_body_cop?(body, keyword_line)
|
|
130
|
+
return false unless body.parent.any_block_type?
|
|
131
|
+
|
|
132
|
+
cop_config = config.for_enabled_cop('Layout/EmptyLinesAroundBlockBody')
|
|
133
|
+
return false if cop_config['EnforcedStyle'] != 'empty_lines'
|
|
134
|
+
|
|
135
|
+
only_empty_lines_until_end?(body, keyword_line)
|
|
136
|
+
end
|
|
137
|
+
|
|
125
138
|
def keyword_locations_in_rescue(node)
|
|
126
139
|
[node.loc.else, *node.resbody_branches.map { |body| body.loc.keyword }].compact
|
|
127
140
|
end
|
|
@@ -133,6 +146,15 @@ module RuboCop
|
|
|
133
146
|
*keyword_locations(rescue_body_without_ensure)
|
|
134
147
|
]
|
|
135
148
|
end
|
|
149
|
+
|
|
150
|
+
def only_empty_lines_until_end?(body, keyword_line)
|
|
151
|
+
end_line = body.parent.loc.end.line
|
|
152
|
+
next_line = (keyword_line + 1).upto(end_line).find do |line_number|
|
|
153
|
+
!processed_source.lines[line_number - 1].strip.empty?
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
next_line == end_line
|
|
157
|
+
end
|
|
136
158
|
end
|
|
137
159
|
end
|
|
138
160
|
end
|
|
@@ -123,16 +123,8 @@ module RuboCop
|
|
|
123
123
|
AlignmentCorrector.align_end(corrector, processed_source, node, alignment_node(node))
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
-
# rubocop:disable-next Metrics/CyclomaticComplexity
|
|
127
126
|
def check_assignment(node, rhs)
|
|
128
|
-
|
|
129
|
-
# assignment, we let rhs be the receiver of those method calls before
|
|
130
|
-
# we check if it's an if/unless/while/until.
|
|
131
|
-
return unless (rhs = first_part_of_call_chain(rhs))
|
|
132
|
-
|
|
133
|
-
# If `rhs` is a `begin` node or a logical operator,
|
|
134
|
-
# unwrap to find the leading conditional.
|
|
135
|
-
rhs = rhs.child_nodes.first while rhs&.type?(:begin, :or, :and)
|
|
127
|
+
rhs = leading_node(rhs)
|
|
136
128
|
|
|
137
129
|
return unless rhs&.conditional?
|
|
138
130
|
return if rhs.if_type? && rhs.ternary?
|
|
@@ -151,6 +143,16 @@ module RuboCop
|
|
|
151
143
|
ignore_node(inner_node)
|
|
152
144
|
end
|
|
153
145
|
|
|
146
|
+
def leading_node(rhs)
|
|
147
|
+
# If there are method calls chained to the right hand side of the assignment,
|
|
148
|
+
# we let rhs be the receiver of those method calls.
|
|
149
|
+
rhs = first_part_of_call_chain(rhs)
|
|
150
|
+
|
|
151
|
+
# If `rhs` is a `begin` node or a logical operator, unwrap to find the leading node.
|
|
152
|
+
rhs = rhs.child_nodes.first while rhs&.type?(:begin, :or, :and)
|
|
153
|
+
rhs
|
|
154
|
+
end
|
|
155
|
+
|
|
154
156
|
def asgn_variable_align_with(outer_node, inner_node)
|
|
155
157
|
expr = outer_node.source_range
|
|
156
158
|
|
|
@@ -175,13 +177,7 @@ module RuboCop
|
|
|
175
177
|
when :keyword
|
|
176
178
|
node
|
|
177
179
|
when :variable
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
while (parent = align_to.parent) && parent.send_type? && same_line?(align_to, parent)
|
|
181
|
-
align_to = parent
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
align_to
|
|
180
|
+
alignment_node_for_variable_style(node)
|
|
185
181
|
else
|
|
186
182
|
start_line_range(node)
|
|
187
183
|
end
|
|
@@ -207,7 +203,13 @@ module RuboCop
|
|
|
207
203
|
|
|
208
204
|
def assignment_or_operator_method(node)
|
|
209
205
|
node.ancestors.find do |ancestor|
|
|
210
|
-
ancestor.assignment_or_similar?
|
|
206
|
+
if ancestor.assignment_or_similar?
|
|
207
|
+
leading_node(extract_rhs(ancestor)).equal?(node)
|
|
208
|
+
elsif ancestor.send_type? && ancestor.operator_method?
|
|
209
|
+
!leading_node(ancestor).equal?(node)
|
|
210
|
+
elsif ancestor.send_type?
|
|
211
|
+
leading_node(ancestor.last_argument).equal?(node)
|
|
212
|
+
end
|
|
211
213
|
end
|
|
212
214
|
end
|
|
213
215
|
end
|
|
@@ -36,6 +36,10 @@ module RuboCop
|
|
|
36
36
|
MSG_UNNECESSARY = 'Unnecessary spacing detected.'
|
|
37
37
|
MSG_UNALIGNED_ASGN = '`=` is not aligned with the %<location>s assignment.'
|
|
38
38
|
|
|
39
|
+
def self.autocorrect_incompatible_with
|
|
40
|
+
[Layout::RedundantLineBreak, Style::SelfAssignment]
|
|
41
|
+
end
|
|
42
|
+
|
|
39
43
|
def on_new_investigation
|
|
40
44
|
return if processed_source.blank?
|
|
41
45
|
|
|
@@ -152,6 +152,10 @@ module RuboCop
|
|
|
152
152
|
|
|
153
153
|
MSG = 'Indent the first argument one step more than %<base>s.'
|
|
154
154
|
|
|
155
|
+
def self.autocorrect_incompatible_with
|
|
156
|
+
[Layout::ArgumentAlignment, Layout::HashAlignment]
|
|
157
|
+
end
|
|
158
|
+
|
|
155
159
|
def on_send(node)
|
|
156
160
|
return unless should_check?(node)
|
|
157
161
|
return if same_line?(node, node.first_argument)
|
|
@@ -180,7 +184,13 @@ module RuboCop
|
|
|
180
184
|
|
|
181
185
|
top_level_send = find_top_level_send(send_node)
|
|
182
186
|
node_to_correct =
|
|
183
|
-
should_correct_entire_chain?(send_node, top_level_send)
|
|
187
|
+
if should_correct_entire_chain?(send_node, top_level_send)
|
|
188
|
+
top_level_send
|
|
189
|
+
elsif hash_elements_aligned_by_argument_alignment?(node)
|
|
190
|
+
node.children.first
|
|
191
|
+
else
|
|
192
|
+
node
|
|
193
|
+
end
|
|
184
194
|
|
|
185
195
|
AlignmentCorrector.correct(corrector, processed_source, node_to_correct, column_delta)
|
|
186
196
|
end
|
|
@@ -189,6 +199,7 @@ module RuboCop
|
|
|
189
199
|
return false unless style == :special_for_inner_method_call_in_parentheses
|
|
190
200
|
return false unless inner_call?(top_level_send)
|
|
191
201
|
return false unless display_column(send_node.source_range) < column_delta.abs
|
|
202
|
+
return false if column_delta.positive?
|
|
192
203
|
|
|
193
204
|
top_level_send != send_node || begins_its_line?(top_level_send.loc.end)
|
|
194
205
|
end
|
|
@@ -209,6 +220,21 @@ module RuboCop
|
|
|
209
220
|
top_level_send
|
|
210
221
|
end
|
|
211
222
|
|
|
223
|
+
# `Layout/ArgumentAlignment` with `with_fixed_indentation` indents the pairs of an
|
|
224
|
+
# unbraced hash to a fixed column, so they must not move along with the first element.
|
|
225
|
+
def hash_elements_aligned_by_argument_alignment?(node)
|
|
226
|
+
return false if !node.hash_type? || node.braces?
|
|
227
|
+
return false unless enforce_first_argument_with_fixed_indentation?
|
|
228
|
+
|
|
229
|
+
argument_alignment_applies?(node.parent) && !enforce_hash_argument_with_separator?
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def enforce_hash_argument_with_separator?
|
|
233
|
+
HashAlignment::SEPARATOR_ALIGNMENT_STYLES.any? do |style|
|
|
234
|
+
config.for_enabled_cop('Layout/HashAlignment')[style]&.include?('separator')
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
212
238
|
def bare_operator?(node)
|
|
213
239
|
node.operator_method? && !node.dot?
|
|
214
240
|
end
|
|
@@ -6,6 +6,10 @@ module RuboCop
|
|
|
6
6
|
# Checks for a line break before the first element in a
|
|
7
7
|
# multi-line array.
|
|
8
8
|
#
|
|
9
|
+
# NOTE: An array whose first element is an array literal is not checked when
|
|
10
|
+
# `Layout/SpaceInsideArrayLiteralBrackets` is enabled with `EnforcedStyle: compact`,
|
|
11
|
+
# since that style joins the two opening brackets.
|
|
12
|
+
#
|
|
9
13
|
# @example
|
|
10
14
|
#
|
|
11
15
|
# # bad
|
|
@@ -70,6 +74,7 @@ module RuboCop
|
|
|
70
74
|
def on_array(node)
|
|
71
75
|
return if !node.loc.begin && !assignment_on_same_line?(node)
|
|
72
76
|
return if allow_implicit_array_brackets? && !node.bracketed?
|
|
77
|
+
return if compact_nested_array?(node)
|
|
73
78
|
|
|
74
79
|
check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
|
|
75
80
|
end
|
|
@@ -85,6 +90,16 @@ module RuboCop
|
|
|
85
90
|
!!cop_config['AllowImplicitArrayLiterals']
|
|
86
91
|
end
|
|
87
92
|
|
|
93
|
+
def compact_nested_array?(node)
|
|
94
|
+
node.square_brackets? && node.children.first&.source&.start_with?('[') &&
|
|
95
|
+
compact_array_brackets_enforced?
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def compact_array_brackets_enforced?
|
|
99
|
+
config.cop_enabled?('Layout/SpaceInsideArrayLiteralBrackets') &&
|
|
100
|
+
config.for_cop('Layout/SpaceInsideArrayLiteralBrackets')['EnforcedStyle'] == 'compact'
|
|
101
|
+
end
|
|
102
|
+
|
|
88
103
|
def ignore_last_element?
|
|
89
104
|
!!cop_config['AllowMultilineFinalElement']
|
|
90
105
|
end
|