rubocop 1.70.0 → 1.71.2
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/config/default.yml +17 -0
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs.rb +3 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/redundant_line_break.rb +6 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +2 -6
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +5 -2
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -3
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +1 -1
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +13 -18
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +2 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -5
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +4 -4
- data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +22 -8
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -2
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
- data/lib/rubocop/cop/naming/block_forwarding.rb +18 -14
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
- data/lib/rubocop/cop/security/compound_hash.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -4
- data/lib/rubocop/cop/style/arguments_forwarding.rb +38 -19
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +7 -20
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
- data/lib/rubocop/cop/style/hash_except.rb +20 -131
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -6
- data/lib/rubocop/cop/style/it_assignment.rb +1 -1
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/map_into_array.rb +1 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +10 -13
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -2
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -2
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -2
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +27 -10
- data/lib/rubocop/cop/style/redundant_parentheses.rb +9 -6
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +12 -27
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -2
- data/lib/rubocop/cop/style/string_concatenation.rb +1 -1
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +4 -4
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cop/variable_force/variable.rb +14 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cops_documentation_generator.rb +13 -13
- data/lib/rubocop/directive_comment.rb +9 -8
- data/lib/rubocop/options.rb +2 -1
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/support.rb +1 -2
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +3 -0
- metadata +15 -11
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,126 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Use `node.type?(:foo, :bar)` instead of `node.foo_type? || node.bar_type?`,
|
7
|
+
# and `!node.type?(:foo, :bar)` instead of `!node.foo_type? && !node.bar_type?`.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
#
|
11
|
+
# # bad
|
12
|
+
# node.str_type? || node.sym_type?
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# node.type?(:str, :sym)
|
16
|
+
#
|
17
|
+
# # bad
|
18
|
+
# node.type?(:str, :sym) || node.boolean_type?
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# node.type?(:str, :sym, :boolean)
|
22
|
+
#
|
23
|
+
# # bad
|
24
|
+
# !node.str_type? && !node.sym_type?
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# !node.type?(:str, :sym)
|
28
|
+
#
|
29
|
+
# # bad
|
30
|
+
# !node.type?(:str, :sym) && !node.boolean_type?
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# !node.type?(:str, :sym, :boolean)
|
34
|
+
#
|
35
|
+
class NodeTypeMultiplePredicates < Base
|
36
|
+
extend AutoCorrector
|
37
|
+
|
38
|
+
MSG_OR = 'Use `%<replacement>s` instead of checking for multiple node types.'
|
39
|
+
MSG_AND = 'Use `%<replacement>s` instead of checking against multiple node types.'
|
40
|
+
|
41
|
+
# @!method one_of_node_types?(node)
|
42
|
+
def_node_matcher :one_of_node_types?, <<~PATTERN
|
43
|
+
(or $(call _receiver #type_predicate?) (call _receiver #type_predicate?))
|
44
|
+
PATTERN
|
45
|
+
|
46
|
+
# @!method or_another_type?(node)
|
47
|
+
def_node_matcher :or_another_type?, <<~PATTERN
|
48
|
+
(or {
|
49
|
+
$(call _receiver :type? sym+) (call _receiver #type_predicate?) |
|
50
|
+
(call _receiver #type_predicate?) $(call _receiver :type? sym+)
|
51
|
+
})
|
52
|
+
PATTERN
|
53
|
+
|
54
|
+
# @!method none_of_node_types?(node)
|
55
|
+
def_node_matcher :none_of_node_types?, <<~PATTERN
|
56
|
+
(and
|
57
|
+
(send $(call _receiver #type_predicate?) :!)
|
58
|
+
(send (call _receiver #type_predicate?) :!)
|
59
|
+
)
|
60
|
+
PATTERN
|
61
|
+
|
62
|
+
# @!method and_not_another_type?(node)
|
63
|
+
def_node_matcher :and_not_another_type?, <<~PATTERN
|
64
|
+
(and {
|
65
|
+
(send $(call _receiver :type? sym+) :!) (send (call _receiver #type_predicate?) :!) |
|
66
|
+
(send (call _receiver #type_predicate?) :!) (send $(call _receiver :type? sym+) :!)
|
67
|
+
})
|
68
|
+
PATTERN
|
69
|
+
|
70
|
+
def on_or(node)
|
71
|
+
return unless (send_node = one_of_node_types?(node) || or_another_type?(node))
|
72
|
+
return unless send_node.receiver
|
73
|
+
|
74
|
+
replacement = replacement(node, send_node)
|
75
|
+
add_offense(node, message: format(MSG_OR, replacement: replacement)) do |corrector|
|
76
|
+
corrector.replace(node, replacement)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def on_and(node)
|
81
|
+
return unless (send_node = none_of_node_types?(node) || and_not_another_type?(node))
|
82
|
+
return unless send_node.receiver
|
83
|
+
|
84
|
+
replacement = "!#{replacement(node, send_node)}"
|
85
|
+
|
86
|
+
add_offense(node, message: format(MSG_AND, replacement: replacement)) do |corrector|
|
87
|
+
corrector.replace(node, replacement)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def type_predicate?(method_name)
|
94
|
+
method_name.end_with?('_type?')
|
95
|
+
end
|
96
|
+
|
97
|
+
def replacement(node, send_node)
|
98
|
+
send_node = send_node.children.first if send_node.method?(:!)
|
99
|
+
|
100
|
+
types = types(node)
|
101
|
+
receiver = send_node.receiver.source
|
102
|
+
dot = send_node.loc.dot.source
|
103
|
+
|
104
|
+
"#{receiver}#{dot}type?(:#{types.join(', :')})"
|
105
|
+
end
|
106
|
+
|
107
|
+
def types(node)
|
108
|
+
[types_in_branch(node.lhs), types_in_branch(node.rhs)]
|
109
|
+
end
|
110
|
+
|
111
|
+
def types_in_branch(branch)
|
112
|
+
branch = branch.children.first if branch.method?(:!)
|
113
|
+
|
114
|
+
if branch.method?(:type?)
|
115
|
+
branch.arguments.map(&:value)
|
116
|
+
elsif branch.method?(:defined_type?)
|
117
|
+
# `node.defined_type?` relates to `node.type == :defined?`
|
118
|
+
'defined?'
|
119
|
+
else
|
120
|
+
branch.method_name.to_s.delete_suffix('_type?')
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Checks for cops that define `on_send` without define `on_csend`.
|
7
|
+
#
|
8
|
+
# Although in some cases it can be predetermined that safe navigation
|
9
|
+
# will never be used with the code checked by a specific cop, in general
|
10
|
+
# it is good practice to handle safe navigation methods if handling any
|
11
|
+
# `send` node.
|
12
|
+
#
|
13
|
+
# NOTE: It is expected to disable this cop for cops that check for method calls
|
14
|
+
# on receivers that cannot be nil (`self`, a literal, a constant), and
|
15
|
+
# method calls that will never have a receiver (ruby keywords like `raise`,
|
16
|
+
# macros like `attr_reader`, DSL methods, etc.), and other checks that wouldn't
|
17
|
+
# make sense to support safe navigation.
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
# # bad
|
21
|
+
# class MyCop < RuboCop::Cop:Base
|
22
|
+
# def on_send(node)
|
23
|
+
# # ...
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# # good - explicit method definition
|
28
|
+
# class MyCop < RuboCop::Cop:Base
|
29
|
+
# def on_send(node)
|
30
|
+
# # ...
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# def on_csend(node)
|
34
|
+
# # ...
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# # good - alias
|
39
|
+
# class MyCop < RuboCop::Cop:Base
|
40
|
+
# def on_send(node)
|
41
|
+
# # ...
|
42
|
+
# end
|
43
|
+
# alias on_csend on_send
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# # good - alias_method
|
47
|
+
# class MyCop < RuboCop::Cop:Base
|
48
|
+
# def on_send(node)
|
49
|
+
# # ...
|
50
|
+
# end
|
51
|
+
# alias_method :on_csend, :on_send
|
52
|
+
# end
|
53
|
+
class OnSendWithoutOnCSend < Base
|
54
|
+
RESTRICT_ON_SEND = %i[alias_method].freeze
|
55
|
+
MSG = 'Cop defines `on_send` but not `on_csend`.'
|
56
|
+
|
57
|
+
def on_new_investigation
|
58
|
+
@on_send_definition = nil
|
59
|
+
@on_csend_definition = nil
|
60
|
+
end
|
61
|
+
|
62
|
+
def on_investigation_end
|
63
|
+
return unless @on_send_definition && !@on_csend_definition
|
64
|
+
|
65
|
+
add_offense(@on_send_definition)
|
66
|
+
end
|
67
|
+
|
68
|
+
def on_def(node)
|
69
|
+
@on_send_definition = node if node.method?(:on_send)
|
70
|
+
@on_csend_definition = node if node.method?(:on_csend)
|
71
|
+
end
|
72
|
+
|
73
|
+
def on_alias(node)
|
74
|
+
@on_send_definition = node if node.new_identifier.value == :on_send
|
75
|
+
@on_csend_definition = node if node.new_identifier.value == :on_csend
|
76
|
+
end
|
77
|
+
|
78
|
+
def on_send(node) # rubocop:disable InternalAffairs/OnSendWithoutOnCSend
|
79
|
+
new_identifier = node.first_argument
|
80
|
+
return unless new_identifier.basic_literal?
|
81
|
+
|
82
|
+
new_identifier = new_identifier.value
|
83
|
+
|
84
|
+
@on_send_definition = node if new_identifier == :on_send
|
85
|
+
@on_csend_definition = node if new_identifier == :on_csend
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -47,7 +47,7 @@ module RuboCop
|
|
47
47
|
# @!method redundant_source_range(node)
|
48
48
|
def_node_matcher :redundant_source_range, <<~PATTERN
|
49
49
|
{
|
50
|
-
(
|
50
|
+
(call $(call _ :source_range) :source)
|
51
51
|
(send nil? :add_offense $(send _ :source_range) ...)
|
52
52
|
(send _ {
|
53
53
|
:replace :insert_before :insert_before_multi :insert_after :insert_after_multi
|
@@ -59,6 +59,7 @@ module RuboCop
|
|
59
59
|
|
60
60
|
def on_send(node)
|
61
61
|
return unless (source_range = redundant_source_range(node))
|
62
|
+
return unless source_range.receiver
|
62
63
|
return if source_range.receiver.send_type? && source_range.receiver.method?(:buffer)
|
63
64
|
|
64
65
|
selector = source_range.loc.selector
|
@@ -67,6 +68,7 @@ module RuboCop
|
|
67
68
|
corrector.remove(source_range.loc.dot.join(selector))
|
68
69
|
end
|
69
70
|
end
|
71
|
+
alias on_csend on_send
|
70
72
|
end
|
71
73
|
end
|
72
74
|
end
|
@@ -34,8 +34,8 @@ module RuboCop
|
|
34
34
|
# @!method single_line_comparison(node)
|
35
35
|
def_node_matcher :single_line_comparison, <<~PATTERN
|
36
36
|
{
|
37
|
-
(send (
|
38
|
-
(send (
|
37
|
+
(send (call $_receiver {:line :first_line}) {:== :!=} (call _receiver :last_line))
|
38
|
+
(send (call $_receiver :last_line) {:== :!=} (call _receiver {:line :first_line}))
|
39
39
|
}
|
40
40
|
PATTERN
|
41
41
|
|
@@ -43,7 +43,8 @@ module RuboCop
|
|
43
43
|
return unless (receiver = single_line_comparison(node))
|
44
44
|
|
45
45
|
bang = node.method?(:!=) ? '!' : ''
|
46
|
-
|
46
|
+
dot = receiver.parent.loc.dot.source
|
47
|
+
preferred = "#{bang}#{extract_receiver(receiver)}#{dot}single_line?"
|
47
48
|
|
48
49
|
add_offense(node, message: format(MSG, preferred: preferred)) do |corrector|
|
49
50
|
corrector.replace(node, preferred)
|
@@ -53,7 +54,7 @@ module RuboCop
|
|
53
54
|
private
|
54
55
|
|
55
56
|
def extract_receiver(node)
|
56
|
-
node = node.receiver if node.
|
57
|
+
node = node.receiver if node.call_type? && %i[loc source_range].include?(node.method_name)
|
57
58
|
node.source
|
58
59
|
end
|
59
60
|
end
|
@@ -15,9 +15,12 @@ require_relative 'internal_affairs/method_name_equal'
|
|
15
15
|
require_relative 'internal_affairs/node_destructuring'
|
16
16
|
require_relative 'internal_affairs/node_first_or_last_argument'
|
17
17
|
require_relative 'internal_affairs/node_matcher_directive'
|
18
|
+
require_relative 'internal_affairs/node_pattern_groups'
|
19
|
+
require_relative 'internal_affairs/node_type_multiple_predicates'
|
18
20
|
require_relative 'internal_affairs/node_type_predicate'
|
19
21
|
require_relative 'internal_affairs/numblock_handler'
|
20
22
|
require_relative 'internal_affairs/offense_location_keyword'
|
23
|
+
require_relative 'internal_affairs/on_send_without_on_csend'
|
21
24
|
require_relative 'internal_affairs/operator_keyword'
|
22
25
|
require_relative 'internal_affairs/processed_source_buffer_name'
|
23
26
|
require_relative 'internal_affairs/redundant_context_config_parameter'
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
6
|
# Bare access modifiers (those not applying to specific methods) should be
|
7
|
-
# indented as deep as method definitions, or as deep as the class
|
7
|
+
# indented as deep as method definitions, or as deep as the `class`/`module`
|
8
8
|
# keyword, depending on configuration.
|
9
9
|
#
|
10
10
|
# @example EnforcedStyle: indent (default)
|
@@ -188,7 +188,7 @@ module RuboCop
|
|
188
188
|
# In offense message, we want to show the assignment LHS rather than
|
189
189
|
# the entire assignment.
|
190
190
|
def find_lhs_node(node)
|
191
|
-
node = node.lhs while node.
|
191
|
+
node = node.lhs while node.type?(:op_asgn, :masgn)
|
192
192
|
node
|
193
193
|
end
|
194
194
|
|
@@ -3,23 +3,23 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks if the code style follows the ExpectedOrder configuration:
|
6
|
+
# Checks if the code style follows the `ExpectedOrder` configuration:
|
7
7
|
#
|
8
8
|
# `Categories` allows us to map macro names into a category.
|
9
9
|
#
|
10
10
|
# Consider an example of code style that covers the following order:
|
11
11
|
#
|
12
|
-
# * Module inclusion (include
|
12
|
+
# * Module inclusion (`include`, `prepend`, `extend`)
|
13
13
|
# * Constants
|
14
|
-
# * Associations (has_one
|
15
|
-
# * Public attribute macros (attr_accessor
|
16
|
-
# * Other macros (validates
|
14
|
+
# * Associations (`has_one`, `has_many`)
|
15
|
+
# * Public attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
16
|
+
# * Other macros (`validates`, `validate`)
|
17
17
|
# * Public class methods
|
18
18
|
# * Initializer
|
19
19
|
# * Public instance methods
|
20
|
-
# * Protected attribute macros (attr_accessor
|
20
|
+
# * Protected attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
21
21
|
# * Protected instance methods
|
22
|
-
# * Private attribute macros (attr_accessor
|
22
|
+
# * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
23
23
|
# * Private instance methods
|
24
24
|
#
|
25
25
|
# You can configure the following order:
|
@@ -236,7 +236,7 @@ module RuboCop
|
|
236
236
|
|
237
237
|
return [] unless class_def
|
238
238
|
|
239
|
-
if class_def.
|
239
|
+
if class_def.type?(:def, :send)
|
240
240
|
[class_def]
|
241
241
|
else
|
242
242
|
class_def.children.compact
|
@@ -289,7 +289,7 @@ module RuboCop
|
|
289
289
|
def marked_as_private_constant?(node, name)
|
290
290
|
return false unless node.method?(:private_constant)
|
291
291
|
|
292
|
-
node.arguments.any? { |arg|
|
292
|
+
node.arguments.any? { |arg| arg.type?(:sym, :str) && arg.value == name }
|
293
293
|
end
|
294
294
|
|
295
295
|
def end_position_for(node)
|
@@ -92,7 +92,7 @@ module RuboCop
|
|
92
92
|
case parent.type
|
93
93
|
when :def, :defs then base_for_method_definition(parent)
|
94
94
|
when :kwbegin then parent.loc.begin
|
95
|
-
when :block
|
95
|
+
when :block, :numblock
|
96
96
|
assignment_node = assignment_node(parent)
|
97
97
|
if same_line?(parent, assignment_node)
|
98
98
|
assignment_node.source_range
|
@@ -22,8 +22,6 @@ module RuboCop
|
|
22
22
|
# def b
|
23
23
|
# end
|
24
24
|
#
|
25
|
-
# @example
|
26
|
-
#
|
27
25
|
# # good
|
28
26
|
# def a
|
29
27
|
# end
|
@@ -42,8 +40,6 @@ module RuboCop
|
|
42
40
|
# def b
|
43
41
|
# end
|
44
42
|
#
|
45
|
-
# @example
|
46
|
-
#
|
47
43
|
# # good
|
48
44
|
# class A
|
49
45
|
# end
|
@@ -65,8 +61,6 @@ module RuboCop
|
|
65
61
|
# def b
|
66
62
|
# end
|
67
63
|
#
|
68
|
-
# @example
|
69
|
-
#
|
70
64
|
# # good
|
71
65
|
# module A
|
72
66
|
# end
|
@@ -162,7 +156,7 @@ module RuboCop
|
|
162
156
|
private
|
163
157
|
|
164
158
|
def def_location(correction_node)
|
165
|
-
if correction_node.
|
159
|
+
if correction_node.any_block_type?
|
166
160
|
correction_node.source_range.join(correction_node.children.first.source_range)
|
167
161
|
else
|
168
162
|
correction_node.loc.keyword.join(correction_node.loc.name)
|
@@ -181,12 +175,12 @@ module RuboCop
|
|
181
175
|
end
|
182
176
|
|
183
177
|
def macro_candidate?(node)
|
184
|
-
node.
|
178
|
+
node.any_block_type? && node.children.first.macro? &&
|
185
179
|
empty_line_between_macros.include?(node.children.first.method_name)
|
186
180
|
end
|
187
181
|
|
188
182
|
def method_candidate?(node)
|
189
|
-
cop_config['EmptyLineBetweenMethodDefs'] &&
|
183
|
+
cop_config['EmptyLineBetweenMethodDefs'] && node.type?(:def, :defs)
|
190
184
|
end
|
191
185
|
|
192
186
|
def class_candidate?(node)
|
@@ -246,7 +240,7 @@ module RuboCop
|
|
246
240
|
end
|
247
241
|
|
248
242
|
def def_start(node)
|
249
|
-
if node.
|
243
|
+
if node.any_block_type? && node.children.first.send_type?
|
250
244
|
node.source_range.line
|
251
245
|
else
|
252
246
|
node.loc.keyword.line
|
@@ -258,7 +252,7 @@ module RuboCop
|
|
258
252
|
end
|
259
253
|
|
260
254
|
def end_loc(node)
|
261
|
-
if
|
255
|
+
if node.type?(:def, :defs) && node.endless?
|
262
256
|
node.source_range.end
|
263
257
|
else
|
264
258
|
node.loc.end
|
@@ -283,6 +277,8 @@ module RuboCop
|
|
283
277
|
case node.type
|
284
278
|
when :def, :defs
|
285
279
|
:method
|
280
|
+
when :numblock
|
281
|
+
:block
|
286
282
|
else
|
287
283
|
node.type
|
288
284
|
end
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
# Checks if empty lines exist around the bodies of `begin`
|
7
7
|
# sections. This cop doesn't check empty lines at `begin` body
|
8
8
|
# beginning/end and around method definition body.
|
9
|
-
# `
|
9
|
+
# `Layout/EmptyLinesAroundBeginBody` or `Layout/EmptyLinesAroundMethodBody`
|
10
10
|
# can be used for this purpose.
|
11
11
|
#
|
12
12
|
# @example
|
@@ -182,7 +182,7 @@ module RuboCop
|
|
182
182
|
end
|
183
183
|
|
184
184
|
def alignment_node_for_variable_style(node)
|
185
|
-
if
|
185
|
+
if node.type?(:case, :case_match) && node.argument? &&
|
186
186
|
same_line?(node, node.parent)
|
187
187
|
return node.parent
|
188
188
|
end
|
@@ -225,7 +225,7 @@ module RuboCop
|
|
225
225
|
|
226
226
|
def base_range(send_node, arg_node)
|
227
227
|
parent = send_node.parent
|
228
|
-
start_node = if parent
|
228
|
+
start_node = if parent&.type?(:splat, :kwsplat)
|
229
229
|
send_node.parent
|
230
230
|
else
|
231
231
|
send_node
|
@@ -7,7 +7,7 @@ module RuboCop
|
|
7
7
|
# where the opening brace and the first key are on separate lines. The
|
8
8
|
# other keys' indentations are handled by the HashAlignment cop.
|
9
9
|
#
|
10
|
-
# By default, Hash literals that are arguments in a method call with
|
10
|
+
# By default, `Hash` literals that are arguments in a method call with
|
11
11
|
# parentheses, and where the opening curly brace of the hash is on the
|
12
12
|
# same line as the opening parenthesis of the method call, shall have
|
13
13
|
# their first key indented one step (two spaces) more than the position
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
|
52
52
|
def on_hash(node)
|
53
53
|
# node.loc.begin tells us whether the hash opens with a {
|
54
|
-
# If it doesn't,
|
54
|
+
# If it doesn't, Layout/FirstMethodArgumentLineBreak will handle it
|
55
55
|
return unless node.loc.begin
|
56
56
|
|
57
57
|
check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
|
@@ -5,10 +5,10 @@ module RuboCop
|
|
5
5
|
module Layout
|
6
6
|
# Checks the indentation of the first parameter in a method
|
7
7
|
# definition. Parameters after the first one are checked by
|
8
|
-
# Layout/ParameterAlignment
|
8
|
+
# `Layout/ParameterAlignment`, not by this cop.
|
9
9
|
#
|
10
10
|
# For indenting the first argument of method _calls_, check out
|
11
|
-
# Layout/FirstArgumentIndentation
|
11
|
+
# `Layout/FirstArgumentIndentation`, which supports options related to
|
12
12
|
# nesting that are irrelevant for method _definitions_.
|
13
13
|
#
|
14
14
|
# @example
|
@@ -102,7 +102,7 @@ module RuboCop
|
|
102
102
|
|
103
103
|
def strings_concatenated_with_backslash?(dstr_node)
|
104
104
|
dstr_node.multiline? &&
|
105
|
-
dstr_node.children.all? { |c| c.
|
105
|
+
dstr_node.children.all? { |c| c.type?(:str, :dstr) } &&
|
106
106
|
dstr_node.children.none?(&:multiline?)
|
107
107
|
end
|
108
108
|
|
@@ -52,7 +52,7 @@ module RuboCop
|
|
52
52
|
def on_hash(node)
|
53
53
|
# This cop only deals with hashes wrapped by a set of curly
|
54
54
|
# braces like {foo: 1}. That is, not a kwargs hashes.
|
55
|
-
#
|
55
|
+
# Layout/MultilineMethodArgumentLineBreaks handles those.
|
56
56
|
return unless starts_with_curly_brace?(node)
|
57
57
|
return unless node.loc.begin
|
58
58
|
|
@@ -100,7 +100,7 @@ module RuboCop
|
|
100
100
|
|
101
101
|
def extra_indentation(given_style, parent)
|
102
102
|
if given_style == :indented_relative_to_receiver
|
103
|
-
if parent
|
103
|
+
if parent&.type?(:splat, :kwsplat)
|
104
104
|
configured_indentation_width - parent.loc.operator.length
|
105
105
|
else
|
106
106
|
configured_indentation_width
|
@@ -224,7 +224,7 @@ module RuboCop
|
|
224
224
|
end
|
225
225
|
|
226
226
|
def find_multiline_block_chain_node(node)
|
227
|
-
return unless (block_node = node.each_descendant(:
|
227
|
+
return unless (block_node = node.each_descendant(:any_block).first)
|
228
228
|
return unless block_node.multiline? && block_node.parent.call_type?
|
229
229
|
|
230
230
|
if node.receiver.call_type?
|
@@ -103,13 +103,13 @@ module RuboCop
|
|
103
103
|
|
104
104
|
def configured_to_not_be_inspected?(node)
|
105
105
|
return true if other_cop_takes_precedence?(node)
|
106
|
+
return false if cop_config['InspectBlocks']
|
106
107
|
|
107
|
-
|
108
|
-
any_descendant?(node, :block, &:multiline?))
|
108
|
+
node.any_block_type? || any_descendant?(node, :any_block, &:multiline?)
|
109
109
|
end
|
110
110
|
|
111
111
|
def other_cop_takes_precedence?(node)
|
112
|
-
single_line_block_chain_enabled? && any_descendant?(node, :
|
112
|
+
single_line_block_chain_enabled? && any_descendant?(node, :any_block) do |block_node|
|
113
113
|
block_node.parent.send_type? && block_node.parent.loc.dot && !block_node.multiline?
|
114
114
|
end
|
115
115
|
end
|
@@ -119,8 +119,9 @@ module RuboCop
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def convertible_block?(node)
|
122
|
-
parent = node.parent
|
123
|
-
|
122
|
+
return false unless (parent = node.parent)
|
123
|
+
|
124
|
+
parent.any_block_type? && node == parent.send_node &&
|
124
125
|
(node.parenthesized? || !node.arguments?)
|
125
126
|
end
|
126
127
|
end
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
MSG = '`%<kw_loc>s` at %<kw_loc_line>d, %<kw_loc_column>d is not ' \
|
30
30
|
'aligned with `%<beginning>s` at ' \
|
31
31
|
'%<begin_loc_line>d, %<begin_loc_column>d.'
|
32
|
-
ANCESTOR_TYPES = %i[kwbegin def defs class module
|
32
|
+
ANCESTOR_TYPES = %i[kwbegin def defs class module any_block].freeze
|
33
33
|
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS = %i[def defs].freeze
|
34
34
|
ALTERNATIVE_ACCESS_MODIFIERS = %i[public_class_method private_class_method].freeze
|
35
35
|
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
|
40
40
|
def offending_range(node)
|
41
41
|
receiver = node.receiver
|
42
|
-
return unless receiver&.
|
42
|
+
return unless receiver&.any_block_type?
|
43
43
|
|
44
44
|
receiver_location = receiver.loc
|
45
45
|
closing_block_delimiter_line_num = receiver_location.end.line
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks for colon (
|
6
|
+
# Checks for colon (`:`) not followed by some kind of space.
|
7
7
|
# N.B. this cop does not handle spaces after a ternary operator, which are
|
8
|
-
# instead handled by Layout/SpaceAroundOperators
|
8
|
+
# instead handled by `Layout/SpaceAroundOperators`.
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
# # bad
|