rubocop 0.81.0 → 0.82.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 +2 -2
- data/config/default.yml +59 -13
- data/lib/rubocop.rb +4 -2
- data/lib/rubocop/ast/node.rb +1 -1
- data/lib/rubocop/ast/node/array_node.rb +13 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +8 -0
- data/lib/rubocop/cli.rb +10 -4
- data/lib/rubocop/config.rb +9 -1
- data/lib/rubocop/config_loader.rb +24 -15
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/config_obsoletion.rb +1 -0
- data/lib/rubocop/config_validator.rb +16 -0
- data/lib/rubocop/cop/badge.rb +5 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/corrector.rb +48 -24
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +16 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +133 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
- data/lib/rubocop/cop/lint/raise_exception.rb +42 -6
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -3
- 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 +2 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +11 -4
- data/lib/rubocop/cop/style/alias.rb +4 -4
- data/lib/rubocop/cop/style/and_or.rb +5 -6
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/case_equality.rb +24 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -8
- data/lib/rubocop/cop/style/copyright.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +3 -3
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
- data/lib/rubocop/cop/style/format_string.rb +2 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -3
- data/lib/rubocop/cop/style/hash_syntax.rb +3 -5
- data/lib/rubocop/cop/style/hash_transform_values.rb +0 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
- data/lib/rubocop/cop/style/lambda.rb +2 -2
- data/lib/rubocop/cop/style/lambda_call.rb +2 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +2 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +3 -4
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_return.rb +5 -7
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- 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/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +3 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +0 -4
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +0 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/options.rb +7 -1
- data/lib/rubocop/processed_source.rb +0 -3
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +0 -4
- data/lib/rubocop/runner.rb +1 -1
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +1 -1
- metadata +7 -5
- data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
data/lib/rubocop/cop/badge.rb
CHANGED
@@ -4,11 +4,11 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Identifier of all cops containing a department and cop name.
|
6
6
|
#
|
7
|
-
# All cops are identified by their badge. For example, the badge
|
8
|
-
#
|
9
|
-
# parsed as either `Department/CopName` or just `CopName` to
|
10
|
-
# for badge references in source files that omit the department
|
11
|
-
#
|
7
|
+
# All cops are identified by their badge. For example, the badge for
|
8
|
+
# `RuboCop::Cop::Layout::IndentationStyle` is `Layout/IndentationStyle`.
|
9
|
+
# Badges can be parsed as either `Department/CopName` or just `CopName` to
|
10
|
+
# allow for badge references in source files that omit the department for
|
11
|
+
# RuboCop to infer.
|
12
12
|
class Badge
|
13
13
|
# Error raised when a badge parse fails.
|
14
14
|
class InvalidBadge < Error
|
@@ -72,18 +72,18 @@ module RuboCop
|
|
72
72
|
|
73
73
|
# Removes the source range.
|
74
74
|
#
|
75
|
-
# @param [Parser::Source::Range] range
|
76
|
-
def remove(
|
77
|
-
|
75
|
+
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
76
|
+
def remove(node_or_range)
|
77
|
+
range = to_range(node_or_range)
|
78
78
|
@source_rewriter.remove(range)
|
79
79
|
end
|
80
80
|
|
81
81
|
# Inserts new code before the given source range.
|
82
82
|
#
|
83
|
-
# @param [Parser::Source::Range] range
|
83
|
+
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
84
84
|
# @param [String] content
|
85
|
-
def insert_before(
|
86
|
-
|
85
|
+
def insert_before(node_or_range, content)
|
86
|
+
range = to_range(node_or_range)
|
87
87
|
# TODO: Fix Cops using bad ranges instead
|
88
88
|
if range.end_pos > @source_buffer.source.size
|
89
89
|
range = range.with(end_pos: @source_buffer.source.size)
|
@@ -94,28 +94,38 @@ module RuboCop
|
|
94
94
|
|
95
95
|
# Inserts new code after the given source range.
|
96
96
|
#
|
97
|
-
# @param [Parser::Source::Range] range
|
97
|
+
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
98
98
|
# @param [String] content
|
99
|
-
def insert_after(
|
100
|
-
|
99
|
+
def insert_after(node_or_range, content)
|
100
|
+
range = to_range(node_or_range)
|
101
101
|
@source_rewriter.insert_after(range, content)
|
102
102
|
end
|
103
103
|
|
104
|
+
# Wraps the given source range with the given before and after texts
|
105
|
+
#
|
106
|
+
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
107
|
+
# @param [String] before
|
108
|
+
# @param [String] after
|
109
|
+
def wrap(node_or_range, before, after)
|
110
|
+
range = to_range(node_or_range)
|
111
|
+
@source_rewriter.wrap(range, before, after)
|
112
|
+
end
|
113
|
+
|
104
114
|
# Replaces the code of the source range `range` with `content`.
|
105
115
|
#
|
106
|
-
# @param [Parser::Source::Range] range
|
116
|
+
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
107
117
|
# @param [String] content
|
108
|
-
def replace(
|
109
|
-
|
118
|
+
def replace(node_or_range, content)
|
119
|
+
range = to_range(node_or_range)
|
110
120
|
@source_rewriter.replace(range, content)
|
111
121
|
end
|
112
122
|
|
113
123
|
# Removes `size` characters prior to the source range.
|
114
124
|
#
|
115
|
-
# @param [Parser::Source::Range] range
|
125
|
+
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
116
126
|
# @param [Integer] size
|
117
|
-
def remove_preceding(
|
118
|
-
|
127
|
+
def remove_preceding(node_or_range, size)
|
128
|
+
range = to_range(node_or_range)
|
119
129
|
to_remove = Parser::Source::Range.new(range.source_buffer,
|
120
130
|
range.begin_pos - size,
|
121
131
|
range.begin_pos)
|
@@ -126,10 +136,10 @@ module RuboCop
|
|
126
136
|
# If `size` is greater than the size of `range`, the removed region can
|
127
137
|
# overrun the end of `range`.
|
128
138
|
#
|
129
|
-
# @param [Parser::Source::Range] range
|
139
|
+
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
130
140
|
# @param [Integer] size
|
131
|
-
def remove_leading(
|
132
|
-
|
141
|
+
def remove_leading(node_or_range, size)
|
142
|
+
range = to_range(node_or_range)
|
133
143
|
to_remove = Parser::Source::Range.new(range.source_buffer,
|
134
144
|
range.begin_pos,
|
135
145
|
range.begin_pos + size)
|
@@ -140,10 +150,10 @@ module RuboCop
|
|
140
150
|
# If `size` is greater than the size of `range`, the removed region can
|
141
151
|
# overrun the beginning of `range`.
|
142
152
|
#
|
143
|
-
# @param [Parser::Source::Range] range
|
153
|
+
# @param [Parser::Source::Range, Rubocop::AST::Node] range or node
|
144
154
|
# @param [Integer] size
|
145
|
-
def remove_trailing(
|
146
|
-
|
155
|
+
def remove_trailing(node_or_range, size)
|
156
|
+
range = to_range(node_or_range)
|
147
157
|
to_remove = Parser::Source::Range.new(range.source_buffer,
|
148
158
|
range.end_pos - size,
|
149
159
|
range.end_pos)
|
@@ -153,11 +163,25 @@ module RuboCop
|
|
153
163
|
private
|
154
164
|
|
155
165
|
# :nodoc:
|
156
|
-
def
|
157
|
-
|
166
|
+
def to_range(node_or_range)
|
167
|
+
range = case node_or_range
|
168
|
+
when ::RuboCop::AST::Node, ::Parser::Source::Comment
|
169
|
+
node_or_range.loc.expression
|
170
|
+
when ::Parser::Source::Range
|
171
|
+
node_or_range
|
172
|
+
else
|
173
|
+
raise TypeError,
|
174
|
+
'Expected a Parser::Source::Range, Comment or ' \
|
175
|
+
"Rubocop::AST::Node, got #{node_or_range.class}"
|
176
|
+
end
|
177
|
+
validate_buffer(range.source_buffer)
|
178
|
+
range
|
179
|
+
end
|
180
|
+
|
181
|
+
def validate_buffer(buffer)
|
158
182
|
return if buffer == @source_buffer
|
159
183
|
|
160
|
-
unless buffer.is_a?(Parser::Source::Buffer)
|
184
|
+
unless buffer.is_a?(::Parser::Source::Buffer)
|
161
185
|
# actually this should be enforced by parser gem
|
162
186
|
raise 'Corrector expected range source buffer to be a ' \
|
163
187
|
"Parser::Source::Buffer, but got #{buffer.class}"
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
unless range.resize(1).source == "\n"
|
52
52
|
corrector.insert_before(range, ' ' * column_delta)
|
53
53
|
end
|
54
|
-
elsif
|
54
|
+
elsif /\A[ \t]+\z/.match?(range.source)
|
55
55
|
remove(range, corrector)
|
56
56
|
end
|
57
57
|
end
|
@@ -112,7 +112,7 @@ module RuboCop
|
|
112
112
|
corrector.remove(range)
|
113
113
|
rescue RuntimeError
|
114
114
|
range = range_between(range.begin_pos + 1, range.end_pos + 1)
|
115
|
-
retry if range.source
|
115
|
+
retry if /^ +$/.match?(range.source)
|
116
116
|
ensure
|
117
117
|
$stderr = original_stderr
|
118
118
|
end
|
@@ -10,8 +10,7 @@ module RuboCop
|
|
10
10
|
|
11
11
|
lambda do |corrector|
|
12
12
|
corrector.replace(node.loc.keyword, node.inverse_keyword)
|
13
|
-
corrector.replace(condition.
|
14
|
-
condition.children.first.source)
|
13
|
+
corrector.replace(condition, condition.children.first.source)
|
15
14
|
end
|
16
15
|
end
|
17
16
|
|
@@ -44,13 +44,13 @@ module RuboCop
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def replace_selector(corrector)
|
47
|
-
corrector.replace(method
|
47
|
+
corrector.replace(method, 'lambda')
|
48
48
|
end
|
49
49
|
|
50
50
|
def remove_arguments(corrector)
|
51
51
|
return if arguments.empty_and_without_delimiters?
|
52
52
|
|
53
|
-
corrector.remove(arguments
|
53
|
+
corrector.remove(arguments)
|
54
54
|
end
|
55
55
|
|
56
56
|
def insert_arguments(corrector)
|
@@ -62,7 +62,7 @@ module RuboCop
|
|
62
62
|
|
63
63
|
def remove_leading_whitespace(corrector)
|
64
64
|
corrector.remove_preceding(
|
65
|
-
arguments
|
65
|
+
arguments,
|
66
66
|
arguments.source_range.begin_pos -
|
67
67
|
block_node.send_node.source_range.end_pos
|
68
68
|
)
|
@@ -38,9 +38,9 @@ module RuboCop
|
|
38
38
|
return unless eol_comment
|
39
39
|
|
40
40
|
text = eol_comment.loc.expression.source
|
41
|
-
corrector.insert_before(node
|
41
|
+
corrector.insert_before(node,
|
42
42
|
text + "\n" + (' ' * node.loc.keyword.column))
|
43
|
-
corrector.remove(eol_comment
|
43
|
+
corrector.remove(eol_comment)
|
44
44
|
end
|
45
45
|
|
46
46
|
private
|
@@ -13,9 +13,9 @@ module RuboCop
|
|
13
13
|
lambda do |corrector|
|
14
14
|
str = node.str_content
|
15
15
|
if style == :single_quotes
|
16
|
-
corrector.replace(node
|
16
|
+
corrector.replace(node, to_string_literal(str))
|
17
17
|
else
|
18
|
-
corrector.replace(node
|
18
|
+
corrector.replace(node, str.inspect)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -125,21 +125,15 @@ module RuboCop
|
|
125
125
|
|
126
126
|
def check_right_bracket(right_bracket, left_bracket, left_parenthesis)
|
127
127
|
# if the right bracket is on the same line as the last value, accept
|
128
|
-
|
128
|
+
if /\S/.match?(right_bracket.source_line[0...right_bracket.column])
|
129
|
+
return
|
130
|
+
end
|
129
131
|
|
130
132
|
expected_column = base_column(left_bracket, left_parenthesis)
|
131
133
|
@column_delta = expected_column - right_bracket.column
|
132
134
|
return if @column_delta.zero?
|
133
135
|
|
134
|
-
msg =
|
135
|
-
'Indent the right bracket the same as the left bracket.'
|
136
|
-
elsif style == :special_inside_parentheses && left_parenthesis
|
137
|
-
'Indent the right bracket the same as the first position ' \
|
138
|
-
'after the preceding left parenthesis.'
|
139
|
-
else
|
140
|
-
'Indent the right bracket the same as the start of the line' \
|
141
|
-
' where the left bracket is.'
|
142
|
-
end
|
136
|
+
msg = msg(left_parenthesis)
|
143
137
|
add_offense(right_bracket, location: right_bracket, message: msg)
|
144
138
|
end
|
145
139
|
|
@@ -161,6 +155,18 @@ module RuboCop
|
|
161
155
|
base_description: base_description
|
162
156
|
)
|
163
157
|
end
|
158
|
+
|
159
|
+
def msg(left_parenthesis)
|
160
|
+
if style == :align_brackets
|
161
|
+
'Indent the right bracket the same as the left bracket.'
|
162
|
+
elsif style == :special_inside_parentheses && left_parenthesis
|
163
|
+
'Indent the right bracket the same as the first position ' \
|
164
|
+
'after the preceding left parenthesis.'
|
165
|
+
else
|
166
|
+
'Indent the right bracket the same as the start of the line' \
|
167
|
+
' where the left bracket is.'
|
168
|
+
end
|
169
|
+
end
|
164
170
|
end
|
165
171
|
end
|
166
172
|
end
|
@@ -128,7 +128,7 @@ module RuboCop
|
|
128
128
|
|
129
129
|
def check_right_brace(right_brace, left_brace, left_parenthesis)
|
130
130
|
# if the right brace is on the same line as the last value, accept
|
131
|
-
return if right_brace.source_line[0...right_brace.column]
|
131
|
+
return if /\S/.match?(right_brace.source_line[0...right_brace.column])
|
132
132
|
|
133
133
|
expected_column = base_column(left_brace, left_parenthesis)
|
134
134
|
@column_delta = expected_column - right_brace.column
|
@@ -169,7 +169,7 @@ module RuboCop
|
|
169
169
|
end
|
170
170
|
|
171
171
|
def add_correct_closing_paren(node, corrector)
|
172
|
-
corrector.insert_after(node.arguments.last
|
172
|
+
corrector.insert_after(node.arguments.last, ')')
|
173
173
|
end
|
174
174
|
|
175
175
|
def remove_incorrect_closing_paren(node, corrector)
|
@@ -249,7 +249,7 @@ module RuboCop
|
|
249
249
|
def add_correct_external_trailing_comma(node, corrector)
|
250
250
|
return unless external_trailing_comma?(node)
|
251
251
|
|
252
|
-
corrector.insert_after(node.arguments.last
|
252
|
+
corrector.insert_after(node.arguments.last, ',')
|
253
253
|
end
|
254
254
|
|
255
255
|
def remove_incorrect_external_trailing_comma(node, corrector)
|
@@ -184,14 +184,14 @@ module RuboCop
|
|
184
184
|
def adjust_minus(corrector, node)
|
185
185
|
heredoc_beginning = node.loc.expression.source
|
186
186
|
corrected = heredoc_beginning.sub(/<<-?/, '<<~')
|
187
|
-
corrector.replace(node
|
187
|
+
corrector.replace(node, corrected)
|
188
188
|
end
|
189
189
|
|
190
190
|
def correct_by_library(node)
|
191
191
|
lambda do |corrector|
|
192
192
|
corrector.replace(node.loc.heredoc_body, indented_body(node))
|
193
193
|
corrected = ".#{STRIP_METHODS[style]}"
|
194
|
-
corrector.insert_after(node
|
194
|
+
corrector.insert_after(node, corrected)
|
195
195
|
end
|
196
196
|
end
|
197
197
|
|
@@ -5,9 +5,10 @@ require 'set'
|
|
5
5
|
module RuboCop
|
6
6
|
module Cop
|
7
7
|
module Layout
|
8
|
-
# This cop checks
|
8
|
+
# This cop checks that the indentation method is consistent.
|
9
|
+
# Either tabs only or spaces only are used for indentation.
|
9
10
|
#
|
10
|
-
# @example
|
11
|
+
# @example EnforcedStyle: spaces (default)
|
11
12
|
# # bad
|
12
13
|
# # This example uses a tab to indent bar.
|
13
14
|
# def foo
|
@@ -20,17 +21,30 @@ module RuboCop
|
|
20
21
|
# bar
|
21
22
|
# end
|
22
23
|
#
|
23
|
-
|
24
|
+
# @example EnforcedStyle: tabs
|
25
|
+
# # bad
|
26
|
+
# # This example uses spaces to indent bar.
|
27
|
+
# def foo
|
28
|
+
# bar
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# # This example uses a tab to indent bar.
|
33
|
+
# def foo
|
34
|
+
# bar
|
35
|
+
# end
|
36
|
+
class IndentationStyle < Cop
|
24
37
|
include Alignment
|
38
|
+
include ConfigurableEnforcedStyle
|
25
39
|
include RangeHelp
|
26
40
|
|
27
|
-
MSG = '
|
41
|
+
MSG = '%<type>s detected in indentation.'
|
28
42
|
|
29
43
|
def investigate(processed_source)
|
30
44
|
str_ranges = string_literal_ranges(processed_source.ast)
|
31
45
|
|
32
46
|
processed_source.lines.each.with_index(1) do |line, lineno|
|
33
|
-
match = line
|
47
|
+
match = find_offence(line)
|
34
48
|
next unless match
|
35
49
|
|
36
50
|
range = source_range(processed_source.buffer,
|
@@ -43,13 +57,37 @@ module RuboCop
|
|
43
57
|
end
|
44
58
|
|
45
59
|
def autocorrect(range)
|
60
|
+
if range.source.include?("\t")
|
61
|
+
autocorrect_lambda_for_tabs(range)
|
62
|
+
else
|
63
|
+
autocorrect_lambda_for_spaces(range)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def find_offence(line)
|
70
|
+
if style == :spaces
|
71
|
+
line.match(/\A\s*\t+/)
|
72
|
+
else
|
73
|
+
line.match(/\A\s* +/)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def autocorrect_lambda_for_tabs(range)
|
46
78
|
lambda do |corrector|
|
47
79
|
spaces = ' ' * configured_indentation_width
|
48
80
|
corrector.replace(range, range.source.gsub(/\t/, spaces))
|
49
81
|
end
|
50
82
|
end
|
51
83
|
|
52
|
-
|
84
|
+
def autocorrect_lambda_for_spaces(range)
|
85
|
+
lambda do |corrector|
|
86
|
+
corrector.replace(range, range.source.gsub(/\A\s+/) do |match|
|
87
|
+
"\t" * (match.size / configured_indentation_width)
|
88
|
+
end)
|
89
|
+
end
|
90
|
+
end
|
53
91
|
|
54
92
|
def in_string_literal?(ranges, tabs_range)
|
55
93
|
ranges.any? { |range| range.contains?(tabs_range) }
|
@@ -69,6 +107,10 @@ module RuboCop
|
|
69
107
|
end
|
70
108
|
end
|
71
109
|
end
|
110
|
+
|
111
|
+
def message(_node)
|
112
|
+
format(MSG, type: style == :spaces ? 'Tab' : 'Space')
|
113
|
+
end
|
72
114
|
end
|
73
115
|
end
|
74
116
|
end
|