rubocop 0.59.2 → 0.60.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 +5 -5
- data/README.md +3 -2
- data/config/default.yml +2960 -552
- data/lib/rubocop.rb +1 -0
- data/lib/rubocop/ast/builder.rb +29 -29
- data/lib/rubocop/ast/node.rb +29 -25
- data/lib/rubocop/ast/node/args_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +26 -0
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +5 -1
- data/lib/rubocop/ast/node/pair_node.rb +8 -1
- data/lib/rubocop/ast/node/str_node.rb +1 -1
- data/lib/rubocop/cached_data.rb +2 -2
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +8 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +7 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -1
- data/lib/rubocop/cop/generator.rb +10 -3
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/layout/align_hash.rb +9 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +2 -4
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +7 -7
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +1 -2
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +25 -25
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +1 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indent_hash.rb +1 -1
- data/lib/rubocop/cop/layout/indent_heredoc.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +84 -43
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -2
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +5 -5
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +10 -20
- data/lib/rubocop/cop/lint/ensure_return.rb +3 -0
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -3
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +10 -7
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +3 -4
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -2
- data/lib/rubocop/cop/lint/syntax.rb +3 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -3
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -17
- data/lib/rubocop/cop/metrics/line_length.rb +14 -10
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +45 -0
- data/lib/rubocop/cop/mixin/check_assignment.rb +12 -6
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +0 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +4 -2
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +2 -2
- data/lib/rubocop/cop/mixin/hash_alignment.rb +32 -5
- data/lib/rubocop/cop/mixin/heredoc.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -4
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -0
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +2 -0
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +1 -1
- data/lib/rubocop/cop/performance/regexp_match.rb +1 -1
- data/lib/rubocop/cop/performance/sample.rb +3 -2
- data/lib/rubocop/cop/performance/start_with.rb +1 -1
- data/lib/rubocop/cop/performance/string_replacement.rb +1 -1
- data/lib/rubocop/cop/rails/date.rb +8 -8
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -1
- data/lib/rubocop/cop/rails/exit.rb +8 -9
- data/lib/rubocop/cop/rails/output_safety.rb +3 -3
- data/lib/rubocop/cop/rails/read_write_attribute.rb +5 -4
- data/lib/rubocop/cop/rails/refute_methods.rb +13 -13
- data/lib/rubocop/cop/rails/reversible_migration.rb +2 -1
- data/lib/rubocop/cop/rails/skips_model_validations.rb +17 -0
- data/lib/rubocop/cop/registry.rb +11 -2
- data/lib/rubocop/cop/style/and_or.rb +3 -3
- data/lib/rubocop/cop/style/collection_methods.rb +26 -0
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +3 -3
- data/lib/rubocop/cop/style/global_vars.rb +1 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -13
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +4 -7
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +1 -1
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +15 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/not.rb +2 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +10 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +6 -2
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +4 -3
- data/lib/rubocop/cop/style/unneeded_condition.rb +2 -2
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/unpack_first.rb +1 -1
- data/lib/rubocop/cop/team.rb +3 -2
- data/lib/rubocop/cop/util.rb +2 -22
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/cop/variable_force/variable.rb +3 -4
- data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
- data/lib/rubocop/formatter/base_formatter.rb +3 -3
- data/lib/rubocop/formatter/disabled_config_formatter.rb +16 -1
- data/lib/rubocop/formatter/formatter_set.rb +14 -14
- data/lib/rubocop/formatter/html_formatter.rb +4 -4
- data/lib/rubocop/formatter/json_formatter.rb +13 -13
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -4
- data/lib/rubocop/magic_comment.rb +4 -4
- data/lib/rubocop/node_pattern.rb +17 -17
- data/lib/rubocop/options.rb +93 -82
- data/lib/rubocop/result_cache.rb +9 -1
- data/lib/rubocop/rspec/expect_offense.rb +2 -2
- data/lib/rubocop/rspec/shared_contexts.rb +11 -11
- data/lib/rubocop/rspec/shared_examples.rb +4 -4
- data/lib/rubocop/string_interpreter.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- metadata +6 -13
- data/config/disabled.yml +0 -161
- data/config/enabled.yml +0 -2092
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This
|
6
|
+
# This cop checks the indentation of hanging closing parentheses in
|
7
7
|
# method calls, method definitions, and grouped expressions. A hanging
|
8
8
|
# closing parenthesis means `)` preceded by a line break.
|
9
9
|
#
|
@@ -116,9 +116,9 @@ module RuboCop
|
|
116
116
|
|
117
117
|
add_offense(right_paren,
|
118
118
|
location: right_paren,
|
119
|
-
message:
|
120
|
-
|
121
|
-
|
119
|
+
message: message(correct_column,
|
120
|
+
left_paren,
|
121
|
+
right_paren))
|
122
122
|
end
|
123
123
|
|
124
124
|
def check_for_no_elements(node)
|
@@ -135,9 +135,9 @@ module RuboCop
|
|
135
135
|
correct_column = candidates.first
|
136
136
|
add_offense(right_paren,
|
137
137
|
location: right_paren,
|
138
|
-
message:
|
139
|
-
|
140
|
-
|
138
|
+
message: message(correct_column,
|
139
|
+
left_paren,
|
140
|
+
right_paren))
|
141
141
|
end
|
142
142
|
|
143
143
|
def expected_column(left_paren, elements)
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
# @example EnforcedStyle: leading (default)
|
9
9
|
# # bad
|
10
10
|
# something.
|
11
|
-
#
|
11
|
+
# method
|
12
12
|
#
|
13
13
|
# # good
|
14
14
|
# something
|
@@ -21,7 +21,7 @@ module RuboCop
|
|
21
21
|
#
|
22
22
|
# # good
|
23
23
|
# something.
|
24
|
-
#
|
24
|
+
# method
|
25
25
|
class DotPosition < Cop
|
26
26
|
include ConfigurableEnforcedStyle
|
27
27
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This
|
6
|
+
# This cop checks the alignment of else keywords. Normally they should
|
7
7
|
# be aligned with an if/unless/while/until/begin/def keyword, but there
|
8
8
|
# are special cases when they should follow the same rules as the
|
9
9
|
# alignment of end.
|
@@ -24,12 +24,11 @@ module RuboCop
|
|
24
24
|
include RangeHelp
|
25
25
|
|
26
26
|
MSG = 'Add an empty line after magic comments.'.freeze
|
27
|
-
BLANK_LINE = /\A\s*\z/
|
28
27
|
|
29
28
|
def investigate(source)
|
30
29
|
return unless source.ast &&
|
31
30
|
(last_magic_comment = last_magic_comment(source))
|
32
|
-
return if source[last_magic_comment.loc.line]
|
31
|
+
return if source[last_magic_comment.loc.line].strip.empty?
|
33
32
|
|
34
33
|
offending_range =
|
35
34
|
source_range(source.buffer, last_magic_comment.loc.line + 1, 0)
|
@@ -32,21 +32,21 @@ module RuboCop
|
|
32
32
|
def on_class(node)
|
33
33
|
_name, superclass, _body = *node
|
34
34
|
|
35
|
-
@
|
36
|
-
superclass.first_line
|
37
|
-
else
|
38
|
-
node.source_range.first_line
|
39
|
-
end
|
35
|
+
@class_or_module_def = superclass || node.source_range
|
40
36
|
end
|
41
37
|
|
42
38
|
def on_module(node)
|
43
|
-
@
|
39
|
+
@class_or_module_def = node.source_range
|
44
40
|
end
|
45
41
|
|
46
42
|
def on_sclass(node)
|
47
43
|
self_node, _body = *node
|
48
44
|
|
49
|
-
@
|
45
|
+
@class_or_module_def = self_node.source_range
|
46
|
+
end
|
47
|
+
|
48
|
+
def on_block(node)
|
49
|
+
@block_line = node.source_range.first_line
|
50
50
|
end
|
51
51
|
|
52
52
|
def on_send(node)
|
@@ -59,15 +59,13 @@ module RuboCop
|
|
59
59
|
|
60
60
|
def autocorrect(node)
|
61
61
|
lambda do |corrector|
|
62
|
-
send_line = node.first_line
|
63
|
-
next_line = processed_source[send_line]
|
64
62
|
line = range_by_whole_lines(node.source_range)
|
65
63
|
|
66
|
-
unless previous_line_empty?(
|
64
|
+
unless previous_line_empty?(node.first_line)
|
67
65
|
corrector.insert_before(line, "\n")
|
68
66
|
end
|
69
67
|
|
70
|
-
unless next_line_empty?(
|
68
|
+
unless next_line_empty?(node.last_line)
|
71
69
|
corrector.insert_after(line, "\n")
|
72
70
|
end
|
73
71
|
end
|
@@ -85,42 +83,44 @@ module RuboCop
|
|
85
83
|
previous_line = previous_line_ignoring_comments(processed_source,
|
86
84
|
send_line)
|
87
85
|
|
88
|
-
block_start?(
|
86
|
+
block_start?(send_line) ||
|
89
87
|
class_def?(send_line) ||
|
90
88
|
previous_line.blank?
|
91
89
|
end
|
92
90
|
|
93
|
-
def next_line_empty?(
|
94
|
-
|
91
|
+
def next_line_empty?(last_send_line)
|
92
|
+
next_line = processed_source[last_send_line]
|
93
|
+
|
94
|
+
body_end?(last_send_line) || next_line.blank?
|
95
95
|
end
|
96
96
|
|
97
97
|
def empty_lines_around?(node)
|
98
|
-
|
99
|
-
|
100
|
-
next_line = processed_source[send_line]
|
101
|
-
|
102
|
-
previous_line_empty?(send_line) && next_line_empty?(next_line)
|
98
|
+
previous_line_empty?(node.first_line) &&
|
99
|
+
next_line_empty?(node.last_line)
|
103
100
|
end
|
104
101
|
|
105
102
|
def class_def?(line)
|
106
|
-
return false unless @
|
103
|
+
return false unless @class_or_module_def
|
107
104
|
|
108
|
-
line == @
|
105
|
+
line == @class_or_module_def.first_line + 1
|
109
106
|
end
|
110
107
|
|
111
108
|
def block_start?(line)
|
112
|
-
|
109
|
+
return false unless @block_line
|
110
|
+
|
111
|
+
line == @block_line + 1
|
113
112
|
end
|
114
113
|
|
115
114
|
def body_end?(line)
|
116
|
-
|
115
|
+
return false unless @class_or_module_def
|
116
|
+
|
117
|
+
line == @class_or_module_def.last_line - 1
|
117
118
|
end
|
118
119
|
|
119
120
|
def message(node)
|
120
121
|
send_line = node.first_line
|
121
|
-
previous_line = processed_source[send_line - 2]
|
122
122
|
|
123
|
-
if block_start?(
|
123
|
+
if block_start?(send_line) ||
|
124
124
|
class_def?(send_line)
|
125
125
|
format(MSG_AFTER, modifier: node.loc.selector.source)
|
126
126
|
else
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This
|
6
|
+
# This cop 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
|
# `Style/EmptyLinesAroundBeginBody` or `Style/EmptyLinesAroundMethodBody`
|
@@ -113,7 +113,7 @@ module RuboCop
|
|
113
113
|
# assignment, we let rhs be the receiver of those method calls before
|
114
114
|
# we check if it's an if/unless/while/until.
|
115
115
|
return unless (rhs = first_part_of_call_chain(rhs))
|
116
|
-
return unless
|
116
|
+
return unless rhs.conditional?
|
117
117
|
return if rhs.if_type? && rhs.ternary?
|
118
118
|
|
119
119
|
check_asgn_alignment(node, rhs)
|
@@ -168,7 +168,7 @@ module RuboCop
|
|
168
168
|
text = base_range(send_node, arg_node).source.strip
|
169
169
|
base = if text !~ /\n/ && special_inner_call_indentation?(send_node)
|
170
170
|
"`#{text}`"
|
171
|
-
elsif text.lines.reverse_each.first
|
171
|
+
elsif comment_line?(text.lines.reverse_each.first)
|
172
172
|
'the start of the previous line (not counting the comment)'
|
173
173
|
else
|
174
174
|
'the start of the previous line'
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This
|
6
|
+
# This cop checks the indentation of the first key in a hash literal
|
7
7
|
# where the opening brace and the first key are on separate lines. The
|
8
8
|
# other keys' indentations are handled by the AlignHash cop.
|
9
9
|
#
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This
|
6
|
+
# This cop checks the indentation of the here document bodies. The bodies
|
7
7
|
# are indented one step.
|
8
8
|
# In Ruby 2.3 or newer, squiggly heredocs (`<<~`) should be used. If you
|
9
9
|
# use the older rubies, you should introduce some library to your project
|
@@ -88,7 +88,7 @@ module RuboCop
|
|
88
88
|
|
89
89
|
def on_heredoc(node)
|
90
90
|
body = heredoc_body(node)
|
91
|
-
return if body
|
91
|
+
return if body.strip.empty?
|
92
92
|
|
93
93
|
body_indent_level = indent_level(body)
|
94
94
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This
|
6
|
+
# This cop checks for inconsistent indentation.
|
7
7
|
#
|
8
8
|
# The difference between `rails` and `normal` is that the `rails` style
|
9
9
|
# prescribes that in classes and modules the `protected` and `private`
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This
|
6
|
+
# This cop checks for indentation that doesn't use the specified number
|
7
7
|
# of spaces.
|
8
8
|
#
|
9
9
|
# See also the IndentationConsistency cop which is the companion to this
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
6
|
# This cop checks that the closing brace in an array literal is either
|
7
|
-
# on the same line as the last array element
|
7
|
+
# on the same line as the last array element or on a new line.
|
8
8
|
#
|
9
9
|
# When using the `symmetrical` (default) style:
|
10
10
|
#
|
@@ -29,6 +29,7 @@ module RuboCop
|
|
29
29
|
'%<begin_loc_line>d, %<begin_loc_column>d.'.freeze
|
30
30
|
ANCESTOR_TYPES = %i[kwbegin def defs class module].freeze
|
31
31
|
RUBY_2_5_ANCESTOR_TYPES = (ANCESTOR_TYPES + [:block]).freeze
|
32
|
+
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS = %i[def defs].freeze
|
32
33
|
|
33
34
|
def on_resbody(node)
|
34
35
|
check(node) unless modifier?(node)
|
@@ -38,6 +39,18 @@ module RuboCop
|
|
38
39
|
check(node)
|
39
40
|
end
|
40
41
|
|
42
|
+
def autocorrect(node)
|
43
|
+
whitespace = whitespace_range(node)
|
44
|
+
# Some inline node is sitting before current node.
|
45
|
+
return nil unless whitespace.source.strip.empty?
|
46
|
+
|
47
|
+
alignment_node = alignment_node(node)
|
48
|
+
return false if alignment_node.nil?
|
49
|
+
|
50
|
+
new_column = alignment_node.loc.column
|
51
|
+
->(corrector) { corrector.replace(whitespace, ' ' * new_column) }
|
52
|
+
end
|
53
|
+
|
41
54
|
def investigate(processed_source)
|
42
55
|
@modifier_locations =
|
43
56
|
processed_source.tokens.each_with_object([]) do |token, locations|
|
@@ -47,50 +60,88 @@ module RuboCop
|
|
47
60
|
end
|
48
61
|
end
|
49
62
|
|
50
|
-
|
51
|
-
whitespace = whitespace_range(node)
|
52
|
-
return false unless whitespace.source.strip.empty?
|
63
|
+
private
|
53
64
|
|
54
|
-
|
55
|
-
|
65
|
+
# Check alignment of node with rescue or ensure modifiers.
|
66
|
+
|
67
|
+
def check(node)
|
68
|
+
alignment_node = alignment_node(node)
|
69
|
+
return if alignment_node.nil?
|
70
|
+
|
71
|
+
alignment_loc = alignment_node.loc.expression
|
72
|
+
kw_loc = node.loc.keyword
|
73
|
+
|
74
|
+
return if
|
75
|
+
alignment_loc.column == kw_loc.column ||
|
76
|
+
alignment_loc.line == kw_loc.line
|
77
|
+
|
78
|
+
add_offense(
|
79
|
+
node,
|
80
|
+
location: kw_loc,
|
81
|
+
message: format_message(alignment_node, alignment_loc, kw_loc)
|
82
|
+
)
|
56
83
|
end
|
57
84
|
|
58
|
-
|
85
|
+
def format_message(alignment_node, alignment_loc, kw_loc)
|
86
|
+
format(
|
87
|
+
MSG,
|
88
|
+
kw_loc: kw_loc.source,
|
89
|
+
kw_loc_line: kw_loc.line,
|
90
|
+
kw_loc_column: kw_loc.column,
|
91
|
+
beginning: alignment_source(alignment_node, alignment_loc),
|
92
|
+
begin_loc_line: alignment_loc.line,
|
93
|
+
begin_loc_column: alignment_loc.column
|
94
|
+
)
|
95
|
+
end
|
59
96
|
|
60
|
-
def
|
97
|
+
def alignment_source(node, starting_loc)
|
98
|
+
ending_loc =
|
99
|
+
case node.type
|
100
|
+
when :block, :kwbegin
|
101
|
+
node.loc.begin
|
102
|
+
when :def, :defs, :class, :module
|
103
|
+
node.loc.name
|
104
|
+
else
|
105
|
+
# It is a wrapper with access modifier.
|
106
|
+
node.child_nodes.first.loc.name
|
107
|
+
end
|
108
|
+
|
109
|
+
range_between(starting_loc.begin_pos, ending_loc.end_pos).source
|
110
|
+
end
|
111
|
+
|
112
|
+
# We will use ancestor or wrapper with access modifier.
|
113
|
+
|
114
|
+
def alignment_node(node)
|
61
115
|
ancestor_node = ancestor_node(node)
|
62
|
-
|
63
|
-
kw_loc = node.loc.keyword
|
116
|
+
return nil if ancestor_node.nil?
|
64
117
|
|
65
|
-
|
66
|
-
return if
|
118
|
+
access_modifier_node = access_modifier_node(ancestor_node)
|
119
|
+
return ancestor_node if access_modifier_node.nil?
|
67
120
|
|
68
|
-
|
69
|
-
location: kw_loc,
|
70
|
-
message: format_message(kw_loc,
|
71
|
-
alignment_loc,
|
72
|
-
ancestor_node))
|
121
|
+
access_modifier_node
|
73
122
|
end
|
74
123
|
|
75
|
-
def
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
124
|
+
def ancestor_node(node)
|
125
|
+
ancestor_types =
|
126
|
+
if target_ruby_version >= 2.5
|
127
|
+
RUBY_2_5_ANCESTOR_TYPES
|
128
|
+
else
|
129
|
+
ANCESTOR_TYPES
|
130
|
+
end
|
131
|
+
|
132
|
+
node.each_ancestor(*ancestor_types).first
|
83
133
|
end
|
84
134
|
|
85
|
-
def
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
135
|
+
def access_modifier_node(node)
|
136
|
+
return nil unless
|
137
|
+
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS.include?(node.type)
|
138
|
+
|
139
|
+
access_modifier_node = node.ancestors.first
|
140
|
+
return nil unless
|
141
|
+
access_modifier_node.respond_to?(:access_modifier?) &&
|
142
|
+
access_modifier_node.access_modifier?
|
92
143
|
|
93
|
-
|
144
|
+
access_modifier_node
|
94
145
|
end
|
95
146
|
|
96
147
|
def modifier?(node)
|
@@ -100,21 +151,11 @@ module RuboCop
|
|
100
151
|
end
|
101
152
|
|
102
153
|
def whitespace_range(node)
|
103
|
-
begin_pos
|
154
|
+
begin_pos = node.loc.keyword.begin_pos
|
104
155
|
current_column = node.loc.keyword.column
|
105
156
|
|
106
157
|
range_between(begin_pos - current_column, begin_pos)
|
107
158
|
end
|
108
|
-
|
109
|
-
def ancestor_node(node)
|
110
|
-
types = if target_ruby_version >= 2.5
|
111
|
-
RUBY_2_5_ANCESTOR_TYPES
|
112
|
-
else
|
113
|
-
ANCESTOR_TYPES
|
114
|
-
end
|
115
|
-
|
116
|
-
node.each_ancestor(*types).first
|
117
|
-
end
|
118
159
|
end
|
119
160
|
end
|
120
161
|
end
|