rubocop 0.85.0 → 0.88.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 +25 -17
- data/bin/rubocop-profile +31 -0
- data/config/default.yml +132 -11
- data/lib/rubocop.rb +17 -1
- data/lib/rubocop/cli.rb +2 -4
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +1 -1
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +39 -67
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/config_obsoletion.rb +0 -1
- data/lib/rubocop/config_store.rb +4 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +407 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +48 -50
- data/lib/rubocop/cop/cop.rb +91 -235
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +7 -2
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
- data/lib/rubocop/cop/layout/class_structure.rb +2 -37
- data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +27 -68
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -4
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +3 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +11 -1
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +8 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +69 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -3
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +31 -25
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +9 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +11 -26
- data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +22 -0
- data/lib/rubocop/cop/metrics/class_length.rb +25 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
- data/lib/rubocop/cop/metrics/method_length.rb +23 -0
- data/lib/rubocop/cop/metrics/module_length.rb +25 -2
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/code_length.rb +4 -0
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +1 -1
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +10 -5
- data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -4
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +1 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/registry.rb +62 -7
- data/lib/rubocop/cop/style/accessor_grouping.rb +147 -0
- data/lib/rubocop/cop/style/array_coercion.rb +63 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +146 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -4
- data/lib/rubocop/cop/style/case_like_if.rb +217 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +21 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/copyright.rb +3 -3
- data/lib/rubocop/cop/style/date_time.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
- data/lib/rubocop/cop/style/empty_literal.rb +5 -5
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +8 -10
- data/lib/rubocop/cop/style/float_division.rb +7 -10
- data/lib/rubocop/cop/style/format_string_token.rb +5 -5
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +62 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -11
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
- data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +1 -11
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
- data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +3 -4
- data/lib/rubocop/cop/style/parallel_assignment.rb +3 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -2
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
- data/lib/rubocop/cop/style/symbol_array.rb +5 -5
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
- data/lib/rubocop/cop/team.rb +105 -81
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cop/utils/format_string.rb +19 -2
- data/lib/rubocop/cop/variable_force/variable.rb +5 -3
- data/lib/rubocop/file_finder.rb +12 -12
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +15 -8
- data/lib/rubocop/path_util.rb +4 -19
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +6 -9
- data/lib/rubocop/result_cache.rb +12 -8
- data/lib/rubocop/rspec/cop_helper.rb +4 -4
- data/lib/rubocop/rspec/expect_offense.rb +65 -21
- data/lib/rubocop/rspec/shared_contexts.rb +19 -16
- data/lib/rubocop/runner.rb +34 -33
- data/lib/rubocop/target_finder.rb +3 -3
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +1 -1
- metadata +34 -9
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
@@ -109,7 +109,7 @@ module RuboCop
|
|
109
109
|
|
110
110
|
def own_line_comment?(comment)
|
111
111
|
own_line = processed_source.lines[comment.loc.line - 1]
|
112
|
-
|
112
|
+
/\A\s*#/.match?(own_line)
|
113
113
|
end
|
114
114
|
|
115
115
|
def line_after_comment(comment)
|
@@ -129,11 +129,11 @@ module RuboCop
|
|
129
129
|
end
|
130
130
|
|
131
131
|
def less_indented?(line)
|
132
|
-
|
132
|
+
/^\s*(end\b|[)}\]])/.match?(line)
|
133
133
|
end
|
134
134
|
|
135
135
|
def two_alternatives?(line)
|
136
|
-
|
136
|
+
/^\s*(else|elsif|when|rescue|ensure)\b/.match?(line)
|
137
137
|
end
|
138
138
|
end
|
139
139
|
end
|
@@ -62,6 +62,7 @@ module RuboCop
|
|
62
62
|
#
|
63
63
|
class EmptyLinesAroundAttributeAccessor < Cop
|
64
64
|
include RangeHelp
|
65
|
+
include AllowedMethods
|
65
66
|
|
66
67
|
MSG = 'Add an empty line after attribute accessor.'
|
67
68
|
|
@@ -96,6 +97,8 @@ module RuboCop
|
|
96
97
|
end
|
97
98
|
|
98
99
|
def next_line_node(node)
|
100
|
+
return if node.parent.if_type?
|
101
|
+
|
99
102
|
node.parent.children[node.sibling_index + 1]
|
100
103
|
end
|
101
104
|
|
@@ -112,14 +115,6 @@ module RuboCop
|
|
112
115
|
def allow_alias_syntax?
|
113
116
|
cop_config.fetch('AllowAliasSyntax', true)
|
114
117
|
end
|
115
|
-
|
116
|
-
def allowed_method?(name)
|
117
|
-
allowed_methods.include?(name.to_s)
|
118
|
-
end
|
119
|
-
|
120
|
-
def allowed_methods
|
121
|
-
cop_config.fetch('AllowedMethods', [])
|
122
|
-
end
|
123
118
|
end
|
124
119
|
end
|
125
120
|
end
|
@@ -150,9 +150,10 @@ module RuboCop
|
|
150
150
|
end
|
151
151
|
|
152
152
|
def alignment_node(node)
|
153
|
-
|
153
|
+
case style
|
154
|
+
when :keyword
|
154
155
|
node
|
155
|
-
|
156
|
+
when :variable
|
156
157
|
alignment_node_for_variable_style(node)
|
157
158
|
else
|
158
159
|
start_line_range(node)
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
65
65
|
|
66
66
|
# If there is no LF on the last line, we don't care if there's no CR.
|
67
67
|
def unimportant_missing_cr?(index, last_line, line)
|
68
|
-
style == :crlf && index == last_line - 1 && line
|
68
|
+
style == :crlf && index == last_line - 1 && !/\n$/.match?(line)
|
69
69
|
end
|
70
70
|
|
71
71
|
def offense_message(line)
|
@@ -168,7 +168,7 @@ module RuboCop
|
|
168
168
|
|
169
169
|
send_node = arg_node.parent
|
170
170
|
text = base_range(send_node, arg_node).source.strip
|
171
|
-
base = if text
|
171
|
+
base = if !/\n/.match?(text) && special_inner_call_indentation?(send_node)
|
172
172
|
"`#{text}`"
|
173
173
|
elsif comment_line?(text.lines.reverse_each.first)
|
174
174
|
'the start of the previous line (not counting the comment)'
|
@@ -241,6 +241,10 @@ module RuboCop
|
|
241
241
|
.select { |c| begins_its_line?(c.loc.expression) }
|
242
242
|
.map { |c| c.loc.line }
|
243
243
|
end
|
244
|
+
|
245
|
+
def on_new_investigation
|
246
|
+
@comment_lines = nil
|
247
|
+
end
|
244
248
|
end
|
245
249
|
end
|
246
250
|
end
|
@@ -200,7 +200,7 @@ module RuboCop
|
|
200
200
|
alias on_super on_send
|
201
201
|
alias on_yield on_send
|
202
202
|
|
203
|
-
def on_hash(node)
|
203
|
+
def on_hash(node) # rubocop:todo Metrics/CyclomaticComplexity
|
204
204
|
return if ignored_node?(node)
|
205
205
|
return if node.pairs.empty? || node.single_line?
|
206
206
|
|
@@ -219,8 +219,7 @@ module RuboCop
|
|
219
219
|
correct_node(node, delta)
|
220
220
|
end
|
221
221
|
|
222
|
-
attr_accessor :offences_by
|
223
|
-
attr_accessor :column_deltas
|
222
|
+
attr_accessor :offences_by, :column_deltas
|
224
223
|
|
225
224
|
private
|
226
225
|
|
@@ -147,7 +147,7 @@ module RuboCop
|
|
147
147
|
def indent_level(str)
|
148
148
|
indentations = str.lines
|
149
149
|
.map { |line| line[/^\s*/] }
|
150
|
-
.reject { |line| line
|
150
|
+
.reject { |line| line.end_with?("\n") }
|
151
151
|
indentations.empty? ? 0 : indentations.min_by(&:size).size
|
152
152
|
end
|
153
153
|
|
@@ -95,17 +95,27 @@ module RuboCop
|
|
95
95
|
end
|
96
96
|
|
97
97
|
def line_break_necessary_in_args?(node)
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
98
|
+
needed_length_for_args(node) > max_line_length
|
99
|
+
end
|
100
|
+
|
101
|
+
def needed_length_for_args(node)
|
102
|
+
node.source_range.column +
|
103
|
+
characters_needed_for_space_and_pipes(node) +
|
104
|
+
node.source.lines.first.chomp.length +
|
105
|
+
block_arg_string(node, node.arguments).length
|
106
|
+
end
|
107
|
+
|
108
|
+
def characters_needed_for_space_and_pipes(node)
|
109
|
+
if node.source.lines.first.end_with?("|\n")
|
110
|
+
PIPE_SIZE
|
111
|
+
else
|
112
|
+
1 + PIPE_SIZE * 2
|
113
|
+
end
|
103
114
|
end
|
104
115
|
|
105
116
|
def add_offense_for_expression(node, expr, msg)
|
106
117
|
expression = expr.source_range
|
107
118
|
range = range_between(expression.begin_pos, expression.end_pos)
|
108
|
-
|
109
119
|
add_offense(node, location: range, message: msg)
|
110
120
|
end
|
111
121
|
|
@@ -121,7 +131,7 @@ module RuboCop
|
|
121
131
|
end
|
122
132
|
|
123
133
|
def autocorrect_body(corrector, node, block_body)
|
124
|
-
first_node = if block_body.begin_type?
|
134
|
+
first_node = if block_body.begin_type? && !block_body.source.start_with?('(')
|
125
135
|
block_body.children.first
|
126
136
|
else
|
127
137
|
block_body
|
@@ -24,9 +24,10 @@ module RuboCop
|
|
24
24
|
# # good
|
25
25
|
# {}.each { | x, y | puts x }
|
26
26
|
# ->( x, y ) { puts x }
|
27
|
-
class SpaceAroundBlockParameters <
|
27
|
+
class SpaceAroundBlockParameters < Base
|
28
28
|
include ConfigurableEnforcedStyle
|
29
29
|
include RangeHelp
|
30
|
+
extend AutoCorrector
|
30
31
|
|
31
32
|
def on_block(node)
|
32
33
|
arguments = node.arguments
|
@@ -38,23 +39,6 @@ module RuboCop
|
|
38
39
|
check_each_arg(arguments)
|
39
40
|
end
|
40
41
|
|
41
|
-
# @param target [RuboCop::AST::Node,Parser::Source::Range]
|
42
|
-
def autocorrect(target)
|
43
|
-
lambda do |corrector|
|
44
|
-
if target.is_a?(RuboCop::AST::Node)
|
45
|
-
if target.parent.children.first == target
|
46
|
-
corrector.insert_before(target, ' ')
|
47
|
-
else
|
48
|
-
corrector.insert_after(target, ' ')
|
49
|
-
end
|
50
|
-
elsif /^\s+$/.match?(target.source)
|
51
|
-
corrector.remove(target)
|
52
|
-
else
|
53
|
-
corrector.insert_after(target, ' ')
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
42
|
private
|
59
43
|
|
60
44
|
def pipes(arguments)
|
@@ -72,11 +56,12 @@ module RuboCop
|
|
72
56
|
def check_inside_pipes(arguments)
|
73
57
|
opening_pipe, closing_pipe = pipes(arguments)
|
74
58
|
|
75
|
-
|
59
|
+
case style
|
60
|
+
when :no_space
|
76
61
|
check_no_space_style_inside_pipes(arguments.children,
|
77
62
|
opening_pipe,
|
78
63
|
closing_pipe)
|
79
|
-
|
64
|
+
when :space
|
80
65
|
check_space_style_inside_pipes(arguments.children,
|
81
66
|
opening_pipe,
|
82
67
|
closing_pipe)
|
@@ -97,7 +82,7 @@ module RuboCop
|
|
97
82
|
|
98
83
|
check_no_space(opening_pipe.end_pos, first.begin_pos,
|
99
84
|
'Space before first')
|
100
|
-
check_no_space(last_end_pos_inside_pipes(last
|
85
|
+
check_no_space(last_end_pos_inside_pipes(last),
|
101
86
|
closing_pipe.begin_pos, 'Space after last')
|
102
87
|
end
|
103
88
|
|
@@ -118,7 +103,7 @@ module RuboCop
|
|
118
103
|
|
119
104
|
def check_closing_pipe_space(args, closing_pipe)
|
120
105
|
last = args.last.source_range
|
121
|
-
last_end_pos = last_end_pos_inside_pipes(last
|
106
|
+
last_end_pos = last_end_pos_inside_pipes(last)
|
122
107
|
|
123
108
|
check_space(last_end_pos, closing_pipe.begin_pos, last,
|
124
109
|
'after last block parameter')
|
@@ -126,8 +111,9 @@ module RuboCop
|
|
126
111
|
'Extra space after last')
|
127
112
|
end
|
128
113
|
|
129
|
-
def last_end_pos_inside_pipes(
|
130
|
-
|
114
|
+
def last_end_pos_inside_pipes(range)
|
115
|
+
pos = range.end_pos
|
116
|
+
range.source_buffer.source[pos] == ',' ? pos + 1 : pos
|
131
117
|
end
|
132
118
|
|
133
119
|
def check_each_arg(args)
|
@@ -151,7 +137,14 @@ module RuboCop
|
|
151
137
|
return if space_begin_pos != space_end_pos
|
152
138
|
|
153
139
|
target = node || range
|
154
|
-
|
140
|
+
message = "Space #{msg} missing."
|
141
|
+
add_offense(target, message: message) do |corrector|
|
142
|
+
if node
|
143
|
+
corrector.insert_before(node, ' ')
|
144
|
+
else
|
145
|
+
corrector.insert_after(target, ' ')
|
146
|
+
end
|
147
|
+
end
|
155
148
|
end
|
156
149
|
|
157
150
|
def check_no_space(space_begin_pos, space_end_pos, msg)
|
@@ -160,8 +153,10 @@ module RuboCop
|
|
160
153
|
range = range_between(space_begin_pos, space_end_pos)
|
161
154
|
return if range.source.include?("\n")
|
162
155
|
|
163
|
-
|
164
|
-
|
156
|
+
message = "#{msg} block parameter detected."
|
157
|
+
add_offense(range, message: message) do |corrector|
|
158
|
+
corrector.remove(range)
|
159
|
+
end
|
165
160
|
end
|
166
161
|
end
|
167
162
|
end
|
@@ -186,7 +186,7 @@ module RuboCop
|
|
186
186
|
pos = range.begin_pos - 1
|
187
187
|
return false if pos.negative?
|
188
188
|
|
189
|
-
|
189
|
+
!/[\s(|{\[;,*=]/.match?(range.source_buffer.source[pos])
|
190
190
|
end
|
191
191
|
|
192
192
|
def space_after_missing?(range)
|
@@ -198,7 +198,7 @@ module RuboCop
|
|
198
198
|
return false if accept_namespace_operator?(range) &&
|
199
199
|
namespace_operator?(range, pos)
|
200
200
|
|
201
|
-
|
201
|
+
!/[\s;,#\\)}\].]/.match?(char)
|
202
202
|
end
|
203
203
|
|
204
204
|
def accepted_opening_delimiter?(range, char)
|
@@ -34,96 +34,55 @@ module RuboCop
|
|
34
34
|
# RuboCop::Cop::Cop
|
35
35
|
# ::RuboCop::Cop
|
36
36
|
#
|
37
|
-
class SpaceAroundMethodCallOperator <
|
38
|
-
include
|
37
|
+
class SpaceAroundMethodCallOperator < Base
|
38
|
+
include RangeHelp
|
39
|
+
extend AutoCorrector
|
40
|
+
|
41
|
+
SPACES_REGEXP = /\A[ \t]+\z/.freeze
|
39
42
|
|
40
43
|
MSG = 'Avoid using spaces around a method call operator.'
|
41
44
|
|
42
45
|
def on_send(node)
|
43
|
-
return unless
|
46
|
+
return unless node.dot? || node.safe_navigation?
|
44
47
|
|
45
|
-
|
48
|
+
check_space_before_dot(node)
|
49
|
+
check_space_after_dot(node)
|
46
50
|
end
|
51
|
+
alias on_csend on_send
|
47
52
|
|
48
53
|
def on_const(node)
|
49
54
|
return unless node.loc.double_colon
|
50
55
|
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
def autocorrect(node)
|
55
|
-
operator = operator_token(node)
|
56
|
-
left = left_token_for_auto_correction(node, operator)
|
57
|
-
right = right_token_for_auto_correction(operator)
|
58
|
-
|
59
|
-
lambda do |corrector|
|
60
|
-
SpaceCorrector.remove_space(
|
61
|
-
processed_source, corrector, left, right
|
62
|
-
)
|
63
|
-
end
|
56
|
+
check_space_after_double_colon(node)
|
64
57
|
end
|
65
58
|
|
66
|
-
alias on_csend on_send
|
67
|
-
|
68
59
|
private
|
69
60
|
|
70
|
-
def
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
if !right.comment? && valid_right_token?(right, operator)
|
76
|
-
no_space_offenses(node, operator, right, MSG)
|
77
|
-
end
|
78
|
-
return unless valid_left_token?(left, operator)
|
79
|
-
|
80
|
-
no_space_offenses(node, left, operator, MSG) if add_left_offense
|
81
|
-
end
|
82
|
-
|
83
|
-
def operator_token(node)
|
84
|
-
operator_location =
|
85
|
-
node.const_type? ? node.loc.double_colon : node.loc.dot
|
86
|
-
|
87
|
-
processed_source.find_token do |token|
|
88
|
-
token.pos == operator_location
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def previous_token(current_token)
|
93
|
-
index = processed_source.tokens.index(current_token)
|
94
|
-
index.zero? ? nil : processed_source.tokens[index - 1]
|
95
|
-
end
|
96
|
-
|
97
|
-
def next_token(current_token)
|
98
|
-
index = processed_source.tokens.index(current_token)
|
99
|
-
processed_source.tokens[index + 1]
|
100
|
-
end
|
101
|
-
|
102
|
-
def dot_or_safe_navigation_operator?(node)
|
103
|
-
node.dot? || node.safe_navigation?
|
61
|
+
def check_space_before_dot(node)
|
62
|
+
receiver_pos = node.receiver.source_range.end_pos
|
63
|
+
dot_pos = node.loc.dot.begin_pos
|
64
|
+
check_space(receiver_pos, dot_pos)
|
104
65
|
end
|
105
66
|
|
106
|
-
def
|
107
|
-
|
67
|
+
def check_space_after_dot(node)
|
68
|
+
dot_pos = node.loc.dot.end_pos
|
69
|
+
selector_pos = node.loc.selector.begin_pos
|
70
|
+
check_space(dot_pos, selector_pos)
|
108
71
|
end
|
109
72
|
|
110
|
-
def
|
111
|
-
|
73
|
+
def check_space_after_double_colon(node)
|
74
|
+
double_colon_pos = node.loc.double_colon.end_pos
|
75
|
+
name_pos = node.loc.name.begin_pos
|
76
|
+
check_space(double_colon_pos, name_pos)
|
112
77
|
end
|
113
78
|
|
114
|
-
def
|
115
|
-
|
116
|
-
return operator if node.const_type?
|
117
|
-
return left_token if valid_left_token?(left_token, operator)
|
118
|
-
|
119
|
-
operator
|
120
|
-
end
|
79
|
+
def check_space(begin_pos, end_pos)
|
80
|
+
return if end_pos <= begin_pos
|
121
81
|
|
122
|
-
|
123
|
-
|
124
|
-
return right_token if !right_token.comment? && valid_right_token?(right_token, operator)
|
82
|
+
range = range_between(begin_pos, end_pos)
|
83
|
+
return unless range.source.match?(SPACES_REGEXP)
|
125
84
|
|
126
|
-
|
85
|
+
add_offense(range) { |corrector| corrector.remove(range) }
|
127
86
|
end
|
128
87
|
end
|
129
88
|
end
|