rubocop 0.75.0 → 0.79.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 +341 -316
- data/lib/rubocop.rb +48 -31
- data/lib/rubocop/ast/builder.rb +43 -41
- data/lib/rubocop/ast/node.rb +5 -1
- data/lib/rubocop/ast/node/block_node.rb +2 -0
- data/lib/rubocop/ast/node/def_node.rb +11 -0
- data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
- data/lib/rubocop/ast/node/return_node.rb +24 -0
- data/lib/rubocop/ast/traversal.rb +11 -3
- 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 +80 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +8 -1
- data/lib/rubocop/config_loader.rb +20 -20
- data/lib/rubocop/config_loader_resolver.rb +2 -1
- data/lib/rubocop/config_obsoletion.rb +73 -11
- data/lib/rubocop/config_validator.rb +77 -110
- data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
- 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 +31 -6
- data/lib/rubocop/cop/corrector.rb +8 -7
- 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/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/generator.rb +3 -4
- data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
- 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} +3 -2
- 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 -1
- 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} +16 -8
- data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +5 -5
- 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 +14 -5
- 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_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 +7 -4
- data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
- 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/debugger.rb +2 -2
- 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/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/{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/{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/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 +16 -1
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -7
- 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/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
- data/lib/rubocop/cop/offense.rb +11 -0
- data/lib/rubocop/cop/registry.rb +8 -3
- 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/braces_around_hash_parameters.rb +6 -6
- data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- 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 +2 -2
- 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 +15 -34
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +10 -0
- 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 +45 -3
- data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
- 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 +24 -227
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +168 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
- 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/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +6 -2
- data/lib/rubocop/cop/style/nested_modifier.rb +4 -2
- 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/numeric_predicate.rb +4 -3
- data/lib/rubocop/cop/style/option_hash.rb +3 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
- 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 +3 -3
- 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/{unneeded_sort.rb → redundant_sort.rb} +5 -5
- data/lib/rubocop/cop/style/safe_navigation.rb +19 -8
- data/lib/rubocop/cop/style/semicolon.rb +13 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
- 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/style/yoda_condition.rb +16 -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 +10 -18
- data/lib/rubocop/cop/variable_force.rb +7 -5
- 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 -12
- data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +16 -16
- data/lib/rubocop/formatter/json_formatter.rb +6 -5
- data/lib/rubocop/formatter/pacman_formatter.rb +3 -3
- data/lib/rubocop/formatter/simple_text_formatter.rb +7 -3
- data/lib/rubocop/formatter/tap_formatter.rb +9 -6
- data/lib/rubocop/node_pattern.rb +4 -2
- data/lib/rubocop/options.rb +20 -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/rspec/shared_contexts.rb +5 -0
- data/lib/rubocop/runner.rb +50 -29
- data/lib/rubocop/target_finder.rb +12 -6
- data/lib/rubocop/target_ruby.rb +151 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +50 -34
- data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
@@ -94,20 +94,25 @@ module RuboCop
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def autocorrect(node)
|
97
|
+
if node.block_type?
|
98
|
+
correct_inverse_block(node)
|
99
|
+
elsif node.send_type?
|
100
|
+
correct_inverse_method(node)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def correct_inverse_method(node)
|
97
105
|
method_call, _lhs, method, _rhs = inverse_candidate?(node)
|
106
|
+
return unless method_call && method
|
98
107
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
inverse_methods[method].to_s)
|
108
|
+
lambda do |corrector|
|
109
|
+
corrector.remove(not_to_receiver(node, method_call))
|
110
|
+
corrector.replace(method_call.loc.selector,
|
111
|
+
inverse_methods[method].to_s)
|
104
112
|
|
105
|
-
|
106
|
-
|
107
|
-
end
|
113
|
+
if EQUALITY_METHODS.include?(method)
|
114
|
+
corrector.remove(end_parentheses(node, method_call))
|
108
115
|
end
|
109
|
-
else
|
110
|
-
correct_inverse_block(node)
|
111
116
|
end
|
112
117
|
end
|
113
118
|
|
@@ -122,18 +127,19 @@ module RuboCop
|
|
122
127
|
end
|
123
128
|
|
124
129
|
def correct_inverse_selector(block, corrector)
|
125
|
-
|
130
|
+
selector_loc = block.loc.selector
|
131
|
+
selector = selector_loc.source
|
126
132
|
|
127
133
|
if NEGATED_EQUALITY_METHODS.include?(selector.to_sym)
|
128
134
|
selector[0] = '='
|
129
|
-
corrector.replace(
|
135
|
+
corrector.replace(selector_loc, selector)
|
130
136
|
else
|
131
137
|
if block.loc.dot
|
132
138
|
range = dot_range(block.loc)
|
133
139
|
corrector.remove(range)
|
134
140
|
end
|
135
141
|
|
136
|
-
corrector.remove(
|
142
|
+
corrector.remove(selector_loc)
|
137
143
|
end
|
138
144
|
end
|
139
145
|
|
@@ -28,7 +28,7 @@ module RuboCop
|
|
28
28
|
contents = node.source[1...-1]
|
29
29
|
return false if contents.empty?
|
30
30
|
|
31
|
-
return false if
|
31
|
+
return false if allowed_addresses.include?(contents.downcase)
|
32
32
|
|
33
33
|
# To try to avoid doing two regex checks on every string,
|
34
34
|
# shortcut out if the string does not look like an IP address
|
@@ -47,9 +47,9 @@ module RuboCop
|
|
47
47
|
|
48
48
|
private
|
49
49
|
|
50
|
-
def
|
51
|
-
|
52
|
-
Array(
|
50
|
+
def allowed_addresses
|
51
|
+
allowed_addresses = cop_config['AllowedAddresses']
|
52
|
+
Array(allowed_addresses).map(&:downcase)
|
53
53
|
end
|
54
54
|
|
55
55
|
def could_be_ip?(str)
|
@@ -26,13 +26,14 @@ module RuboCop
|
|
26
26
|
'those strings.'
|
27
27
|
CONCAT_TOKEN_TYPES = %i[tPLUS tLSHFT].freeze
|
28
28
|
SIMPLE_STRING_TOKEN_TYPE = :tSTRING
|
29
|
-
|
29
|
+
COMPLEX_STRING_BEGIN_TOKEN = :tSTRING_BEG
|
30
|
+
COMPLEX_STRING_END_TOKEN = :tSTRING_END
|
30
31
|
HIGH_PRECEDENCE_OP_TOKEN_TYPES = %i[tSTAR2 tPERCENT tDOT
|
31
32
|
tLBRACK2].freeze
|
32
33
|
QUOTE_DELIMITERS = %w[' "].freeze
|
33
34
|
|
34
35
|
def self.autocorrect_incompatible_with
|
35
|
-
[Style::
|
36
|
+
[Style::RedundantInterpolation]
|
36
37
|
end
|
37
38
|
|
38
39
|
def investigate(processed_source)
|
@@ -59,9 +60,7 @@ module RuboCop
|
|
59
60
|
def check_token_set(index)
|
60
61
|
predecessor, operator, successor = processed_source.tokens[index, 3]
|
61
62
|
|
62
|
-
return unless
|
63
|
-
eligible_operator?(operator) &&
|
64
|
-
eligible_predecessor?(predecessor)
|
63
|
+
return unless eligible_token_set?(predecessor, operator, successor)
|
65
64
|
|
66
65
|
return if operator.line == successor.line
|
67
66
|
|
@@ -72,6 +71,12 @@ module RuboCop
|
|
72
71
|
add_offense(operator.pos, location: operator.pos)
|
73
72
|
end
|
74
73
|
|
74
|
+
def eligible_token_set?(predecessor, operator, successor)
|
75
|
+
eligible_successor?(successor) &&
|
76
|
+
eligible_operator?(operator) &&
|
77
|
+
eligible_predecessor?(predecessor)
|
78
|
+
end
|
79
|
+
|
75
80
|
def eligible_successor?(successor)
|
76
81
|
successor && standard_string_literal?(successor)
|
77
82
|
end
|
@@ -91,13 +96,12 @@ module RuboCop
|
|
91
96
|
|
92
97
|
def token_after_last_string(successor, base_index)
|
93
98
|
index = base_index + 3
|
94
|
-
|
95
|
-
if successor.type == begin_token
|
99
|
+
if successor.type == COMPLEX_STRING_BEGIN_TOKEN
|
96
100
|
ends_to_find = 1
|
97
101
|
while ends_to_find.positive?
|
98
102
|
case processed_source.tokens[index].type
|
99
|
-
when
|
100
|
-
when
|
103
|
+
when COMPLEX_STRING_BEGIN_TOKEN then ends_to_find += 1
|
104
|
+
when COMPLEX_STRING_END_TOKEN then ends_to_find -= 1
|
101
105
|
end
|
102
106
|
index += 1
|
103
107
|
end
|
@@ -109,7 +113,7 @@ module RuboCop
|
|
109
113
|
case token.type
|
110
114
|
when SIMPLE_STRING_TOKEN_TYPE
|
111
115
|
true
|
112
|
-
when
|
116
|
+
when COMPLEX_STRING_BEGIN_TOKEN, COMPLEX_STRING_END_TOKEN
|
113
117
|
QUOTE_DELIMITERS.include?(token.text)
|
114
118
|
else
|
115
119
|
false
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable Metrics/ClassLength
|
4
3
|
module RuboCop
|
5
4
|
module Cop
|
6
5
|
module Style
|
@@ -43,7 +42,6 @@ module RuboCop
|
|
43
42
|
#
|
44
43
|
# @example EnforcedStyle: require_parentheses (default)
|
45
44
|
#
|
46
|
-
#
|
47
45
|
# # bad
|
48
46
|
# array.delete e
|
49
47
|
#
|
@@ -64,20 +62,6 @@ module RuboCop
|
|
64
62
|
# # okay with `^assert` listed in `IgnoredPatterns`
|
65
63
|
# assert_equal 'test', x
|
66
64
|
#
|
67
|
-
# # IgnoreMacros: true (default)
|
68
|
-
#
|
69
|
-
# # good
|
70
|
-
# class Foo
|
71
|
-
# bar :baz
|
72
|
-
# end
|
73
|
-
#
|
74
|
-
# # IgnoreMacros: false
|
75
|
-
#
|
76
|
-
# # bad
|
77
|
-
# class Foo
|
78
|
-
# bar :baz
|
79
|
-
# end
|
80
|
-
#
|
81
65
|
# @example EnforcedStyle: omit_parentheses
|
82
66
|
#
|
83
67
|
# # bad
|
@@ -92,7 +76,21 @@ module RuboCop
|
|
92
76
|
# # good
|
93
77
|
# foo.enforce strict: true
|
94
78
|
#
|
95
|
-
#
|
79
|
+
# @example IgnoreMacros: true (default)
|
80
|
+
#
|
81
|
+
# # good
|
82
|
+
# class Foo
|
83
|
+
# bar :baz
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# @example IgnoreMacros: false
|
87
|
+
#
|
88
|
+
# # bad
|
89
|
+
# class Foo
|
90
|
+
# bar :baz
|
91
|
+
# end
|
92
|
+
#
|
93
|
+
# @example AllowParenthesesInMultilineCall: false (default)
|
96
94
|
#
|
97
95
|
# # bad
|
98
96
|
# foo.enforce(
|
@@ -103,7 +101,7 @@ module RuboCop
|
|
103
101
|
# foo.enforce \
|
104
102
|
# strict: true
|
105
103
|
#
|
106
|
-
#
|
104
|
+
# @example AllowParenthesesInMultilineCall: true
|
107
105
|
#
|
108
106
|
# # good
|
109
107
|
# foo.enforce(
|
@@ -114,7 +112,7 @@ module RuboCop
|
|
114
112
|
# foo.enforce \
|
115
113
|
# strict: true
|
116
114
|
#
|
117
|
-
#
|
115
|
+
# @example AllowParenthesesInChaining: false (default)
|
118
116
|
#
|
119
117
|
# # bad
|
120
118
|
# foo().bar(1)
|
@@ -122,7 +120,7 @@ module RuboCop
|
|
122
120
|
# # good
|
123
121
|
# foo().bar 1
|
124
122
|
#
|
125
|
-
#
|
123
|
+
# @example AllowParenthesesInChaining: true
|
126
124
|
#
|
127
125
|
# # good
|
128
126
|
# foo().bar(1)
|
@@ -130,7 +128,7 @@ module RuboCop
|
|
130
128
|
# # good
|
131
129
|
# foo().bar 1
|
132
130
|
#
|
133
|
-
#
|
131
|
+
# @example AllowParenthesesInCamelCaseMethod: false (default)
|
134
132
|
#
|
135
133
|
# # bad
|
136
134
|
# Array(1)
|
@@ -138,7 +136,7 @@ module RuboCop
|
|
138
136
|
# # good
|
139
137
|
# Array 1
|
140
138
|
#
|
141
|
-
#
|
139
|
+
# @example AllowParenthesesInCamelCaseMethod: true
|
142
140
|
#
|
143
141
|
# # good
|
144
142
|
# Array(1)
|
@@ -150,94 +148,18 @@ module RuboCop
|
|
150
148
|
include IgnoredMethods
|
151
149
|
include IgnoredPattern
|
152
150
|
|
153
|
-
|
154
|
-
|
155
|
-
def on_send(node)
|
151
|
+
def initialize(*)
|
152
|
+
super
|
156
153
|
case style
|
157
154
|
when :require_parentheses
|
158
|
-
|
155
|
+
extend RequireParentheses
|
159
156
|
when :omit_parentheses
|
160
|
-
|
161
|
-
end
|
162
|
-
end
|
163
|
-
alias on_csend on_send
|
164
|
-
alias on_super on_send
|
165
|
-
alias on_yield on_send
|
166
|
-
|
167
|
-
def autocorrect(node)
|
168
|
-
case style
|
169
|
-
when :require_parentheses
|
170
|
-
autocorrect_for_require_parentheses(node)
|
171
|
-
when :omit_parentheses
|
172
|
-
autocorrect_for_omit_parentheses(node)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def message(_node = nil)
|
177
|
-
case style
|
178
|
-
when :require_parentheses
|
179
|
-
'Use parentheses for method calls with arguments.'
|
180
|
-
when :omit_parentheses
|
181
|
-
'Omit parentheses for method calls with arguments.'
|
157
|
+
extend OmitParentheses
|
182
158
|
end
|
183
159
|
end
|
184
160
|
|
185
161
|
private
|
186
162
|
|
187
|
-
def add_offense_for_require_parentheses(node)
|
188
|
-
return if ignored_method?(node.method_name)
|
189
|
-
return if matches_ignored_pattern?(node.method_name)
|
190
|
-
return if eligible_for_parentheses_omission?(node)
|
191
|
-
return unless node.arguments? && !node.parenthesized?
|
192
|
-
|
193
|
-
add_offense(node)
|
194
|
-
end
|
195
|
-
|
196
|
-
def add_offense_for_omit_parentheses(node)
|
197
|
-
return unless node.parenthesized?
|
198
|
-
return if node.implicit_call?
|
199
|
-
return if super_call_without_arguments?(node)
|
200
|
-
return if allowed_camel_case_method_call?(node)
|
201
|
-
return if legitimate_call_with_parentheses?(node)
|
202
|
-
|
203
|
-
add_offense(node, location: node.loc.begin.join(node.loc.end))
|
204
|
-
end
|
205
|
-
|
206
|
-
def autocorrect_for_require_parentheses(node)
|
207
|
-
lambda do |corrector|
|
208
|
-
corrector.replace(args_begin(node), '(')
|
209
|
-
|
210
|
-
unless args_parenthesized?(node)
|
211
|
-
corrector.insert_after(args_end(node), ')')
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
def autocorrect_for_omit_parentheses(node)
|
217
|
-
lambda do |corrector|
|
218
|
-
if parentheses_at_the_end_of_multiline_call?(node)
|
219
|
-
corrector.replace(args_begin(node), ' \\')
|
220
|
-
else
|
221
|
-
corrector.replace(args_begin(node), ' ')
|
222
|
-
end
|
223
|
-
corrector.remove(node.loc.end)
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
def eligible_for_parentheses_omission?(node)
|
228
|
-
node.operator_method? || node.setter_method? || ignored_macro?(node)
|
229
|
-
end
|
230
|
-
|
231
|
-
def included_macros_list
|
232
|
-
cop_config.fetch('IncludedMacros', []).map(&:to_sym)
|
233
|
-
end
|
234
|
-
|
235
|
-
def ignored_macro?(node)
|
236
|
-
cop_config['IgnoreMacros'] &&
|
237
|
-
node.macro? &&
|
238
|
-
!included_macros_list.include?(node.method_name)
|
239
|
-
end
|
240
|
-
|
241
163
|
def args_begin(node)
|
242
164
|
loc = node.loc
|
243
165
|
selector =
|
@@ -257,132 +179,7 @@ module RuboCop
|
|
257
179
|
first_node = node.arguments.first
|
258
180
|
first_node.begin_type? && first_node.parenthesized_call?
|
259
181
|
end
|
260
|
-
|
261
|
-
def parentheses_at_the_end_of_multiline_call?(node)
|
262
|
-
node.multiline? &&
|
263
|
-
node.loc.begin.source_line
|
264
|
-
.gsub(TRAILING_WHITESPACE_REGEX, '')
|
265
|
-
.end_with?('(')
|
266
|
-
end
|
267
|
-
|
268
|
-
def super_call_without_arguments?(node)
|
269
|
-
node.super_type? && node.arguments.none?
|
270
|
-
end
|
271
|
-
|
272
|
-
def allowed_camel_case_method_call?(node)
|
273
|
-
node.camel_case_method? &&
|
274
|
-
(node.arguments.none? ||
|
275
|
-
cop_config['AllowParenthesesInCamelCaseMethod'])
|
276
|
-
end
|
277
|
-
|
278
|
-
def legitimate_call_with_parentheses?(node)
|
279
|
-
call_in_literals?(node) ||
|
280
|
-
call_with_ambiguous_arguments?(node) ||
|
281
|
-
call_in_logical_operators?(node) ||
|
282
|
-
call_in_optional_arguments?(node) ||
|
283
|
-
allowed_multiline_call_with_parentheses?(node) ||
|
284
|
-
allowed_chained_call_with_parentheses?(node)
|
285
|
-
end
|
286
|
-
|
287
|
-
def call_in_literals?(node)
|
288
|
-
node.parent &&
|
289
|
-
(node.parent.pair_type? ||
|
290
|
-
node.parent.array_type? ||
|
291
|
-
node.parent.range_type? ||
|
292
|
-
splat?(node.parent) ||
|
293
|
-
ternary_if?(node.parent))
|
294
|
-
end
|
295
|
-
|
296
|
-
def call_in_logical_operators?(node)
|
297
|
-
node.parent &&
|
298
|
-
(logical_operator?(node.parent) ||
|
299
|
-
node.parent.send_type? &&
|
300
|
-
node.parent.arguments.any?(&method(:logical_operator?)))
|
301
|
-
end
|
302
|
-
|
303
|
-
def call_in_optional_arguments?(node)
|
304
|
-
node.parent &&
|
305
|
-
(node.parent.optarg_type? || node.parent.kwoptarg_type?)
|
306
|
-
end
|
307
|
-
|
308
|
-
def call_with_ambiguous_arguments?(node)
|
309
|
-
call_with_braced_block?(node) ||
|
310
|
-
call_as_argument_or_chain?(node) ||
|
311
|
-
hash_literal_in_arguments?(node) ||
|
312
|
-
node.descendants.any? do |n|
|
313
|
-
ambigious_literal?(n) || logical_operator?(n) ||
|
314
|
-
call_with_braced_block?(n)
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
def call_with_braced_block?(node)
|
319
|
-
(node.send_type? || node.super_type?) &&
|
320
|
-
node.block_node && node.block_node.braces?
|
321
|
-
end
|
322
|
-
|
323
|
-
def call_as_argument_or_chain?(node)
|
324
|
-
node.parent &&
|
325
|
-
(node.parent.send_type? && !assigned_before?(node.parent, node) ||
|
326
|
-
node.parent.csend_type? || node.parent.super_type?)
|
327
|
-
end
|
328
|
-
|
329
|
-
def hash_literal_in_arguments?(node)
|
330
|
-
node.arguments.any? do |n|
|
331
|
-
hash_literal?(n) ||
|
332
|
-
n.send_type? && node.descendants.any?(&method(:hash_literal?))
|
333
|
-
end
|
334
|
-
end
|
335
|
-
|
336
|
-
def allowed_multiline_call_with_parentheses?(node)
|
337
|
-
cop_config['AllowParenthesesInMultilineCall'] && node.multiline?
|
338
|
-
end
|
339
|
-
|
340
|
-
def allowed_chained_call_with_parentheses?(node)
|
341
|
-
return false unless cop_config['AllowParenthesesInChaining']
|
342
|
-
|
343
|
-
previous = node.descendants.first
|
344
|
-
return false unless previous&.send_type?
|
345
|
-
|
346
|
-
previous.parenthesized? ||
|
347
|
-
allowed_chained_call_with_parentheses?(previous)
|
348
|
-
end
|
349
|
-
|
350
|
-
def ambigious_literal?(node)
|
351
|
-
splat?(node) || ternary_if?(node) || regexp_slash_literal?(node) ||
|
352
|
-
unary_literal?(node)
|
353
|
-
end
|
354
|
-
|
355
|
-
def splat?(node)
|
356
|
-
node.splat_type? || node.kwsplat_type? || node.block_pass_type?
|
357
|
-
end
|
358
|
-
|
359
|
-
def ternary_if?(node)
|
360
|
-
node.if_type? && node.ternary?
|
361
|
-
end
|
362
|
-
|
363
|
-
def logical_operator?(node)
|
364
|
-
(node.and_type? || node.or_type?) && node.logical_operator?
|
365
|
-
end
|
366
|
-
|
367
|
-
def hash_literal?(node)
|
368
|
-
node.hash_type? && node.braces?
|
369
|
-
end
|
370
|
-
|
371
|
-
def regexp_slash_literal?(node)
|
372
|
-
node.regexp_type? && node.loc.begin.source == '/'
|
373
|
-
end
|
374
|
-
|
375
|
-
def unary_literal?(node)
|
376
|
-
node.numeric_type? && node.sign? ||
|
377
|
-
node.parent&.send_type? && node.parent&.unary_operation?
|
378
|
-
end
|
379
|
-
|
380
|
-
def assigned_before?(node, target)
|
381
|
-
node.assignment? &&
|
382
|
-
node.loc.operator.begin < target.loc.begin
|
383
|
-
end
|
384
182
|
end
|
385
183
|
end
|
386
184
|
end
|
387
185
|
end
|
388
|
-
# rubocop:enable Metrics/ClassLength
|