rubocop 0.74.0 → 0.75.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 -1
- data/config/default.yml +27 -3
- data/lib/rubocop.rb +6 -1
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -12
- data/lib/rubocop/comment_config.rb +3 -2
- data/lib/rubocop/config.rb +4 -0
- data/lib/rubocop/config_loader.rb +20 -2
- data/lib/rubocop/config_loader_resolver.rb +2 -2
- data/lib/rubocop/config_obsoletion.rb +12 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +2 -2
- data/lib/rubocop/cop/cop.rb +4 -3
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/generator.rb +3 -3
- data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +0 -6
- data/lib/rubocop/cop/layout/indent_assignment.rb +9 -1
- data/lib/rubocop/cop/layout/indent_heredoc.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
- data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/message_annotator.rb +16 -7
- data/lib/rubocop/cop/migration/department_name.rb +44 -0
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
- data/lib/rubocop/cop/naming/method_name.rb +12 -1
- data/lib/rubocop/cop/naming/variable_name.rb +1 -0
- data/lib/rubocop/cop/offense.rb +18 -7
- data/lib/rubocop/cop/registry.rb +22 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +29 -10
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +8 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +4 -4
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +8 -2
- data/lib/rubocop/cop/style/format_string_token.rb +10 -40
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +18 -33
- data/lib/rubocop/cop/style/if_unless_modifier.rb +51 -15
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +5 -5
- data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +18 -2
- data/lib/rubocop/cop/style/or_assignment.rb +6 -1
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -4
- data/lib/rubocop/cop/style/redundant_self.rb +18 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +9 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
- data/lib/rubocop/cop/utils/format_string.rb +128 -0
- data/lib/rubocop/cop/variable_force/variable.rb +15 -2
- data/lib/rubocop/core_ext/string.rb +0 -24
- data/lib/rubocop/formatter/emacs_style_formatter.rb +8 -5
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +9 -1
- data/lib/rubocop/formatter/tap_formatter.rb +9 -1
- data/lib/rubocop/magic_comment.rb +4 -0
- data/lib/rubocop/options.rb +2 -1
- data/lib/rubocop/runner.rb +14 -8
- data/lib/rubocop/version.rb +1 -1
- metadata +6 -3
- data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78f22d960f9c7b85730f215741a8e083b3b63396f414478d4831762e4c4cf7cb
|
4
|
+
data.tar.gz: b933d30e9d959fd0ef51958f5815349cab06f8dc7069b4f10c16907e43be53a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 070a442e799b151ea2be23c3eb0d00ad25cc269ed6296ca3862fb6b3b25bfff238886423e7ae52cea853041038fefa354f818377cfde730b4464d7503b0680da
|
7
|
+
data.tar.gz: b14a228097fd48fc7c3dd4c7674b607574f99fba7b9870b64e97b836340181b57563794dd1d5371929fa1dac7e33430eb14189447b05caba84e8ce2b5034f12e
|
data/README.md
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
[](https://www.patreon.com/bbatsov)
|
10
10
|
[](#open-collective-backers)
|
11
11
|
[](#open-collective-sponsors)
|
12
|
+
[](https://tidelift.com/subscription/pkg/rubygems-rubocop?utm_source=rubygems-rubocop&utm_medium=referral&utm_campaign=readme)
|
12
13
|
|
13
14
|
<p align="center">
|
14
15
|
<img src="https://raw.githubusercontent.com/rubocop-hq/rubocop/master/logo/rubo-logo-horizontal.png" alt="RuboCop Logo"/>
|
@@ -52,7 +53,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
|
|
52
53
|
might want to use a conservative version lock in your `Gemfile`:
|
53
54
|
|
54
55
|
```rb
|
55
|
-
gem 'rubocop', '~> 0.
|
56
|
+
gem 'rubocop', '~> 0.75.0', require: false
|
56
57
|
```
|
57
58
|
|
58
59
|
## Quickstart
|
data/config/default.yml
CHANGED
@@ -1591,6 +1591,11 @@ Lint/ScriptPermission:
|
|
1591
1591
|
VersionAdded: '0.49'
|
1592
1592
|
VersionChanged: '0.50'
|
1593
1593
|
|
1594
|
+
Lint/SendWithMixinArgument:
|
1595
|
+
Description: 'Checks for `send` method when using mixin.'
|
1596
|
+
Enabled: true
|
1597
|
+
VersionAdded: '0.75'
|
1598
|
+
|
1594
1599
|
Lint/ShadowedArgument:
|
1595
1600
|
Description: 'Avoid reassigning arguments before they were used.'
|
1596
1601
|
Enabled: true
|
@@ -1746,7 +1751,7 @@ Metrics/AbcSize:
|
|
1746
1751
|
branches, and conditions.
|
1747
1752
|
Reference:
|
1748
1753
|
- http://c2.com/cgi/wiki?AbcMetric
|
1749
|
-
- https://en.wikipedia.org/wiki/ABC_Software_Metric
|
1754
|
+
- https://en.wikipedia.org/wiki/ABC_Software_Metric
|
1750
1755
|
Enabled: true
|
1751
1756
|
VersionAdded: '0.27'
|
1752
1757
|
VersionChanged: '0.66'
|
@@ -1849,6 +1854,14 @@ Metrics/PerceivedComplexity:
|
|
1849
1854
|
VersionAdded: '0.25'
|
1850
1855
|
Max: 7
|
1851
1856
|
|
1857
|
+
################## Migration #############################
|
1858
|
+
|
1859
|
+
Migration/DepartmentName:
|
1860
|
+
Description: >-
|
1861
|
+
Check that cop names in rubocop:disable (etc) comments are
|
1862
|
+
given with department name.
|
1863
|
+
Enabled: false
|
1864
|
+
|
1852
1865
|
#################### Naming ##############################
|
1853
1866
|
|
1854
1867
|
Naming/AccessorMethodName:
|
@@ -1984,6 +1997,13 @@ Naming/MethodName:
|
|
1984
1997
|
SupportedStyles:
|
1985
1998
|
- snake_case
|
1986
1999
|
- camelCase
|
2000
|
+
# Method names matching patterns are always allowed.
|
2001
|
+
#
|
2002
|
+
# IgnoredPatterns:
|
2003
|
+
# - '\A\s*onSelectionBulkChange\s*'
|
2004
|
+
# - '\A\s*onSelectionCleared\s*'
|
2005
|
+
#
|
2006
|
+
IgnoredPatterns: []
|
1987
2007
|
|
1988
2008
|
Naming/PredicateName:
|
1989
2009
|
Description: 'Check the names of predicate methods.'
|
@@ -2706,7 +2726,7 @@ Style/FormatStringToken:
|
|
2706
2726
|
- template
|
2707
2727
|
- unannotated
|
2708
2728
|
VersionAdded: '0.49'
|
2709
|
-
VersionChanged: '0.
|
2729
|
+
VersionChanged: '0.75'
|
2710
2730
|
|
2711
2731
|
Style/FrozenStringLiteralComment:
|
2712
2732
|
Description: >-
|
@@ -2899,6 +2919,7 @@ Style/MethodCallWithArgsParentheses:
|
|
2899
2919
|
VersionChanged: '0.61'
|
2900
2920
|
IgnoreMacros: true
|
2901
2921
|
IgnoredMethods: []
|
2922
|
+
IgnoredPatterns: []
|
2902
2923
|
IncludedMacros: []
|
2903
2924
|
AllowParenthesesInMultilineCall: false
|
2904
2925
|
AllowParenthesesInChaining: false
|
@@ -3586,6 +3607,8 @@ Style/StringHashKeys:
|
|
3586
3607
|
StyleGuide: '#symbols-as-keys'
|
3587
3608
|
Enabled: false
|
3588
3609
|
VersionAdded: '0.52'
|
3610
|
+
VersionChanged: '0.75'
|
3611
|
+
Safe: false
|
3589
3612
|
|
3590
3613
|
Style/StringLiterals:
|
3591
3614
|
Description: 'Checks if uses of quotes match the configured preference.'
|
@@ -3904,8 +3927,9 @@ Style/YodaCondition:
|
|
3904
3927
|
- require_for_all_comparison_operators
|
3905
3928
|
# enforce yoda only for equality operators: `!=` and `==`
|
3906
3929
|
- require_for_equality_operators_only
|
3930
|
+
Safe: false
|
3907
3931
|
VersionAdded: '0.49'
|
3908
|
-
VersionChanged: '0.
|
3932
|
+
VersionChanged: '0.75'
|
3909
3933
|
|
3910
3934
|
Style/ZeroLengthPredicate:
|
3911
3935
|
Description: 'Use #empty? when testing for objects of length 0.'
|
data/lib/rubocop.rb
CHANGED
@@ -120,7 +120,6 @@ require_relative 'rubocop/cop/mixin/frozen_string_literal'
|
|
120
120
|
require_relative 'rubocop/cop/mixin/hash_alignment'
|
121
121
|
require_relative 'rubocop/cop/mixin/ignored_pattern'
|
122
122
|
require_relative 'rubocop/cop/mixin/ignored_methods'
|
123
|
-
require_relative 'rubocop/cop/mixin/ignored_method_patterns'
|
124
123
|
require_relative 'rubocop/cop/mixin/integer_node'
|
125
124
|
require_relative 'rubocop/cop/mixin/interpolation'
|
126
125
|
require_relative 'rubocop/cop/mixin/match_range'
|
@@ -158,6 +157,10 @@ require_relative 'rubocop/cop/mixin/trailing_comma'
|
|
158
157
|
require_relative 'rubocop/cop/mixin/uncommunicative_name'
|
159
158
|
require_relative 'rubocop/cop/mixin/unused_argument'
|
160
159
|
|
160
|
+
require_relative 'rubocop/cop/utils/format_string'
|
161
|
+
|
162
|
+
require_relative 'rubocop/cop/migration/department_name'
|
163
|
+
|
161
164
|
require_relative 'rubocop/cop/correctors/alignment_corrector'
|
162
165
|
require_relative 'rubocop/cop/correctors/condition_corrector'
|
163
166
|
require_relative 'rubocop/cop/correctors/each_to_for_corrector'
|
@@ -329,6 +332,7 @@ require_relative 'rubocop/cop/lint/safe_navigation_consistency'
|
|
329
332
|
require_relative 'rubocop/cop/lint/safe_navigation_chain'
|
330
333
|
require_relative 'rubocop/cop/lint/safe_navigation_with_empty'
|
331
334
|
require_relative 'rubocop/cop/lint/script_permission'
|
335
|
+
require_relative 'rubocop/cop/lint/send_with_mixin_argument'
|
332
336
|
require_relative 'rubocop/cop/lint/shadowed_argument'
|
333
337
|
require_relative 'rubocop/cop/lint/shadowed_exception'
|
334
338
|
require_relative 'rubocop/cop/lint/shadowing_outer_local_variable'
|
@@ -578,6 +582,7 @@ require_relative 'rubocop/formatter/progress_formatter'
|
|
578
582
|
require_relative 'rubocop/formatter/quiet_formatter'
|
579
583
|
require_relative 'rubocop/formatter/tap_formatter'
|
580
584
|
require_relative 'rubocop/formatter/worst_offenders_formatter'
|
585
|
+
require_relative 'rubocop/formatter/pacman_formatter'
|
581
586
|
# relies on progress formatter
|
582
587
|
require_relative 'rubocop/formatter/auto_gen_config_formatter'
|
583
588
|
|
@@ -222,22 +222,11 @@ module RuboCop
|
|
222
222
|
|
223
223
|
def_node_matcher :macro_scope?, <<~PATTERN
|
224
224
|
{^{({sclass class module block} ...) class_constructor?}
|
225
|
-
|
225
|
+
^^{({sclass class module block} ... ({begin if} ...)) class_constructor?}
|
226
226
|
^#macro_kwbegin_wrapper?
|
227
227
|
#root_node?}
|
228
228
|
PATTERN
|
229
229
|
|
230
|
-
def_node_matcher :wrapped_macro_scope?, <<~PATTERN
|
231
|
-
{({sclass class module block} ... ({begin if} ...)) class_constructor?}
|
232
|
-
PATTERN
|
233
|
-
|
234
|
-
def ascend_macro_scope?(ancestor)
|
235
|
-
return true if wrapped_macro_scope?(ancestor)
|
236
|
-
return false if root_node?(ancestor)
|
237
|
-
|
238
|
-
ascend_macro_scope?(ancestor.parent)
|
239
|
-
end
|
240
|
-
|
241
230
|
# Check if a node's parent is a kwbegin wrapper within a macro scope
|
242
231
|
#
|
243
232
|
# @param parent [Node] parent of the node being checked
|
@@ -11,7 +11,8 @@ module RuboCop
|
|
11
11
|
COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
|
12
12
|
|
13
13
|
COMMENT_DIRECTIVE_REGEXP = Regexp.new(
|
14
|
-
('# rubocop : ((?:
|
14
|
+
('# rubocop : ((?:disable|enable|todo))\b ' + COPS_PATTERN)
|
15
|
+
.gsub(' ', '\s*')
|
15
16
|
)
|
16
17
|
|
17
18
|
CopAnalysis = Struct.new(:line_ranges, :start_line_number)
|
@@ -141,7 +142,7 @@ module RuboCop
|
|
141
142
|
cop_names =
|
142
143
|
cops_string == 'all' ? all_cop_names : cops_string.split(/,\s*/)
|
143
144
|
|
144
|
-
disabled = (switch
|
145
|
+
disabled = %w[disable todo].include?(switch)
|
145
146
|
|
146
147
|
[cop_names, disabled]
|
147
148
|
end
|
data/lib/rubocop/config.rb
CHANGED
@@ -199,6 +199,8 @@ module RuboCop
|
|
199
199
|
raise(TypeError, "Malformed configuration in #{absolute_path}")
|
200
200
|
end
|
201
201
|
|
202
|
+
check_cop_config_value(hash)
|
203
|
+
|
202
204
|
hash
|
203
205
|
end
|
204
206
|
|
@@ -220,6 +222,22 @@ module RuboCop
|
|
220
222
|
end
|
221
223
|
end
|
222
224
|
|
225
|
+
def check_cop_config_value(hash, parent = nil)
|
226
|
+
hash.each do |key, value|
|
227
|
+
check_cop_config_value(value, key) if value.is_a?(Hash)
|
228
|
+
|
229
|
+
next unless %w[Enabled
|
230
|
+
Safe
|
231
|
+
SafeAutoCorrect
|
232
|
+
AutoCorrect].include?(key) && value.is_a?(String)
|
233
|
+
|
234
|
+
abort(
|
235
|
+
"Property #{Rainbow(key).yellow} of cop #{Rainbow(parent).yellow}" \
|
236
|
+
" is supposed to be a boolean and #{Rainbow(value).yellow} is not."
|
237
|
+
)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
223
241
|
# Read the specified file, or exit with a friendly, concise message on
|
224
242
|
# stderr. Care is taken to use the standard OS exit code for a "file not
|
225
243
|
# found" error.
|
@@ -240,11 +258,11 @@ module RuboCop
|
|
240
258
|
yaml_code,
|
241
259
|
permitted_classes: [Regexp, Symbol],
|
242
260
|
permitted_symbols: [],
|
243
|
-
aliases:
|
261
|
+
aliases: true,
|
244
262
|
filename: filename
|
245
263
|
)
|
246
264
|
else
|
247
|
-
YAML.safe_load(yaml_code, [Regexp, Symbol], [],
|
265
|
+
YAML.safe_load(yaml_code, [Regexp, Symbol], [], true, filename)
|
248
266
|
end
|
249
267
|
end
|
250
268
|
end
|
@@ -73,7 +73,7 @@ module RuboCop
|
|
73
73
|
|
74
74
|
opts = { inherit_mode: config['inherit_mode'] || {},
|
75
75
|
unset_nil: unset_nil }
|
76
|
-
Config.new(merge(default_configuration, config, opts), config_file)
|
76
|
+
Config.new(merge(default_configuration, config, **opts), config_file)
|
77
77
|
end
|
78
78
|
|
79
79
|
# Return a recursive merge of two hashes. That is, a normal hash merge,
|
@@ -92,7 +92,7 @@ module RuboCop
|
|
92
92
|
elsif should_union?(base_hash, key, opts[:inherit_mode])
|
93
93
|
result[key] = base_hash[key] | derived_hash[key]
|
94
94
|
elsif opts[:debug]
|
95
|
-
warn_on_duplicate_setting(base_hash, derived_hash, key, opts)
|
95
|
+
warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
96
96
|
end
|
97
97
|
end
|
98
98
|
result
|
@@ -119,6 +119,18 @@ module RuboCop
|
|
119
119
|
cops: 'Rails/UniqBeforePluck',
|
120
120
|
parameters: 'EnforcedMode',
|
121
121
|
alternative: '`EnforcedMode` has been renamed to `EnforcedStyle`'
|
122
|
+
},
|
123
|
+
{
|
124
|
+
cops: 'Style/MethodCallWithArgsParentheses',
|
125
|
+
parameters: 'IgnoredMethodPatterns',
|
126
|
+
alternative: '`IgnoredMethodPatterns` has been renamed to ' \
|
127
|
+
'`IgnoredPatterns`'
|
128
|
+
},
|
129
|
+
{
|
130
|
+
cops: %w[Performance/Count Performance/Detect],
|
131
|
+
parameters: 'SafeMode',
|
132
|
+
alternative: '`SafeMode` has been removed. ' \
|
133
|
+
'Use `SafeAutoCorrect` instead.'
|
122
134
|
}
|
123
135
|
].freeze
|
124
136
|
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
|
40
40
|
def disable_offense(node)
|
41
41
|
range = node.location.expression
|
42
|
-
eol_comment = " # rubocop:
|
42
|
+
eol_comment = " # rubocop:todo #{cop_name}"
|
43
43
|
needed_line_length = range.column +
|
44
44
|
(range.source_line + eol_comment).length
|
45
45
|
if needed_line_length <= max_line_length
|
@@ -90,7 +90,7 @@ module RuboCop
|
|
90
90
|
|
91
91
|
corrector.insert_before(
|
92
92
|
range_with_newline,
|
93
|
-
"#{leading_whitespace}# rubocop:
|
93
|
+
"#{leading_whitespace}# rubocop:todo #{cop_name}\n"
|
94
94
|
)
|
95
95
|
corrector.insert_after(
|
96
96
|
range_with_newline,
|
data/lib/rubocop/cop/cop.rb
CHANGED
@@ -160,10 +160,11 @@ module RuboCop
|
|
160
160
|
return :uncorrected unless correction
|
161
161
|
|
162
162
|
@corrections << Correction.new(correction, node, self)
|
163
|
+
:corrected
|
163
164
|
elsif disable_uncorrectable?
|
164
165
|
disable_uncorrectable(node)
|
166
|
+
:corrected_with_todo
|
165
167
|
end
|
166
|
-
:corrected
|
167
168
|
end
|
168
169
|
|
169
170
|
def reason_to_not_correct(node)
|
@@ -224,8 +225,8 @@ module RuboCop
|
|
224
225
|
|
225
226
|
def annotate(message)
|
226
227
|
RuboCop::Cop::MessageAnnotator.new(
|
227
|
-
config, cop_config, @options
|
228
|
-
).annotate(message
|
228
|
+
config, cop_name, cop_config, @options
|
229
|
+
).annotate(message)
|
229
230
|
end
|
230
231
|
|
231
232
|
def file_name_matches_any?(file, parameter, default_result)
|
@@ -19,10 +19,12 @@ module RuboCop
|
|
19
19
|
expr = node.respond_to?(:loc) ? node.loc.expression : node
|
20
20
|
return if block_comment_within?(expr)
|
21
21
|
|
22
|
+
taboo_ranges = inside_string_ranges(node)
|
23
|
+
|
22
24
|
lambda do |corrector|
|
23
25
|
each_line(expr) do |line_begin_pos|
|
24
26
|
autocorrect_line(corrector, line_begin_pos, expr, column_delta,
|
25
|
-
|
27
|
+
taboo_ranges)
|
26
28
|
end
|
27
29
|
end
|
28
30
|
end
|
@@ -39,27 +41,48 @@ module RuboCop
|
|
39
41
|
private
|
40
42
|
|
41
43
|
def autocorrect_line(corrector, line_begin_pos, expr, column_delta,
|
42
|
-
|
44
|
+
taboo_ranges)
|
43
45
|
range = calculate_range(expr, line_begin_pos, column_delta)
|
44
|
-
# We must not change indentation of heredoc strings
|
45
|
-
|
46
|
+
# We must not change indentation of heredoc strings or inside other
|
47
|
+
# string literals
|
48
|
+
return if taboo_ranges.any? { |t| within?(range, t) }
|
46
49
|
|
47
50
|
if column_delta.positive?
|
48
|
-
unless range.source == "\n"
|
49
|
-
|
50
|
-
corrector.insert_before(range.begin, ' ' * column_delta)
|
51
|
+
unless range.resize(1).source == "\n"
|
52
|
+
corrector.insert_before(range, ' ' * column_delta)
|
51
53
|
end
|
52
54
|
elsif range.source =~ /\A[ \t]+\z/
|
53
55
|
remove(range, corrector)
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
57
|
-
def
|
59
|
+
def inside_string_ranges(node)
|
58
60
|
return [] unless node.is_a?(Parser::AST::Node)
|
59
61
|
|
60
|
-
node.each_node(:dstr)
|
61
|
-
.
|
62
|
-
|
62
|
+
node.each_node(:str, :dstr, :xstr).map { |n| inside_string_range(n) }
|
63
|
+
.compact
|
64
|
+
end
|
65
|
+
|
66
|
+
def inside_string_range(node)
|
67
|
+
loc = node.location
|
68
|
+
|
69
|
+
if node.heredoc?
|
70
|
+
loc.heredoc_body.join(loc.heredoc_end)
|
71
|
+
elsif delimited_string_literal?(node)
|
72
|
+
loc.begin.end.join(loc.end.begin)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Some special kinds of string literals are not composed of literal
|
77
|
+
# characters between two delimiters:
|
78
|
+
# - The source map of `?a` responds to :begin and :end but its end is
|
79
|
+
# nil.
|
80
|
+
# - The source map of `__FILE__` responds to neither :begin nor :end.
|
81
|
+
def delimited_string_literal?(node)
|
82
|
+
loc = node.location
|
83
|
+
|
84
|
+
loc.respond_to?(:begin) && loc.begin &&
|
85
|
+
loc.respond_to?(:end) && loc.end
|
63
86
|
end
|
64
87
|
|
65
88
|
def block_comment_within?(expr)
|
@@ -69,15 +92,18 @@ module RuboCop
|
|
69
92
|
end
|
70
93
|
|
71
94
|
def calculate_range(expr, line_begin_pos, column_delta)
|
95
|
+
if column_delta.positive?
|
96
|
+
return range_between(line_begin_pos, line_begin_pos)
|
97
|
+
end
|
98
|
+
|
72
99
|
starts_with_space =
|
73
100
|
expr.source_buffer.source[line_begin_pos].start_with?(' ')
|
74
|
-
pos_to_remove = if column_delta.positive? || starts_with_space
|
75
|
-
line_begin_pos
|
76
|
-
else
|
77
|
-
line_begin_pos - column_delta.abs
|
78
|
-
end
|
79
101
|
|
80
|
-
|
102
|
+
if starts_with_space
|
103
|
+
range_between(line_begin_pos, line_begin_pos + column_delta.abs)
|
104
|
+
else
|
105
|
+
range_between(line_begin_pos - column_delta.abs, line_begin_pos)
|
106
|
+
end
|
81
107
|
end
|
82
108
|
|
83
109
|
def remove(range, corrector)
|
@@ -40,8 +40,8 @@ module RuboCop
|
|
40
40
|
range_with_surrounding_space(range: node.loc.end, side: :left)
|
41
41
|
)
|
42
42
|
|
43
|
-
corrector.
|
44
|
-
last_element_range_with_trailing_comma(node),
|
43
|
+
corrector.insert_before(
|
44
|
+
last_element_range_with_trailing_comma(node).end,
|
45
45
|
node.loc.end.source
|
46
46
|
)
|
47
47
|
end
|
@@ -10,10 +10,10 @@ module RuboCop
|
|
10
10
|
# Note: RDoc 5.1.0 or lower has the following issue.
|
11
11
|
# https://github.com/rubocop-hq/rubocop/issues/7043
|
12
12
|
#
|
13
|
-
# The following `String#
|
13
|
+
# The following `String#gsub` can be replaced with
|
14
14
|
# squiggly heredoc when RuboCop supports Ruby 2.5 or higher
|
15
15
|
# (RDoc 6.0 or higher).
|
16
|
-
SOURCE_TEMPLATE = <<-RUBY.
|
16
|
+
SOURCE_TEMPLATE = <<-RUBY.gsub(/^ {8}/, '')
|
17
17
|
# frozen_string_literal: true
|
18
18
|
|
19
19
|
# TODO: when finished, run `rake generate_cops_documentation` to update the docs
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
# See https://github.com/rubocop-hq/rubocop/blob/master/lib/rubocop/node_pattern.rb
|
62
62
|
#
|
63
63
|
# For example
|
64
|
-
MSG = 'Use `#good_method` instead of `#bad_method`.'
|
64
|
+
MSG = 'Use `#good_method` instead of `#bad_method`.'
|
65
65
|
|
66
66
|
def_node_matcher :bad_method?, <<~PATTERN
|
67
67
|
(send nil? :bad_method ...)
|