rbhint 0.85.1.rc2 → 0.87.1.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -1
  3. data/bin/rubocop-profile +16 -0
  4. data/config/default.yml +118 -10
  5. data/lib/rbhint/version.rb +1 -1
  6. data/lib/rubocop.rb +15 -1
  7. data/lib/rubocop/cli.rb +0 -2
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +40 -5
  9. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  10. data/lib/rubocop/cli/command/show_cops.rb +1 -1
  11. data/lib/rubocop/config_loader.rb +24 -66
  12. data/lib/rubocop/config_obsoletion.rb +0 -1
  13. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  14. data/lib/rubocop/cop/badge.rb +1 -1
  15. data/lib/rubocop/cop/base.rb +407 -0
  16. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  17. data/lib/rubocop/cop/commissioner.rb +48 -50
  18. data/lib/rubocop/cop/cop.rb +85 -236
  19. data/lib/rubocop/cop/corrector.rb +38 -115
  20. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  21. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +6 -1
  22. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  23. data/lib/rubocop/cop/generator.rb +1 -1
  24. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  25. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  26. data/lib/rubocop/cop/layout/class_structure.rb +2 -37
  27. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  28. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -8
  29. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  30. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -0
  31. data/lib/rubocop/cop/layout/hash_alignment.rb +1 -2
  32. data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
  33. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  34. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +27 -68
  35. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  36. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  37. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  38. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -4
  39. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  40. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
  41. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +3 -2
  42. data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
  43. data/lib/rubocop/cop/lint/literal_as_condition.rb +11 -1
  44. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  45. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  46. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -3
  47. data/lib/rubocop/cop/lint/raise_exception.rb +8 -0
  48. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  49. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -23
  50. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
  51. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
  52. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +8 -0
  53. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  54. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
  55. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
  56. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  57. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  58. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  59. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  60. data/lib/rubocop/cop/metrics/method_length.rb +24 -1
  61. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  62. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  63. data/lib/rubocop/cop/metrics/perceived_complexity.rb +3 -3
  64. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  65. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  66. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  67. data/lib/rubocop/cop/mixin/code_length.rb +4 -0
  68. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  69. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  70. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  71. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  72. data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
  73. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -2
  74. data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
  75. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +4 -2
  76. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  77. data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
  78. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  79. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  80. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  81. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  82. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  83. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  84. data/lib/rubocop/cop/offense.rb +16 -2
  85. data/lib/rubocop/cop/style/accessor_grouping.rb +147 -0
  86. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  87. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -2
  88. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +146 -0
  89. data/lib/rubocop/cop/style/case_like_if.rb +217 -0
  90. data/lib/rubocop/cop/style/class_vars.rb +21 -0
  91. data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
  92. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
  93. data/lib/rubocop/cop/style/date_time.rb +1 -1
  94. data/lib/rubocop/cop/style/dir.rb +2 -2
  95. data/lib/rubocop/cop/style/empty_literal.rb +5 -5
  96. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
  97. data/lib/rubocop/cop/style/exponential_notation.rb +6 -8
  98. data/lib/rubocop/cop/style/float_division.rb +7 -10
  99. data/lib/rubocop/cop/style/format_string_token.rb +5 -5
  100. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +62 -0
  101. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  102. data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -11
  103. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
  104. data/lib/rubocop/cop/style/missing_else.rb +1 -11
  105. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  106. data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
  107. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
  108. data/lib/rubocop/cop/style/numeric_predicate.rb +3 -4
  109. data/lib/rubocop/cop/style/parallel_assignment.rb +3 -3
  110. data/lib/rubocop/cop/style/proc.rb +1 -1
  111. data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
  112. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  113. data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
  114. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  115. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  116. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  117. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -1
  118. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -1
  119. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -2
  120. data/lib/rubocop/cop/style/redundant_sort.rb +3 -2
  121. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  122. data/lib/rubocop/cop/style/signal_exception.rb +1 -1
  123. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  124. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  125. data/lib/rubocop/cop/style/struct_inheritance.rb +2 -2
  126. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  127. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  128. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  129. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  130. data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
  131. data/lib/rubocop/cop/team.rb +97 -81
  132. data/lib/rubocop/cop/utils/format_string.rb +1 -2
  133. data/lib/rubocop/cop/variable_force/variable.rb +5 -3
  134. data/lib/rubocop/file_finder.rb +4 -4
  135. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  136. data/lib/rubocop/name_similarity.rb +1 -3
  137. data/lib/rubocop/options.rb +15 -8
  138. data/lib/rubocop/path_util.rb +2 -17
  139. data/lib/rubocop/rake_task.rb +6 -9
  140. data/lib/rubocop/result_cache.rb +9 -5
  141. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  142. data/lib/rubocop/rspec/expect_offense.rb +52 -22
  143. data/lib/rubocop/rspec/shared_contexts.rb +8 -8
  144. data/lib/rubocop/runner.rb +33 -32
  145. data/lib/rubocop/target_ruby.rb +1 -1
  146. data/lib/rubocop/version.rb +1 -1
  147. metadata +25 -8
  148. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
