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
@@ -16,8 +16,9 @@ module RuboCop
|
|
16
16
|
# add_offense(node)
|
17
17
|
# add_offense(node, location: :selector)
|
18
18
|
#
|
19
|
-
class RedundantLocationArgument <
|
19
|
+
class RedundantLocationArgument < Base
|
20
20
|
include RangeHelp
|
21
|
+
extend AutoCorrector
|
21
22
|
|
22
23
|
MSG = 'Redundant location argument to `#add_offense`.'
|
23
24
|
|
@@ -28,15 +29,17 @@ module RuboCop
|
|
28
29
|
PATTERN
|
29
30
|
|
30
31
|
def on_send(node)
|
31
|
-
redundant_location_argument(node)
|
32
|
-
|
33
|
-
|
34
|
-
def autocorrect(node)
|
35
|
-
range = offending_range(node)
|
32
|
+
redundant_location_argument(node) do |argument|
|
33
|
+
add_offense(argument) do |corrector|
|
34
|
+
range = offending_range(argument)
|
36
35
|
|
37
|
-
|
36
|
+
corrector.remove(range)
|
37
|
+
end
|
38
|
+
end
|
38
39
|
end
|
39
40
|
|
41
|
+
private
|
42
|
+
|
40
43
|
def offending_range(node)
|
41
44
|
with_space = range_with_surrounding_space(range: node.loc.expression)
|
42
45
|
|
@@ -19,8 +19,9 @@ module RuboCop
|
|
19
19
|
# add_offense(node, message: CUSTOM_MSG)
|
20
20
|
# add_offense(node, message: message(other_node))
|
21
21
|
#
|
22
|
-
class RedundantMessageArgument <
|
22
|
+
class RedundantMessageArgument < Base
|
23
23
|
include RangeHelp
|
24
|
+
extend AutoCorrector
|
24
25
|
|
25
26
|
MSG = 'Redundant message argument to `#add_offense`.'
|
26
27
|
|
@@ -39,17 +40,15 @@ module RuboCop
|
|
39
40
|
def on_send(node)
|
40
41
|
node_type_check(node) do |node_arg, kwargs|
|
41
42
|
find_offending_argument(node_arg, kwargs) do |pair|
|
42
|
-
add_offense(pair)
|
43
|
+
add_offense(pair) do |corrector|
|
44
|
+
range = offending_range(pair)
|
45
|
+
|
46
|
+
corrector.remove(range)
|
47
|
+
end
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
46
51
|
|
47
|
-
def autocorrect(node)
|
48
|
-
range = offending_range(node)
|
49
|
-
|
50
|
-
->(corrector) { corrector.remove(range) }
|
51
|
-
end
|
52
|
-
|
53
52
|
private
|
54
53
|
|
55
54
|
def offending_range(node)
|
@@ -13,7 +13,7 @@ module RuboCop
|
|
13
13
|
# # good
|
14
14
|
# expect(cop.messages).to eq(['Do not write bad code like that.'])
|
15
15
|
#
|
16
|
-
class UselessMessageAssertion <
|
16
|
+
class UselessMessageAssertion < Base
|
17
17
|
MSG = 'Do not specify cop behavior using `described_class::MSG`.'
|
18
18
|
|
19
19
|
def_node_search :described_class_msg, <<~PATTERN
|
@@ -24,7 +24,7 @@ module RuboCop
|
|
24
24
|
(send (send nil? :expect #contains_described_class_msg?) :to ...)
|
25
25
|
PATTERN
|
26
26
|
|
27
|
-
def
|
27
|
+
def on_new_investigation
|
28
28
|
assertions_using_described_class_msg.each do |node|
|
29
29
|
add_offense(node)
|
30
30
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'set'
|
4
|
-
|
5
3
|
module RuboCop
|
6
4
|
module Cop
|
7
5
|
module Layout
|
@@ -30,7 +28,8 @@ module RuboCop
|
|
30
28
|
# object.method(arg) # this is a comment
|
31
29
|
# another_object.method(arg) # this is another comment
|
32
30
|
# some_object.method(arg) # this is some comment
|
33
|
-
class ExtraSpacing <
|
31
|
+
class ExtraSpacing < Base
|
32
|
+
extend AutoCorrector
|
34
33
|
include PrecedingFollowingAlignment
|
35
34
|
include RangeHelp
|
36
35
|
|
@@ -38,7 +37,7 @@ module RuboCop
|
|
38
37
|
MSG_UNALIGNED_ASGN = '`=` is not aligned with the %<location>s ' \
|
39
38
|
'assignment.'
|
40
39
|
|
41
|
-
def
|
40
|
+
def on_new_investigation
|
42
41
|
return if processed_source.blank?
|
43
42
|
|
44
43
|
@corrected = Set.new if force_equal_sign_alignment?
|
@@ -48,16 +47,6 @@ module RuboCop
|
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
51
|
-
def autocorrect(range)
|
52
|
-
lambda do |corrector|
|
53
|
-
if range.source.end_with?('=')
|
54
|
-
align_equal_signs(range, corrector)
|
55
|
-
else
|
56
|
-
corrector.remove(range)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
50
|
private
|
62
51
|
|
63
52
|
def check_tokens(ast, token1, token2)
|
@@ -74,7 +63,9 @@ module RuboCop
|
|
74
63
|
return unless aligned_with_preceding_assignment(token) == :no
|
75
64
|
|
76
65
|
message = format(MSG_UNALIGNED_ASGN, location: 'preceding')
|
77
|
-
add_offense(token.pos,
|
66
|
+
add_offense(token.pos, message: message) do |corrector|
|
67
|
+
align_equal_signs(token.pos, corrector)
|
68
|
+
end
|
78
69
|
end
|
79
70
|
|
80
71
|
def check_other(token1, token2, ast)
|
@@ -84,7 +75,9 @@ module RuboCop
|
|
84
75
|
extra_space_range(token1, token2) do |range|
|
85
76
|
next if ignored_range?(ast, range.begin_pos)
|
86
77
|
|
87
|
-
add_offense(range,
|
78
|
+
add_offense(range, message: MSG_UNNECESSARY) do |corrector|
|
79
|
+
corrector.remove(range)
|
80
|
+
end
|
88
81
|
end
|
89
82
|
end
|
90
83
|
|
@@ -161,11 +161,11 @@ module RuboCop
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def heredoc_body(node)
|
164
|
-
node.loc.heredoc_body.source
|
164
|
+
node.loc.heredoc_body.source
|
165
165
|
end
|
166
166
|
|
167
167
|
def heredoc_end(node)
|
168
|
-
node.loc.heredoc_end.source
|
168
|
+
node.loc.heredoc_end.source
|
169
169
|
end
|
170
170
|
end
|
171
171
|
end
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
# ...then each key/value pair is treated as a method 'argument'
|
38
38
|
# when determining where line breaks should appear.
|
39
39
|
if (last_arg = args.last)
|
40
|
-
args = args.
|
40
|
+
args = args[0...-1] + last_arg.children if last_arg.hash_type? && !last_arg.braces?
|
41
41
|
end
|
42
42
|
|
43
43
|
check_line_breaks(node, args)
|
@@ -96,7 +96,6 @@ module RuboCop
|
|
96
96
|
)
|
97
97
|
end
|
98
98
|
|
99
|
-
# rubocop:disable Metrics/AbcSize
|
100
99
|
def alignment_source(node, starting_loc)
|
101
100
|
ending_loc =
|
102
101
|
case node.type
|
@@ -115,7 +114,6 @@ module RuboCop
|
|
115
114
|
|
116
115
|
range_between(starting_loc.begin_pos, ending_loc.end_pos).source
|
117
116
|
end
|
118
|
-
# rubocop:enable Metrics/AbcSize
|
119
117
|
|
120
118
|
# We will use ancestor or wrapper with access modifier.
|
121
119
|
|
@@ -66,7 +66,15 @@ module RuboCop
|
|
66
66
|
|
67
67
|
def check_space_after_dot(node)
|
68
68
|
dot_pos = node.loc.dot.end_pos
|
69
|
-
|
69
|
+
|
70
|
+
selector_pos =
|
71
|
+
# `Proc#call` shorthand syntax
|
72
|
+
if node.method?(:call) && !node.loc.selector
|
73
|
+
node.loc.begin.begin_pos
|
74
|
+
else
|
75
|
+
node.loc.selector.begin_pos
|
76
|
+
end
|
77
|
+
|
70
78
|
check_space(dot_pos, selector_pos)
|
71
79
|
end
|
72
80
|
|
@@ -24,18 +24,21 @@ module RuboCop
|
|
24
24
|
# # good
|
25
25
|
# # Lambda arguments require no disambiguation
|
26
26
|
# foo = ->(bar) { bar.baz }
|
27
|
-
class AmbiguousBlockAssociation <
|
27
|
+
class AmbiguousBlockAssociation < Base
|
28
28
|
MSG = 'Parenthesize the param `%<param>s` to make sure that the ' \
|
29
29
|
'block will be associated with the `%<method>s` method ' \
|
30
30
|
'call.'
|
31
31
|
|
32
32
|
def on_send(node)
|
33
|
-
return
|
34
|
-
node.last_argument.lambda? || allowed_method?(node)
|
33
|
+
return unless node.arguments?
|
35
34
|
|
36
35
|
return unless ambiguous_block_association?(node)
|
36
|
+
return if node.parenthesized? ||
|
37
|
+
node.last_argument.lambda? || allowed_method?(node)
|
38
|
+
|
39
|
+
message = message(node)
|
37
40
|
|
38
|
-
add_offense(node)
|
41
|
+
add_offense(node, message: message)
|
39
42
|
end
|
40
43
|
alias on_csend on_send
|
41
44
|
|
@@ -20,8 +20,8 @@ module RuboCop
|
|
20
20
|
#
|
21
21
|
# # With parentheses, there's no ambiguity.
|
22
22
|
# do_something(*some_array)
|
23
|
-
class AmbiguousOperator <
|
24
|
-
|
23
|
+
class AmbiguousOperator < Base
|
24
|
+
extend AutoCorrector
|
25
25
|
|
26
26
|
AMBIGUITIES = {
|
27
27
|
'+' => { actual: 'positive number', possible: 'addition' },
|
@@ -38,18 +38,23 @@ module RuboCop
|
|
38
38
|
'a whitespace to the right of the `%<operator>s` if it ' \
|
39
39
|
'should be a %<possible>s.'
|
40
40
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
41
|
+
def on_new_investigation
|
42
|
+
processed_source.diagnostics.each do |diagnostic|
|
43
|
+
next unless diagnostic.reason == :ambiguous_prefix
|
44
|
+
|
45
|
+
offense_node = find_offense_node_by(diagnostic)
|
46
|
+
message = message(diagnostic)
|
47
|
+
|
48
|
+
add_offense(
|
49
|
+
diagnostic.location, message: message, severity: diagnostic.level
|
50
|
+
) do |corrector|
|
51
|
+
add_parentheses(offense_node, corrector)
|
52
|
+
end
|
44
53
|
end
|
45
54
|
end
|
46
55
|
|
47
56
|
private
|
48
57
|
|
49
|
-
def relevant_diagnostic?(diagnostic)
|
50
|
-
diagnostic.reason == :ambiguous_prefix
|
51
|
-
end
|
52
|
-
|
53
58
|
def find_offense_node_by(diagnostic)
|
54
59
|
ast = processed_source.ast
|
55
60
|
ast.each_node(:splat, :block_pass, :kwsplat) do |node|
|
@@ -68,7 +73,7 @@ module RuboCop
|
|
68
73
|
end
|
69
74
|
end
|
70
75
|
|
71
|
-
def
|
76
|
+
def message(diagnostic)
|
72
77
|
operator = diagnostic.location.source
|
73
78
|
hash = AMBIGUITIES[operator]
|
74
79
|
format(MSG_FORMAT, hash)
|
@@ -21,25 +21,27 @@ module RuboCop
|
|
21
21
|
#
|
22
22
|
# # With parentheses, there's no ambiguity.
|
23
23
|
# do_something(/pattern/i)
|
24
|
-
class AmbiguousRegexpLiteral <
|
25
|
-
|
24
|
+
class AmbiguousRegexpLiteral < Base
|
25
|
+
extend AutoCorrector
|
26
26
|
|
27
27
|
MSG = 'Ambiguous regexp literal. Parenthesize the method arguments ' \
|
28
28
|
"if it's surely a regexp literal, or add a whitespace to the " \
|
29
29
|
'right of the `/` if it should be a division.'
|
30
30
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
31
|
+
def on_new_investigation
|
32
|
+
processed_source.diagnostics.each do |diagnostic|
|
33
|
+
next unless diagnostic.reason == :ambiguous_literal
|
34
|
+
|
35
|
+
offense_node = find_offense_node_by(diagnostic)
|
36
|
+
|
37
|
+
add_offense(diagnostic.location, severity: diagnostic.level) do |corrector|
|
38
|
+
add_parentheses(offense_node, corrector)
|
39
|
+
end
|
34
40
|
end
|
35
41
|
end
|
36
42
|
|
37
43
|
private
|
38
44
|
|
39
|
-
def relevant_diagnostic?(diagnostic)
|
40
|
-
diagnostic.reason == :ambiguous_literal
|
41
|
-
end
|
42
|
-
|
43
45
|
def find_offense_node_by(diagnostic)
|
44
46
|
node = processed_source.ast.each_node(:regexp).find do |regexp_node|
|
45
47
|
regexp_node.source_range.begin_pos == diagnostic.location.begin_pos
|
@@ -47,10 +49,6 @@ module RuboCop
|
|
47
49
|
|
48
50
|
node.parent
|
49
51
|
end
|
50
|
-
|
51
|
-
def alternative_message(_diagnostic)
|
52
|
-
MSG
|
53
|
-
end
|
54
52
|
end
|
55
53
|
end
|
56
54
|
end
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
34
34
|
# do_something
|
35
35
|
# end
|
36
36
|
#
|
37
|
-
class AssignmentInCondition <
|
37
|
+
class AssignmentInCondition < Base
|
38
38
|
include SafeAssignment
|
39
39
|
|
40
40
|
MSG_WITH_SAFE_ASSIGNMENT_ALLOWED =
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
53
53
|
next :skip_children if skip_children?(asgn_node)
|
54
54
|
next if allowed_construct?(asgn_node)
|
55
55
|
|
56
|
-
add_offense(asgn_node
|
56
|
+
add_offense(asgn_node.loc.operator)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
alias on_while on_if
|
@@ -14,7 +14,9 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# BigDecimal(123.456, 3)
|
16
16
|
#
|
17
|
-
class BigDecimalNew <
|
17
|
+
class BigDecimalNew < Base
|
18
|
+
extend AutoCorrector
|
19
|
+
|
18
20
|
MSG = '`%<double_colon>sBigDecimal.new()` is deprecated. ' \
|
19
21
|
'Use `%<double_colon>sBigDecimal()` instead.'
|
20
22
|
|
@@ -24,18 +26,16 @@ module RuboCop
|
|
24
26
|
PATTERN
|
25
27
|
|
26
28
|
def on_send(node)
|
27
|
-
return unless
|
29
|
+
return unless node.method?(:new)
|
30
|
+
|
31
|
+
big_decimal_new(node) do |captured_value|
|
28
32
|
double_colon = captured_value ? '::' : ''
|
29
33
|
message = format(MSG, double_colon: double_colon)
|
30
34
|
|
31
|
-
add_offense(node
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
def autocorrect(node)
|
36
|
-
lambda do |corrector|
|
37
|
-
corrector.remove(node.loc.selector)
|
38
|
-
corrector.remove(node.loc.dot)
|
35
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
36
|
+
corrector.remove(node.loc.selector)
|
37
|
+
corrector.remove(node.loc.dot)
|
38
|
+
end
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for places where binary operator has identical operands.
|
7
|
+
#
|
8
|
+
# It covers arithmetic operators: `+`, `-`, `*`, `/`, `%`, `**`;
|
9
|
+
# comparison operators: `==`, `===`, `=~`, `>`, `>=`, `<`, `<=`;
|
10
|
+
# bitwise operators: `|`, `^`, `&`, `<<`, `>>`;
|
11
|
+
# boolean operators: `&&`, `||`
|
12
|
+
# and "spaceship" operator - `<=>`.
|
13
|
+
#
|
14
|
+
# This cop is marked as unsafe as it does not consider side effects when calling methods
|
15
|
+
# and thus can generate false positives:
|
16
|
+
# if wr.take_char == '\0' && wr.take_char == '\0'
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
# # bad
|
20
|
+
# x.top >= x.top
|
21
|
+
#
|
22
|
+
# if a.x != 0 && a.x != 0
|
23
|
+
# do_something
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# def childs?
|
27
|
+
# left_child || left_child
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
class BinaryOperatorWithIdenticalOperands < Base
|
31
|
+
MSG = 'Binary operator `%<op>s` has identical operands.'
|
32
|
+
|
33
|
+
def on_send(node)
|
34
|
+
return unless node.binary_operation?
|
35
|
+
|
36
|
+
lhs, operation, rhs = *node
|
37
|
+
return if node.arithmetic_operation? && lhs.basic_literal? && rhs.basic_literal?
|
38
|
+
|
39
|
+
add_offense(node, message: format(MSG, op: operation)) if lhs == rhs
|
40
|
+
end
|
41
|
+
|
42
|
+
def on_and(node)
|
43
|
+
add_offense(node, message: format(MSG, op: node.operator)) if node.lhs == node.rhs
|
44
|
+
end
|
45
|
+
alias on_or on_and
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|