rubocop-rails 2.6.0 → 2.9.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 +16 -0
- data/config/default.yml +189 -6
- data/lib/rubocop/cop/mixin/active_record_helper.rb +12 -3
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +40 -0
- data/lib/rubocop/cop/mixin/index_method.rb +25 -11
- data/lib/rubocop/cop/rails/action_filter.rb +10 -14
- data/lib/rubocop/cop/rails/active_record_aliases.rb +13 -17
- data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +148 -0
- data/lib/rubocop/cop/rails/active_record_override.rb +1 -1
- data/lib/rubocop/cop/rails/active_support_aliases.rb +12 -21
- data/lib/rubocop/cop/rails/after_commit_override.rb +91 -0
- data/lib/rubocop/cop/rails/application_controller.rb +3 -7
- data/lib/rubocop/cop/rails/application_job.rb +2 -1
- data/lib/rubocop/cop/rails/application_mailer.rb +2 -7
- data/lib/rubocop/cop/rails/application_record.rb +2 -7
- data/lib/rubocop/cop/rails/arel_star.rb +41 -0
- data/lib/rubocop/cop/rails/assert_not.rb +8 -10
- data/lib/rubocop/cop/rails/attribute_default_block_value.rb +90 -0
- data/lib/rubocop/cop/rails/belongs_to.rb +9 -18
- data/lib/rubocop/cop/rails/blank.rb +27 -27
- data/lib/rubocop/cop/rails/bulk_change_table.rb +1 -1
- data/lib/rubocop/cop/rails/content_tag.rb +20 -33
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +2 -1
- data/lib/rubocop/cop/rails/date.rb +10 -11
- data/lib/rubocop/cop/rails/default_scope.rb +61 -0
- data/lib/rubocop/cop/rails/delegate.rb +10 -10
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +7 -8
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +13 -11
- data/lib/rubocop/cop/rails/enum_hash.rb +11 -10
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -1
- data/lib/rubocop/cop/rails/environment_comparison.rb +18 -14
- data/lib/rubocop/cop/rails/exit.rb +4 -10
- data/lib/rubocop/cop/rails/file_path.rb +5 -4
- data/lib/rubocop/cop/rails/find_by.rb +13 -13
- data/lib/rubocop/cop/rails/find_by_id.rb +94 -0
- data/lib/rubocop/cop/rails/find_each.rb +16 -14
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +3 -2
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +4 -7
- data/lib/rubocop/cop/rails/helper_instance_variable.rb +4 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +25 -21
- data/lib/rubocop/cop/rails/http_status.rb +7 -9
- data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +8 -6
- data/lib/rubocop/cop/rails/index_by.rb +11 -2
- data/lib/rubocop/cop/rails/index_with.rb +11 -2
- data/lib/rubocop/cop/rails/inquiry.rb +39 -0
- data/lib/rubocop/cop/rails/inverse_of.rb +3 -2
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +17 -15
- data/lib/rubocop/cop/rails/link_to_blank.rb +20 -20
- data/lib/rubocop/cop/rails/mailer_name.rb +86 -0
- data/lib/rubocop/cop/rails/match_route.rb +120 -0
- data/lib/rubocop/cop/rails/negate_include.rb +41 -0
- data/lib/rubocop/cop/rails/not_null_column.rb +2 -1
- data/lib/rubocop/cop/rails/order_by_id.rb +52 -0
- data/lib/rubocop/cop/rails/output.rb +5 -2
- data/lib/rubocop/cop/rails/output_safety.rb +3 -2
- data/lib/rubocop/cop/rails/pick.rb +21 -15
- data/lib/rubocop/cop/rails/pluck.rb +56 -0
- data/lib/rubocop/cop/rails/pluck_id.rb +56 -0
- data/lib/rubocop/cop/rails/pluck_in_where.rb +70 -0
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -14
- data/lib/rubocop/cop/rails/presence.rb +12 -13
- data/lib/rubocop/cop/rails/present.rb +30 -24
- data/lib/rubocop/cop/rails/rake_environment.rb +9 -11
- data/lib/rubocop/cop/rails/read_write_attribute.rb +12 -11
- data/lib/rubocop/cop/rails/redundant_allow_nil.rb +29 -31
- data/lib/rubocop/cop/rails/redundant_foreign_key.rb +9 -12
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +11 -10
- data/lib/rubocop/cop/rails/reflection_class_name.rb +4 -3
- data/lib/rubocop/cop/rails/refute_methods.rb +9 -10
- data/lib/rubocop/cop/rails/relative_date_constant.rb +20 -9
- data/lib/rubocop/cop/rails/render_inline.rb +41 -0
- data/lib/rubocop/cop/rails/render_plain_text.rb +71 -0
- data/lib/rubocop/cop/rails/request_referer.rb +7 -7
- data/lib/rubocop/cop/rails/reversible_migration.rb +82 -7
- data/lib/rubocop/cop/rails/safe_navigation.rb +12 -11
- data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +5 -10
- data/lib/rubocop/cop/rails/save_bang.rb +19 -22
- data/lib/rubocop/cop/rails/scope_args.rb +2 -1
- data/lib/rubocop/cop/rails/short_i18n.rb +74 -0
- data/lib/rubocop/cop/rails/skips_model_validations.rb +46 -11
- data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +82 -0
- data/lib/rubocop/cop/rails/time_zone.rb +22 -20
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +10 -10
- data/lib/rubocop/cop/rails/unique_validation_without_index.rb +18 -8
- data/lib/rubocop/cop/rails/unknown_env.rb +15 -4
- data/lib/rubocop/cop/rails/validation.rb +15 -14
- data/lib/rubocop/cop/rails/where_equals.rb +94 -0
- data/lib/rubocop/cop/rails/where_exists.rb +126 -0
- data/lib/rubocop/cop/rails/where_not.rb +97 -0
- data/lib/rubocop/cop/rails_cops.rb +22 -0
- data/lib/rubocop/rails/schema_loader.rb +4 -4
- data/lib/rubocop/rails/schema_loader/schema.rb +5 -5
- data/lib/rubocop/rails/version.rb +5 -1
- metadata +37 -9
@@ -29,8 +29,9 @@ module RuboCop
|
|
29
29
|
# after_filter :do_stuff
|
30
30
|
# append_around_filter :do_stuff
|
31
31
|
# skip_after_filter :do_stuff
|
32
|
-
class ActionFilter <
|
32
|
+
class ActionFilter < Base
|
33
33
|
include ConfigurableEnforcedStyle
|
34
|
+
extend AutoCorrector
|
34
35
|
|
35
36
|
MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
|
36
37
|
|
@@ -66,6 +67,8 @@ module RuboCop
|
|
66
67
|
skip_action_callback
|
67
68
|
].freeze
|
68
69
|
|
70
|
+
RESTRICT_ON_SEND = FILTER_METHODS + ACTION_METHODS
|
71
|
+
|
69
72
|
def on_block(node)
|
70
73
|
check_method_node(node.send_node)
|
71
74
|
end
|
@@ -74,24 +77,17 @@ module RuboCop
|
|
74
77
|
check_method_node(node) unless node.receiver
|
75
78
|
end
|
76
79
|
|
77
|
-
def autocorrect(node)
|
78
|
-
lambda do |corrector|
|
79
|
-
corrector.replace(node.loc.selector,
|
80
|
-
preferred_method(node.loc.selector.source).to_s)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
80
|
private
|
85
81
|
|
86
82
|
def check_method_node(node)
|
87
|
-
|
83
|
+
method_name = node.method_name
|
84
|
+
return unless bad_methods.include?(method_name)
|
88
85
|
|
89
|
-
|
90
|
-
end
|
86
|
+
message = format(MSG, prefer: preferred_method(method_name), current: method_name)
|
91
87
|
|
92
|
-
|
93
|
-
|
94
|
-
|
88
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
89
|
+
corrector.replace(node.loc.selector, preferred_method(node.loc.selector.source))
|
90
|
+
end
|
95
91
|
end
|
96
92
|
|
97
93
|
def bad_methods
|
@@ -12,7 +12,9 @@ module RuboCop
|
|
12
12
|
#
|
13
13
|
# #good
|
14
14
|
# Book.update!(author: 'Alice')
|
15
|
-
class ActiveRecordAliases <
|
15
|
+
class ActiveRecordAliases < Base
|
16
|
+
extend AutoCorrector
|
17
|
+
|
16
18
|
MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
|
17
19
|
|
18
20
|
ALIASES = {
|
@@ -20,28 +22,22 @@ module RuboCop
|
|
20
22
|
update_attributes!: :update!
|
21
23
|
}.freeze
|
22
24
|
|
25
|
+
RESTRICT_ON_SEND = ALIASES.keys.freeze
|
26
|
+
|
23
27
|
def on_send(node)
|
24
|
-
|
25
|
-
|
28
|
+
method_name = node.method_name
|
29
|
+
alias_method = ALIASES[method_name]
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
add_offense(
|
32
|
+
node.loc.selector,
|
33
|
+
message: format(MSG, prefer: alias_method, current: method_name),
|
34
|
+
severity: :warning
|
35
|
+
) do |corrector|
|
36
|
+
corrector.replace(node.loc.selector, alias_method)
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
35
40
|
alias on_csend on_send
|
36
|
-
|
37
|
-
def autocorrect(node)
|
38
|
-
lambda do |corrector|
|
39
|
-
corrector.replace(
|
40
|
-
node.loc.selector,
|
41
|
-
ALIASES[node.method_name].to_s
|
42
|
-
)
|
43
|
-
end
|
44
|
-
end
|
45
41
|
end
|
46
42
|
end
|
47
43
|
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Rails
|
6
|
+
# This cop checks that Active Record callbacks are declared
|
7
|
+
# in the order in which they will be executed.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# class Person < ApplicationRecord
|
12
|
+
# after_commit :after_commit_callback
|
13
|
+
# before_validation :before_validation_callback
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# class Person < ApplicationRecord
|
18
|
+
# before_validation :before_validation_callback
|
19
|
+
# after_commit :after_commit_callback
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
class ActiveRecordCallbacksOrder < Base
|
23
|
+
extend AutoCorrector
|
24
|
+
|
25
|
+
MSG = '`%<current>s` is supposed to appear before `%<previous>s`.'
|
26
|
+
|
27
|
+
CALLBACKS_IN_ORDER = %i[
|
28
|
+
after_initialize
|
29
|
+
before_validation
|
30
|
+
after_validation
|
31
|
+
before_save
|
32
|
+
around_save
|
33
|
+
before_create
|
34
|
+
around_create
|
35
|
+
after_create
|
36
|
+
before_update
|
37
|
+
around_update
|
38
|
+
after_update
|
39
|
+
before_destroy
|
40
|
+
around_destroy
|
41
|
+
after_destroy
|
42
|
+
after_save
|
43
|
+
after_commit
|
44
|
+
after_rollback
|
45
|
+
after_find
|
46
|
+
after_touch
|
47
|
+
].freeze
|
48
|
+
|
49
|
+
CALLBACKS_ORDER_MAP = CALLBACKS_IN_ORDER.each_with_index.to_h.freeze
|
50
|
+
|
51
|
+
def on_class(class_node)
|
52
|
+
previous_index = -1
|
53
|
+
previous_callback = nil
|
54
|
+
|
55
|
+
defined_callbacks(class_node).each do |node|
|
56
|
+
callback = node.method_name
|
57
|
+
index = CALLBACKS_ORDER_MAP[callback]
|
58
|
+
|
59
|
+
if index < previous_index
|
60
|
+
message = format(MSG, current: callback, previous: previous_callback)
|
61
|
+
add_offense(node, message: message) do |corrector|
|
62
|
+
autocorrect(corrector, node)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
previous_index = index
|
66
|
+
previous_callback = callback
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
# Autocorrect by swapping between two nodes autocorrecting them
|
73
|
+
def autocorrect(corrector, node)
|
74
|
+
previous = left_siblings_of(node).reverse_each.find do |sibling|
|
75
|
+
callback?(sibling)
|
76
|
+
end
|
77
|
+
|
78
|
+
current_range = source_range_with_comment(node)
|
79
|
+
previous_range = source_range_with_comment(previous)
|
80
|
+
|
81
|
+
corrector.insert_before(previous_range, current_range.source)
|
82
|
+
corrector.remove(current_range)
|
83
|
+
end
|
84
|
+
|
85
|
+
def defined_callbacks(class_node)
|
86
|
+
class_def = class_node.body
|
87
|
+
|
88
|
+
if class_def
|
89
|
+
class_def.each_child_node.select { |c| callback?(c) }
|
90
|
+
else
|
91
|
+
[]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def callback?(node)
|
96
|
+
node.send_type? && CALLBACKS_ORDER_MAP.key?(node.method_name)
|
97
|
+
end
|
98
|
+
|
99
|
+
def left_siblings_of(node)
|
100
|
+
siblings_of(node)[0, node.sibling_index]
|
101
|
+
end
|
102
|
+
|
103
|
+
def siblings_of(node)
|
104
|
+
node.parent.children
|
105
|
+
end
|
106
|
+
|
107
|
+
def source_range_with_comment(node)
|
108
|
+
begin_pos = begin_pos_with_comment(node)
|
109
|
+
end_pos = end_position_for(node)
|
110
|
+
|
111
|
+
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
112
|
+
end
|
113
|
+
|
114
|
+
def end_position_for(node)
|
115
|
+
end_line = buffer.line_for_position(node.loc.expression.end_pos)
|
116
|
+
buffer.line_range(end_line).end_pos
|
117
|
+
end
|
118
|
+
|
119
|
+
def begin_pos_with_comment(node)
|
120
|
+
annotation_line = node.first_line - 1
|
121
|
+
first_comment = nil
|
122
|
+
|
123
|
+
processed_source.comments_before_line(annotation_line)
|
124
|
+
.reverse_each do |comment|
|
125
|
+
if comment.location.line == annotation_line && !inline_comment?(comment)
|
126
|
+
first_comment = comment
|
127
|
+
annotation_line -= 1
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
start_line_position(first_comment || node)
|
132
|
+
end
|
133
|
+
|
134
|
+
def inline_comment?(comment)
|
135
|
+
!comment_line?(comment.loc.expression.source_line)
|
136
|
+
end
|
137
|
+
|
138
|
+
def start_line_position(node)
|
139
|
+
buffer.line_range(node.loc.line).begin_pos - 1
|
140
|
+
end
|
141
|
+
|
142
|
+
def buffer
|
143
|
+
processed_source.buffer
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -19,8 +19,11 @@ module RuboCop
|
|
19
19
|
# [1, 2, 'a'].append('b')
|
20
20
|
# [1, 2, 'a'].prepend('b')
|
21
21
|
#
|
22
|
-
class ActiveSupportAliases <
|
22
|
+
class ActiveSupportAliases < Base
|
23
|
+
extend AutoCorrector
|
24
|
+
|
23
25
|
MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
|
26
|
+
RESTRICT_ON_SEND = %i[starts_with? ends_with? append prepend].freeze
|
24
27
|
|
25
28
|
ALIASES = {
|
26
29
|
starts_with?: {
|
@@ -39,29 +42,17 @@ module RuboCop
|
|
39
42
|
|
40
43
|
def on_send(node)
|
41
44
|
ALIASES.each_key do |aliased_method|
|
42
|
-
|
43
|
-
public_send(aliased_method, node)
|
44
|
-
end
|
45
|
-
end
|
45
|
+
next unless public_send(aliased_method, node)
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
preferred_method = ALIASES[aliased_method][:original]
|
48
|
+
message = format(MSG, prefer: preferred_method, current: aliased_method)
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
replacement = ALIASES[method_name.to_sym][:original]
|
53
|
-
corrector.replace(node.loc.selector, replacement.to_s)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
50
|
+
add_offense(node, message: message) do |corrector|
|
51
|
+
next if append(node)
|
58
52
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
message: format(MSG, prefer: ALIASES[method_name][:original],
|
63
|
-
current: method_name)
|
64
|
-
)
|
53
|
+
corrector.replace(node.loc.selector, preferred_method)
|
54
|
+
end
|
55
|
+
end
|
65
56
|
end
|
66
57
|
end
|
67
58
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Rails
|
6
|
+
# This cop enforces that there is only one call to `after_commit`
|
7
|
+
# (and its aliases - `after_create_commit`, `after_update_commit`,
|
8
|
+
# and `after_destroy_commit`) with the same callback name per model.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# # bad
|
12
|
+
# # This won't be triggered.
|
13
|
+
# after_create_commit :log_action
|
14
|
+
#
|
15
|
+
# # This will override the callback added by
|
16
|
+
# # after_create_commit.
|
17
|
+
# after_update_commit :log_action
|
18
|
+
#
|
19
|
+
# # bad
|
20
|
+
# # This won't be triggered.
|
21
|
+
# after_commit :log_action, on: :create
|
22
|
+
# # This won't be triggered.
|
23
|
+
# after_update_commit :log_action
|
24
|
+
# # This will override both previous callbacks.
|
25
|
+
# after_commit :log_action, on: :destroy
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# after_save_commit :log_action
|
29
|
+
#
|
30
|
+
# # good
|
31
|
+
# after_create_commit :log_create_action
|
32
|
+
# after_update_commit :log_update_action
|
33
|
+
#
|
34
|
+
class AfterCommitOverride < Base
|
35
|
+
MSG = 'There can only be one `after_*_commit :%<name>s` hook defined for a model.'
|
36
|
+
|
37
|
+
AFTER_COMMIT_CALLBACKS = %i[
|
38
|
+
after_commit
|
39
|
+
after_create_commit
|
40
|
+
after_update_commit
|
41
|
+
after_save_commit
|
42
|
+
after_destroy_commit
|
43
|
+
].freeze
|
44
|
+
|
45
|
+
def on_class(class_node)
|
46
|
+
seen_callback_names = {}
|
47
|
+
|
48
|
+
each_after_commit_callback(class_node) do |node|
|
49
|
+
callback_name = node.arguments[0].value
|
50
|
+
if seen_callback_names.key?(callback_name)
|
51
|
+
add_offense(node, message: format(MSG, name: callback_name))
|
52
|
+
else
|
53
|
+
seen_callback_names[callback_name] = true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def each_after_commit_callback(class_node)
|
61
|
+
class_send_nodes(class_node).each do |node|
|
62
|
+
yield node if after_commit_callback?(node) && named_callback?(node)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def class_send_nodes(class_node)
|
67
|
+
class_def = class_node.body
|
68
|
+
|
69
|
+
return [] unless class_def
|
70
|
+
|
71
|
+
if class_def.send_type?
|
72
|
+
[class_def]
|
73
|
+
else
|
74
|
+
class_def.each_child_node(:send).to_a
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def after_commit_callback?(node)
|
79
|
+
AFTER_COMMIT_CALLBACKS.include?(node.method_name)
|
80
|
+
end
|
81
|
+
|
82
|
+
def named_callback?(node)
|
83
|
+
name = node.first_argument
|
84
|
+
return false unless name
|
85
|
+
|
86
|
+
name.sym_type?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -16,7 +16,9 @@ module RuboCop
|
|
16
16
|
# class MyController < ActionController::Base
|
17
17
|
# # ...
|
18
18
|
# end
|
19
|
-
class ApplicationController <
|
19
|
+
class ApplicationController < Base
|
20
|
+
extend AutoCorrector
|
21
|
+
|
20
22
|
MSG = 'Controllers should subclass `ApplicationController`.'
|
21
23
|
SUPERCLASS = 'ApplicationController'
|
22
24
|
BASE_PATTERN = '(const (const nil? :ActionController) :Base)'
|
@@ -24,12 +26,6 @@ module RuboCop
|
|
24
26
|
# rubocop:disable Layout/ClassStructure
|
25
27
|
include RuboCop::Cop::EnforceSuperclass
|
26
28
|
# rubocop:enable Layout/ClassStructure
|
27
|
-
|
28
|
-
def autocorrect(node)
|
29
|
-
lambda do |corrector|
|
30
|
-
corrector.replace(node.source_range, self.class::SUPERCLASS)
|
31
|
-
end
|
32
|
-
end
|
33
29
|
end
|
34
30
|
end
|
35
31
|
end
|
@@ -16,7 +16,8 @@ module RuboCop
|
|
16
16
|
# class MyMailer < ActionMailer::Base
|
17
17
|
# # ...
|
18
18
|
# end
|
19
|
-
class ApplicationMailer <
|
19
|
+
class ApplicationMailer < Base
|
20
|
+
extend AutoCorrector
|
20
21
|
extend TargetRailsVersion
|
21
22
|
|
22
23
|
minimum_target_rails_version 5.0
|
@@ -28,12 +29,6 @@ module RuboCop
|
|
28
29
|
# rubocop:disable Layout/ClassStructure
|
29
30
|
include RuboCop::Cop::EnforceSuperclass
|
30
31
|
# rubocop:enable Layout/ClassStructure
|
31
|
-
|
32
|
-
def autocorrect(node)
|
33
|
-
lambda do |corrector|
|
34
|
-
corrector.replace(node.source_range, self.class::SUPERCLASS)
|
35
|
-
end
|
36
|
-
end
|
37
32
|
end
|
38
33
|
end
|
39
34
|
end
|