@@ -50,7 +50,7 @@ module RuboCop
50
50
  PATTERN
51
51
 
52
52
  def_node_matcher :historic_date?, <<~PATTERN
53
- (send _ _ _ (const (const nil? :Date) _))
53
+ (send _ _ _ (const (const {nil? (cbase)} :Date) _))
54
54
  PATTERN
55
55
 
56
56
  def_node_matcher :to_datetime?, <<~PATTERN
@@ -21,8 +21,8 @@ module RuboCop
21
21
  "file's directory."
22
22
 
23
23
  def_node_matcher :dir_replacement?, <<~PATTERN
24
- {(send (const nil? :File) :expand_path (send (const nil? :File) :dirname #file_keyword?))
25
- (send (const nil? :File) :dirname (send (const nil? :File) :realpath #file_keyword?))}
24
+ {(send (const {nil? cbase} :File) :expand_path (send (const {nil? cbase} :File) :dirname #file_keyword?))
25
+ (send (const {nil? cbase} :File) :dirname (send (const {nil? cbase} :File) :realpath #file_keyword?))}
26
26
  PATTERN
27
27
 
28
28
  def on_send(node)
@@ -25,13 +25,13 @@ module RuboCop
25
25
  STR_MSG = 'Use string literal `%<prefer>s` instead of ' \
26
26
  '`String.new`.'
27
27
 
28
- def_node_matcher :array_node, '(send (const nil? :Array) :new)'
29
- def_node_matcher :hash_node, '(send (const nil? :Hash) :new)'
30
- def_node_matcher :str_node, '(send (const nil? :String) :new)'
28
+ def_node_matcher :array_node, '(send (const {nil? cbase} :Array) :new)'
29
+ def_node_matcher :hash_node, '(send (const {nil? cbase} :Hash) :new)'
30
+ def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
31
31
  def_node_matcher :array_with_block,
32
- '(block (send (const nil? :Array) :new) args _)'
32
+ '(block (send (const {nil? cbase} :Array) :new) args _)'
33
33
  def_node_matcher :hash_with_block,
34
- '(block (send (const nil? :Hash) :new) args _)'
34
+ '(block (send (const {nil? cbase} :Hash) :new) args _)'
35
35
 
36
36
  def on_send(node)
37
37
  add_offense(node, message: ARR_MSG) if offense_array_node?(node)
@@ -53,7 +53,7 @@ module RuboCop
53
53
 
54
54
  def_node_matcher :file_expand_path, <<~PATTERN
55
55
  (send
56
- (const nil? :File) :expand_path
56
+ (const {nil? cbase} :File) :expand_path
57
57
  $_
58
58
  $_)
59
59
  PATTERN
@@ -69,7 +69,7 @@ module RuboCop
69
69
  (send
70
70
  (send
71
71
  (send
72
- (const nil? :Pathname) :new
72
+ (const {nil? cbase} :Pathname) :new
73
73
  $_) :parent) :expand_path)
74
74
  PATTERN
75
75
 
@@ -60,6 +60,11 @@ module RuboCop
60
60
  #
61
61
  class ExponentialNotation < Cop
62
62
  include ConfigurableEnforcedStyle
63
+ MESSAGES = {
64
+ scientific: 'Use a mantissa in [1, 10[.',
65
+ engineering: 'Use an exponent divisible by 3 and a mantissa in [0.1, 1000[.',
66
+ integral: 'Use an integer as mantissa, without trailing zero.'
67
+ }.freeze
63
68
 
64
69
  def on_float(node)
65
70
  add_offense(node) if offense?(node)
@@ -104,14 +109,7 @@ module RuboCop
104
109
  end
105
110
 
106
111
  def message(_node)
107
- case style
108
- when :scientific
109
- 'Use a mantissa in [1, 10[.'
110
- when :engineering
111
- 'Use an exponent divisible by 3 and a mantissa in [0.1, 1000[.'
112
- when :integral
113
- 'Use an integer as mantissa, without trailing zero.'
114
- end
112
+ MESSAGES[style]
115
113
  end
116
114
  end
117
115
  end
@@ -41,6 +41,12 @@ module RuboCop
41
41
  # a.fdiv(b)
42
42
  class FloatDivision < Cop
43
43
  include ConfigurableEnforcedStyle
44
+ MESSAGES = {
45
+ left_coerce: 'Prefer using `.to_f` on the left side.',
46
+ right_coerce: 'Prefer using `.to_f` on the right side.',
47
+ single_coerce: 'Prefer using `.to_f` on one side only.',
48
+ fdiv: 'Prefer using `fdiv` for float divisions.'
49
+ }.freeze
44
50
 
45
51
  def_node_matcher :right_coerce?, <<~PATTERN
46
52
  (send _ :/ (send _ :to_f))
@@ -77,16 +83,7 @@ module RuboCop
77
83
  end
78
84
 
79
85
  def message(_node)
80
- case style
81
- when :left_coerce
82
- 'Prefer using `.to_f` on the left side.'
83
- when :right_coerce
84
- 'Prefer using `.to_f` on the right side.'
85
- when :single_coerce
86
- 'Prefer using `.to_f` on one side only.'
87
- when :fdiv
88
- 'Prefer using `fdiv` for float divisions.'
89
- end
86
+ MESSAGES[style]
90
87
  end
91
88
  end
92
89
  end
@@ -75,11 +75,11 @@ module RuboCop
75
75
 
76
76
  # rubocop:disable Style/FormatStringToken
77
77
  def message_text(style)
78
- case style
79
- when :annotated then 'annotated tokens (like `%<foo>s`)'
80
- when :template then 'template tokens (like `%{foo}`)'
81
- when :unannotated then 'unannotated tokens (like `%s`)'
82
- end
78
+ {
79
+ annotated: 'annotated tokens (like `%<foo>s`)',
80
+ template: 'template tokens (like `%{foo}`)',
81
+ unannotated: 'unannotated tokens (like `%s`)'
82
+ }[style]
83
83
  end
84
84
  # rubocop:enable Style/FormatStringToken
85
85
 
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for presence or absence of braces around hash literal as a last
7
+ # array item depending on configuration.
8
+ #
9
+ # @example EnforcedStyle: braces (default)
10
+ # # bad
11
+ # [1, 2, one: 1, two: 2]
12
+ #
13
+ # # good
14
+ # [1, 2, { one: 1, two: 2 }]
15
+ #
16
+ # @example EnforcedStyle: no_braces
17
+ # # bad
18
+ # [1, 2, { one: 1, two: 2 }]
19
+ #
20
+ # # good
21
+ # [1, 2, one: 1, two: 2]
22
+ #
23
+ class HashAsLastArrayItem < Base
24
+ include ConfigurableEnforcedStyle
25
+ extend AutoCorrector
26
+
27
+ def on_hash(node)
28
+ return unless node.parent&.array_type?
29
+
30
+ if braces_style?
31
+ check_braces(node)
32
+ else
33
+ check_no_braces(node)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def check_braces(node)
40
+ return if node.braces?
41
+
42
+ add_offense(node, message: 'Wrap hash in `{` and `}`.') do |corrector|
43
+ corrector.wrap(node, '{', '}')
44
+ end
45
+ end
46
+
47
+ def check_no_braces(node)
48
+ return unless node.braces?
49
+
50
+ add_offense(node, message: 'Omit the braces around the hash.') do |corrector|
51
+ corrector.remove(node.loc.begin)
52
+ corrector.remove(node.loc.end)
53
+ end
54
+ end
55
+
56
+ def braces_style?
57
+ style == :braces
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where `case-when` represents a simple 1:1
7
+ # mapping and can be replaced with a hash lookup.
8
+ #
9
+ # @example MinBranchesCount: 3 (default)
10
+ # # bad
11
+ # case country
12
+ # when 'europe'
13
+ # 'http://eu.example.com'
14
+ # when 'america'
15
+ # 'http://us.example.com'
16
+ # when 'australia'
17
+ # 'http://au.example.com'
18
+ # end
19
+ #
20
+ # # good
21
+ # SITES = {
22
+ # 'europe' => 'http://eu.example.com',
23
+ # 'america' => 'http://us.example.com',
24
+ # 'australia' => 'http://au.example.com'
25
+ # }
26
+ # SITES[country]
27
+ #
28
+ # @example MinBranchesCount: 4
29
+ # # good
30
+ # case country
31
+ # when 'europe'
32
+ # 'http://eu.example.com'
33
+ # when 'america'
34
+ # 'http://us.example.com'
35
+ # when 'australia'
36
+ # 'http://au.example.com'
37
+ # end
38
+ #
39
+ class HashLikeCase < Base
40
+ MSG = 'Consider replacing `case-when` with a hash lookup.'
41
+
42
+ def_node_matcher :hash_like_case?, <<~PATTERN
43
+ (case
44
+ _
45
+ (when
46
+ ${str_type? sym_type?}
47
+ $[!nil? recursive_basic_literal?])+ nil?)
48
+ PATTERN
49
+
50
+ def on_case(node)
51
+ return if node.when_branches.size < min_branches_count
52
+
53
+ hash_like_case?(node) do |condition_nodes, body_nodes|
54
+ if nodes_of_same_type?(condition_nodes) &&
55
+ nodes_of_same_type?(body_nodes)
56
+ add_offense(node)
57
+ end
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ def nodes_of_same_type?(nodes)
64
+ nodes.all? { |node| node.type == nodes.first.type }
65
+ end
66
+
67
+ def min_branches_count
68
+ length = cop_config['MinBranchesCount'] || 3
69
+ return length if length.is_a?(Integer) && length.positive?
70
+
71
+ raise 'MinBranchesCount needs to be a positive integer!'
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -41,11 +41,8 @@ module RuboCop
41
41
  MSG_USE_NORMAL =
42
42
  'Modifier form of `%<keyword>s` makes the line too long.'
43
43
 
44
- ASSIGNMENT_TYPES = %i[lvasgn casgn cvasgn
45
- gvasgn ivasgn masgn].freeze
46
-
47
44
  def on_if(node)
48
- msg = if eligible_node?(node)
45
+ msg = if single_line_as_modifier?(node)
49
46
  MSG_USE_MODIFIER unless named_capture_in_condition?(node)
50
47
  elsif too_long_due_to_modifier?(node)
51
48
  MSG_USE_NORMAL
@@ -125,13 +122,15 @@ module RuboCop
125
122
  node.condition.match_with_lvasgn_type?
126
123
  end
127
124
 
128
- def eligible_node?(node)
129
- !non_eligible_if?(node) && !node.chained? &&
130
- !node.nested_conditional? && single_line_as_modifier?(node)
125
+ def non_eligible_node?(node)
126
+ non_simple_if_unless?(node) ||
127
+ node.chained? ||
128
+ node.nested_conditional? ||
129
+ super
131
130
  end
132
131
 
133
- def non_eligible_if?(node)
134
- node.ternary? || node.modifier_form? || node.elsif? || node.else?
132
+ def non_simple_if_unless?(node)
133
+ node.ternary? || node.elsif? || node.else?
135
134
  end
136
135
 
137
136
  def another_statement_on_same_line?(node)
@@ -153,8 +152,9 @@ module RuboCop
153
152
  # Parenthesize corrected expression if changing to modifier-if form
154
153
  # would change the meaning of the parent expression
155
154
  # (due to the low operator precedence of modifier-if)
156
- return false if node.parent.nil?
157
- return true if ASSIGNMENT_TYPES.include?(node.parent.type)
155
+ parent = node.parent
156
+ return false if parent.nil?
157
+ return true if parent.assignment? || parent.operator_keyword?
158
158
 
159
159
  node.parent.send_type? && !node.parent.parenthesized?
160
160
  end
@@ -33,6 +33,18 @@ module RuboCop
33
33
  add_offense(node, location: :keyword,
34
34
  message: format(MSG, keyword: node.keyword))
35
35
  end
36
+
37
+ def autocorrect(node)
38
+ lambda do |corrector|
39
+ keyword = node.if? ? 'if' : 'unless'
40
+
41
+ corrector.replace(node, <<~RUBY.chop)
42
+ #{keyword} #{node.condition.source}
43
+ #{node.if_branch.source}
44
+ end
45
+ RUBY
46
+ end
47
+ end
36
48
  end
37
49
  end
38
50
  end
@@ -119,17 +119,7 @@ module RuboCop
119
119
  private
120
120
 
121
121
  def check(node)
122
- return if node.else?
123
-
124
- if empty_else_cop_enabled?
125
- if empty_else_style == :empty
126
- add_offense(node)
127
- elsif empty_else_style == :nil
128
- add_offense(node)
129
- end
130
- end
131
-
132
- add_offense(node)
122
+ add_offense(node) unless node.else?
133
123
  end
134
124
 
135
125
  def message(node)
@@ -8,11 +8,20 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  #
11
- # Thread.list.find_all do |t|
11
+ # # bad
12
+ # Thread.list.select do |t|
12
13
  # t.alive?
13
14
  # end.map do |t|
14
15
  # t.object_id
15
16
  # end
17
+ #
18
+ # # good
19
+ # alive_threads = Thread.list.select do |t|
20
+ # t.alive?
21
+ # end
22
+ # alive_threads.map do |t|
23
+ # t.object_id
24
+ # end
16
25
  class MultilineBlockChain < Cop
17
26
  include RangeHelp
18
27
 
@@ -150,14 +150,14 @@ module RuboCop
150
150
  def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
151
151
  {
152
152
  (const _ _)
153
- (send (const nil? :Struct) :new ...)
154
- (block (send (const nil? :Struct) :new ...) ...)
153
+ (send (const {nil? cbase} :Struct) :new ...)
154
+ (block (send (const {nil? cbase} :Struct) :new ...) ...)
155
155
  (send _ :freeze)
156
156
  (send {float int} {:+ :- :* :** :/ :% :<<} _)
157
157
  (send _ {:+ :- :* :** :/ :%} {float int})
158
158
  (send _ {:== :=== :!= :<= :>= :< :>} _)
159
- (send (const nil? :ENV) :[] _)
160
- (or (send (const nil? :ENV) :[] _) _)
159
+ (send (const {nil? cbase} :ENV) :[] _)
160
+ (or (send (const {nil? cbase} :ENV) :[] _) _)
161
161
  (send _ {:count :length :size} ...)
162
162
  (block (send _ {:count :length :size} ...) ...)
163
163
  }
@@ -14,6 +14,7 @@ module RuboCop
14
14
  # method1(method2 arg)
15
15
  class NestedParenthesizedCalls < Cop
16
16
  include RangeHelp
17
+ include AllowedMethods
17
18
 
18
19
  MSG = 'Add parentheses to nested method call `%<source>s`.'
19
20
 
@@ -54,13 +55,9 @@ module RuboCop
54
55
 
55
56
  def allowed?(send_node)
56
57
  send_node.parent.arguments.one? &&
57
- allowed_methods.include?(send_node.method_name.to_s) &&
58
+ allowed_method?(send_node.method_name) &&
58
59
  send_node.arguments.one?
59
60
  end
60
-
61
- def allowed_methods
62
- cop_config['AllowedMethods'] || []
63
- end
64
61
  end
65
62
  end
66
63
  end
@@ -54,15 +54,14 @@ module RuboCop
54
54
  }.freeze
55
55
 
56
56
  def on_send(node)
57
+ numeric, replacement = check(node)
58
+ return unless numeric
59
+
57
60
  return if ignored_method?(node.method_name) ||
58
61
  node.each_ancestor(:send, :block).any? do |ancestor|
59
62
  ignored_method?(ancestor.method_name)
60
63
  end
61
64
 
62
- numeric, replacement = check(node)
63
-
64
- return unless numeric
65
-
66
65
  add_offense(node,
67
66
  message: format(MSG,
68
67
  prefer: replacement,