rubocop 0.85.0 → 0.88.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 +25 -17
- data/bin/rubocop-profile +31 -0
- data/config/default.yml +132 -11
- data/lib/rubocop.rb +17 -1
- data/lib/rubocop/cli.rb +2 -4
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +1 -1
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +39 -67
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/config_obsoletion.rb +0 -1
- data/lib/rubocop/config_store.rb +4 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +407 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +48 -50
- data/lib/rubocop/cop/cop.rb +91 -235
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +7 -2
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
- data/lib/rubocop/cop/layout/class_structure.rb +2 -37
- data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +27 -68
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -4
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +3 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +11 -1
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +8 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +69 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -3
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +31 -25
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +9 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +11 -26
- data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +22 -0
- data/lib/rubocop/cop/metrics/class_length.rb +25 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
- data/lib/rubocop/cop/metrics/method_length.rb +23 -0
- data/lib/rubocop/cop/metrics/module_length.rb +25 -2
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/code_length.rb +4 -0
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +1 -1
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +10 -5
- data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -4
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +1 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/registry.rb +62 -7
- data/lib/rubocop/cop/style/accessor_grouping.rb +147 -0
- data/lib/rubocop/cop/style/array_coercion.rb +63 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +146 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -4
- data/lib/rubocop/cop/style/case_like_if.rb +217 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +21 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/copyright.rb +3 -3
- data/lib/rubocop/cop/style/date_time.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
- data/lib/rubocop/cop/style/empty_literal.rb +5 -5
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +8 -10
- data/lib/rubocop/cop/style/float_division.rb +7 -10
- data/lib/rubocop/cop/style/format_string_token.rb +5 -5
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +62 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -11
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
- data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +1 -11
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
- data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +3 -4
- data/lib/rubocop/cop/style/parallel_assignment.rb +3 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -2
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
- data/lib/rubocop/cop/style/symbol_array.rb +5 -5
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
- data/lib/rubocop/cop/team.rb +105 -81
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cop/utils/format_string.rb +19 -2
- data/lib/rubocop/cop/variable_force/variable.rb +5 -3
- data/lib/rubocop/file_finder.rb +12 -12
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +15 -8
- data/lib/rubocop/path_util.rb +4 -19
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +6 -9
- data/lib/rubocop/result_cache.rb +12 -8
- data/lib/rubocop/rspec/cop_helper.rb +4 -4
- data/lib/rubocop/rspec/expect_offense.rb +65 -21
- data/lib/rubocop/rspec/shared_contexts.rb +19 -16
- data/lib/rubocop/runner.rb +34 -33
- data/lib/rubocop/target_finder.rb +3 -3
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +1 -1
- metadata +34 -9
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
@@ -81,7 +81,7 @@ module RuboCop
|
|
81
81
|
|
82
82
|
private
|
83
83
|
|
84
|
-
def check_branches(branches)
|
84
|
+
def check_branches(branches) # rubocop:todo Metrics/CyclomaticComplexity
|
85
85
|
# return if any branch is empty. An empty branch can be an `if`
|
86
86
|
# without an `else` or a branch that contains only comments.
|
87
87
|
return if branches.any?(&:nil?)
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
class IfInsideElse < Cop
|
62
62
|
MSG = 'Convert `if` nested inside `else` to `elsif`.'
|
63
63
|
|
64
|
-
def on_if(node)
|
64
|
+
def on_if(node) # rubocop:todo Metrics/CyclomaticComplexity
|
65
65
|
return if node.ternary? || node.unless?
|
66
66
|
|
67
67
|
else_branch = node.else_branch
|
@@ -41,11 +41,8 @@ module RuboCop
|
|
41
41
|
MSG_USE_NORMAL =
|
42
42
|
'Modifier form of `%<keyword>s` makes the line too long.'
|
43
43
|
|
44
|
-
ASSIGNMENT_TYPES = %i[lvasgn casgn cvasgn
|
45
|
-
gvasgn ivasgn masgn].freeze
|
46
|
-
|
47
44
|
def on_if(node)
|
48
|
-
msg = if
|
45
|
+
msg = if single_line_as_modifier?(node)
|
49
46
|
MSG_USE_MODIFIER unless named_capture_in_condition?(node)
|
50
47
|
elsif too_long_due_to_modifier?(node)
|
51
48
|
MSG_USE_NORMAL
|
@@ -125,13 +122,15 @@ module RuboCop
|
|
125
122
|
node.condition.match_with_lvasgn_type?
|
126
123
|
end
|
127
124
|
|
128
|
-
def
|
129
|
-
|
130
|
-
|
125
|
+
def non_eligible_node?(node)
|
126
|
+
non_simple_if_unless?(node) ||
|
127
|
+
node.chained? ||
|
128
|
+
node.nested_conditional? ||
|
129
|
+
super
|
131
130
|
end
|
132
131
|
|
133
|
-
def
|
134
|
-
node.ternary? || node.
|
132
|
+
def non_simple_if_unless?(node)
|
133
|
+
node.ternary? || node.elsif? || node.else?
|
135
134
|
end
|
136
135
|
|
137
136
|
def another_statement_on_same_line?(node)
|
@@ -153,8 +152,9 @@ module RuboCop
|
|
153
152
|
# Parenthesize corrected expression if changing to modifier-if form
|
154
153
|
# would change the meaning of the parent expression
|
155
154
|
# (due to the low operator precedence of modifier-if)
|
156
|
-
|
157
|
-
return
|
155
|
+
parent = node.parent
|
156
|
+
return false if parent.nil?
|
157
|
+
return true if parent.assignment? || parent.operator_keyword?
|
158
158
|
|
159
159
|
node.parent.send_type? && !node.parent.parenthesized?
|
160
160
|
end
|
@@ -33,6 +33,18 @@ module RuboCop
|
|
33
33
|
add_offense(node, location: :keyword,
|
34
34
|
message: format(MSG, keyword: node.keyword))
|
35
35
|
end
|
36
|
+
|
37
|
+
def autocorrect(node)
|
38
|
+
lambda do |corrector|
|
39
|
+
keyword = node.if? ? 'if' : 'unless'
|
40
|
+
|
41
|
+
corrector.replace(node, <<~RUBY.chop)
|
42
|
+
#{keyword} #{node.condition.source}
|
43
|
+
#{node.if_branch.source}
|
44
|
+
end
|
45
|
+
RUBY
|
46
|
+
end
|
47
|
+
end
|
36
48
|
end
|
37
49
|
end
|
38
50
|
end
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
34
34
|
# shortcut out if the string does not look like an IP address
|
35
35
|
return false unless could_be_ip?(contents)
|
36
36
|
|
37
|
-
|
37
|
+
::Resolv::IPv4::Regex.match?(contents) || ::Resolv::IPv6::Regex.match?(contents)
|
38
38
|
end
|
39
39
|
|
40
40
|
# Dummy implementation of method in ConfigurableEnforcedStyle that is
|
@@ -119,17 +119,7 @@ module RuboCop
|
|
119
119
|
private
|
120
120
|
|
121
121
|
def check(node)
|
122
|
-
|
123
|
-
|
124
|
-
if empty_else_cop_enabled?
|
125
|
-
if empty_else_style == :empty
|
126
|
-
add_offense(node)
|
127
|
-
elsif empty_else_style == :nil
|
128
|
-
add_offense(node)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
add_offense(node)
|
122
|
+
add_offense(node) unless node.else?
|
133
123
|
end
|
134
124
|
|
135
125
|
def message(node)
|
@@ -8,11 +8,20 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# @example
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# # bad
|
12
|
+
# Thread.list.select do |t|
|
12
13
|
# t.alive?
|
13
14
|
# end.map do |t|
|
14
15
|
# t.object_id
|
15
16
|
# end
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# alive_threads = Thread.list.select do |t|
|
20
|
+
# t.alive?
|
21
|
+
# end
|
22
|
+
# alive_threads.map do |t|
|
23
|
+
# t.object_id
|
24
|
+
# end
|
16
25
|
class MultilineBlockChain < Cop
|
17
26
|
include RangeHelp
|
18
27
|
|
@@ -17,12 +17,11 @@ module RuboCop
|
|
17
17
|
#
|
18
18
|
# # good
|
19
19
|
# a = cond ? b : c
|
20
|
-
# a =
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
# end
|
20
|
+
# a = if cond
|
21
|
+
# b
|
22
|
+
# else
|
23
|
+
# c
|
24
|
+
# end
|
26
25
|
class MultilineTernaryOperator < Cop
|
27
26
|
MSG = 'Avoid multi-line ternary operators, ' \
|
28
27
|
'use `if` or `unless` instead.'
|
@@ -32,6 +31,18 @@ module RuboCop
|
|
32
31
|
|
33
32
|
add_offense(node)
|
34
33
|
end
|
34
|
+
|
35
|
+
def autocorrect(node)
|
36
|
+
lambda do |corrector|
|
37
|
+
corrector.replace(node, <<~RUBY.chop)
|
38
|
+
if #{node.condition.source}
|
39
|
+
#{node.if_branch.source}
|
40
|
+
else
|
41
|
+
#{node.else_branch.source}
|
42
|
+
end
|
43
|
+
RUBY
|
44
|
+
end
|
45
|
+
end
|
35
46
|
end
|
36
47
|
end
|
37
48
|
end
|
@@ -150,14 +150,14 @@ module RuboCop
|
|
150
150
|
def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
|
151
151
|
{
|
152
152
|
(const _ _)
|
153
|
-
(send (const nil? :Struct) :new ...)
|
154
|
-
(block (send (const nil? :Struct) :new ...) ...)
|
153
|
+
(send (const {nil? cbase} :Struct) :new ...)
|
154
|
+
(block (send (const {nil? cbase} :Struct) :new ...) ...)
|
155
155
|
(send _ :freeze)
|
156
156
|
(send {float int} {:+ :- :* :** :/ :% :<<} _)
|
157
157
|
(send _ {:+ :- :* :** :/ :%} {float int})
|
158
158
|
(send _ {:== :=== :!= :<= :>= :< :>} _)
|
159
|
-
(send (const nil? :ENV) :[] _)
|
160
|
-
(or (send (const nil? :ENV) :[] _) _)
|
159
|
+
(send (const {nil? cbase} :ENV) :[] _)
|
160
|
+
(or (send (const {nil? cbase} :ENV) :[] _) _)
|
161
161
|
(send _ {:count :length :size} ...)
|
162
162
|
(block (send _ {:count :length :size} ...) ...)
|
163
163
|
}
|
@@ -14,6 +14,7 @@ module RuboCop
|
|
14
14
|
# method1(method2 arg)
|
15
15
|
class NestedParenthesizedCalls < Cop
|
16
16
|
include RangeHelp
|
17
|
+
include AllowedMethods
|
17
18
|
|
18
19
|
MSG = 'Add parentheses to nested method call `%<source>s`.'
|
19
20
|
|
@@ -54,13 +55,9 @@ module RuboCop
|
|
54
55
|
|
55
56
|
def allowed?(send_node)
|
56
57
|
send_node.parent.arguments.one? &&
|
57
|
-
|
58
|
+
allowed_method?(send_node.method_name) &&
|
58
59
|
send_node.arguments.one?
|
59
60
|
end
|
60
|
-
|
61
|
-
def allowed_methods
|
62
|
-
cop_config['AllowedMethods'] || []
|
63
|
-
end
|
64
61
|
end
|
65
62
|
end
|
66
63
|
end
|
@@ -26,6 +26,33 @@ module RuboCop
|
|
26
26
|
add_offense(nested_ternary)
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
def autocorrect(node)
|
31
|
+
if_node = if_node(node)
|
32
|
+
|
33
|
+
lambda do |corrector|
|
34
|
+
corrector.replace(if_node, <<~RUBY.chop)
|
35
|
+
if #{if_node.condition.source}
|
36
|
+
#{remove_parentheses(if_node.if_branch.source)}
|
37
|
+
else
|
38
|
+
#{if_node.else_branch.source}
|
39
|
+
end
|
40
|
+
RUBY
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def if_node(node)
|
47
|
+
node = node.parent
|
48
|
+
return node if node.if_type?
|
49
|
+
|
50
|
+
if_node(node)
|
51
|
+
end
|
52
|
+
|
53
|
+
def remove_parentheses(source)
|
54
|
+
source.gsub(/\A\(/, '').gsub(/\)\z/, '')
|
55
|
+
end
|
29
56
|
end
|
30
57
|
end
|
31
58
|
end
|
@@ -191,7 +191,7 @@ module RuboCop
|
|
191
191
|
end
|
192
192
|
|
193
193
|
def end_followed_by_whitespace_only?(source_buffer, end_pos)
|
194
|
-
source_buffer.source[end_pos..-1]
|
194
|
+
/\A\s*$/.match?(source_buffer.source[end_pos..-1])
|
195
195
|
end
|
196
196
|
|
197
197
|
def reindentable_lines(node)
|
@@ -201,7 +201,7 @@ module RuboCop
|
|
201
201
|
lines = (node.source_range.line + 1)...node.loc.end.line
|
202
202
|
lines = lines.to_a - heredoc_lines(node)
|
203
203
|
# Skip blank lines
|
204
|
-
lines.reject { |lineno| buffer.source_line(lineno)
|
204
|
+
lines.reject { |lineno| /\A\s*\z/.match?(buffer.source_line(lineno)) }
|
205
205
|
end
|
206
206
|
|
207
207
|
# Adjust indentation of `lines` to match `node`
|
@@ -77,9 +77,9 @@ module RuboCop
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def octal_literal_type(literal)
|
80
|
-
if literal
|
80
|
+
if OCTAL_ZERO_ONLY_REGEX.match?(literal) && octal_zero_only?
|
81
81
|
:octal_zero_only
|
82
|
-
elsif literal
|
82
|
+
elsif OCTAL_REGEX.match?(literal) && !octal_zero_only?
|
83
83
|
:octal
|
84
84
|
end
|
85
85
|
end
|
@@ -54,15 +54,14 @@ module RuboCop
|
|
54
54
|
}.freeze
|
55
55
|
|
56
56
|
def on_send(node)
|
57
|
+
numeric, replacement = check(node)
|
58
|
+
return unless numeric
|
59
|
+
|
57
60
|
return if ignored_method?(node.method_name) ||
|
58
61
|
node.each_ancestor(:send, :block).any? do |ancestor|
|
59
62
|
ignored_method?(ancestor.method_name)
|
60
63
|
end
|
61
64
|
|
62
|
-
numeric, replacement = check(node)
|
63
|
-
|
64
|
-
return unless numeric
|
65
|
-
|
66
65
|
add_offense(node,
|
67
66
|
message: format(MSG,
|
68
67
|
prefer: replacement,
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
def on_masgn(node)
|
31
31
|
lhs, rhs = *node
|
32
32
|
lhs_elements = *lhs
|
33
|
-
rhs_elements =
|
33
|
+
rhs_elements = Array(rhs).compact # edge case for one constant
|
34
34
|
|
35
35
|
return if allowed_lhs?(lhs) || allowed_rhs?(rhs) ||
|
36
36
|
allowed_masign?(lhs_elements, rhs_elements)
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
42
42
|
lambda do |corrector|
|
43
43
|
left, right = *node
|
44
44
|
left_elements = *left
|
45
|
-
right_elements =
|
45
|
+
right_elements = Array(right).compact
|
46
46
|
order = find_valid_order(left_elements, right_elements)
|
47
47
|
correction = assignment_corrector(node, order)
|
48
48
|
|
@@ -69,7 +69,7 @@ module RuboCop
|
|
69
69
|
|
70
70
|
def allowed_rhs?(node)
|
71
71
|
# Edge case for one constant
|
72
|
-
elements =
|
72
|
+
elements = Array(node).compact
|
73
73
|
|
74
74
|
# Account for edge case of `Constant::CONSTANT`
|
75
75
|
!node.array_type? ||
|
@@ -102,7 +102,7 @@ module RuboCop
|
|
102
102
|
delimiters_regexp = Regexp.union(delimiters)
|
103
103
|
node
|
104
104
|
.children.map { |n| string_source(n) }.compact
|
105
|
-
.any? { |s| delimiters_regexp
|
105
|
+
.any? { |s| delimiters_regexp.match?(s.scrub) }
|
106
106
|
end
|
107
107
|
|
108
108
|
def string_source(node)
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
MSG = 'Use `proc` instead of `Proc.new`.'
|
18
18
|
|
19
19
|
def_node_matcher :proc_new?,
|
20
|
-
'(block $(send (const nil? :Proc) :new) ...)'
|
20
|
+
'(block $(send (const {nil? cbase} :Proc) :new) ...)'
|
21
21
|
|
22
22
|
def on_block(node)
|
23
23
|
proc_new?(node) do |block_method|
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
(send
|
32
32
|
int {:+ :-}
|
33
33
|
(send
|
34
|
-
{nil? (const nil? :Random) (const nil? :Kernel)}
|
34
|
+
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
35
35
|
:rand
|
36
36
|
{int irange erange}))
|
37
37
|
PATTERN
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
def_node_matcher :rand_op_integer?, <<~PATTERN
|
40
40
|
(send
|
41
41
|
(send
|
42
|
-
{nil? (const nil? :Random) (const nil? :Kernel)}
|
42
|
+
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
43
43
|
:rand
|
44
44
|
{int irange erange})
|
45
45
|
{:+ :-}
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
def_node_matcher :rand_modified?, <<~PATTERN
|
50
50
|
(send
|
51
51
|
(send
|
52
|
-
{nil? (const nil? :Random) (const nil? :Kernel)}
|
52
|
+
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
53
53
|
:rand
|
54
54
|
{int irange erange})
|
55
55
|
{:succ :pred :next})
|
@@ -128,14 +128,8 @@ module RuboCop
|
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
|
-
def_node_matcher :namespace, <<~PATTERN
|
132
|
-
{$nil? (const nil? $_)}
|
133
|
-
PATTERN
|
134
|
-
|
135
131
|
def prefix_from_prefix_node(node)
|
136
|
-
|
137
|
-
[namespace, 'rand'].compact.join('.')
|
138
|
-
end
|
132
|
+
[node&.source, 'rand'].compact.join('.')
|
139
133
|
end
|
140
134
|
|
141
135
|
def boundaries_from_random_node(random_node)
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for redundant assignment before returning.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# def test
|
11
|
+
# x = foo
|
12
|
+
# x
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# # bad
|
16
|
+
# def test
|
17
|
+
# if x
|
18
|
+
# z = foo
|
19
|
+
# z
|
20
|
+
# elsif y
|
21
|
+
# z = bar
|
22
|
+
# z
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# def test
|
28
|
+
# foo
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# def test
|
33
|
+
# if x
|
34
|
+
# foo
|
35
|
+
# elsif y
|
36
|
+
# bar
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
class RedundantAssignment < Cop
|
41
|
+
MSG = 'Redundant assignment before returning detected.'
|
42
|
+
|
43
|
+
def_node_matcher :redundant_assignment?, <<~PATTERN
|
44
|
+
(... $(lvasgn _name _expression) (lvar _name))
|
45
|
+
PATTERN
|
46
|
+
|
47
|
+
def on_def(node)
|
48
|
+
check_branch(node.body)
|
49
|
+
end
|
50
|
+
alias on_defs on_def
|
51
|
+
|
52
|
+
def autocorrect(node)
|
53
|
+
lambda do |corrector|
|
54
|
+
expression = node.children[1]
|
55
|
+
corrector.replace(node, expression.source)
|
56
|
+
corrector.remove(right_sibling_of(node))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def check_branch(node)
|
63
|
+
return unless node
|
64
|
+
|
65
|
+
case node.type
|
66
|
+
when :case then check_case_node(node)
|
67
|
+
when :if then check_if_node(node)
|
68
|
+
when :rescue, :resbody
|
69
|
+
check_rescue_node(node)
|
70
|
+
when :ensure then check_ensure_node(node)
|
71
|
+
when :begin, :kwbegin
|
72
|
+
check_begin_node(node)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def check_case_node(node)
|
77
|
+
node.when_branches.each { |when_node| check_branch(when_node.body) }
|
78
|
+
check_branch(node.else_branch)
|
79
|
+
end
|
80
|
+
|
81
|
+
def check_if_node(node)
|
82
|
+
return if node.modifier_form? || node.ternary?
|
83
|
+
|
84
|
+
check_branch(node.if_branch)
|
85
|
+
check_branch(node.else_branch)
|
86
|
+
end
|
87
|
+
|
88
|
+
def check_rescue_node(node)
|
89
|
+
node.child_nodes.each do |child_node|
|
90
|
+
check_branch(child_node)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def check_ensure_node(node)
|
95
|
+
check_branch(node.body)
|
96
|
+
end
|
97
|
+
|
98
|
+
def check_begin_node(node)
|
99
|
+
if (assignment = redundant_assignment?(node))
|
100
|
+
add_offense(assignment)
|
101
|
+
else
|
102
|
+
last_expr = node.children.last
|
103
|
+
check_branch(last_expr)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def right_sibling_of(node)
|
108
|
+
siblings_of(node)[node.sibling_index + 1]
|
109
|
+
end
|
110
|
+
|
111
|
+
def siblings_of(node)
|
112
|
+
node.parent.children
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|