rubocop 1.53.0 → 1.60.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 +5 -3
- data/config/default.yml +80 -11
- data/config/obsoletion.yml +5 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +10 -5
- data/lib/rubocop/cli.rb +1 -1
- data/lib/rubocop/config.rb +0 -2
- data/lib/rubocop/config_finder.rb +2 -2
- data/lib/rubocop/config_loader.rb +0 -1
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +11 -8
- data/lib/rubocop/config_validator.rb +0 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -1
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +42 -21
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +53 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -5
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +26 -3
- data/lib/rubocop/cop/layout/end_alignment.rb +12 -2
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -10
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +22 -7
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +17 -9
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
- data/lib/rubocop/cop/layout/redundant_line_break.rb +15 -4
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -4
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +53 -21
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +4 -4
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -2
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +18 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -3
- data/lib/rubocop/cop/lint/float_comparison.rb +10 -0
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +10 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +63 -4
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +14 -8
- data/lib/rubocop/cop/lint/self_assignment.rb +38 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +6 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +5 -3
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +38 -12
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +46 -21
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +8 -3
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +32 -4
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +16 -12
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +14 -11
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -8
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/string_help.rb +4 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +12 -4
- data/lib/rubocop/cop/naming/constant_name.rb +1 -2
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +4 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -1
- data/lib/rubocop/cop/style/alias.rb +9 -8
- data/lib/rubocop/cop/style/arguments_forwarding.rb +355 -63
- data/lib/rubocop/cop/style/array_first_last.rb +64 -0
- data/lib/rubocop/cop/style/array_intersect.rb +13 -5
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/case_like_if.rb +4 -4
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +7 -0
- data/lib/rubocop/cop/style/collection_compact.rb +7 -6
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +17 -9
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -14
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +1 -1
- data/lib/rubocop/cop/style/format_string.rb +24 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -1
- data/lib/rubocop/cop/style/guard_clause.rb +26 -0
- data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +83 -10
- data/lib/rubocop/cop/style/hash_except.rb +2 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +28 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -5
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +39 -2
- data/lib/rubocop/cop/style/lambda.rb +3 -3
- data/lib/rubocop/cop/style/lambda_call.rb +5 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +3 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +17 -7
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +22 -6
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +2 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +2 -4
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
- data/lib/rubocop/cop/style/next.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +8 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +9 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +9 -1
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -9
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +1 -1
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +93 -5
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -3
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +22 -5
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +10 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +63 -21
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +18 -4
- data/lib/rubocop/cop/style/redundant_return.rb +8 -3
- data/lib/rubocop/cop/style/redundant_self.rb +17 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +5 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +9 -8
- data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +6 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +23 -9
- data/lib/rubocop/cop/style/sample.rb +2 -1
- data/lib/rubocop/cop/style/select_by_regexp.rb +7 -6
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +8 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +7 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +36 -0
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -2
- data/lib/rubocop/cop/style/yoda_expression.rb +8 -7
- data/lib/rubocop/cop/utils/regexp_ranges.rb +26 -13
- data/lib/rubocop/cop/variable_force/assignment.rb +14 -5
- data/lib/rubocop/cops_documentation_generator.rb +11 -1
- data/lib/rubocop/ext/regexp_node.rb +9 -4
- data/lib/rubocop/file_finder.rb +4 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +17 -6
- data/lib/rubocop/formatter/html_formatter.rb +5 -4
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lsp/routes.rb +42 -19
- data/lib/rubocop/lsp/runtime.rb +22 -2
- data/lib/rubocop/lsp/server.rb +10 -4
- data/lib/rubocop/magic_comment.rb +12 -10
- data/lib/rubocop/options.rb +0 -8
- data/lib/rubocop/result_cache.rb +4 -1
- data/lib/rubocop/rspec/shared_contexts.rb +8 -3
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/runner.rb +6 -4
- data/lib/rubocop/server/client_command/exec.rb +1 -1
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +7 -3
- data/lib/rubocop/target_ruby.rb +9 -5
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +6 -0
- metadata +20 -13
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks that arrays are sliced with
|
|
7
|
-
# `ary[start..-1]` on Ruby 2.6
|
|
6
|
+
# Checks that arrays are not sliced with the redundant `ary[0..-1]`, replacing it with `ary`,
|
|
7
|
+
# and ensures arrays are sliced with endless ranges instead of `ary[start..-1]` on Ruby 2.6+,
|
|
8
|
+
# and with beginless ranges instead of `ary[nil..end]` on Ruby 2.7+.
|
|
8
9
|
#
|
|
9
10
|
# @safety
|
|
10
11
|
# This cop is unsafe because `x..-1` and `x..` are only guaranteed to
|
|
@@ -21,29 +22,94 @@ module RuboCop
|
|
|
21
22
|
#
|
|
22
23
|
# @example
|
|
23
24
|
# # bad
|
|
24
|
-
# items[
|
|
25
|
+
# items[0..-1]
|
|
26
|
+
# items[0..nil]
|
|
27
|
+
# items[0...nil]
|
|
25
28
|
#
|
|
26
29
|
# # good
|
|
27
|
-
# items
|
|
30
|
+
# items
|
|
31
|
+
#
|
|
32
|
+
# # bad
|
|
33
|
+
# items[1..-1] # Ruby 2.6+
|
|
34
|
+
# items[1..nil] # Ruby 2.6+
|
|
35
|
+
#
|
|
36
|
+
# # good
|
|
37
|
+
# items[1..] # Ruby 2.6+
|
|
38
|
+
#
|
|
39
|
+
# # bad
|
|
40
|
+
# items[nil..42] # Ruby 2.7+
|
|
41
|
+
#
|
|
42
|
+
# # good
|
|
43
|
+
# items[..42] # Ruby 2.7+
|
|
44
|
+
# items[0..42] # Ruby 2.7+
|
|
45
|
+
#
|
|
28
46
|
class SlicingWithRange < Base
|
|
29
47
|
extend AutoCorrector
|
|
30
48
|
extend TargetRubyVersion
|
|
31
49
|
|
|
32
50
|
minimum_target_ruby_version 2.6
|
|
33
51
|
|
|
34
|
-
MSG = 'Prefer
|
|
52
|
+
MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
|
|
53
|
+
MSG_USELESS_RANGE = 'Remove the useless `%<prefer>s`.'
|
|
35
54
|
RESTRICT_ON_SEND = %i[[]].freeze
|
|
36
55
|
|
|
56
|
+
# @!method range_from_zero_till_minus_one?(node)
|
|
57
|
+
def_node_matcher :range_from_zero_till_minus_one?, <<~PATTERN
|
|
58
|
+
{
|
|
59
|
+
(irange (int 0) {(int -1) nil})
|
|
60
|
+
(erange (int 0) nil)
|
|
61
|
+
}
|
|
62
|
+
PATTERN
|
|
63
|
+
|
|
37
64
|
# @!method range_till_minus_one?(node)
|
|
38
|
-
def_node_matcher :range_till_minus_one?,
|
|
65
|
+
def_node_matcher :range_till_minus_one?, <<~PATTERN
|
|
66
|
+
{
|
|
67
|
+
(irange !nil? {(int -1) nil})
|
|
68
|
+
(erange !nil? nil)
|
|
69
|
+
}
|
|
70
|
+
PATTERN
|
|
71
|
+
|
|
72
|
+
# @!method range_from_zero?(node)
|
|
73
|
+
def_node_matcher :range_from_zero?, <<~PATTERN
|
|
74
|
+
(irange nil !nil?)
|
|
75
|
+
PATTERN
|
|
39
76
|
|
|
40
77
|
def on_send(node)
|
|
41
|
-
return unless node.arguments.
|
|
42
|
-
return unless range_till_minus_one?(node.arguments.first)
|
|
78
|
+
return unless node.arguments.one?
|
|
43
79
|
|
|
44
|
-
|
|
45
|
-
|
|
80
|
+
range_node = node.first_argument
|
|
81
|
+
selector = node.loc.selector
|
|
82
|
+
unless (message, removal_range = offense_message_with_removal_range(range_node, selector))
|
|
83
|
+
return
|
|
46
84
|
end
|
|
85
|
+
|
|
86
|
+
add_offense(selector, message: message) do |corrector|
|
|
87
|
+
corrector.remove(removal_range)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
private
|
|
92
|
+
|
|
93
|
+
def offense_message_with_removal_range(range_node, selector)
|
|
94
|
+
if range_from_zero_till_minus_one?(range_node)
|
|
95
|
+
[format(MSG_USELESS_RANGE, prefer: selector.source), selector]
|
|
96
|
+
elsif range_till_minus_one?(range_node)
|
|
97
|
+
[
|
|
98
|
+
format(MSG, prefer: endless(range_node), current: selector.source), range_node.end
|
|
99
|
+
]
|
|
100
|
+
elsif range_from_zero?(range_node) && target_ruby_version >= 2.7
|
|
101
|
+
[
|
|
102
|
+
format(MSG, prefer: beginless(range_node), current: selector.source), range_node.begin
|
|
103
|
+
]
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def endless(range_node)
|
|
108
|
+
"[#{range_node.begin.source}#{range_node.loc.operator.source}]"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def beginless(range_node)
|
|
112
|
+
"[#{range_node.loc.operator.source}#{range_node.end.source}]"
|
|
47
113
|
end
|
|
48
114
|
end
|
|
49
115
|
end
|
|
@@ -173,7 +173,9 @@ module RuboCop
|
|
|
173
173
|
end
|
|
174
174
|
|
|
175
175
|
def correct_for_comment(corrector, node, if_branch)
|
|
176
|
-
comments = processed_source.ast_with_comments[if_branch]
|
|
176
|
+
comments = processed_source.ast_with_comments[if_branch].select do |comment|
|
|
177
|
+
comment.loc.line < if_branch.condition.first_line
|
|
178
|
+
end
|
|
177
179
|
comment_text = comments.map(&:text).join("\n") << "\n"
|
|
178
180
|
|
|
179
181
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
|
@@ -3,22 +3,42 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks that quotes inside
|
|
6
|
+
# Checks that quotes inside string, symbol, and regexp interpolations
|
|
7
7
|
# match the configured preference.
|
|
8
8
|
#
|
|
9
9
|
# @example EnforcedStyle: single_quotes (default)
|
|
10
10
|
# # bad
|
|
11
|
-
#
|
|
11
|
+
# string = "Tests #{success ? "PASS" : "FAIL"}"
|
|
12
|
+
# symbol = :"Tests #{success ? "PASS" : "FAIL"}"
|
|
13
|
+
# heredoc = <<~TEXT
|
|
14
|
+
# Tests #{success ? "PASS" : "FAIL"}
|
|
15
|
+
# TEXT
|
|
16
|
+
# regexp = /Tests #{success ? "PASS" : "FAIL"}/
|
|
12
17
|
#
|
|
13
18
|
# # good
|
|
14
|
-
#
|
|
19
|
+
# string = "Tests #{success ? 'PASS' : 'FAIL'}"
|
|
20
|
+
# symbol = :"Tests #{success ? 'PASS' : 'FAIL'}"
|
|
21
|
+
# heredoc = <<~TEXT
|
|
22
|
+
# Tests #{success ? 'PASS' : 'FAIL'}
|
|
23
|
+
# TEXT
|
|
24
|
+
# regexp = /Tests #{success ? 'PASS' : 'FAIL'}/
|
|
15
25
|
#
|
|
16
26
|
# @example EnforcedStyle: double_quotes
|
|
17
27
|
# # bad
|
|
18
|
-
#
|
|
28
|
+
# string = "Tests #{success ? 'PASS' : 'FAIL'}"
|
|
29
|
+
# symbol = :"Tests #{success ? 'PASS' : 'FAIL'}"
|
|
30
|
+
# heredoc = <<~TEXT
|
|
31
|
+
# Tests #{success ? 'PASS' : 'FAIL'}
|
|
32
|
+
# TEXT
|
|
33
|
+
# regexp = /Tests #{success ? 'PASS' : 'FAIL'}/
|
|
19
34
|
#
|
|
20
35
|
# # good
|
|
21
|
-
#
|
|
36
|
+
# string = "Tests #{success ? "PASS" : "FAIL"}"
|
|
37
|
+
# symbol = :"Tests #{success ? "PASS" : "FAIL"}"
|
|
38
|
+
# heredoc = <<~TEXT
|
|
39
|
+
# Tests #{success ? "PASS" : "FAIL"}
|
|
40
|
+
# TEXT
|
|
41
|
+
# regexp = /Tests #{success ? "PASS" : "FAIL"}/
|
|
22
42
|
class StringLiteralsInInterpolation < Base
|
|
23
43
|
include ConfigurableEnforcedStyle
|
|
24
44
|
include StringLiteralsHelp
|
|
@@ -29,6 +49,11 @@ module RuboCop
|
|
|
29
49
|
StringLiteralCorrector.correct(corrector, node, style)
|
|
30
50
|
end
|
|
31
51
|
|
|
52
|
+
# Cop classes that include the StringHelp module usually ignore regexp
|
|
53
|
+
# nodes. Not so for this cop, which is why we override the on_regexp
|
|
54
|
+
# definition with an empty one.
|
|
55
|
+
def on_regexp(node); end
|
|
56
|
+
|
|
32
57
|
private
|
|
33
58
|
|
|
34
59
|
def message(_node)
|
|
@@ -22,20 +22,23 @@ module RuboCop
|
|
|
22
22
|
|
|
23
23
|
# @!method lstrip_rstrip(node)
|
|
24
24
|
def_node_matcher :lstrip_rstrip, <<~PATTERN
|
|
25
|
-
{
|
|
26
|
-
|
|
25
|
+
{
|
|
26
|
+
(call $(call _ :rstrip) :lstrip)
|
|
27
|
+
(call $(call _ :lstrip) :rstrip)
|
|
28
|
+
}
|
|
27
29
|
PATTERN
|
|
28
30
|
|
|
29
31
|
def on_send(node)
|
|
30
|
-
lstrip_rstrip(node) do |first_send
|
|
32
|
+
lstrip_rstrip(node) do |first_send|
|
|
31
33
|
range = range_between(first_send.loc.selector.begin_pos, node.source_range.end_pos)
|
|
32
|
-
message = format(MSG, methods:
|
|
34
|
+
message = format(MSG, methods: range.source)
|
|
33
35
|
|
|
34
36
|
add_offense(range, message: message) do |corrector|
|
|
35
37
|
corrector.replace(range, 'strip')
|
|
36
38
|
end
|
|
37
39
|
end
|
|
38
40
|
end
|
|
41
|
+
alias on_csend on_send
|
|
39
42
|
end
|
|
40
43
|
end
|
|
41
44
|
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Enforces the presence of parentheses in `super` containing arguments.
|
|
7
|
+
#
|
|
8
|
+
# `super` is a keyword and is provided as a distinct cop from those designed for method call.
|
|
9
|
+
#
|
|
10
|
+
# @example
|
|
11
|
+
#
|
|
12
|
+
# # bad
|
|
13
|
+
# super name, age
|
|
14
|
+
#
|
|
15
|
+
# # good
|
|
16
|
+
# super(name, age)
|
|
17
|
+
#
|
|
18
|
+
class SuperWithArgsParentheses < Base
|
|
19
|
+
extend AutoCorrector
|
|
20
|
+
|
|
21
|
+
MSG = 'Use parentheses for `super` with arguments.'
|
|
22
|
+
|
|
23
|
+
def on_super(node)
|
|
24
|
+
return if node.parenthesized?
|
|
25
|
+
|
|
26
|
+
add_offense(node) do |corrector|
|
|
27
|
+
range = node.loc.keyword.end.join(node.first_argument.source_range.begin)
|
|
28
|
+
corrector.replace(range, '(')
|
|
29
|
+
corrector.insert_after(node.last_argument, ')')
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -22,6 +22,15 @@ module RuboCop
|
|
|
22
22
|
# # bad
|
|
23
23
|
# [:foo, :bar, :baz]
|
|
24
24
|
#
|
|
25
|
+
# # bad (contains spaces)
|
|
26
|
+
# %i[foo\ bar baz\ quux]
|
|
27
|
+
#
|
|
28
|
+
# # bad (contains [] with spaces)
|
|
29
|
+
# %i[foo \[ \]]
|
|
30
|
+
#
|
|
31
|
+
# # bad (contains () with spaces)
|
|
32
|
+
# %i(foo \( \))
|
|
33
|
+
#
|
|
25
34
|
# @example EnforcedStyle: brackets
|
|
26
35
|
# # good
|
|
27
36
|
# [:foo, :bar, :baz]
|
|
@@ -40,6 +49,15 @@ module RuboCop
|
|
|
40
49
|
|
|
41
50
|
PERCENT_MSG = 'Use `%i` or `%I` for an array of symbols.'
|
|
42
51
|
ARRAY_MSG = 'Use %<prefer>s for an array of symbols.'
|
|
52
|
+
DELIMITERS = ['[', ']', '(', ')'].freeze
|
|
53
|
+
SPECIAL_GVARS = %w[
|
|
54
|
+
$! $" $$ $& $' $* $+ $, $/ $; $: $. $< $= $> $? $@ $\\ $_ $` $~ $0
|
|
55
|
+
$-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w
|
|
56
|
+
].freeze
|
|
57
|
+
REDEFINABLE_OPERATORS = %w(
|
|
58
|
+
| ^ & <=> == === =~ > >= < <= << >>
|
|
59
|
+
+ - * / % ** ~ +@ -@ [] []= ` ! != !~
|
|
60
|
+
).freeze
|
|
43
61
|
|
|
44
62
|
class << self
|
|
45
63
|
attr_accessor :largest_brackets
|
|
@@ -47,7 +65,7 @@ module RuboCop
|
|
|
47
65
|
|
|
48
66
|
def on_array(node)
|
|
49
67
|
if bracketed_array_of?(:sym, node)
|
|
50
|
-
return if
|
|
68
|
+
return if complex_content?(node)
|
|
51
69
|
|
|
52
70
|
check_bracketed_array(node, 'i')
|
|
53
71
|
elsif node.percent_literal?(:symbol)
|
|
@@ -57,13 +75,24 @@ module RuboCop
|
|
|
57
75
|
|
|
58
76
|
private
|
|
59
77
|
|
|
60
|
-
def
|
|
78
|
+
def complex_content?(node)
|
|
61
79
|
node.children.any? do |sym|
|
|
62
|
-
|
|
63
|
-
|
|
80
|
+
return false if DELIMITERS.include?(sym.source)
|
|
81
|
+
|
|
82
|
+
content = *sym
|
|
83
|
+
content = content.map { |c| c.is_a?(AST::Node) ? c.source : c }.join
|
|
84
|
+
content_without_delimiter_pairs = content.gsub(/(\[[^\s\[\]]*\])|(\([^\s\(\)]*\))/, '')
|
|
85
|
+
|
|
86
|
+
content.include?(' ') || DELIMITERS.any? do |delimiter|
|
|
87
|
+
content_without_delimiter_pairs.include?(delimiter)
|
|
88
|
+
end
|
|
64
89
|
end
|
|
65
90
|
end
|
|
66
91
|
|
|
92
|
+
def invalid_percent_array_contents?(node)
|
|
93
|
+
complex_content?(node)
|
|
94
|
+
end
|
|
95
|
+
|
|
67
96
|
def build_bracketed_array(node)
|
|
68
97
|
return '[]' if node.children.empty?
|
|
69
98
|
|
|
@@ -88,15 +117,6 @@ module RuboCop
|
|
|
88
117
|
end
|
|
89
118
|
|
|
90
119
|
def symbol_without_quote?(string)
|
|
91
|
-
special_gvars = %w[
|
|
92
|
-
$! $" $$ $& $' $* $+ $, $/ $; $: $. $< $= $> $? $@ $\\ $_ $` $~ $0
|
|
93
|
-
$-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w
|
|
94
|
-
]
|
|
95
|
-
redefinable_operators = %w(
|
|
96
|
-
| ^ & <=> == === =~ > >= < <= << >>
|
|
97
|
-
+ - * / % ** ~ +@ -@ [] []= ` ! != !~
|
|
98
|
-
)
|
|
99
|
-
|
|
100
120
|
# method name
|
|
101
121
|
/\A[a-zA-Z_]\w*[!?]?\z/.match?(string) ||
|
|
102
122
|
# instance / class variable
|
|
@@ -104,8 +124,8 @@ module RuboCop
|
|
|
104
124
|
# global variable
|
|
105
125
|
/\A\$[1-9]\d*\z/.match?(string) ||
|
|
106
126
|
/\A\$[a-zA-Z_]\w*\z/.match?(string) ||
|
|
107
|
-
|
|
108
|
-
|
|
127
|
+
SPECIAL_GVARS.include?(string) ||
|
|
128
|
+
REDEFINABLE_OPERATORS.include?(string)
|
|
109
129
|
end
|
|
110
130
|
end
|
|
111
131
|
end
|
|
@@ -37,6 +37,42 @@ module RuboCop
|
|
|
37
37
|
# # ArgumentError: wrong number of arguments (given 1, expected 0)
|
|
38
38
|
# ----
|
|
39
39
|
#
|
|
40
|
+
# It is also unsafe because `Symbol#to_proc` does not work with
|
|
41
|
+
# `protected` methods which would otherwise be accessible.
|
|
42
|
+
#
|
|
43
|
+
# For example:
|
|
44
|
+
#
|
|
45
|
+
# [source,ruby]
|
|
46
|
+
# ----
|
|
47
|
+
# class Box
|
|
48
|
+
# def initialize
|
|
49
|
+
# @secret = rand
|
|
50
|
+
# end
|
|
51
|
+
#
|
|
52
|
+
# def normal_matches?(*others)
|
|
53
|
+
# others.map { |other| other.secret }.any?(secret)
|
|
54
|
+
# end
|
|
55
|
+
#
|
|
56
|
+
# def symbol_to_proc_matches?(*others)
|
|
57
|
+
# others.map(&:secret).any?(secret)
|
|
58
|
+
# end
|
|
59
|
+
#
|
|
60
|
+
# protected
|
|
61
|
+
#
|
|
62
|
+
# attr_reader :secret
|
|
63
|
+
# end
|
|
64
|
+
#
|
|
65
|
+
# boxes = [Box.new, Box.new]
|
|
66
|
+
# Box.new.normal_matches?(*boxes)
|
|
67
|
+
# # => false
|
|
68
|
+
# boxes.first.normal_matches?(*boxes)
|
|
69
|
+
# # => true
|
|
70
|
+
# Box.new.symbol_to_proc_matches?(*boxes)
|
|
71
|
+
# # => NoMethodError: protected method `secret' called for #<Box...>
|
|
72
|
+
# boxes.first.symbol_to_proc_matches?(*boxes)
|
|
73
|
+
# # => NoMethodError: protected method `secret' called for #<Box...>
|
|
74
|
+
# ----
|
|
75
|
+
#
|
|
40
76
|
# @example
|
|
41
77
|
# # bad
|
|
42
78
|
# something.map { |s| s.upcase }
|
|
@@ -23,38 +23,35 @@ module RuboCop
|
|
|
23
23
|
|
|
24
24
|
minimum_target_ruby_version 2.4
|
|
25
25
|
|
|
26
|
-
MSG = 'Use
|
|
27
|
-
'`%<receiver>s.unpack(%<format>s)%<method>s`.'
|
|
26
|
+
MSG = 'Use `unpack1(%<format>s)` instead of `%<current>s`.'
|
|
28
27
|
RESTRICT_ON_SEND = %i[first [] slice at].freeze
|
|
29
28
|
|
|
30
29
|
# @!method unpack_and_first_element?(node)
|
|
31
30
|
def_node_matcher :unpack_and_first_element?, <<~PATTERN
|
|
32
31
|
{
|
|
33
|
-
(
|
|
34
|
-
(
|
|
32
|
+
(call $(call (...) :unpack $(...)) :first)
|
|
33
|
+
(call $(call (...) :unpack $(...)) {:[] :slice :at} (int 0))
|
|
35
34
|
}
|
|
36
35
|
PATTERN
|
|
37
36
|
|
|
38
37
|
def on_send(node)
|
|
39
38
|
unpack_and_first_element?(node) do |unpack_call, unpack_arg|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
corrector.remove(first_element_range(node, unpack_call))
|
|
39
|
+
first_element_range = first_element_range(node, unpack_call)
|
|
40
|
+
offense_range = unpack_call.loc.selector.join(node.source_range.end)
|
|
41
|
+
message = format(MSG, format: unpack_arg.source, current: offense_range.source)
|
|
42
|
+
|
|
43
|
+
add_offense(offense_range, message: message) do |corrector|
|
|
44
|
+
corrector.remove(first_element_range)
|
|
47
45
|
corrector.replace(unpack_call.loc.selector, 'unpack1')
|
|
48
46
|
end
|
|
49
47
|
end
|
|
50
48
|
end
|
|
49
|
+
alias on_csend on_send
|
|
51
50
|
|
|
52
51
|
private
|
|
53
52
|
|
|
54
53
|
def first_element_range(node, unpack_call)
|
|
55
|
-
|
|
56
|
-
unpack_call.source_range.end_pos,
|
|
57
|
-
node.source_range.end_pos)
|
|
54
|
+
unpack_call.source_range.end.join(node.source_range.end)
|
|
58
55
|
end
|
|
59
56
|
end
|
|
60
57
|
end
|
|
@@ -118,16 +118,18 @@ module RuboCop
|
|
|
118
118
|
node.comparison_method? && !noncommutative_operator?(node)
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
121
122
|
def valid_yoda?(node)
|
|
122
|
-
|
|
123
|
-
rhs = node.first_argument
|
|
123
|
+
return true unless (rhs = node.first_argument)
|
|
124
124
|
|
|
125
|
+
lhs = node.receiver
|
|
125
126
|
return true if (constant_portion?(lhs) && constant_portion?(rhs)) ||
|
|
126
127
|
(!constant_portion?(lhs) && !constant_portion?(rhs)) ||
|
|
127
128
|
interpolation?(lhs)
|
|
128
129
|
|
|
129
130
|
enforce_yoda? ? constant_portion?(lhs) : constant_portion?(rhs)
|
|
130
131
|
end
|
|
132
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
131
133
|
|
|
132
134
|
def message(node)
|
|
133
135
|
format(MSG, source: node.source)
|
|
@@ -19,22 +19,23 @@ module RuboCop
|
|
|
19
19
|
# differently on different classes, and are not guaranteed to
|
|
20
20
|
# have the same result if reversed.
|
|
21
21
|
#
|
|
22
|
-
# @example SupportedOperators: ['*', '+', '&'']
|
|
22
|
+
# @example SupportedOperators: ['*', '+', '&', '|', '^'] (default)
|
|
23
23
|
# # bad
|
|
24
|
-
# 1 + x
|
|
25
24
|
# 10 * y
|
|
25
|
+
# 1 + x
|
|
26
26
|
# 1 & z
|
|
27
|
+
# 1 | x
|
|
28
|
+
# 1 ^ x
|
|
27
29
|
# 1 + CONST
|
|
28
30
|
#
|
|
29
31
|
# # good
|
|
30
|
-
# 60 * 24
|
|
31
|
-
# x + 1
|
|
32
32
|
# y * 10
|
|
33
|
+
# x + 1
|
|
33
34
|
# z & 1
|
|
35
|
+
# x | 1
|
|
36
|
+
# x ^ 1
|
|
34
37
|
# CONST + 1
|
|
35
|
-
#
|
|
36
|
-
# # good
|
|
37
|
-
# 1 | x
|
|
38
|
+
# 60 * 24
|
|
38
39
|
#
|
|
39
40
|
class YodaExpression < Base
|
|
40
41
|
extend AutoCorrector
|
|
@@ -6,27 +6,40 @@ module RuboCop
|
|
|
6
6
|
# Helper to abstract complexity of building range pairs
|
|
7
7
|
# with octal escape reconstruction (needed for regexp_parser < 2.7).
|
|
8
8
|
class RegexpRanges
|
|
9
|
-
attr_reader :
|
|
9
|
+
attr_reader :root
|
|
10
10
|
|
|
11
11
|
def initialize(root)
|
|
12
12
|
@root = root
|
|
13
13
|
@compound_token = []
|
|
14
|
+
@pairs = []
|
|
15
|
+
@populated = false
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def compound_token
|
|
19
|
+
populate_all unless @populated
|
|
20
|
+
|
|
21
|
+
@compound_token
|
|
14
22
|
end
|
|
15
23
|
|
|
16
24
|
def pairs
|
|
17
|
-
unless @
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
populate_all unless @populated
|
|
26
|
+
|
|
27
|
+
@pairs
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def populate_all
|
|
33
|
+
populate(@root)
|
|
21
34
|
|
|
22
35
|
# If either bound is a compound the first one is an escape
|
|
23
36
|
# and that's all we need to work with.
|
|
24
37
|
# If there are any cops that wanted to operate on the compound
|
|
25
38
|
# expression we could wrap it with a facade class.
|
|
26
|
-
@pairs.map { |pair| pair.map(&:first) }
|
|
27
|
-
end
|
|
39
|
+
@pairs.map! { |pair| pair.map(&:first) }
|
|
28
40
|
|
|
29
|
-
|
|
41
|
+
@populated = true
|
|
42
|
+
end
|
|
30
43
|
|
|
31
44
|
def populate(expr)
|
|
32
45
|
expressions = expr.expressions.to_a
|
|
@@ -35,15 +48,15 @@ module RuboCop
|
|
|
35
48
|
current = expressions.shift
|
|
36
49
|
|
|
37
50
|
if escaped_octal?(current)
|
|
38
|
-
compound_token << current
|
|
39
|
-
compound_token.concat(pop_octal_digits(expressions))
|
|
51
|
+
@compound_token << current
|
|
52
|
+
@compound_token.concat(pop_octal_digits(expressions))
|
|
40
53
|
# If we have all the digits we can discard.
|
|
41
54
|
end
|
|
42
55
|
|
|
43
56
|
next unless current.type == :set
|
|
44
57
|
|
|
45
58
|
process_set(expressions, current)
|
|
46
|
-
compound_token.clear
|
|
59
|
+
@compound_token.clear
|
|
47
60
|
end
|
|
48
61
|
end
|
|
49
62
|
|
|
@@ -64,8 +77,8 @@ module RuboCop
|
|
|
64
77
|
|
|
65
78
|
def compose_range(expressions, current)
|
|
66
79
|
range_start, range_end = current.expressions
|
|
67
|
-
range_start = if compound_token.size.between?(1, 2) && octal_digit?(range_start.text)
|
|
68
|
-
compound_token.dup << range_start
|
|
80
|
+
range_start = if @compound_token.size.between?(1, 2) && octal_digit?(range_start.text)
|
|
81
|
+
@compound_token.dup << range_start
|
|
69
82
|
else
|
|
70
83
|
[range_start]
|
|
71
84
|
end
|
|
@@ -102,10 +102,11 @@ module RuboCop
|
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
def multiple_assignment_node
|
|
105
|
-
grandparent_node = node.parent&.parent
|
|
106
|
-
|
|
105
|
+
return nil unless (grandparent_node = node.parent&.parent)
|
|
106
|
+
if (node = find_multiple_assignment_node(grandparent_node))
|
|
107
|
+
return node
|
|
108
|
+
end
|
|
107
109
|
return nil unless grandparent_node.type == MULTIPLE_ASSIGNMENT_TYPE
|
|
108
|
-
return nil unless node.parent.type == MULTIPLE_LEFT_HAND_SIDE_TYPE
|
|
109
110
|
|
|
110
111
|
grandparent_node
|
|
111
112
|
end
|
|
@@ -118,9 +119,17 @@ module RuboCop
|
|
|
118
119
|
end
|
|
119
120
|
|
|
120
121
|
def for_assignment_node
|
|
121
|
-
|
|
122
|
+
node.ancestors.find(&:for_type?)
|
|
123
|
+
end
|
|
122
124
|
|
|
123
|
-
|
|
125
|
+
def find_multiple_assignment_node(grandparent_node)
|
|
126
|
+
return unless grandparent_node.type == MULTIPLE_LEFT_HAND_SIDE_TYPE
|
|
127
|
+
return if grandparent_node.children.any?(&:splat_type?)
|
|
128
|
+
|
|
129
|
+
parent = grandparent_node.parent
|
|
130
|
+
return parent if parent.type == MULTIPLE_ASSIGNMENT_TYPE
|
|
131
|
+
|
|
132
|
+
find_multiple_assignment_node(parent)
|
|
124
133
|
end
|
|
125
134
|
end
|
|
126
135
|
end
|
|
@@ -251,9 +251,18 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
251
251
|
"\ninclude::../partials/#{filename}[]\n"
|
|
252
252
|
end
|
|
253
253
|
|
|
254
|
+
# rubocop:disable Metrics/MethodLength
|
|
254
255
|
def print_cops_of_department(department)
|
|
255
256
|
selected_cops = cops_of_department(department)
|
|
256
|
-
content =
|
|
257
|
+
content = +<<~HEADER
|
|
258
|
+
////
|
|
259
|
+
Do NOT edit this file by hand directly, as it is automatically generated.
|
|
260
|
+
|
|
261
|
+
Please make any necessary changes to the cop documentation within the source files themselves.
|
|
262
|
+
////
|
|
263
|
+
|
|
264
|
+
= #{department}
|
|
265
|
+
HEADER
|
|
257
266
|
selected_cops.each { |cop| content << print_cop_with_doc(cop) }
|
|
258
267
|
content << footer_for_department(department)
|
|
259
268
|
file_name = "#{docs_path}/#{department_to_basename(department)}.adoc"
|
|
@@ -262,6 +271,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
262
271
|
file.write("#{content.strip}\n")
|
|
263
272
|
end
|
|
264
273
|
end
|
|
274
|
+
# rubocop:enable Metrics/MethodLength
|
|
265
275
|
|
|
266
276
|
def print_cop_with_doc(cop) # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
|
|
267
277
|
cop_config = config.for_cop(cop)
|
|
@@ -54,10 +54,7 @@ module RuboCop
|
|
|
54
54
|
return enum_for(__method__, named: named) unless block_given?
|
|
55
55
|
|
|
56
56
|
parsed_tree&.traverse do |event, exp, _index|
|
|
57
|
-
yield(exp) if event
|
|
58
|
-
named == exp.respond_to?(:name) &&
|
|
59
|
-
exp.respond_to?(:capturing?) &&
|
|
60
|
-
exp.capturing?
|
|
57
|
+
yield(exp) if named_capturing?(exp, event, named)
|
|
61
58
|
end
|
|
62
59
|
|
|
63
60
|
self
|
|
@@ -65,6 +62,14 @@ module RuboCop
|
|
|
65
62
|
|
|
66
63
|
private
|
|
67
64
|
|
|
65
|
+
def named_capturing?(exp, event, named)
|
|
66
|
+
event == :enter &&
|
|
67
|
+
named == exp.respond_to?(:name) &&
|
|
68
|
+
!exp.text.start_with?('(?<=') &&
|
|
69
|
+
exp.respond_to?(:capturing?) &&
|
|
70
|
+
exp.capturing?
|
|
71
|
+
end
|
|
72
|
+
|
|
68
73
|
def with_interpolations_blanked
|
|
69
74
|
# Ignore the trailing regopt node
|
|
70
75
|
children[0...-1].map do |child|
|