rubocop 0.74.0 → 0.78.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/README.md +3 -2
- data/config/default.yml +366 -318
- data/lib/rubocop.rb +48 -32
- data/lib/rubocop/ast/builder.rb +1 -0
- data/lib/rubocop/ast/node.rb +5 -1
- data/lib/rubocop/ast/node/block_node.rb +2 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -12
- data/lib/rubocop/ast/node/return_node.rb +24 -0
- data/lib/rubocop/cli.rb +11 -227
- data/lib/rubocop/cli/command.rb +21 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
- data/lib/rubocop/cli/command/base.rb +33 -0
- data/lib/rubocop/cli/command/execute_runner.rb +76 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
- data/lib/rubocop/cli/command/show_cops.rb +73 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/comment_config.rb +5 -4
- data/lib/rubocop/config.rb +12 -1
- data/lib/rubocop/config_loader.rb +21 -3
- data/lib/rubocop/config_loader_resolver.rb +4 -3
- data/lib/rubocop/config_obsoletion.rb +85 -11
- data/lib/rubocop/config_validator.rb +28 -19
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
- data/lib/rubocop/cop/commissioner.rb +15 -7
- data/lib/rubocop/cop/cop.rb +35 -9
- data/lib/rubocop/cop/corrector.rb +8 -7
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
- data/lib/rubocop/cop/generator.rb +3 -3
- data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
- data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +11 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
- data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -7
- data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
- data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
- data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
- data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +6 -6
- data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -0
- data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
- data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
- data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
- data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
- data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
- 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 +5 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
- data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
- data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +7 -26
- data/lib/rubocop/cop/message_annotator.rb +16 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
- data/lib/rubocop/cop/migration/department_name.rb +44 -0
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
- data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
- data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
- data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +12 -5
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
- data/lib/rubocop/cop/naming/method_name.rb +12 -1
- data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
- data/lib/rubocop/cop/naming/variable_name.rb +1 -0
- data/lib/rubocop/cop/offense.rb +29 -7
- data/lib/rubocop/cop/registry.rb +22 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
- data/lib/rubocop/cop/style/alias.rb +1 -1
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +10 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
- data/lib/rubocop/cop/style/commented_keyword.rb +8 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
- data/lib/rubocop/cop/style/copyright.rb +11 -7
- data/lib/rubocop/cop/style/documentation_method.rb +44 -0
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +5 -5
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
- data/lib/rubocop/cop/style/format_string.rb +10 -7
- data/lib/rubocop/cop/style/format_string_token.rb +19 -68
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
- data/lib/rubocop/cop/style/guard_clause.rb +3 -2
- data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +93 -15
- data/lib/rubocop/cop/style/infinite_loop.rb +6 -5
- data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
- data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
- data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
- data/lib/rubocop/cop/style/next.rb +5 -5
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
- data/lib/rubocop/cop/style/option_hash.rb +3 -3
- data/lib/rubocop/cop/style/or_assignment.rb +6 -1
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
- data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
- data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
- data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
- data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +39 -29
- data/lib/rubocop/cop/style/redundant_self.rb +18 -1
- data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
- data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
- data/lib/rubocop/cop/style/semicolon.rb +13 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
- data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/team.rb +5 -0
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +120 -0
- data/lib/rubocop/cop/variable_force.rb +7 -5
- data/lib/rubocop/cop/variable_force/variable.rb +15 -2
- data/lib/rubocop/core_ext/string.rb +0 -24
- data/lib/rubocop/formatter/base_formatter.rb +2 -2
- data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
- data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
- data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +16 -15
- data/lib/rubocop/formatter/json_formatter.rb +6 -5
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
- data/lib/rubocop/formatter/tap_formatter.rb +18 -7
- data/lib/rubocop/magic_comment.rb +4 -0
- data/lib/rubocop/node_pattern.rb +4 -2
- data/lib/rubocop/options.rb +21 -26
- data/lib/rubocop/processed_source.rb +1 -1
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/result_cache.rb +24 -8
- data/lib/rubocop/runner.rb +60 -33
- data/lib/rubocop/target_finder.rb +12 -6
- data/lib/rubocop/version.rb +1 -1
- metadata +48 -33
- data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
- data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb}
RENAMED
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# The Lint/
|
3
|
+
# The Lint/RedundantCopEnableDirective cop needs to be disabled so as
|
4
4
|
# to be able to provide a (bad) example of an unneeded enable.
|
5
5
|
|
6
|
-
# rubocop:disable Lint/
|
6
|
+
# rubocop:disable Lint/RedundantCopEnableDirective
|
7
7
|
module RuboCop
|
8
8
|
module Cop
|
9
9
|
module Lint
|
@@ -15,24 +15,24 @@ module RuboCop
|
|
15
15
|
# @example
|
16
16
|
# # bad
|
17
17
|
# foo = 1
|
18
|
-
# # rubocop:enable
|
18
|
+
# # rubocop:enable Layout/LineLength
|
19
19
|
#
|
20
20
|
# # good
|
21
21
|
# foo = 1
|
22
22
|
# @example
|
23
23
|
# # bad
|
24
|
-
# # rubocop:disable
|
24
|
+
# # rubocop:disable Layout/LineLength
|
25
25
|
# baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
|
26
|
-
# # rubocop:enable
|
26
|
+
# # rubocop:enable Layout/LineLength
|
27
27
|
# baz
|
28
28
|
# # rubocop:enable all
|
29
29
|
#
|
30
30
|
# # good
|
31
|
-
# # rubocop:disable
|
31
|
+
# # rubocop:disable Layout/LineLength
|
32
32
|
# baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
|
33
33
|
# # rubocop:enable all
|
34
34
|
# baz
|
35
|
-
class
|
35
|
+
class RedundantCopEnableDirective < Cop
|
36
36
|
include RangeHelp
|
37
37
|
include SurroundingSpace
|
38
38
|
|
@@ -94,16 +94,14 @@ module RuboCop
|
|
94
94
|
|
95
95
|
def range_to_remove(begin_pos, end_pos, comma_pos, comment)
|
96
96
|
start = comment_start(comment)
|
97
|
-
buffer = processed_source.buffer
|
98
|
-
range_class = Parser::Source::Range
|
99
97
|
|
100
98
|
case comma_pos
|
101
99
|
when :before
|
102
|
-
|
100
|
+
range_between(start + begin_pos - 1, start + end_pos)
|
103
101
|
when :after
|
104
|
-
|
102
|
+
range_between(start + begin_pos, start + end_pos + 1)
|
105
103
|
else
|
106
|
-
|
104
|
+
range_between(start, comment.loc.expression.end_pos)
|
107
105
|
end
|
108
106
|
end
|
109
107
|
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
# else
|
50
50
|
# baz
|
51
51
|
# end
|
52
|
-
class
|
52
|
+
class RedundantSplatExpansion < Cop
|
53
53
|
MSG = 'Replace splat expansion with comma separated values.'
|
54
54
|
ARRAY_PARAM_MSG = 'Pass array contents as separate arguments.'
|
55
55
|
PERCENT_W = '%w'
|
@@ -70,7 +70,7 @@ module RuboCop
|
|
70
70
|
PATTERN
|
71
71
|
|
72
72
|
def on_splat(node)
|
73
|
-
|
73
|
+
redundant_splat_expansion(node) do
|
74
74
|
if array_splat?(node) &&
|
75
75
|
(method_argument?(node) || part_of_an_array?(node))
|
76
76
|
add_offense(node, message: ARRAY_PARAM_MSG)
|
@@ -90,7 +90,7 @@ module RuboCop
|
|
90
90
|
|
91
91
|
private
|
92
92
|
|
93
|
-
def
|
93
|
+
def redundant_splat_expansion(node)
|
94
94
|
literal_expansion(node) do |expanded_item|
|
95
95
|
if expanded_item.send_type?
|
96
96
|
return if array_new_inside_array_literal?(expanded_item)
|
@@ -119,7 +119,7 @@ module RuboCop
|
|
119
119
|
[node.parent.loc.expression, variable.source]
|
120
120
|
elsif !variable.array_type?
|
121
121
|
[loc.expression, "[#{variable.source}]"]
|
122
|
-
elsif
|
122
|
+
elsif redundant_brackets?(node)
|
123
123
|
[loc.expression, remove_brackets(variable)]
|
124
124
|
else
|
125
125
|
[loc.operator, '']
|
@@ -141,12 +141,12 @@ module RuboCop
|
|
141
141
|
parent.array_type? && parent.loc.begin && parent.loc.end
|
142
142
|
end
|
143
143
|
|
144
|
-
def
|
144
|
+
def redundant_brackets?(node)
|
145
145
|
parent = node.parent
|
146
146
|
grandparent = node.parent.parent
|
147
147
|
|
148
148
|
parent.when_type? || parent.send_type? || part_of_an_array?(node) ||
|
149
|
-
|
149
|
+
grandparent&.resbody_type?
|
150
150
|
end
|
151
151
|
|
152
152
|
def remove_brackets(array)
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
def autocorrect(node)
|
51
51
|
lambda do |corrector|
|
52
52
|
redundant_with_index?(node) do |send|
|
53
|
-
if send.
|
53
|
+
if send.method?(:each_with_index)
|
54
54
|
corrector.replace(send.loc.selector, 'each')
|
55
55
|
else
|
56
56
|
corrector.remove(with_index_range(send))
|
@@ -63,7 +63,7 @@ module RuboCop
|
|
63
63
|
private
|
64
64
|
|
65
65
|
def message(node)
|
66
|
-
if node.
|
66
|
+
if node.method?(:each_with_index)
|
67
67
|
MSG_EACH_WITH_INDEX
|
68
68
|
else
|
69
69
|
MSG_WITH_INDEX
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
def autocorrect(node)
|
52
52
|
lambda do |corrector|
|
53
53
|
redundant_with_object?(node) do |send|
|
54
|
-
if send.
|
54
|
+
if send.method?(:each_with_object)
|
55
55
|
corrector.replace(with_object_range(send), 'each')
|
56
56
|
else
|
57
57
|
corrector.remove(with_object_range(send))
|
@@ -64,7 +64,7 @@ module RuboCop
|
|
64
64
|
private
|
65
65
|
|
66
66
|
def message(node)
|
67
|
-
if node.
|
67
|
+
if node.method?(:each_with_object)
|
68
68
|
MSG_EACH_WITH_OBJECT
|
69
69
|
else
|
70
70
|
MSG_WITH_OBJECT
|
@@ -42,9 +42,9 @@ module RuboCop
|
|
42
42
|
|
43
43
|
method_chain = method_chain(node)
|
44
44
|
location =
|
45
|
-
Parser::Source::Range.new(node.
|
46
|
-
safe_nav.
|
47
|
-
method_chain.
|
45
|
+
Parser::Source::Range.new(node.source_range.source_buffer,
|
46
|
+
safe_nav.source_range.end_pos,
|
47
|
+
method_chain.source_range.end_pos)
|
48
48
|
add_offense(node, location: location)
|
49
49
|
end
|
50
50
|
end
|
@@ -54,9 +54,8 @@ module RuboCop
|
|
54
54
|
def method_chain(node)
|
55
55
|
chain = node
|
56
56
|
while chain.send_type?
|
57
|
-
chain = chain.parent if chain.parent
|
58
|
-
|
59
|
-
break
|
57
|
+
chain = chain.parent if chain.parent&.call_type?
|
58
|
+
break # FIXME: Unconditional break. Why while "loop" then?
|
60
59
|
end
|
61
60
|
chain
|
62
61
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
#
|
7
|
+
# This cop checks for `send`, `public_send`, and `__send__` methods
|
8
|
+
# when using mix-in.
|
9
|
+
#
|
10
|
+
# `include` and `prepend` methods were private methods until Ruby 2.0,
|
11
|
+
# they were mixed-in via `send` method. This cop uses Ruby 2.1 or
|
12
|
+
# higher style that can be called by public methods.
|
13
|
+
# And `extend` method that was originally a public method is also targeted
|
14
|
+
# for style unification.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# # bad
|
18
|
+
# Foo.send(:include, Bar)
|
19
|
+
# Foo.send(:prepend, Bar)
|
20
|
+
# Foo.send(:extend, Bar)
|
21
|
+
#
|
22
|
+
# # bad
|
23
|
+
# Foo.public_send(:include, Bar)
|
24
|
+
# Foo.public_send(:prepend, Bar)
|
25
|
+
# Foo.public_send(:extend, Bar)
|
26
|
+
#
|
27
|
+
# # bad
|
28
|
+
# Foo.__send__(:include, Bar)
|
29
|
+
# Foo.__send__(:prepend, Bar)
|
30
|
+
# Foo.__send__(:extend, Bar)
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# Foo.include Bar
|
34
|
+
# Foo.prepend Bar
|
35
|
+
# Foo.extend Bar
|
36
|
+
#
|
37
|
+
class SendWithMixinArgument < Cop
|
38
|
+
include RangeHelp
|
39
|
+
|
40
|
+
MSG = 'Use `%<method>s %<module_name>s` instead of `%<bad_method>s`.'
|
41
|
+
MIXIN_METHODS = %i[include prepend extend].freeze
|
42
|
+
|
43
|
+
def_node_matcher :send_with_mixin_argument?, <<~PATTERN
|
44
|
+
(send
|
45
|
+
(const _ _) {:send :public_send :__send__}
|
46
|
+
({sym str} $#mixin_method?)
|
47
|
+
$(const _ _))
|
48
|
+
PATTERN
|
49
|
+
|
50
|
+
def on_send(node)
|
51
|
+
send_with_mixin_argument?(node) do |method, module_name|
|
52
|
+
message = message(
|
53
|
+
method, module_name.source, bad_location(node).source
|
54
|
+
)
|
55
|
+
|
56
|
+
add_offense(node, location: bad_location(node), message: message)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def autocorrect(node)
|
61
|
+
send_with_mixin_argument?(node) do |method, module_name|
|
62
|
+
lambda do |corrector|
|
63
|
+
corrector.replace(
|
64
|
+
bad_location(node), "#{method} #{module_name.source}"
|
65
|
+
)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def bad_location(node)
|
73
|
+
loc = node.loc
|
74
|
+
|
75
|
+
range_between(loc.selector.begin_pos, loc.expression.end_pos)
|
76
|
+
end
|
77
|
+
|
78
|
+
def message(method, module_name, bad_method)
|
79
|
+
format(
|
80
|
+
MSG,
|
81
|
+
method: method, module_name: module_name, bad_method: bad_method
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
def mixin_method?(node)
|
86
|
+
MIXIN_METHODS.include?(node.to_sym)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -6,9 +6,7 @@ module RuboCop
|
|
6
6
|
# This cop checks for unused block arguments.
|
7
7
|
#
|
8
8
|
# @example
|
9
|
-
#
|
10
9
|
# # bad
|
11
|
-
#
|
12
10
|
# do_something do |used, unused|
|
13
11
|
# puts used
|
14
12
|
# end
|
@@ -21,10 +19,7 @@ module RuboCop
|
|
21
19
|
# puts :baz
|
22
20
|
# end
|
23
21
|
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
# #good
|
27
|
-
#
|
22
|
+
# # good
|
28
23
|
# do_something do |used, _unused|
|
29
24
|
# puts used
|
30
25
|
# end
|
@@ -36,6 +31,27 @@ module RuboCop
|
|
36
31
|
# define_method(:foo) do |_bar|
|
37
32
|
# puts :baz
|
38
33
|
# end
|
34
|
+
#
|
35
|
+
# @example IgnoreEmptyBlocks: true (default)
|
36
|
+
# # good
|
37
|
+
# do_something { |unused| }
|
38
|
+
#
|
39
|
+
# @example IgnoreEmptyBlocks: false
|
40
|
+
# # bad
|
41
|
+
# do_something { |unused| }
|
42
|
+
#
|
43
|
+
# @example AllowUnusedKeywordArguments: false (default)
|
44
|
+
# # bad
|
45
|
+
# do_something do |unused: 42|
|
46
|
+
# foo
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# @example AllowUnusedKeywordArguments: true
|
50
|
+
# # good
|
51
|
+
# do_something do |unused: 42|
|
52
|
+
# foo
|
53
|
+
# end
|
54
|
+
#
|
39
55
|
class UnusedBlockArgument < Cop
|
40
56
|
include UnusedArgument
|
41
57
|
|
@@ -6,20 +6,38 @@ module RuboCop
|
|
6
6
|
# This cop checks for unused method arguments.
|
7
7
|
#
|
8
8
|
# @example
|
9
|
-
#
|
10
9
|
# # bad
|
11
|
-
#
|
12
10
|
# def some_method(used, unused, _unused_but_allowed)
|
13
11
|
# puts used
|
14
12
|
# end
|
15
13
|
#
|
16
|
-
# @example
|
17
|
-
#
|
18
14
|
# # good
|
19
|
-
#
|
20
15
|
# def some_method(used, _unused, _unused_but_allowed)
|
21
16
|
# puts used
|
22
17
|
# end
|
18
|
+
#
|
19
|
+
# @example AllowUnusedKeywordArguments: false (default)
|
20
|
+
# # bad
|
21
|
+
# def do_something(used, unused: 42)
|
22
|
+
# used
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# @example AllowUnusedKeywordArguments: true
|
26
|
+
# # good
|
27
|
+
# def do_something(used, unused: 42)
|
28
|
+
# used
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# @example IgnoreEmptyMethods: true (default)
|
32
|
+
# # good
|
33
|
+
# def do_something(unused)
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# @example IgnoreEmptyMethods: false
|
37
|
+
# # bad
|
38
|
+
# def do_something(unused)
|
39
|
+
# end
|
40
|
+
#
|
23
41
|
class UnusedMethodArgument < Cop
|
24
42
|
include UnusedArgument
|
25
43
|
|
@@ -9,23 +9,64 @@ module RuboCop
|
|
9
9
|
# always being defined, and thus access modifiers guarding such methods
|
10
10
|
# are not redundant.
|
11
11
|
#
|
12
|
-
#
|
12
|
+
# This cop has `ContextCreatingMethods` option. The default setting value
|
13
|
+
# is an empty array that means no method is specified.
|
14
|
+
# This setting is an array of methods which, when called, are known to
|
15
|
+
# create its own context in the module's current access context.
|
16
|
+
#
|
17
|
+
# It also has `MethodCreatingMethods` option. The default setting value
|
18
|
+
# is an empty array that means no method is specified.
|
19
|
+
# This setting is an array of methods which, when called, are known to
|
20
|
+
# create other methods in the module's current access context.
|
13
21
|
#
|
22
|
+
# @example
|
23
|
+
# # bad
|
14
24
|
# class Foo
|
15
25
|
# public # this is redundant (default access is public)
|
16
26
|
#
|
17
27
|
# def method
|
18
28
|
# end
|
29
|
+
# end
|
19
30
|
#
|
20
|
-
#
|
21
|
-
#
|
31
|
+
# # bad
|
32
|
+
# class Foo
|
33
|
+
# # The following is redundant (methods defined on the class'
|
34
|
+
# # singleton class are not affected by the public modifier)
|
35
|
+
# public
|
36
|
+
#
|
37
|
+
# def self.method3
|
22
38
|
# end
|
39
|
+
# end
|
23
40
|
#
|
41
|
+
# # bad
|
42
|
+
# class Foo
|
43
|
+
# protected
|
44
|
+
#
|
45
|
+
# define_method(:method2) do
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# protected # this is redundant (repeated from previous modifier)
|
49
|
+
#
|
50
|
+
# [1,2,3].each do |i|
|
51
|
+
# define_method("foo#{i}") do
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# # bad
|
57
|
+
# class Foo
|
24
58
|
# private # this is redundant (no following methods are defined)
|
25
59
|
# end
|
26
60
|
#
|
27
|
-
#
|
61
|
+
# # good
|
62
|
+
# class Foo
|
63
|
+
# private # this is not redundant (a method is defined)
|
64
|
+
#
|
65
|
+
# def method2
|
66
|
+
# end
|
67
|
+
# end
|
28
68
|
#
|
69
|
+
# # good
|
29
70
|
# class Foo
|
30
71
|
# # The following is not redundant (conditionally defined methods are
|
31
72
|
# # considered as always defining a method)
|
@@ -35,31 +76,22 @@ module RuboCop
|
|
35
76
|
# def method
|
36
77
|
# end
|
37
78
|
# end
|
79
|
+
# end
|
38
80
|
#
|
39
|
-
#
|
81
|
+
# # good
|
82
|
+
# class Foo
|
83
|
+
# protected # this is not redundant (a method is defined)
|
40
84
|
#
|
41
85
|
# define_method(:method2) do
|
42
86
|
# end
|
43
|
-
#
|
44
|
-
# protected # this is redundant (repeated from previous modifier)
|
45
|
-
#
|
46
|
-
# [1,2,3].each do |i|
|
47
|
-
# define_method("foo#{i}") do
|
48
|
-
# end
|
49
|
-
# end
|
50
|
-
#
|
51
|
-
# # The following is redundant (methods defined on the class'
|
52
|
-
# # singleton class are not affected by the public modifier)
|
53
|
-
# public
|
54
|
-
#
|
55
|
-
# def self.method3
|
56
|
-
# end
|
57
87
|
# end
|
58
88
|
#
|
59
|
-
# @example
|
89
|
+
# @example ContextCreatingMethods: concerning
|
60
90
|
# # Lint/UselessAccessModifier:
|
61
91
|
# # ContextCreatingMethods:
|
62
92
|
# # - concerning
|
93
|
+
#
|
94
|
+
# # good
|
63
95
|
# require 'active_support/concern'
|
64
96
|
# class Foo
|
65
97
|
# concerning :Bar do
|
@@ -79,10 +111,12 @@ module RuboCop
|
|
79
111
|
# end
|
80
112
|
# end
|
81
113
|
#
|
82
|
-
# @example
|
114
|
+
# @example MethodCreatingMethods: delegate
|
83
115
|
# # Lint/UselessAccessModifier:
|
84
116
|
# # MethodCreatingMethods:
|
85
117
|
# # - delegate
|
118
|
+
#
|
119
|
+
# # good
|
86
120
|
# require 'active_support/core_ext/module/delegation'
|
87
121
|
# class Foo
|
88
122
|
# # this is not redundant because `delegate` creates methods
|
@@ -141,7 +175,7 @@ module RuboCop
|
|
141
175
|
|
142
176
|
def access_modifier?(node)
|
143
177
|
node.bare_access_modifier? ||
|
144
|
-
node.
|
178
|
+
node.method?(:private_class_method)
|
145
179
|
end
|
146
180
|
|
147
181
|
def check_scope(node)
|
@@ -169,7 +203,7 @@ module RuboCop
|
|
169
203
|
def check_send_node(node, cur_vis, unused)
|
170
204
|
if node.bare_access_modifier?
|
171
205
|
check_new_visibility(node, unused, node.method_name, cur_vis)
|
172
|
-
elsif node.
|
206
|
+
elsif node.method?(:private_class_method) && !node.arguments?
|
173
207
|
add_offense(node, message: format(MSG, current: node.method_name))
|
174
208
|
[cur_vis, unused]
|
175
209
|
end
|