rubocop 0.90.0 → 0.91.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 +2 -2
- data/config/default.yml +35 -0
- data/lib/rubocop.rb +10 -1
- data/lib/rubocop/cli/command/execute_runner.rb +8 -0
- data/lib/rubocop/config_loader.rb +3 -3
- data/lib/rubocop/config_store.rb +3 -3
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +6 -5
- data/lib/rubocop/cop/layout/end_alignment.rb +5 -10
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +17 -4
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -3
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -6
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
- data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +54 -0
- data/lib/rubocop/cop/lint/debugger.rb +2 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
- data/lib/rubocop/cop/lint/duplicate_require.rb +7 -2
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
- data/lib/rubocop/cop/lint/empty_file.rb +1 -4
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/identity_comparison.rb +49 -0
- data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -2
- data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
- data/lib/rubocop/cop/lint/rand_one.rb +2 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
- data/lib/rubocop/cop/lint/to_json.rb +16 -5
- data/lib/rubocop/cop/lint/unreachable_loop.rb +2 -1
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +2 -1
- data/lib/rubocop/cop/lint/useless_method_definition.rb +20 -27
- data/lib/rubocop/cop/lint/useless_times.rb +97 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +3 -9
- data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +9 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -1
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/security/eval.rb +1 -0
- data/lib/rubocop/cop/security/json_load.rb +1 -0
- data/lib/rubocop/cop/security/marshal_load.rb +1 -0
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -11
- data/lib/rubocop/cop/style/alias.rb +2 -0
- data/lib/rubocop/cop/style/array_join.rb +1 -0
- data/lib/rubocop/cop/style/attr.rb +1 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -0
- data/lib/rubocop/cop/style/case_equality.rb +3 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +2 -0
- data/lib/rubocop/cop/style/class_check.rb +6 -9
- data/lib/rubocop/cop/style/class_methods_definitions.rb +42 -16
- data/lib/rubocop/cop/style/class_vars.rb +1 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +49 -60
- data/lib/rubocop/cop/style/dir.rb +1 -0
- data/lib/rubocop/cop/style/double_negation.rb +1 -0
- data/lib/rubocop/cop/style/empty_literal.rb +3 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -3
- data/lib/rubocop/cop/style/even_odd.rb +1 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/float_division.rb +2 -0
- data/lib/rubocop/cop/style/format_string.rb +1 -4
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +12 -2
- data/lib/rubocop/cop/style/hash_transform_keys.rb +5 -11
- data/lib/rubocop/cop/style/hash_transform_values.rb +5 -11
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +3 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -0
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +14 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/non_nil_check.rb +2 -0
- data/lib/rubocop/cop/style/not.rb +1 -0
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -3
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +2 -0
- data/lib/rubocop/cop/style/raise_args.rb +2 -0
- data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +12 -3
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
- data/lib/rubocop/cop/style/redundant_sort.rb +1 -7
- data/lib/rubocop/cop/style/safe_navigation.rb +5 -0
- data/lib/rubocop/cop/style/sample.rb +2 -1
- data/lib/rubocop/cop/style/send.rb +2 -3
- data/lib/rubocop/cop/style/signal_exception.rb +2 -0
- data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +2 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +16 -2
- data/lib/rubocop/cop/style/strip.rb +1 -0
- data/lib/rubocop/cop/style/unpack_first.rb +1 -0
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -5
- data/lib/rubocop/core_ext/string.rb +1 -1
- data/lib/rubocop/ext/regexp_node.rb +4 -4
- data/lib/rubocop/options.rb +19 -1
- data/lib/rubocop/result_cache.rb +30 -13
- data/lib/rubocop/runner.rb +29 -14
- data/lib/rubocop/version.rb +1 -1
- metadata +8 -4
@@ -52,6 +52,8 @@ module RuboCop
|
|
52
52
|
'instead of ' \
|
53
53
|
'`Pathname.new(__FILE__).parent.expand_path`.'
|
54
54
|
|
55
|
+
RESTRICT_ON_SEND = %i[expand_path].freeze
|
56
|
+
|
55
57
|
def_node_matcher :file_expand_path, <<~PATTERN
|
56
58
|
(send
|
57
59
|
(const {nil? cbase} :File) :expand_path
|
@@ -75,8 +77,6 @@ module RuboCop
|
|
75
77
|
PATTERN
|
76
78
|
|
77
79
|
def on_send(node)
|
78
|
-
return unless node.method?(:expand_path)
|
79
|
-
|
80
80
|
if (current_path, default_dir = file_expand_path(node))
|
81
81
|
inspect_offense_for_expand_path(node, current_path, default_dir)
|
82
82
|
elsif (default_dir = pathname_parent_expand_path(node))
|
@@ -83,7 +83,7 @@ module RuboCop
|
|
83
83
|
replacement = ' &block'
|
84
84
|
replacement = ",#{replacement}" unless arg_range.source.end_with?(',')
|
85
85
|
corrector.insert_after(arg_range, replacement) unless last_arg.blockarg_type?
|
86
|
-
elsif node.
|
86
|
+
elsif node.call_type?
|
87
87
|
corrector.insert_after(node, '(&block)')
|
88
88
|
else
|
89
89
|
corrector.insert_after(node.loc.name, '(&block)')
|
@@ -40,8 +40,7 @@ module RuboCop
|
|
40
40
|
extend AutoCorrector
|
41
41
|
|
42
42
|
MSG = 'Favor `%<prefer>s` over `%<current>s`.'
|
43
|
-
|
44
|
-
FORMAT_METHODS = %i[format sprintf %].freeze
|
43
|
+
RESTRICT_ON_SEND = %i[format sprintf %].freeze
|
45
44
|
|
46
45
|
def_node_matcher :formatter, <<~PATTERN
|
47
46
|
{
|
@@ -56,8 +55,6 @@ module RuboCop
|
|
56
55
|
PATTERN
|
57
56
|
|
58
57
|
def on_send(node)
|
59
|
-
return unless FORMAT_METHODS.include?(node.method_name)
|
60
|
-
|
61
58
|
formatter(node) do |selector|
|
62
59
|
detected_style = selector == :% ? :percent : selector
|
63
60
|
|
@@ -6,6 +6,9 @@ module RuboCop
|
|
6
6
|
# Checks for presence or absence of braces around hash literal as a last
|
7
7
|
# array item depending on configuration.
|
8
8
|
#
|
9
|
+
# NOTE: This cop will ignore arrays where all items are hashes, regardless of
|
10
|
+
# EnforcedStyle.
|
11
|
+
#
|
9
12
|
# @example EnforcedStyle: braces (default)
|
10
13
|
# # bad
|
11
14
|
# [1, 2, one: 1, two: 2]
|
@@ -13,6 +16,9 @@ module RuboCop
|
|
13
16
|
# # good
|
14
17
|
# [1, 2, { one: 1, two: 2 }]
|
15
18
|
#
|
19
|
+
# # good
|
20
|
+
# [{ one: 1 }, { two: 2 }]
|
21
|
+
#
|
16
22
|
# @example EnforcedStyle: no_braces
|
17
23
|
# # bad
|
18
24
|
# [1, 2, { one: 1, two: 2 }]
|
@@ -20,6 +26,8 @@ module RuboCop
|
|
20
26
|
# # good
|
21
27
|
# [1, 2, one: 1, two: 2]
|
22
28
|
#
|
29
|
+
# # good
|
30
|
+
# [{ one: 1 }, { two: 2 }]
|
23
31
|
class HashAsLastArrayItem < Base
|
24
32
|
include ConfigurableEnforcedStyle
|
25
33
|
extend AutoCorrector
|
@@ -38,9 +46,10 @@ module RuboCop
|
|
38
46
|
|
39
47
|
def last_array_item?(node)
|
40
48
|
parent = node.parent
|
41
|
-
return false unless parent
|
49
|
+
return false unless parent&.array_type?
|
50
|
+
return false if parent.child_nodes.all?(&:hash_type?)
|
42
51
|
|
43
|
-
parent.
|
52
|
+
parent.children.last.equal?(node)
|
44
53
|
end
|
45
54
|
|
46
55
|
def check_braces(node)
|
@@ -53,6 +62,7 @@ module RuboCop
|
|
53
62
|
|
54
63
|
def check_no_braces(node)
|
55
64
|
return unless node.braces?
|
65
|
+
return if node.children.empty? # Empty hash cannot be "unbraced"
|
56
66
|
|
57
67
|
add_offense(node, message: 'Omit the braces around the hash.') do |corrector|
|
58
68
|
corrector.remove(node.loc.begin)
|
@@ -34,15 +34,13 @@ module RuboCop
|
|
34
34
|
|
35
35
|
def_node_matcher :on_bad_each_with_object, <<~PATTERN
|
36
36
|
(block
|
37
|
-
({send csend}
|
38
|
-
!{(send _ :each_with_index) (array ...)}
|
39
|
-
:each_with_object (hash))
|
37
|
+
({send csend} !#array_receiver? :each_with_object (hash))
|
40
38
|
(args
|
41
39
|
(mlhs
|
42
40
|
(arg $_)
|
43
41
|
(arg _val))
|
44
42
|
(arg _memo))
|
45
|
-
({send csend} (lvar _memo) :[]=
|
43
|
+
({send csend} (lvar _memo) :[]= $!`_memo $(lvar _val)))
|
46
44
|
PATTERN
|
47
45
|
|
48
46
|
def_node_matcher :on_bad_hash_brackets_map, <<~PATTERN
|
@@ -50,7 +48,7 @@ module RuboCop
|
|
50
48
|
(const _ :Hash)
|
51
49
|
:[]
|
52
50
|
(block
|
53
|
-
({send csend}
|
51
|
+
({send csend} !#array_receiver? {:map :collect})
|
54
52
|
(args
|
55
53
|
(arg $_)
|
56
54
|
(arg _val))
|
@@ -60,9 +58,7 @@ module RuboCop
|
|
60
58
|
def_node_matcher :on_bad_map_to_h, <<~PATTERN
|
61
59
|
({send csend}
|
62
60
|
(block
|
63
|
-
({send csend}
|
64
|
-
!{(send _ :each_with_index) (array ...)}
|
65
|
-
{:map :collect})
|
61
|
+
({send csend} !#array_receiver? {:map :collect})
|
66
62
|
(args
|
67
63
|
(arg $_)
|
68
64
|
(arg _val))
|
@@ -72,9 +68,7 @@ module RuboCop
|
|
72
68
|
|
73
69
|
def_node_matcher :on_bad_to_h, <<~PATTERN
|
74
70
|
(block
|
75
|
-
({send csend}
|
76
|
-
!{(send _ :each_with_index) (array ...)}
|
77
|
-
:to_h)
|
71
|
+
({send csend} !#array_receiver? :to_h)
|
78
72
|
(args
|
79
73
|
(arg $_)
|
80
74
|
(arg _val))
|
@@ -31,15 +31,13 @@ module RuboCop
|
|
31
31
|
|
32
32
|
def_node_matcher :on_bad_each_with_object, <<~PATTERN
|
33
33
|
(block
|
34
|
-
({send csend}
|
35
|
-
!{(send _ :each_with_index) (array ...)}
|
36
|
-
:each_with_object (hash))
|
34
|
+
({send csend} !#array_receiver? :each_with_object (hash))
|
37
35
|
(args
|
38
36
|
(mlhs
|
39
37
|
(arg _key)
|
40
38
|
(arg $_))
|
41
39
|
(arg _memo))
|
42
|
-
({send csend} (lvar _memo) :[]= $(lvar _key)
|
40
|
+
({send csend} (lvar _memo) :[]= $(lvar _key) $!`_memo))
|
43
41
|
PATTERN
|
44
42
|
|
45
43
|
def_node_matcher :on_bad_hash_brackets_map, <<~PATTERN
|
@@ -47,7 +45,7 @@ module RuboCop
|
|
47
45
|
(const _ :Hash)
|
48
46
|
:[]
|
49
47
|
(block
|
50
|
-
({send csend}
|
48
|
+
({send csend} !#array_receiver? {:map :collect})
|
51
49
|
(args
|
52
50
|
(arg _key)
|
53
51
|
(arg $_))
|
@@ -57,9 +55,7 @@ module RuboCop
|
|
57
55
|
def_node_matcher :on_bad_map_to_h, <<~PATTERN
|
58
56
|
({send csend}
|
59
57
|
(block
|
60
|
-
({send csend}
|
61
|
-
!{(send _ :each_with_index) (array ...)}
|
62
|
-
{:map :collect})
|
58
|
+
({send csend} !#array_receiver? {:map :collect})
|
63
59
|
(args
|
64
60
|
(arg _key)
|
65
61
|
(arg $_))
|
@@ -69,9 +65,7 @@ module RuboCop
|
|
69
65
|
|
70
66
|
def_node_matcher :on_bad_to_h, <<~PATTERN
|
71
67
|
(block
|
72
|
-
({send csend}
|
73
|
-
!{(send _ :each_with_index) (array ...)}
|
74
|
-
:to_h)
|
68
|
+
({send csend} !#array_receiver? :to_h)
|
75
69
|
(args
|
76
70
|
(arg _key)
|
77
71
|
(arg $_))
|
@@ -17,6 +17,7 @@ module RuboCop
|
|
17
17
|
class ImplicitRuntimeError < Base
|
18
18
|
MSG = 'Use `%<method>s` with an explicit exception class and message,' \
|
19
19
|
' rather than just a message.'
|
20
|
+
RESTRICT_ON_SEND = %i[raise fail].freeze
|
20
21
|
|
21
22
|
def_node_matcher :implicit_runtime_error_raise_or_fail,
|
22
23
|
'(send nil? ${:raise :fail} {str dstr})'
|
@@ -22,8 +22,10 @@ module RuboCop
|
|
22
22
|
include ConfigurableEnforcedStyle
|
23
23
|
extend AutoCorrector
|
24
24
|
|
25
|
+
RESTRICT_ON_SEND = %i[call].freeze
|
26
|
+
|
25
27
|
def on_send(node)
|
26
|
-
return unless node.receiver
|
28
|
+
return unless node.receiver
|
27
29
|
|
28
30
|
if offense?(node) && opposite_style_detected
|
29
31
|
add_offense(node) do |corrector|
|
@@ -43,6 +43,7 @@ module RuboCop
|
|
43
43
|
class MixinUsage < Base
|
44
44
|
MSG = '`%<statement>s` is used at the top level. Use inside `class` ' \
|
45
45
|
'or `module`.'
|
46
|
+
RESTRICT_ON_SEND = %i[include extend prepend].freeze
|
46
47
|
|
47
48
|
def_node_matcher :include_statement, <<~PATTERN
|
48
49
|
(send nil? ${:include :extend :prepend}
|
@@ -5,6 +5,9 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop checks for multi-line ternary op expressions.
|
7
7
|
#
|
8
|
+
# NOTE: `return if ... else ... end` is syntax error. If `return` is used before
|
9
|
+
# multiline ternary operator expression, it cannot be auto-corrected.
|
10
|
+
#
|
8
11
|
# @example
|
9
12
|
# # bad
|
10
13
|
# a = cond ?
|
@@ -29,9 +32,13 @@ module RuboCop
|
|
29
32
|
'use `if` or `unless` instead.'
|
30
33
|
|
31
34
|
def on_if(node)
|
32
|
-
return unless
|
35
|
+
return unless offense?(node)
|
33
36
|
|
34
37
|
add_offense(node) do |corrector|
|
38
|
+
# `return if ... else ... end` is syntax error. If `return` is used before
|
39
|
+
# multiline ternary operator expression, it cannot be auto-corrected.
|
40
|
+
next unless offense?(node) && !node.parent.return_type?
|
41
|
+
|
35
42
|
corrector.replace(node, <<~RUBY.chop)
|
36
43
|
if #{node.condition.source}
|
37
44
|
#{node.if_branch.source}
|
@@ -41,6 +48,12 @@ module RuboCop
|
|
41
48
|
RUBY
|
42
49
|
end
|
43
50
|
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def offense?(node)
|
55
|
+
node.ternary? && node.multiline?
|
56
|
+
end
|
44
57
|
end
|
45
58
|
end
|
46
59
|
end
|
@@ -35,6 +35,8 @@ module RuboCop
|
|
35
35
|
PREDICATE_MSG = 'Prefer the use of the `nil?` predicate.'
|
36
36
|
EXPLICIT_MSG = 'Prefer the use of the `==` comparison.'
|
37
37
|
|
38
|
+
RESTRICT_ON_SEND = %i[== === nil?].freeze
|
39
|
+
|
38
40
|
def_node_matcher :nil_comparison?, '(send _ {:== :===} nil)'
|
39
41
|
def_node_matcher :nil_check?, '(send _ :nil?)'
|
40
42
|
|
@@ -41,6 +41,8 @@ module RuboCop
|
|
41
41
|
class NonNilCheck < Base
|
42
42
|
extend AutoCorrector
|
43
43
|
|
44
|
+
RESTRICT_ON_SEND = %i[!= nil? !].freeze
|
45
|
+
|
44
46
|
def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'
|
45
47
|
def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'
|
46
48
|
def_node_matcher :nil_check?, '(send _ :nil?)'
|
@@ -54,11 +54,9 @@ module RuboCop
|
|
54
54
|
'negative?' => '<'
|
55
55
|
}.freeze
|
56
56
|
|
57
|
-
|
57
|
+
RESTRICT_ON_SEND = %i[== > < positive? negative? zero?].freeze
|
58
58
|
|
59
59
|
def on_send(node)
|
60
|
-
return unless COMPARISON_METHODS.include?(node.method_name)
|
61
|
-
|
62
60
|
numeric, replacement = check(node)
|
63
61
|
return unless numeric
|
64
62
|
|
@@ -23,13 +23,11 @@ module RuboCop
|
|
23
23
|
MSG_2 = 'Redundant `RuntimeError.new` call can be replaced with ' \
|
24
24
|
'just the message.'
|
25
25
|
|
26
|
-
|
26
|
+
RESTRICT_ON_SEND = %i[raise fail].freeze
|
27
27
|
|
28
28
|
# Switch `raise RuntimeError, 'message'` to `raise 'message'`, and
|
29
29
|
# `raise RuntimeError.new('message')` to `raise 'message'`.
|
30
30
|
def on_send(node)
|
31
|
-
return unless RAISE_METHODS.include?(node.method_name)
|
32
|
-
|
33
31
|
fix_exploded(node) || fix_compact(node)
|
34
32
|
end
|
35
33
|
|
@@ -17,9 +17,10 @@ module RuboCop
|
|
17
17
|
|
18
18
|
MSG = 'Do not freeze immutable objects, as freezing them has no ' \
|
19
19
|
'effect.'
|
20
|
+
RESTRICT_ON_SEND = %i[freeze].freeze
|
20
21
|
|
21
22
|
def on_send(node)
|
22
|
-
return unless node.receiver &&
|
23
|
+
return unless node.receiver &&
|
23
24
|
(immutable_literal?(node.receiver) ||
|
24
25
|
operation_produces_immutable_object?(node.receiver))
|
25
26
|
|
@@ -26,9 +26,7 @@ module RuboCop
|
|
26
26
|
'^^(block (send _ _ equal?(%0) ...) ...)'
|
27
27
|
|
28
28
|
def on_begin(node)
|
29
|
-
return if !parentheses?(node) || parens_allowed?(node)
|
30
|
-
return if node.parent && (node.parent.while_post_type? ||
|
31
|
-
node.parent.until_post_type?)
|
29
|
+
return if !parentheses?(node) || parens_allowed?(node) || ignore_syntax?(node)
|
32
30
|
|
33
31
|
check(node)
|
34
32
|
end
|
@@ -42,6 +40,13 @@ module RuboCop
|
|
42
40
|
allowed_expression?(node)
|
43
41
|
end
|
44
42
|
|
43
|
+
def ignore_syntax?(node)
|
44
|
+
return false unless (parent = node.parent)
|
45
|
+
|
46
|
+
parent.while_post_type? || parent.until_post_type? ||
|
47
|
+
like_method_argument_parentheses?(parent)
|
48
|
+
end
|
49
|
+
|
45
50
|
def allowed_expression?(node)
|
46
51
|
allowed_ancestor?(node) ||
|
47
52
|
allowed_method_call?(node) ||
|
@@ -68,6 +73,10 @@ module RuboCop
|
|
68
73
|
!ancestor.begin_type? && !ancestor.def_type? && !ancestor.block_type?
|
69
74
|
end
|
70
75
|
|
76
|
+
def like_method_argument_parentheses?(node)
|
77
|
+
node.send_type? && node.arguments.size == 1 && !node.arithmetic_operation?
|
78
|
+
end
|
79
|
+
|
71
80
|
def empty_parentheses?(node)
|
72
81
|
# Don't flag `()`
|
73
82
|
node.children.empty?
|
@@ -37,8 +37,8 @@ module RuboCop
|
|
37
37
|
METHODS_RETURNING_SELF = %i[
|
38
38
|
append clear collect! compare_by_identity concat delete_if
|
39
39
|
fill initialize_copy insert keep_if map! merge! prepend push
|
40
|
-
rehash replace reverse! rotate! shuffle! sort! sort_by!
|
41
|
-
|
40
|
+
rehash replace reverse! rotate! shuffle! sort! sort_by!
|
41
|
+
transform_keys! transform_values! unshift update
|
42
42
|
].to_set.freeze
|
43
43
|
|
44
44
|
ASSIGNMENT_TYPE_TO_RECEIVER_TYPE = {
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
55
55
|
MSG = 'Use `%<suggestion>s` instead of '\
|
56
56
|
'`%<sorter>s...%<accessor_source>s`.'
|
57
57
|
|
58
|
-
|
58
|
+
RESTRICT_ON_SEND = %i[sort sort_by].freeze
|
59
59
|
|
60
60
|
def_node_matcher :redundant_sort?, <<~MATCHER
|
61
61
|
{
|
@@ -74,8 +74,6 @@ module RuboCop
|
|
74
74
|
MATCHER
|
75
75
|
|
76
76
|
def on_send(node)
|
77
|
-
return unless sort_method?(node)
|
78
|
-
|
79
77
|
if (sort_node, sorter, accessor = redundant_sort?(node.parent))
|
80
78
|
ancestor = node.parent
|
81
79
|
elsif (sort_node, sorter, accessor = redundant_sort?(node.parent&.parent))
|
@@ -113,10 +111,6 @@ module RuboCop
|
|
113
111
|
|
114
112
|
private
|
115
113
|
|
116
|
-
def sort_method?(node)
|
117
|
-
SORT_METHODS.include?(node.method_name)
|
118
|
-
end
|
119
|
-
|
120
114
|
def offense_range(sort_node, ancestor)
|
121
115
|
range_between(sort_node.loc.selector.begin_pos, ancestor.loc.expression.end_pos)
|
122
116
|
end
|