rubocop 0.47.1 → 0.48.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.
Potentially problematic release.
This version of rubocop might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +28 -16
- data/config/default.yml +203 -115
- data/config/disabled.yml +0 -5
- data/config/enabled.yml +92 -8
- data/lib/rubocop.rb +24 -1
- data/lib/rubocop/ast/builder.rb +7 -2
- data/lib/rubocop/ast/node.rb +23 -20
- data/lib/rubocop/ast/node/and_node.rb +37 -0
- data/lib/rubocop/ast/node/array_node.rb +4 -1
- data/lib/rubocop/ast/node/case_node.rb +1 -0
- data/lib/rubocop/ast/node/ensure_node.rb +25 -0
- data/lib/rubocop/ast/node/hash_node.rb +10 -3
- data/lib/rubocop/ast/node/if_node.rb +2 -0
- data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +23 -0
- data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +35 -0
- data/lib/rubocop/ast/node/or_node.rb +37 -0
- data/lib/rubocop/ast/node/resbody_node.rb +25 -0
- data/lib/rubocop/ast/node/send_node.rb +190 -0
- data/lib/rubocop/ast/node/when_node.rb +1 -1
- data/lib/rubocop/ast/traversal.rb +15 -15
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +39 -15
- data/lib/rubocop/config_loader.rb +34 -13
- data/lib/rubocop/cop/bundler/ordered_gems.rb +23 -4
- data/lib/rubocop/cop/commissioner.rb +4 -0
- data/lib/rubocop/cop/cop.rb +5 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +53 -0
- data/lib/rubocop/cop/lint/debugger.rb +8 -1
- data/lib/rubocop/cop/lint/def_end_alignment.rb +2 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +3 -1
- data/lib/rubocop/cop/lint/empty_ensure.rb +6 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +20 -18
- data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -3
- data/lib/rubocop/cop/lint/literal_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_compare.rb +5 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +26 -18
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +7 -8
- data/lib/rubocop/cop/lint/require_parentheses.rb +7 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +7 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -6
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +7 -8
- data/lib/rubocop/cop/lint/unneeded_disable.rb +35 -11
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +5 -2
- data/lib/rubocop/cop/lint/unused_block_argument.rb +6 -6
- data/lib/rubocop/cop/lint/useless_assignment.rb +2 -1
- data/lib/rubocop/cop/lint/useless_comparison.rb +5 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +4 -4
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -2
- data/lib/rubocop/cop/metrics/line_length.rb +2 -9
- data/lib/rubocop/cop/metrics/parameter_lists.rb +4 -3
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -2
- data/lib/rubocop/cop/mixin/access_modifier_node.rb +1 -1
- data/lib/rubocop/cop/mixin/array_hash_indentation.rb +2 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +6 -6
- data/lib/rubocop/cop/mixin/duplication.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +27 -0
- data/lib/rubocop/cop/mixin/method_preference.rb +2 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +17 -29
- data/lib/rubocop/cop/mixin/on_method_def.rb +3 -3
- data/lib/rubocop/cop/mixin/percent_literal.rb +27 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +21 -0
- data/lib/rubocop/cop/mixin/safe_mode.rb +1 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +2 -1
- data/lib/rubocop/cop/mixin/target_rails_version.rb +16 -0
- data/lib/rubocop/cop/mixin/unused_argument.rb +1 -1
- data/lib/rubocop/cop/offense.rb +3 -3
- data/lib/rubocop/cop/performance/casecmp.rb +1 -1
- data/lib/rubocop/cop/performance/detect.rb +2 -1
- data/lib/rubocop/cop/performance/double_start_end_with.rb +35 -1
- data/lib/rubocop/cop/performance/end_with.rb +3 -1
- data/lib/rubocop/cop/performance/flat_map.rb +6 -6
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
- data/lib/rubocop/cop/performance/range_include.rb +3 -1
- data/lib/rubocop/cop/performance/redundant_match.rb +6 -5
- data/lib/rubocop/cop/performance/regexp_match.rb +10 -3
- data/lib/rubocop/cop/performance/reverse_each.rb +2 -1
- data/lib/rubocop/cop/performance/size.rb +6 -11
- data/lib/rubocop/cop/performance/start_with.rb +3 -1
- data/lib/rubocop/cop/performance/string_replacement.rb +13 -18
- data/lib/rubocop/cop/performance/times_map.rb +4 -4
- data/lib/rubocop/cop/rails/action_filter.rb +42 -42
- data/lib/rubocop/cop/rails/active_support_aliases.rb +68 -0
- data/lib/rubocop/cop/rails/blank.rb +131 -0
- data/lib/rubocop/cop/rails/date.rb +25 -28
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +5 -7
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +7 -3
- data/lib/rubocop/cop/rails/exit.rb +9 -9
- data/lib/rubocop/cop/rails/file_path.rb +5 -14
- data/lib/rubocop/cop/rails/find_by.rb +8 -10
- data/lib/rubocop/cop/rails/find_each.rb +6 -9
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -0
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +15 -7
- data/lib/rubocop/cop/rails/output.rb +3 -5
- data/lib/rubocop/cop/rails/output_safety.rb +4 -8
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +25 -24
- data/lib/rubocop/cop/rails/present.rb +137 -0
- data/lib/rubocop/cop/rails/read_write_attribute.rb +9 -18
- data/lib/rubocop/cop/rails/relative_date_constant.rb +53 -0
- data/lib/rubocop/cop/rails/request_referer.rb +7 -4
- data/lib/rubocop/cop/rails/reversible_migration.rb +1 -2
- data/lib/rubocop/cop/rails/safe_navigation.rb +2 -1
- data/lib/rubocop/cop/rails/save_bang.rb +10 -10
- data/lib/rubocop/cop/rails/skips_model_validations.rb +23 -6
- data/lib/rubocop/cop/rails/time_zone.rb +20 -18
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +3 -2
- data/lib/rubocop/cop/rails/validation.rb +8 -11
- data/lib/rubocop/cop/registry.rb +3 -3
- data/lib/rubocop/cop/security/json_load.rb +1 -1
- data/lib/rubocop/cop/security/marshal_load.rb +5 -1
- data/lib/rubocop/cop/security/yaml_load.rb +3 -3
- data/lib/rubocop/cop/severity.rb +1 -1
- data/lib/rubocop/cop/style/alias.rb +5 -5
- data/lib/rubocop/cop/style/align_hash.rb +1 -1
- data/lib/rubocop/cop/style/align_parameters.rb +5 -5
- data/lib/rubocop/cop/style/and_or.rb +16 -31
- data/lib/rubocop/cop/style/attr.rb +14 -8
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +8 -11
- data/lib/rubocop/cop/style/block_delimiters.rb +11 -13
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +19 -23
- data/lib/rubocop/cop/style/case_indentation.rb +2 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_check.rb +5 -7
- data/lib/rubocop/cop/style/closing_parenthesis_indentation.rb +5 -4
- data/lib/rubocop/cop/style/collection_methods.rb +8 -8
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +38 -45
- data/lib/rubocop/cop/style/constant_name.rb +1 -1
- data/lib/rubocop/cop/style/documentation_method.rb +1 -0
- data/lib/rubocop/cop/style/dot_position.rb +3 -7
- data/lib/rubocop/cop/style/double_negation.rb +2 -1
- data/lib/rubocop/cop/style/each_with_object.rb +1 -1
- data/lib/rubocop/cop/style/empty_else.rb +2 -2
- data/lib/rubocop/cop/style/empty_line_after_magic_comment.rb +63 -0
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +74 -4
- data/lib/rubocop/cop/style/empty_lines_around_begin_body.rb +42 -0
- data/lib/rubocop/cop/style/empty_lines_around_exception_handling_keywords.rb +127 -0
- data/lib/rubocop/cop/style/empty_literal.rb +17 -9
- data/lib/rubocop/cop/style/end_of_line.rb +25 -3
- data/lib/rubocop/cop/style/file_name.rb +1 -1
- data/lib/rubocop/cop/style/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/style/first_parameter_indentation.rb +17 -19
- data/lib/rubocop/cop/style/for.rb +2 -4
- data/lib/rubocop/cop/style/format_string.rb +5 -4
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +27 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
- data/lib/rubocop/cop/style/indent_assignment.rb +2 -2
- data/lib/rubocop/cop/style/indent_hash.rb +2 -1
- data/lib/rubocop/cop/style/indent_heredoc.rb +173 -0
- data/lib/rubocop/cop/style/indentation_width.rb +61 -29
- data/lib/rubocop/cop/style/inverse_methods.rb +130 -0
- data/lib/rubocop/cop/style/lambda_call.rb +15 -11
- data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +26 -14
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -16
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +4 -1
- data/lib/rubocop/cop/style/missing_else.rb +4 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +97 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +38 -5
- data/lib/rubocop/cop/style/multiline_method_call_brace_layout.rb +2 -3
- data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +38 -19
- data/lib/rubocop/cop/style/mutable_constant.rb +5 -1
- data/lib/rubocop/cop/style/negated_if.rb +73 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +21 -19
- data/lib/rubocop/cop/style/next.rb +5 -5
- data/lib/rubocop/cop/style/non_nil_check.rb +7 -10
- data/lib/rubocop/cop/style/not.rb +3 -4
- data/lib/rubocop/cop/style/numeric_literals.rb +25 -3
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +2 -2
- data/lib/rubocop/cop/style/op_method.rb +2 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +6 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +52 -6
- data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -9
- data/lib/rubocop/cop/style/raise_args.rb +28 -24
- data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
- data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self.rb +17 -35
- data/lib/rubocop/cop/style/rescue_modifier.rb +2 -14
- data/lib/rubocop/cop/style/self_assignment.rb +3 -3
- data/lib/rubocop/cop/style/send.rb +4 -5
- data/lib/rubocop/cop/style/space_after_not.rb +7 -8
- data/lib/rubocop/cop/style/space_around_keyword.rb +8 -9
- data/lib/rubocop/cop/style/space_around_operators.rb +19 -15
- data/lib/rubocop/cop/style/space_before_first_arg.rb +17 -14
- data/lib/rubocop/cop/style/space_inside_brackets.rb +1 -1
- data/lib/rubocop/cop/style/space_inside_hash_literal_braces.rb +3 -3
- data/lib/rubocop/cop/style/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +14 -14
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +10 -5
- data/lib/rubocop/cop/style/struct_inheritance.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +31 -35
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +41 -13
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +6 -9
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -2
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +12 -34
- data/lib/rubocop/cop/style/zero_length_predicate.rb +11 -4
- data/lib/rubocop/cop/team.rb +4 -1
- data/lib/rubocop/cop/util.rb +33 -26
- data/lib/rubocop/cop/variable_force.rb +13 -13
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -8
- data/lib/rubocop/cop/variable_force/branch.rb +318 -0
- data/lib/rubocop/cop/variable_force/branchable.rb +21 -0
- data/lib/rubocop/cop/variable_force/reference.rb +1 -3
- data/lib/rubocop/cop/variable_force/scope.rb +36 -20
- data/lib/rubocop/cop/variable_force/variable.rb +9 -8
- data/lib/rubocop/formatter/colorizable.rb +10 -10
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +2 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -2
- data/lib/rubocop/magic_comment.rb +20 -6
- data/lib/rubocop/options.rb +1 -1
- data/lib/rubocop/platform.rb +11 -0
- data/lib/rubocop/processed_source.rb +1 -1
- data/lib/rubocop/remote_config.rb +18 -6
- data/lib/rubocop/result_cache.rb +8 -8
- data/lib/rubocop/rspec/cop_helper.rb +2 -0
- data/lib/rubocop/rspec/shared_contexts.rb +20 -0
- data/lib/rubocop/rspec/shared_examples.rb +1 -1
- data/lib/rubocop/runner.rb +2 -2
- data/lib/rubocop/target_finder.rb +64 -6
- data/lib/rubocop/version.rb +2 -4
- metadata +27 -4
- data/lib/rubocop/cop/variable_force/locatable.rb +0 -200
@@ -16,7 +16,7 @@ module RuboCop
|
|
16
16
|
lambda do |corrector|
|
17
17
|
backref, = *node
|
18
18
|
parent_type = node.parent ? node.parent.type : nil
|
19
|
-
if
|
19
|
+
if %i(dstr xstr regexp).include?(parent_type)
|
20
20
|
corrector.replace(node.source_range,
|
21
21
|
"{Regexp.last_match(#{backref})}")
|
22
22
|
else
|
@@ -37,19 +37,15 @@ module RuboCop
|
|
37
37
|
MSG = 'Use `Hash#%s` instead of `Hash#%s`.'.freeze
|
38
38
|
|
39
39
|
OFFENDING_SELECTORS = {
|
40
|
-
short:
|
41
|
-
verbose:
|
40
|
+
short: %i(has_key? has_value?),
|
41
|
+
verbose: %i(key? value?)
|
42
42
|
}.freeze
|
43
43
|
|
44
44
|
def on_send(node)
|
45
|
-
|
46
|
-
|
47
|
-
offending_selector?(method_name)
|
45
|
+
return unless node.arguments.one? &&
|
46
|
+
offending_selector?(node.method_name)
|
48
47
|
|
49
|
-
add_offense(node, :selector
|
50
|
-
format(MSG,
|
51
|
-
proper_method_name(method_name),
|
52
|
-
method_name))
|
48
|
+
add_offense(node, :selector)
|
53
49
|
end
|
54
50
|
|
55
51
|
def autocorrect(node)
|
@@ -61,6 +57,10 @@ module RuboCop
|
|
61
57
|
|
62
58
|
private
|
63
59
|
|
60
|
+
def message(node)
|
61
|
+
format(MSG, proper_method_name(node.method_name), node.method_name)
|
62
|
+
end
|
63
|
+
|
64
64
|
def proper_method_name(method_name)
|
65
65
|
if style == :verbose
|
66
66
|
"has_#{method_name}"
|
@@ -23,7 +23,8 @@ module RuboCop
|
|
23
23
|
# # good
|
24
24
|
# raise StandardError, "message"
|
25
25
|
# fail "message"
|
26
|
-
# raise
|
26
|
+
# raise MyCustomError.new(arg1, arg2, arg3)
|
27
|
+
# raise MyKwArgError.new(key1: val1, key2: val2)
|
27
28
|
#
|
28
29
|
# @example
|
29
30
|
#
|
@@ -35,7 +36,7 @@ module RuboCop
|
|
35
36
|
#
|
36
37
|
# # good
|
37
38
|
# raise StandardError.new("message")
|
38
|
-
# raise
|
39
|
+
# raise MyCustomError.new(arg1, arg2, arg3)
|
39
40
|
# fail "message"
|
40
41
|
class RaiseArgs < Cop
|
41
42
|
include ConfigurableEnforcedStyle
|
@@ -59,20 +60,18 @@ module RuboCop
|
|
59
60
|
private
|
60
61
|
|
61
62
|
def autocorrect(node)
|
62
|
-
_scope, method, *args = *node
|
63
|
-
|
64
63
|
new_exception = if style == :compact
|
65
|
-
correction_exploded_to_compact(
|
64
|
+
correction_exploded_to_compact(node.arguments)
|
66
65
|
else
|
67
|
-
correction_compact_to_exploded(
|
66
|
+
correction_compact_to_exploded(node.first_argument)
|
68
67
|
end
|
69
|
-
replacement = "#{
|
68
|
+
replacement = "#{node.method_name} #{new_exception}"
|
70
69
|
|
71
70
|
->(corrector) { corrector.replace(node.source_range, replacement) }
|
72
71
|
end
|
73
72
|
|
74
73
|
def correction_compact_to_exploded(node)
|
75
|
-
exception_node, _new, message_node = *node
|
74
|
+
exception_node, _new, message_node = *node
|
76
75
|
|
77
76
|
message = message_node && message_node.source
|
78
77
|
|
@@ -91,10 +90,8 @@ module RuboCop
|
|
91
90
|
end
|
92
91
|
|
93
92
|
def check_compact(node)
|
94
|
-
|
95
|
-
|
96
|
-
if args.size > 1
|
97
|
-
add_offense(node, :expression, message(selector)) do
|
93
|
+
if node.arguments.size > 1
|
94
|
+
add_offense(node, :expression, message(node.method_name)) do
|
98
95
|
opposite_style_detected
|
99
96
|
end
|
100
97
|
else
|
@@ -103,26 +100,33 @@ module RuboCop
|
|
103
100
|
end
|
104
101
|
|
105
102
|
def check_exploded(node)
|
106
|
-
|
103
|
+
return correct_style_detected unless node.arguments.one?
|
107
104
|
|
108
|
-
|
109
|
-
arg, = *args
|
105
|
+
first_arg = node.first_argument
|
110
106
|
|
111
|
-
return unless
|
112
|
-
_receiver, _selector, *constructor_args = *arg
|
107
|
+
return unless first_arg.send_type? && first_arg.method?(:new)
|
113
108
|
|
114
|
-
|
115
|
-
return unless constructor_args.size <= 1
|
109
|
+
return if acceptable_exploded_args?(first_arg.arguments)
|
116
110
|
|
117
|
-
|
118
|
-
first_arg = constructor_args.first
|
119
|
-
return if first_arg && first_arg.splat_type?
|
120
|
-
|
121
|
-
add_offense(node, :expression, message(selector)) do
|
111
|
+
add_offense(node, :expression, message(node.method_name)) do
|
122
112
|
opposite_style_detected
|
123
113
|
end
|
124
114
|
end
|
125
115
|
|
116
|
+
def acceptable_exploded_args?(args)
|
117
|
+
# Allow code like `raise Ex.new(arg1, arg2)`.
|
118
|
+
return true if args.size > 1
|
119
|
+
|
120
|
+
# Disallow zero arguments.
|
121
|
+
return false if args.empty?
|
122
|
+
|
123
|
+
arg = args.first
|
124
|
+
|
125
|
+
# Allow code like `raise Ex.new(kw: arg)`.
|
126
|
+
# Allow code like `raise Ex.new(*args)`.
|
127
|
+
arg.hash_type? || arg.splat_type?
|
128
|
+
end
|
129
|
+
|
126
130
|
def message(method)
|
127
131
|
if style == :compact
|
128
132
|
format(COMPACT_MSG, method)
|
@@ -17,13 +17,11 @@ module RuboCop
|
|
17
17
|
MSG = 'Do not freeze immutable objects, as freezing them has no ' \
|
18
18
|
'effect.'.freeze
|
19
19
|
|
20
|
-
def_node_matcher :freezing?, '(send $_ :freeze)'
|
21
|
-
|
22
20
|
def on_send(node)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
return unless node.receiver && node.method?(:freeze) &&
|
22
|
+
immutable_literal?(node.receiver)
|
23
|
+
|
24
|
+
add_offense(node, :expression)
|
27
25
|
end
|
28
26
|
|
29
27
|
def autocorrect(node)
|
@@ -36,8 +34,8 @@ module RuboCop
|
|
36
34
|
private
|
37
35
|
|
38
36
|
def immutable_literal?(node)
|
39
|
-
return false unless node
|
40
37
|
return true if node.immutable_literal?
|
38
|
+
|
41
39
|
FROZEN_STRING_LITERAL_TYPES.include?(node.type) &&
|
42
40
|
frozen_string_literals_enabled?
|
43
41
|
end
|
@@ -16,7 +16,7 @@ module RuboCop
|
|
16
16
|
class RedundantParentheses < Cop
|
17
17
|
include Parentheses
|
18
18
|
|
19
|
-
ALLOWED_LITERALS =
|
19
|
+
ALLOWED_LITERALS = %i(irange erange).freeze
|
20
20
|
|
21
21
|
def_node_matcher :square_brackets?,
|
22
22
|
'(send {(send _recv _msg) str array hash} :[] ...)'
|
@@ -191,8 +191,7 @@ module RuboCop
|
|
191
191
|
def call_chain_starts_with_int?(begin_node, send_node)
|
192
192
|
recv = first_part_of_call_chain(send_node)
|
193
193
|
recv && recv.int_type? && (parent = begin_node.parent) &&
|
194
|
-
parent.send_type? &&
|
195
|
-
(parent.method_name == :-@ || parent.method_name == :+@)
|
194
|
+
parent.send_type? && (parent.method?(:-@) || parent.method?(:+@))
|
196
195
|
end
|
197
196
|
end
|
198
197
|
end
|
@@ -84,26 +84,22 @@ module RuboCop
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def on_lvasgn(node)
|
87
|
-
lhs,
|
88
|
-
@local_variables_scopes[
|
87
|
+
lhs, rhs = *node
|
88
|
+
@local_variables_scopes[rhs] << lhs
|
89
89
|
end
|
90
90
|
|
91
|
-
# Detect offenses
|
92
|
-
|
93
91
|
def on_send(node)
|
94
|
-
|
95
|
-
return unless receiver && receiver.self_type?
|
96
|
-
return unless regular_method_call?(node)
|
92
|
+
return unless node.self_receiver? && regular_method_call?(node)
|
97
93
|
|
98
94
|
return if @allowed_send_nodes.include?(node) ||
|
99
|
-
@local_variables_scopes[node].include?(method_name)
|
95
|
+
@local_variables_scopes[node].include?(node.method_name)
|
96
|
+
|
100
97
|
add_offense(node, :expression)
|
101
98
|
end
|
102
99
|
|
103
100
|
def autocorrect(node)
|
104
|
-
receiver, _method_name, *_args = *node
|
105
101
|
lambda do |corrector|
|
106
|
-
corrector.remove(receiver.source_range)
|
102
|
+
corrector.remove(node.receiver.source_range)
|
107
103
|
corrector.remove(node.loc.dot)
|
108
104
|
end
|
109
105
|
end
|
@@ -118,13 +114,11 @@ module RuboCop
|
|
118
114
|
end
|
119
115
|
|
120
116
|
def regular_method_call?(node)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
node.asgn_method_call? ||
|
127
|
-
braces_style_call?(node))
|
117
|
+
!(operator?(node.method_name) ||
|
118
|
+
keyword?(node.method_name) ||
|
119
|
+
node.camel_case_method? ||
|
120
|
+
node.setter_method? ||
|
121
|
+
node.implicit_call?)
|
128
122
|
end
|
129
123
|
|
130
124
|
def on_argument(node)
|
@@ -133,27 +127,15 @@ module RuboCop
|
|
133
127
|
end
|
134
128
|
|
135
129
|
def keyword?(method_name)
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
def constant_name?(method_name)
|
144
|
-
method_name.match(/^[A-Z]/)
|
145
|
-
end
|
146
|
-
|
147
|
-
def braces_style_call?(node)
|
148
|
-
node.loc.selector.nil?
|
130
|
+
%i(alias and begin break case class def defined? do
|
131
|
+
else elsif end ensure false for if in module
|
132
|
+
next nil not or redo rescue retry return self
|
133
|
+
super then true undef unless until when while
|
134
|
+
yield).include?(method_name)
|
149
135
|
end
|
150
136
|
|
151
137
|
def allow_self(node)
|
152
|
-
return unless node.send_type?
|
153
|
-
|
154
|
-
receiver, _method_name, *_args = *node
|
155
|
-
|
156
|
-
return unless receiver && receiver.self_type?
|
138
|
+
return unless node.send_type? && node.self_receiver?
|
157
139
|
|
158
140
|
@allowed_send_nodes << node
|
159
141
|
end
|
@@ -6,18 +6,12 @@ module RuboCop
|
|
6
6
|
# This cop checks for uses of rescue in its modifier form.
|
7
7
|
class RescueModifier < Cop
|
8
8
|
include AutocorrectAlignment
|
9
|
+
include RescueNode
|
9
10
|
|
10
11
|
MSG = 'Avoid using `rescue` in its modifier form.'.freeze
|
11
12
|
|
12
|
-
def investigate(processed_source)
|
13
|
-
@modifier_locations = processed_source
|
14
|
-
.tokens
|
15
|
-
.select { |t| t.type == :kRESCUE_MOD }
|
16
|
-
.map(&:pos)
|
17
|
-
end
|
18
|
-
|
19
13
|
def on_resbody(node)
|
20
|
-
return unless
|
14
|
+
return unless rescue_modifier?(node)
|
21
15
|
add_offense(node.parent, :expression)
|
22
16
|
end
|
23
17
|
|
@@ -37,12 +31,6 @@ module RuboCop
|
|
37
31
|
corrector.replace(node.source_range, correction)
|
38
32
|
end
|
39
33
|
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def modifier?(node)
|
44
|
-
@modifier_locations.include?(node.loc.keyword)
|
45
|
-
end
|
46
34
|
end
|
47
35
|
end
|
48
36
|
end
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
# x += 1
|
15
15
|
class SelfAssignment < Cop
|
16
16
|
MSG = 'Use self-assignment shorthand `%s=`.'.freeze
|
17
|
-
OPS =
|
17
|
+
OPS = %i(+ - * ** / | &).freeze
|
18
18
|
|
19
19
|
def on_lvasgn(node)
|
20
20
|
check(node, :lvar)
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
36
36
|
|
37
37
|
if rhs.send_type?
|
38
38
|
check_send_node(node, rhs, var_name, var_type)
|
39
|
-
elsif
|
39
|
+
elsif %i(and or).include?(rhs.type)
|
40
40
|
check_boolean_node(node, rhs, var_name, var_type)
|
41
41
|
end
|
42
42
|
end
|
@@ -66,7 +66,7 @@ module RuboCop
|
|
66
66
|
|
67
67
|
if rhs.send_type?
|
68
68
|
autocorrect_send_node(node, rhs)
|
69
|
-
elsif
|
69
|
+
elsif %i(and or).include?(rhs.type)
|
70
70
|
autocorrect_boolean_node(node, rhs)
|
71
71
|
end
|
72
72
|
end
|
@@ -8,13 +8,12 @@ module RuboCop
|
|
8
8
|
MSG = 'Prefer `Object#__send__` or `Object#public_send` to ' \
|
9
9
|
'`send`.'.freeze
|
10
10
|
|
11
|
-
def_node_matcher :sending?, '(send _ :send
|
11
|
+
def_node_matcher :sending?, '(send _ :send ...)'
|
12
12
|
|
13
13
|
def on_send(node)
|
14
|
-
sending?(node)
|
15
|
-
|
16
|
-
|
17
|
-
end
|
14
|
+
return unless sending?(node) && node.arguments?
|
15
|
+
|
16
|
+
add_offense(node, :selector)
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -15,22 +15,21 @@ module RuboCop
|
|
15
15
|
MSG = 'Do not leave space between `!` and its argument.'.freeze
|
16
16
|
|
17
17
|
def on_send(node)
|
18
|
-
return unless node.keyword_bang? &&
|
18
|
+
return unless node.keyword_bang? && whitespace_after_operator?(node)
|
19
19
|
|
20
20
|
add_offense(node, :expression)
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
receiver
|
25
|
-
receiver.loc.column - node.loc.column > 1
|
23
|
+
def whitespace_after_operator?(node)
|
24
|
+
node.receiver.loc.column - node.loc.column > 1
|
26
25
|
end
|
27
26
|
|
28
27
|
def autocorrect(node)
|
29
28
|
lambda do |corrector|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
corrector.remove(
|
30
|
+
range_between(node.loc.selector.end_pos,
|
31
|
+
node.receiver.source_range.begin_pos)
|
32
|
+
)
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def on_block(node)
|
43
|
-
check(node,
|
43
|
+
check(node, %i(begin end).freeze)
|
44
44
|
end
|
45
45
|
|
46
46
|
def on_break(node)
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def on_case(node)
|
51
|
-
check(node,
|
51
|
+
check(node, %i(keyword else).freeze)
|
52
52
|
end
|
53
53
|
|
54
54
|
def on_ensure(node)
|
@@ -56,15 +56,15 @@ module RuboCop
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def on_for(node)
|
59
|
-
check(node,
|
59
|
+
check(node, %i(begin end).freeze)
|
60
60
|
end
|
61
61
|
|
62
62
|
def on_if(node)
|
63
|
-
check(node,
|
63
|
+
check(node, %i(keyword else begin end).freeze, 'then'.freeze)
|
64
64
|
end
|
65
65
|
|
66
66
|
def on_kwbegin(node)
|
67
|
-
check(node,
|
67
|
+
check(node, %i(begin end).freeze, nil)
|
68
68
|
end
|
69
69
|
|
70
70
|
def on_next(node)
|
@@ -108,7 +108,7 @@ module RuboCop
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def on_until(node)
|
111
|
-
check(node,
|
111
|
+
check(node, %i(begin end keyword).freeze)
|
112
112
|
end
|
113
113
|
|
114
114
|
def on_when(node)
|
@@ -116,7 +116,7 @@ module RuboCop
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def on_while(node)
|
119
|
-
check(node,
|
119
|
+
check(node, %i(begin end keyword).freeze)
|
120
120
|
end
|
121
121
|
|
122
122
|
def on_yield(node)
|
@@ -203,11 +203,10 @@ module RuboCop
|
|
203
203
|
def preceded_by_operator?(node, _range)
|
204
204
|
# regular dotted method calls bind more tightly than operators
|
205
205
|
# so we need to climb up the AST past them
|
206
|
-
|
206
|
+
node.each_ancestor do |ancestor|
|
207
207
|
return true if ancestor.and_type? || ancestor.or_type?
|
208
208
|
return false unless ancestor.send_type?
|
209
209
|
return true if operator?(ancestor.method_name)
|
210
|
-
node = ancestor
|
211
210
|
end
|
212
211
|
false
|
213
212
|
end
|