rubocop 0.92.0 → 1.2.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 +21 -7
- data/config/default.yml +169 -59
- data/exe/rubocop +1 -1
- data/lib/rubocop.rb +15 -3
- data/lib/rubocop/cached_data.rb +2 -1
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
- data/lib/rubocop/cli/command/version.rb +1 -1
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +4 -0
- data/lib/rubocop/config_loader.rb +19 -2
- data/lib/rubocop/config_loader_resolver.rb +7 -5
- data/lib/rubocop/config_validator.rb +7 -6
- data/lib/rubocop/cop/badge.rb +9 -24
- data/lib/rubocop/cop/base.rb +16 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +23 -3
- data/lib/rubocop/cop/commissioner.rb +36 -22
- data/lib/rubocop/cop/corrector.rb +3 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/force.rb +1 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +10 -10
- data/lib/rubocop/cop/layout/class_structure.rb +7 -0
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +6 -9
- data/lib/rubocop/cop/layout/else_alignment.rb +15 -2
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +7 -7
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +4 -4
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +24 -18
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +2 -11
- data/lib/rubocop/cop/layout/space_around_operators.rb +4 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +0 -4
- data/lib/rubocop/cop/layout/space_inside_parens.rb +35 -13
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +37 -13
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +2 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +18 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +3 -0
- data/lib/rubocop/cop/lint/debugger.rb +2 -3
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +77 -0
- data/lib/rubocop/cop/lint/else_layout.rb +29 -3
- data/lib/rubocop/cop/lint/empty_block.rb +59 -0
- data/lib/rubocop/cop/lint/flip_flop.rb +8 -2
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +37 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +17 -3
- data/lib/rubocop/cop/lint/loop.rb +0 -4
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +14 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +58 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +46 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +27 -8
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +78 -0
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +95 -0
- data/lib/rubocop/cop/lint/to_json.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +185 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +6 -1
- data/lib/rubocop/cop/metrics/block_length.rb +3 -1
- data/lib/rubocop/cop/metrics/class_length.rb +14 -6
- data/lib/rubocop/cop/metrics/parameter_lists.rb +4 -1
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +12 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +11 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +67 -18
- data/lib/rubocop/cop/naming/predicate_name.rb +2 -1
- data/lib/rubocop/cop/naming/variable_number.rb +82 -8
- data/lib/rubocop/cop/offense.rb +18 -5
- data/lib/rubocop/cop/security/open.rb +12 -10
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +6 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +3 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +142 -0
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +0 -4
- data/lib/rubocop/cop/style/case_like_if.rb +18 -6
- data/lib/rubocop/cop/style/class_equality_comparison.rb +64 -0
- data/lib/rubocop/cop/style/collection_compact.rb +85 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +8 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +6 -0
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +67 -0
- data/lib/rubocop/cop/style/double_negation.rb +6 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +6 -2
- data/lib/rubocop/cop/style/for.rb +0 -4
- data/lib/rubocop/cop/style/format_string_token.rb +48 -3
- data/lib/rubocop/cop/style/hash_syntax.rb +3 -3
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +12 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +10 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +6 -11
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +7 -11
- data/lib/rubocop/cop/style/method_def_parentheses.rb +0 -4
- data/lib/rubocop/cop/style/mixin_grouping.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +54 -7
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +99 -0
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -0
- data/lib/rubocop/cop/style/raise_args.rb +21 -9
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -8
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +6 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +45 -24
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -15
- data/lib/rubocop/cop/style/redundant_self.rb +3 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +16 -4
- data/lib/rubocop/cop/style/semicolon.rb +3 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +14 -2
- data/lib/rubocop/cop/style/swap_values.rb +108 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +3 -1
- data/lib/rubocop/cop/team.rb +6 -1
- data/lib/rubocop/cop/util.rb +5 -1
- data/lib/rubocop/cop/variable_force/branch.rb +0 -4
- data/lib/rubocop/ext/regexp_node.rb +35 -11
- data/lib/rubocop/ext/regexp_parser.rb +84 -0
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +47 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/magic_comment.rb +2 -2
- data/lib/rubocop/options.rb +6 -1
- data/lib/rubocop/result_cache.rb +8 -2
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/runner.rb +4 -4
- data/lib/rubocop/target_finder.rb +23 -25
- data/lib/rubocop/version.rb +56 -6
- metadata +22 -8
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +0 -43
@@ -7,15 +7,19 @@ module RuboCop
|
|
7
7
|
# Style omit_parentheses
|
8
8
|
module OmitParentheses
|
9
9
|
TRAILING_WHITESPACE_REGEX = /\s+\Z/.freeze
|
10
|
+
OMIT_MSG = 'Omit parentheses for method calls with arguments.'
|
11
|
+
private_constant :OMIT_MSG
|
10
12
|
|
11
|
-
|
13
|
+
private
|
14
|
+
|
15
|
+
def omit_parentheses(node)
|
12
16
|
return unless node.parenthesized?
|
13
17
|
return if node.implicit_call?
|
14
18
|
return if super_call_without_arguments?(node)
|
15
19
|
return if allowed_camel_case_method_call?(node)
|
16
20
|
return if legitimate_call_with_parentheses?(node)
|
17
21
|
|
18
|
-
add_offense(offense_range(node)) do |corrector|
|
22
|
+
add_offense(offense_range(node), message: OMIT_MSG) do |corrector|
|
19
23
|
if parentheses_at_the_end_of_multiline_call?(node)
|
20
24
|
corrector.replace(args_begin(node), ' \\')
|
21
25
|
else
|
@@ -24,20 +28,11 @@ module RuboCop
|
|
24
28
|
corrector.remove(node.loc.end)
|
25
29
|
end
|
26
30
|
end
|
27
|
-
alias on_csend on_send
|
28
|
-
alias on_super on_send
|
29
|
-
alias on_yield on_send
|
30
|
-
|
31
|
-
private
|
32
31
|
|
33
32
|
def offense_range(node)
|
34
33
|
node.loc.begin.join(node.loc.end)
|
35
34
|
end
|
36
35
|
|
37
|
-
def message(_range = nil)
|
38
|
-
'Omit parentheses for method calls with arguments.'
|
39
|
-
end
|
40
|
-
|
41
36
|
def super_call_without_arguments?(node)
|
42
37
|
node.super_type? && node.arguments.none?
|
43
38
|
end
|
@@ -6,27 +6,23 @@ module RuboCop
|
|
6
6
|
class MethodCallWithArgsParentheses
|
7
7
|
# Style require_parentheses
|
8
8
|
module RequireParentheses
|
9
|
-
|
9
|
+
REQUIRE_MSG = 'Use parentheses for method calls with arguments.'
|
10
|
+
private_constant :REQUIRE_MSG
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def require_parentheses(node)
|
10
15
|
return if ignored_method?(node.method_name)
|
11
16
|
return if matches_ignored_pattern?(node.method_name)
|
12
17
|
return if eligible_for_parentheses_omission?(node)
|
13
18
|
return unless node.arguments? && !node.parenthesized?
|
14
19
|
|
15
|
-
add_offense(node) do |corrector|
|
20
|
+
add_offense(node, message: REQUIRE_MSG) do |corrector|
|
16
21
|
corrector.replace(args_begin(node), '(')
|
17
22
|
|
18
23
|
corrector.insert_after(args_end(node), ')') unless args_parenthesized?(node)
|
19
24
|
end
|
20
25
|
end
|
21
|
-
alias on_csend on_send
|
22
|
-
alias on_super on_send
|
23
|
-
alias on_yield on_send
|
24
|
-
|
25
|
-
def message(_node = nil)
|
26
|
-
'Use parentheses for method calls with arguments.'
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
26
|
|
31
27
|
def eligible_for_parentheses_omission?(node)
|
32
28
|
node.operator_method? || node.setter_method? || ignored_macro?(node)
|
@@ -140,16 +140,12 @@ module RuboCop
|
|
140
140
|
def missing_parentheses(node)
|
141
141
|
location = node.arguments.source_range
|
142
142
|
|
143
|
-
return unless unexpected_style_detected(:require_no_parentheses)
|
144
|
-
|
145
143
|
add_offense(location, message: MSG_MISSING) do |corrector|
|
146
144
|
correct_definition(node, corrector)
|
147
145
|
end
|
148
146
|
end
|
149
147
|
|
150
148
|
def unwanted_parentheses(args)
|
151
|
-
return unless unexpected_style_detected(:require_parentheses)
|
152
|
-
|
153
149
|
add_offense(args, message: MSG_PRESENT) do |corrector|
|
154
150
|
# offense is registered on args node when parentheses are unwanted
|
155
151
|
correct_arguments(args, corrector)
|
@@ -4,7 +4,10 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# This cop checks against comparing a variable with multiple items, where
|
7
|
-
# `Array#include?` could be used instead
|
7
|
+
# `Array#include?`, `Set#include?` or a `case` could be used instead
|
8
|
+
# to avoid code repetition.
|
9
|
+
# It accepts comparisons of multiple method calls to avoid unnecessary method calls
|
10
|
+
# by default. It can be configured by `AllowMethodComparison` option.
|
8
11
|
#
|
9
12
|
# @example
|
10
13
|
# # bad
|
@@ -14,25 +17,61 @@ module RuboCop
|
|
14
17
|
# # good
|
15
18
|
# a = 'a'
|
16
19
|
# foo if ['a', 'b', 'c'].include?(a)
|
20
|
+
#
|
21
|
+
# VALUES = Set['a', 'b', 'c'].freeze
|
22
|
+
# # elsewhere...
|
23
|
+
# foo if VALUES.include?(a)
|
24
|
+
#
|
25
|
+
# case foo
|
26
|
+
# when 'a', 'b', 'c' then foo
|
27
|
+
# # ...
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# # accepted (but consider `case` as above)
|
31
|
+
# foo if a == b.lightweight || a == b.heavyweight
|
32
|
+
#
|
33
|
+
# @example AllowMethodComparison: true (default)
|
34
|
+
# # good
|
35
|
+
# foo if a == b.lightweight || a == b.heavyweight
|
36
|
+
#
|
37
|
+
# @example AllowMethodComparison: false
|
38
|
+
# # bad
|
39
|
+
# foo if a == b.lightweight || a == b.heavyweight
|
40
|
+
#
|
41
|
+
# # good
|
42
|
+
# foo if [b.lightweight, b.heavyweight].include?(a)
|
17
43
|
class MultipleComparison < Base
|
44
|
+
extend AutoCorrector
|
45
|
+
|
18
46
|
MSG = 'Avoid comparing a variable with multiple items ' \
|
19
47
|
'in a conditional, use `Array#include?` instead.'
|
20
48
|
|
49
|
+
def on_new_investigation
|
50
|
+
@compared_elements = []
|
51
|
+
end
|
52
|
+
|
21
53
|
def on_or(node)
|
22
54
|
root_of_or_node = root_of_or_node(node)
|
23
55
|
|
24
56
|
return unless node == root_of_or_node
|
25
57
|
return unless nested_variable_comparison?(root_of_or_node)
|
26
58
|
|
27
|
-
add_offense(node)
|
59
|
+
add_offense(node) do |corrector|
|
60
|
+
elements = @compared_elements.join(', ')
|
61
|
+
prefer_method = "[#{elements}].include?(#{variables_in_node(node).first})"
|
62
|
+
|
63
|
+
corrector.replace(node, prefer_method)
|
64
|
+
end
|
28
65
|
end
|
29
66
|
|
30
67
|
private
|
31
68
|
|
32
69
|
def_node_matcher :simple_double_comparison?, '(send $lvar :== $lvar)'
|
33
|
-
def_node_matcher :
|
34
|
-
|
35
|
-
|
70
|
+
def_node_matcher :simple_comparison_lhs?, <<~PATTERN
|
71
|
+
(send $lvar :== $_)
|
72
|
+
PATTERN
|
73
|
+
def_node_matcher :simple_comparison_rhs?, <<~PATTERN
|
74
|
+
(send $_ :== $lvar)
|
36
75
|
PATTERN
|
37
76
|
|
38
77
|
def nested_variable_comparison?(node)
|
@@ -55,9 +94,13 @@ module RuboCop
|
|
55
94
|
simple_double_comparison?(node) do |var1, var2|
|
56
95
|
return [variable_name(var1), variable_name(var2)]
|
57
96
|
end
|
58
|
-
|
97
|
+
if (var, obj = simple_comparison_lhs?(node)) || (obj, var = simple_comparison_rhs?(node))
|
98
|
+
return [] if allow_method_comparison? && obj.send_type?
|
99
|
+
|
100
|
+
@compared_elements << obj.source
|
59
101
|
return [variable_name(var)]
|
60
102
|
end
|
103
|
+
|
61
104
|
[]
|
62
105
|
end
|
63
106
|
|
@@ -74,7 +117,7 @@ module RuboCop
|
|
74
117
|
end
|
75
118
|
|
76
119
|
def comparison?(node)
|
77
|
-
|
120
|
+
simple_comparison_lhs?(node) || simple_comparison_rhs?(node) || nested_comparison?(node)
|
78
121
|
end
|
79
122
|
|
80
123
|
def root_of_or_node(or_node)
|
@@ -86,6 +129,10 @@ module RuboCop
|
|
86
129
|
or_node
|
87
130
|
end
|
88
131
|
end
|
132
|
+
|
133
|
+
def allow_method_comparison?
|
134
|
+
cop_config.fetch('AllowMethodComparison', true)
|
135
|
+
end
|
89
136
|
end
|
90
137
|
end
|
91
138
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for uses of `if-else` and ternary operators with a negated condition
|
7
|
+
# which can be simplified by inverting condition and swapping branches.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# if !x
|
12
|
+
# do_something
|
13
|
+
# else
|
14
|
+
# do_something_else
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# if x
|
19
|
+
# do_something_else
|
20
|
+
# else
|
21
|
+
# do_something
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# # bad
|
25
|
+
# !x ? do_something : do_something_else
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# x ? do_something_else : do_something
|
29
|
+
#
|
30
|
+
class NegatedIfElseCondition < Base
|
31
|
+
extend AutoCorrector
|
32
|
+
|
33
|
+
MSG = 'Invert the negated condition and swap the %<type>s branches.'
|
34
|
+
|
35
|
+
NEGATED_EQUALITY_METHODS = %i[!= !~].freeze
|
36
|
+
|
37
|
+
def self.autocorrect_incompatible_with
|
38
|
+
[Style::InverseMethods, Style::Not]
|
39
|
+
end
|
40
|
+
|
41
|
+
def on_new_investigation
|
42
|
+
@corrected_nodes = nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def on_if(node)
|
46
|
+
return unless if_else?(node)
|
47
|
+
|
48
|
+
condition = node.condition
|
49
|
+
return unless negated_condition?(condition)
|
50
|
+
|
51
|
+
type = node.ternary? ? 'ternary' : 'if-else'
|
52
|
+
add_offense(node, message: format(MSG, type: type)) do |corrector|
|
53
|
+
unless corrected_ancestor?(node)
|
54
|
+
correct_negated_condition(corrector, condition)
|
55
|
+
swap_branches(corrector, node)
|
56
|
+
|
57
|
+
@corrected_nodes ||= Set.new.compare_by_identity
|
58
|
+
@corrected_nodes.add(node)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def if_else?(node)
|
66
|
+
else_branch = node.else_branch
|
67
|
+
!node.elsif? && else_branch && (!else_branch.if_type? || !else_branch.elsif?)
|
68
|
+
end
|
69
|
+
|
70
|
+
def negated_condition?(node)
|
71
|
+
node.send_type? &&
|
72
|
+
(node.negation_method? || NEGATED_EQUALITY_METHODS.include?(node.method_name))
|
73
|
+
end
|
74
|
+
|
75
|
+
def corrected_ancestor?(node)
|
76
|
+
node.each_ancestor(:if).any? { |ancestor| @corrected_nodes&.include?(ancestor) }
|
77
|
+
end
|
78
|
+
|
79
|
+
def correct_negated_condition(corrector, node)
|
80
|
+
receiver, method_name, rhs = *node
|
81
|
+
replacement =
|
82
|
+
if node.negation_method?
|
83
|
+
receiver.source
|
84
|
+
else
|
85
|
+
inverted_method = method_name.to_s.sub('!', '=')
|
86
|
+
"#{receiver.source} #{inverted_method} #{rhs.source}"
|
87
|
+
end
|
88
|
+
|
89
|
+
corrector.replace(node, replacement)
|
90
|
+
end
|
91
|
+
|
92
|
+
def swap_branches(corrector, node)
|
93
|
+
corrector.replace(node.if_branch, node.else_branch.source)
|
94
|
+
corrector.replace(node.else_branch, node.if_branch.source)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -13,25 +13,32 @@ module RuboCop
|
|
13
13
|
# will also suggest constructing error objects when the exception is
|
14
14
|
# passed multiple arguments.
|
15
15
|
#
|
16
|
+
# The exploded style has an `AllowedCompactTypes` configuration
|
17
|
+
# option that takes an Array of exception name Strings.
|
18
|
+
#
|
16
19
|
# @example EnforcedStyle: exploded (default)
|
17
20
|
# # bad
|
18
|
-
# raise StandardError.new(
|
21
|
+
# raise StandardError.new('message')
|
19
22
|
#
|
20
23
|
# # good
|
21
|
-
# raise StandardError,
|
22
|
-
# fail
|
24
|
+
# raise StandardError, 'message'
|
25
|
+
# fail 'message'
|
23
26
|
# raise MyCustomError.new(arg1, arg2, arg3)
|
24
27
|
# raise MyKwArgError.new(key1: val1, key2: val2)
|
25
28
|
#
|
29
|
+
# # With `AllowedCompactTypes` set to ['MyWrappedError']
|
30
|
+
# raise MyWrappedError.new(obj)
|
31
|
+
# raise MyWrappedError.new(obj), 'message'
|
32
|
+
#
|
26
33
|
# @example EnforcedStyle: compact
|
27
34
|
# # bad
|
28
|
-
# raise StandardError,
|
35
|
+
# raise StandardError, 'message'
|
29
36
|
# raise RuntimeError, arg1, arg2, arg3
|
30
37
|
#
|
31
38
|
# # good
|
32
|
-
# raise StandardError.new(
|
39
|
+
# raise StandardError.new('message')
|
33
40
|
# raise MyCustomError.new(arg1, arg2, arg3)
|
34
|
-
# fail
|
41
|
+
# fail 'message'
|
35
42
|
class RaiseArgs < Base
|
36
43
|
include ConfigurableEnforcedStyle
|
37
44
|
extend AutoCorrector
|
@@ -84,8 +91,6 @@ module RuboCop
|
|
84
91
|
|
85
92
|
def check_compact(node)
|
86
93
|
if node.arguments.size > 1
|
87
|
-
return unless opposite_style_detected
|
88
|
-
|
89
94
|
add_offense(node, message: format(COMPACT_MSG, method: node.method_name)) do |corrector|
|
90
95
|
replacement = correction_exploded_to_compact(node)
|
91
96
|
|
@@ -103,7 +108,8 @@ module RuboCop
|
|
103
108
|
|
104
109
|
return unless first_arg.send_type? && first_arg.method?(:new)
|
105
110
|
return if acceptable_exploded_args?(first_arg.arguments)
|
106
|
-
|
111
|
+
|
112
|
+
return if allowed_non_exploded_type?(first_arg)
|
107
113
|
|
108
114
|
add_offense(node, message: format(EXPLODED_MSG, method: node.method_name)) do |corrector|
|
109
115
|
replacement = correction_compact_to_exploded(node)
|
@@ -126,6 +132,12 @@ module RuboCop
|
|
126
132
|
arg.hash_type? || arg.splat_type?
|
127
133
|
end
|
128
134
|
|
135
|
+
def allowed_non_exploded_type?(arg)
|
136
|
+
type = arg.receiver.const_name
|
137
|
+
|
138
|
+
Array(cop_config['AllowedCompactTypes']).include?(type)
|
139
|
+
end
|
140
|
+
|
129
141
|
def requires_parens?(parent)
|
130
142
|
parent.and_type? || parent.or_type? ||
|
131
143
|
parent.if_type? && parent.ternary?
|
@@ -28,6 +28,14 @@ module RuboCop
|
|
28
28
|
# end
|
29
29
|
#
|
30
30
|
# # bad
|
31
|
+
# begin
|
32
|
+
# do_something
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# # good
|
36
|
+
# do_something
|
37
|
+
#
|
38
|
+
# # bad
|
31
39
|
# # When using Ruby 2.5 or later.
|
32
40
|
# do_something do
|
33
41
|
# begin
|
@@ -60,7 +68,9 @@ module RuboCop
|
|
60
68
|
MSG = 'Redundant `begin` block detected.'
|
61
69
|
|
62
70
|
def on_def(node)
|
63
|
-
|
71
|
+
return unless node.body&.kwbegin_type?
|
72
|
+
|
73
|
+
register_offense(node.body)
|
64
74
|
end
|
65
75
|
alias on_defs on_def
|
66
76
|
|
@@ -69,20 +79,38 @@ module RuboCop
|
|
69
79
|
|
70
80
|
return if node.send_node.lambda_literal?
|
71
81
|
return if node.braces?
|
82
|
+
return unless node.body&.kwbegin_type?
|
72
83
|
|
73
|
-
|
84
|
+
register_offense(node.body)
|
74
85
|
end
|
75
86
|
|
76
|
-
|
87
|
+
def on_kwbegin(node)
|
88
|
+
return if contain_rescue_or_ensure?(node) || valid_context_using_only_begin?(node)
|
77
89
|
|
78
|
-
|
79
|
-
|
90
|
+
register_offense(node)
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
80
94
|
|
81
|
-
|
82
|
-
|
83
|
-
corrector.remove(node.
|
95
|
+
def register_offense(node)
|
96
|
+
add_offense(node.loc.begin) do |corrector|
|
97
|
+
corrector.remove(node.loc.begin)
|
98
|
+
corrector.remove(node.loc.end)
|
84
99
|
end
|
85
100
|
end
|
101
|
+
|
102
|
+
def contain_rescue_or_ensure?(node)
|
103
|
+
first_child = node.children.first
|
104
|
+
|
105
|
+
first_child.rescue_type? || first_child.ensure_type?
|
106
|
+
end
|
107
|
+
|
108
|
+
def valid_context_using_only_begin?(node)
|
109
|
+
parent = node.parent
|
110
|
+
|
111
|
+
node.each_ancestor.any?(&:assignment?) || parent&.post_condition_loop? ||
|
112
|
+
parent&.send_type? || parent&.operator_keyword?
|
113
|
+
end
|
86
114
|
end
|
87
115
|
end
|
88
116
|
end
|