rubocop 0.88.0 → 0.89.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 +1 -1
- data/bin/rubocop-profile +1 -0
- data/config/default.yml +96 -16
- data/lib/rubocop.rb +16 -4
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +1 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +19 -2
- data/lib/rubocop/config_loader.rb +1 -1
- data/lib/rubocop/config_loader_resolver.rb +3 -3
- data/lib/rubocop/config_obsoletion.rb +6 -1
- data/lib/rubocop/config_validator.rb +1 -3
- data/lib/rubocop/cop/base.rb +2 -2
- data/lib/rubocop/cop/commissioner.rb +0 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
- data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
- data/lib/rubocop/cop/layout/extra_spacing.rb +9 -16
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +49 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +7 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -4
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
- data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
- data/lib/rubocop/cop/lint/empty_when.rb +2 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
- data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
- data/lib/rubocop/cop/lint/loop.rb +23 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
- data/lib/rubocop/cop/lint/missing_super.rb +99 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +61 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
- data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
- data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
- data/lib/rubocop/cop/lint/rand_one.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
- data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
- data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
- data/lib/rubocop/cop/lint/script_permission.rb +10 -7
- data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
- data/lib/rubocop/cop/lint/to_json.rb +4 -6
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
- data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +11 -31
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
- data/lib/rubocop/cop/lint/void.rb +3 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -2
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +2 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
- data/lib/rubocop/cop/metrics/method_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +2 -2
- data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
- data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
- data/lib/rubocop/cop/migration/department_name.rb +13 -15
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +22 -5
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
- data/lib/rubocop/cop/mixin/statement_modifier.rb +35 -6
- data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
- data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/file_name.rb +3 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
- 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/rescued_exceptions_variable_name.rb +12 -11
- data/lib/rubocop/cop/registry.rb +3 -3
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +6 -8
- data/lib/rubocop/cop/security/marshal_load.rb +2 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +6 -6
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +11 -1
- data/lib/rubocop/cop/style/accessor_grouping.rb +9 -7
- data/lib/rubocop/cop/style/alias.rb +7 -3
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +0 -2
- data/lib/rubocop/cop/style/case_equality.rb +22 -3
- data/lib/rubocop/cop/style/case_like_if.rb +2 -2
- data/lib/rubocop/cop/style/colon_method_call.rb +3 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +11 -2
- data/lib/rubocop/cop/style/documentation.rb +4 -4
- data/lib/rubocop/cop/style/each_with_object.rb +0 -2
- data/lib/rubocop/cop/style/empty_method.rb +5 -5
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
- data/lib/rubocop/cop/style/format_string.rb +4 -0
- data/lib/rubocop/cop/style/format_string_token.rb +1 -0
- data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
- data/lib/rubocop/cop/style/guard_clause.rb +2 -2
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +8 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- 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 +0 -20
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +2 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +9 -2
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +4 -0
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +25 -10
- data/lib/rubocop/cop/style/signal_exception.rb +2 -0
- data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/tokens_util.rb +84 -0
- data/lib/rubocop/cop/util.rb +1 -13
- data/lib/rubocop/cop/variable_force.rb +0 -2
- data/lib/rubocop/cop/variable_force/branch.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +2 -2
- data/lib/rubocop/cops_documentation_generator.rb +282 -0
- data/lib/rubocop/error.rb +1 -0
- data/lib/rubocop/formatter/formatter_set.rb +1 -0
- data/lib/rubocop/path_util.rb +19 -4
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/rspec/expect_offense.rb +1 -1
- data/lib/rubocop/target_finder.rb +12 -9
- data/lib/rubocop/version.rb +2 -2
- metadata +19 -6
- data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
- data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
- data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -27,13 +27,14 @@ module RuboCop
|
|
27
27
|
# # frozen_string_literal: true
|
28
28
|
# p [''.frozen?, ''.encoding] #=> [true, #<Encoding:US-ASCII>]
|
29
29
|
#
|
30
|
-
class OrderedMagicComments <
|
30
|
+
class OrderedMagicComments < Base
|
31
31
|
include FrozenStringLiteral
|
32
|
+
extend AutoCorrector
|
32
33
|
|
33
34
|
MSG = 'The encoding magic comment should precede all other ' \
|
34
35
|
'magic comments.'
|
35
36
|
|
36
|
-
def
|
37
|
+
def on_new_investigation
|
37
38
|
return if processed_source.buffer.source.empty?
|
38
39
|
|
39
40
|
encoding_line, frozen_string_literal_line = magic_comment_lines
|
@@ -43,24 +44,21 @@ module RuboCop
|
|
43
44
|
|
44
45
|
range = processed_source.buffer.line_range(encoding_line + 1)
|
45
46
|
|
46
|
-
add_offense(range
|
47
|
+
add_offense(range) do |corrector|
|
48
|
+
autocorrect(corrector, encoding_line, frozen_string_literal_line)
|
49
|
+
end
|
47
50
|
end
|
48
51
|
|
49
|
-
|
50
|
-
encoding_line, frozen_string_literal_line = magic_comment_lines
|
52
|
+
private
|
51
53
|
|
54
|
+
def autocorrect(corrector, encoding_line, frozen_string_literal_line)
|
52
55
|
range1 = processed_source.buffer.line_range(encoding_line + 1)
|
53
|
-
range2 =
|
54
|
-
processed_source.buffer.line_range(frozen_string_literal_line + 1)
|
56
|
+
range2 = processed_source.buffer.line_range(frozen_string_literal_line + 1)
|
55
57
|
|
56
|
-
|
57
|
-
|
58
|
-
corrector.replace(range2, range1.source)
|
59
|
-
end
|
58
|
+
corrector.replace(range1, range2.source)
|
59
|
+
corrector.replace(range2, range1.source)
|
60
60
|
end
|
61
61
|
|
62
|
-
private
|
63
|
-
|
64
62
|
def magic_comment_lines
|
65
63
|
lines = [nil, nil]
|
66
64
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cops looks for references of Regexp captures that are out of range
|
7
|
+
# and thus always returns nil.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
#
|
11
|
+
# /(foo)bar/ =~ 'foobar'
|
12
|
+
#
|
13
|
+
# # bad - always returns nil
|
14
|
+
#
|
15
|
+
# puts $2 # => nil
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
#
|
19
|
+
# puts $1 # => foo
|
20
|
+
#
|
21
|
+
class OutOfRangeRegexpRef < Base
|
22
|
+
MSG = 'Do not use out of range reference for the Regexp.'
|
23
|
+
|
24
|
+
def on_new_investigation
|
25
|
+
@valid_ref = 0
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_regexp(node)
|
29
|
+
@valid_ref = nil
|
30
|
+
return if contain_non_literal?(node)
|
31
|
+
|
32
|
+
tree = Regexp::Parser.parse(node.content)
|
33
|
+
@valid_ref = regexp_captures(tree)
|
34
|
+
end
|
35
|
+
|
36
|
+
def on_nth_ref(node)
|
37
|
+
backref, = *node
|
38
|
+
return if @valid_ref.nil?
|
39
|
+
|
40
|
+
add_offense(node) if backref > @valid_ref
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def contain_non_literal?(node)
|
46
|
+
node.children.size != 2 || !node.children.first.str_type?
|
47
|
+
end
|
48
|
+
|
49
|
+
def regexp_captures(tree)
|
50
|
+
named_capture = numbered_capture = 0
|
51
|
+
tree.each_expression do |e|
|
52
|
+
if e.type?(:group)
|
53
|
+
e.respond_to?(:name) ? named_capture += 1 : numbered_capture += 1
|
54
|
+
end
|
55
|
+
end
|
56
|
+
named_capture.positive? ? named_capture : numbered_capture
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -15,8 +15,9 @@ module RuboCop
|
|
15
15
|
# do_something(foo)
|
16
16
|
# do_something (2 + 3) * 4
|
17
17
|
# do_something (foo * bar).baz
|
18
|
-
class ParenthesesAsGroupedExpression <
|
18
|
+
class ParenthesesAsGroupedExpression < Base
|
19
19
|
include RangeHelp
|
20
|
+
extend AutoCorrector
|
20
21
|
|
21
22
|
MSG = '`(...)` interpreted as grouped expression.'
|
22
23
|
|
@@ -28,18 +29,11 @@ module RuboCop
|
|
28
29
|
|
29
30
|
range = space_range(node.first_argument.source_range, space_length)
|
30
31
|
|
31
|
-
add_offense(
|
32
|
-
end
|
33
|
-
alias on_csend on_send
|
34
|
-
|
35
|
-
def autocorrect(node)
|
36
|
-
space_length = spaces_before_left_parenthesis(node)
|
37
|
-
range = space_range(node.first_argument.source_range, space_length)
|
38
|
-
|
39
|
-
lambda do |corrector|
|
32
|
+
add_offense(range) do |corrector|
|
40
33
|
corrector.remove(range)
|
41
34
|
end
|
42
35
|
end
|
36
|
+
alias on_csend on_send
|
43
37
|
|
44
38
|
private
|
45
39
|
|
@@ -20,8 +20,9 @@ module RuboCop
|
|
20
20
|
# # good
|
21
21
|
#
|
22
22
|
# %w(foo bar)
|
23
|
-
class PercentStringArray <
|
23
|
+
class PercentStringArray < Base
|
24
24
|
include PercentLiteral
|
25
|
+
extend AutoCorrector
|
25
26
|
|
26
27
|
QUOTES_AND_COMMAS = [/,$/, /^'.*'$/, /^".*"$/].freeze
|
27
28
|
LEADING_QUOTE = /^['"]/.freeze
|
@@ -37,24 +38,24 @@ module RuboCop
|
|
37
38
|
def on_percent_literal(node)
|
38
39
|
return unless contains_quotes_or_commas?(node)
|
39
40
|
|
40
|
-
add_offense(node)
|
41
|
+
add_offense(node) do |corrector|
|
42
|
+
autocorrect(corrector, node)
|
43
|
+
end
|
41
44
|
end
|
42
45
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
private
|
47
|
+
|
48
|
+
def autocorrect(corrector, node)
|
49
|
+
node.each_value do |value|
|
50
|
+
range = value.loc.expression
|
47
51
|
|
48
|
-
|
49
|
-
|
52
|
+
match = range.source.match(TRAILING_QUOTE)
|
53
|
+
corrector.remove_trailing(range, match[0].length) if match
|
50
54
|
|
51
|
-
|
52
|
-
end
|
55
|
+
corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
|
53
56
|
end
|
54
57
|
end
|
55
58
|
|
56
|
-
private
|
57
|
-
|
58
59
|
def contains_quotes_or_commas?(node)
|
59
60
|
node.values.any? do |value|
|
60
61
|
literal = value.children.first.to_s.scrub
|
@@ -20,8 +20,9 @@ module RuboCop
|
|
20
20
|
# # good
|
21
21
|
#
|
22
22
|
# %i(foo bar)
|
23
|
-
class PercentSymbolArray <
|
23
|
+
class PercentSymbolArray < Base
|
24
24
|
include PercentLiteral
|
25
|
+
extend AutoCorrector
|
25
26
|
|
26
27
|
MSG = "Within `%i`/`%I`, ':' and ',' are unnecessary and may be " \
|
27
28
|
'unwanted in the resulting symbols.'
|
@@ -33,23 +34,23 @@ module RuboCop
|
|
33
34
|
def on_percent_literal(node)
|
34
35
|
return unless contains_colons_or_commas?(node)
|
35
36
|
|
36
|
-
add_offense(node)
|
37
|
+
add_offense(node) do |corrector|
|
38
|
+
autocorrect(corrector, node)
|
39
|
+
end
|
37
40
|
end
|
38
41
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
private
|
43
|
+
|
44
|
+
def autocorrect(corrector, node)
|
45
|
+
node.children.each do |child|
|
46
|
+
range = child.loc.expression
|
43
47
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
48
|
+
corrector.remove_trailing(range, 1) if range.source.end_with?(',')
|
49
|
+
corrector.remove_leading(range, 1) if
|
50
|
+
range.source.start_with?(':')
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
51
|
-
private
|
52
|
-
|
53
54
|
def contains_colons_or_commas?(node)
|
54
55
|
node.children.any? do |child|
|
55
56
|
literal = child.children.first.to_s
|
@@ -27,7 +27,9 @@ module RuboCop
|
|
27
27
|
# raise Exception # This exception means `Gem::Exception`.
|
28
28
|
# end
|
29
29
|
# end
|
30
|
-
class RaiseException <
|
30
|
+
class RaiseException < Base
|
31
|
+
extend AutoCorrector
|
32
|
+
|
31
33
|
MSG = 'Use `StandardError` over `Exception`.'
|
32
34
|
|
33
35
|
def_node_matcher :exception?, <<~PATTERN
|
@@ -44,21 +46,21 @@ module RuboCop
|
|
44
46
|
exception_new_with_message?(node, &check(node))
|
45
47
|
end
|
46
48
|
|
47
|
-
def autocorrect(node)
|
48
|
-
lambda do |corrector|
|
49
|
-
exception_class = node.children.first&.cbase_type? ? '::StandardError' : 'StandardError'
|
50
|
-
|
51
|
-
corrector.replace(node, exception_class)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
49
|
private
|
56
50
|
|
57
51
|
def check(node)
|
58
52
|
lambda do |exception_class, cbase|
|
59
53
|
return if cbase.nil? && implicit_namespace?(node)
|
60
54
|
|
61
|
-
add_offense(exception_class)
|
55
|
+
add_offense(exception_class) do |corrector|
|
56
|
+
prefer_exception = if exception_class.children.first&.cbase_type?
|
57
|
+
'::StandardError'
|
58
|
+
else
|
59
|
+
'StandardError'
|
60
|
+
end
|
61
|
+
|
62
|
+
corrector.replace(exception_class, prefer_exception)
|
63
|
+
end
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
# # good
|
21
21
|
#
|
22
22
|
# 0 # just use 0 instead
|
23
|
-
class RandOne <
|
23
|
+
class RandOne < Base
|
24
24
|
MSG = '`%<method>s` always returns `0`. ' \
|
25
25
|
'Perhaps you meant `rand(2)` or `rand`?'
|
26
26
|
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
PATTERN
|
30
30
|
|
31
31
|
def on_send(node)
|
32
|
-
return unless rand_one?(node)
|
32
|
+
return unless node.method?(:rand) && rand_one?(node)
|
33
33
|
|
34
34
|
add_offense(node)
|
35
35
|
end
|
@@ -135,7 +135,7 @@ module RuboCop
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
|
-
# rubocop:todo Metrics/CyclomaticComplexity
|
138
|
+
# rubocop:todo Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
139
139
|
def find_redundant(comment, offenses, cop, line_range, next_line_range)
|
140
140
|
if all_disabled?(comment)
|
141
141
|
# If there's a disable all comment followed by a comment
|
@@ -153,7 +153,7 @@ module RuboCop
|
|
153
153
|
cop if cop_offenses.none? { |o| line_range.cover?(o.line) }
|
154
154
|
end
|
155
155
|
end
|
156
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
156
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
157
157
|
|
158
158
|
def all_disabled?(comment)
|
159
159
|
/rubocop\s*:\s*(?:disable|todo)\s+all\b/.match?(comment.text)
|
@@ -34,28 +34,24 @@ module RuboCop
|
|
34
34
|
# foo = "1"
|
35
35
|
# # rubocop:enable all
|
36
36
|
# baz
|
37
|
-
class RedundantCopEnableDirective <
|
37
|
+
class RedundantCopEnableDirective < Base
|
38
38
|
include RangeHelp
|
39
39
|
include SurroundingSpace
|
40
|
+
extend AutoCorrector
|
40
41
|
|
41
42
|
MSG = 'Unnecessary enabling of %<cop>s.'
|
42
43
|
|
43
|
-
def
|
44
|
+
def on_new_investigation
|
44
45
|
return if processed_source.blank?
|
45
46
|
|
46
47
|
offenses = processed_source.comment_config.extra_enabled_comments
|
47
48
|
offenses.each do |comment, name|
|
48
49
|
add_offense(
|
49
|
-
|
50
|
-
location: range_of_offense(comment, name),
|
50
|
+
range_of_offense(comment, name),
|
51
51
|
message: format(MSG, cop: all_or_name(name))
|
52
|
-
)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
def autocorrect(comment_and_name)
|
57
|
-
lambda do |corrector|
|
58
|
-
corrector.remove(range_with_comma(*comment_and_name))
|
52
|
+
) do |corrector|
|
53
|
+
corrector.remove(range_with_comma(comment, name))
|
54
|
+
end
|
59
55
|
end
|
60
56
|
end
|
61
57
|
|
@@ -21,8 +21,9 @@ module RuboCop
|
|
21
21
|
#
|
22
22
|
# # good
|
23
23
|
# require 'unloaded_feature'
|
24
|
-
class RedundantRequireStatement <
|
24
|
+
class RedundantRequireStatement < Base
|
25
25
|
include RangeHelp
|
26
|
+
extend AutoCorrector
|
26
27
|
|
27
28
|
MSG = 'Remove unnecessary `require` statement.'
|
28
29
|
|
@@ -34,13 +35,9 @@ module RuboCop
|
|
34
35
|
def on_send(node)
|
35
36
|
return unless unnecessary_require_statement?(node)
|
36
37
|
|
37
|
-
add_offense(node)
|
38
|
-
|
38
|
+
add_offense(node) do |corrector|
|
39
|
+
range = range_with_surrounding_space(range: node.loc.expression, side: :right)
|
39
40
|
|
40
|
-
def autocorrect(node)
|
41
|
-
lambda do |corrector|
|
42
|
-
range = range_with_surrounding_space(range: node.loc.expression,
|
43
|
-
side: :right)
|
44
41
|
corrector.remove(range)
|
45
42
|
end
|
46
43
|
end
|
@@ -49,7 +49,9 @@ module RuboCop
|
|
49
49
|
# else
|
50
50
|
# baz
|
51
51
|
# end
|
52
|
-
class RedundantSplatExpansion <
|
52
|
+
class RedundantSplatExpansion < Base
|
53
|
+
extend AutoCorrector
|
54
|
+
|
53
55
|
MSG = 'Replace splat expansion with comma separated values.'
|
54
56
|
ARRAY_PARAM_MSG = 'Pass array contents as separate arguments.'
|
55
57
|
PERCENT_W = '%w'
|
@@ -73,23 +75,25 @@ module RuboCop
|
|
73
75
|
redundant_splat_expansion(node) do
|
74
76
|
if array_splat?(node) &&
|
75
77
|
(method_argument?(node) || part_of_an_array?(node))
|
76
|
-
add_offense(node, message: ARRAY_PARAM_MSG)
|
78
|
+
add_offense(node, message: ARRAY_PARAM_MSG) do |corrector|
|
79
|
+
autocorrect(corrector, node)
|
80
|
+
end
|
77
81
|
else
|
78
|
-
add_offense(node)
|
82
|
+
add_offense(node) do |corrector|
|
83
|
+
autocorrect(corrector, node)
|
84
|
+
end
|
79
85
|
end
|
80
86
|
end
|
81
87
|
end
|
82
88
|
|
83
|
-
|
89
|
+
private
|
90
|
+
|
91
|
+
def autocorrect(corrector, node)
|
84
92
|
range, content = replacement_range_and_content(node)
|
85
93
|
|
86
|
-
|
87
|
-
corrector.replace(range, content)
|
88
|
-
end
|
94
|
+
corrector.replace(range, content)
|
89
95
|
end
|
90
96
|
|
91
|
-
private
|
92
|
-
|
93
97
|
def redundant_splat_expansion(node)
|
94
98
|
literal_expansion(node) do |expanded_item|
|
95
99
|
if expanded_item.send_type?
|
@@ -17,8 +17,9 @@ module RuboCop
|
|
17
17
|
# # good
|
18
18
|
#
|
19
19
|
# "result is #{something}"
|
20
|
-
class RedundantStringCoercion <
|
20
|
+
class RedundantStringCoercion < Base
|
21
21
|
include Interpolation
|
22
|
+
extend AutoCorrector
|
22
23
|
|
23
24
|
MSG_DEFAULT = 'Redundant use of `Object#to_s` in interpolation.'
|
24
25
|
MSG_SELF = 'Use `self` instead of `Object#to_s` in ' \
|
@@ -31,14 +32,12 @@ module RuboCop
|
|
31
32
|
|
32
33
|
return unless to_s_without_args?(final_node)
|
33
34
|
|
34
|
-
|
35
|
-
end
|
35
|
+
message = final_node.receiver ? MSG_DEFAULT : MSG_SELF
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
receiver = node.receiver
|
37
|
+
add_offense(final_node.loc.selector, message: message) do |corrector|
|
38
|
+
receiver = final_node.receiver
|
40
39
|
corrector.replace(
|
41
|
-
|
40
|
+
final_node,
|
42
41
|
if receiver
|
43
42
|
receiver.source
|
44
43
|
else
|
@@ -47,12 +46,6 @@ module RuboCop
|
|
47
46
|
)
|
48
47
|
end
|
49
48
|
end
|
50
|
-
|
51
|
-
private
|
52
|
-
|
53
|
-
def message(node)
|
54
|
-
node.receiver ? MSG_DEFAULT : MSG_SELF
|
55
|
-
end
|
56
49
|
end
|
57
50
|
end
|
58
51
|
end
|