rubocop 0.74.0 → 0.78.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 +3 -2
- data/config/default.yml +366 -318
- data/lib/rubocop.rb +48 -32
- data/lib/rubocop/ast/builder.rb +1 -0
- data/lib/rubocop/ast/node.rb +5 -1
- data/lib/rubocop/ast/node/block_node.rb +2 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -12
- data/lib/rubocop/ast/node/return_node.rb +24 -0
- data/lib/rubocop/cli.rb +11 -227
- data/lib/rubocop/cli/command.rb +21 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
- data/lib/rubocop/cli/command/base.rb +33 -0
- data/lib/rubocop/cli/command/execute_runner.rb +76 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
- data/lib/rubocop/cli/command/show_cops.rb +73 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/comment_config.rb +5 -4
- data/lib/rubocop/config.rb +12 -1
- data/lib/rubocop/config_loader.rb +21 -3
- data/lib/rubocop/config_loader_resolver.rb +4 -3
- data/lib/rubocop/config_obsoletion.rb +85 -11
- data/lib/rubocop/config_validator.rb +28 -19
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
- data/lib/rubocop/cop/commissioner.rb +15 -7
- data/lib/rubocop/cop/cop.rb +35 -9
- data/lib/rubocop/cop/corrector.rb +8 -7
- 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/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -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/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
- data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +11 -2
- 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/comment_indentation.rb +10 -13
- data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -7
- data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
- data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
- data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
- data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +6 -6
- data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -0
- data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
- 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/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
- data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
- data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
- data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
- data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
- data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
- data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +7 -26
- data/lib/rubocop/cop/message_annotator.rb +16 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
- data/lib/rubocop/cop/migration/department_name.rb +44 -0
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
- data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
- data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
- data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +12 -5
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
- data/lib/rubocop/cop/naming/method_name.rb +12 -1
- data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
- data/lib/rubocop/cop/naming/variable_name.rb +1 -0
- data/lib/rubocop/cop/offense.rb +29 -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/alias.rb +1 -1
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +10 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
- data/lib/rubocop/cop/style/commented_keyword.rb +8 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
- data/lib/rubocop/cop/style/copyright.rb +11 -7
- data/lib/rubocop/cop/style/documentation_method.rb +44 -0
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +5 -5
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
- data/lib/rubocop/cop/style/format_string.rb +10 -7
- data/lib/rubocop/cop/style/format_string_token.rb +19 -68
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
- data/lib/rubocop/cop/style/guard_clause.rb +3 -2
- data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +93 -15
- data/lib/rubocop/cop/style/infinite_loop.rb +6 -5
- data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
- data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
- data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- 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/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
- data/lib/rubocop/cop/style/next.rb +5 -5
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
- data/lib/rubocop/cop/style/option_hash.rb +3 -3
- 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/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
- data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
- data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
- data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +39 -29
- data/lib/rubocop/cop/style/redundant_self.rb +18 -1
- data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
- data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
- data/lib/rubocop/cop/style/semicolon.rb +13 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
- data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/team.rb +5 -0
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +120 -0
- data/lib/rubocop/cop/variable_force.rb +7 -5
- data/lib/rubocop/cop/variable_force/variable.rb +15 -2
- data/lib/rubocop/core_ext/string.rb +0 -24
- data/lib/rubocop/formatter/base_formatter.rb +2 -2
- data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
- data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
- data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +16 -15
- data/lib/rubocop/formatter/json_formatter.rb +6 -5
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
- data/lib/rubocop/formatter/tap_formatter.rb +18 -7
- data/lib/rubocop/magic_comment.rb +4 -0
- data/lib/rubocop/node_pattern.rb +4 -2
- data/lib/rubocop/options.rb +21 -26
- data/lib/rubocop/processed_source.rb +1 -1
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/result_cache.rb +24 -8
- data/lib/rubocop/runner.rb +60 -33
- data/lib/rubocop/target_finder.rb +12 -6
- data/lib/rubocop/version.rb +1 -1
- metadata +48 -33
- data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
- data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
'on the same line as the assignment operator `=`.'
|
44
44
|
|
45
45
|
def check_assignment(node, rhs)
|
46
|
-
return if node.send_type?
|
46
|
+
return if node.send_type? && node.loc.operator&.source != '='
|
47
47
|
return unless rhs
|
48
48
|
return unless supported_types.include?(rhs.type)
|
49
49
|
return if rhs.first_line == rhs.last_line
|
@@ -5,7 +5,9 @@ module RuboCop
|
|
5
5
|
module Layout
|
6
6
|
# This cop checks whether the multiline do end blocks have a newline
|
7
7
|
# after the start of the block. Additionally, it checks whether the block
|
8
|
-
# arguments, if any, are on the same line as the start of the
|
8
|
+
# arguments, if any, are on the same line as the start of the
|
9
|
+
# block. Putting block arguments on separate lines, because the whole
|
10
|
+
# line would otherwise be too long, is accepted.
|
9
11
|
#
|
10
12
|
# @example
|
11
13
|
# # bad
|
@@ -35,6 +37,17 @@ module RuboCop
|
|
35
37
|
# foo(i)
|
36
38
|
# bar(i)
|
37
39
|
# }
|
40
|
+
#
|
41
|
+
# # good
|
42
|
+
# blah { |
|
43
|
+
# long_list,
|
44
|
+
# of_parameters,
|
45
|
+
# that_would_not,
|
46
|
+
# fit_on_one_line
|
47
|
+
# |
|
48
|
+
# foo(i)
|
49
|
+
# bar(i)
|
50
|
+
# }
|
38
51
|
class MultilineBlockLayout < Cop
|
39
52
|
include RangeHelp
|
40
53
|
|
@@ -42,11 +55,13 @@ module RuboCop
|
|
42
55
|
'the block start.'
|
43
56
|
ARG_MSG = 'Block argument expression is not on the same line as the ' \
|
44
57
|
'block start.'
|
58
|
+
PIPE_SIZE = '|'.length
|
45
59
|
|
46
60
|
def on_block(node)
|
47
61
|
return if node.single_line?
|
48
62
|
|
49
|
-
unless args_on_beginning_line?(node)
|
63
|
+
unless args_on_beginning_line?(node) ||
|
64
|
+
line_break_necessary_in_args?(node)
|
50
65
|
add_offense_for_expression(node, node.arguments, ARG_MSG)
|
51
66
|
end
|
52
67
|
|
@@ -79,6 +94,13 @@ module RuboCop
|
|
79
94
|
node.loc.begin.line == node.arguments.loc.last_line
|
80
95
|
end
|
81
96
|
|
97
|
+
def line_break_necessary_in_args?(node)
|
98
|
+
needed_length = node.source_range.column +
|
99
|
+
node.source.lines.first.length +
|
100
|
+
block_arg_string(node.arguments).length + PIPE_SIZE
|
101
|
+
needed_length > max_line_length
|
102
|
+
end
|
103
|
+
|
82
104
|
def add_offense_for_expression(node, expr, msg)
|
83
105
|
expression = expr.source_range
|
84
106
|
range = range_between(expression.begin_pos, expression.end_pos)
|
@@ -96,6 +96,7 @@ module RuboCop
|
|
96
96
|
)
|
97
97
|
end
|
98
98
|
|
99
|
+
# rubocop:disable Metrics/AbcSize
|
99
100
|
def alignment_source(node, starting_loc)
|
100
101
|
ending_loc =
|
101
102
|
case node.type
|
@@ -114,6 +115,7 @@ module RuboCop
|
|
114
115
|
|
115
116
|
range_between(starting_loc.begin_pos, ending_loc.end_pos).source
|
116
117
|
end
|
118
|
+
# rubocop:enable Metrics/AbcSize
|
117
119
|
|
118
120
|
# We will use ancestor or wrapper with access modifier.
|
119
121
|
|
@@ -3,7 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks the spacing inside and after block parameters pipes.
|
6
|
+
# Checks the spacing inside and after block parameters pipes. Line breaks
|
7
|
+
# inside parameter pipes are checked by `Layout/MultilineBlockLayout` and
|
8
|
+
# not by this cop.
|
7
9
|
#
|
8
10
|
# @example EnforcedStyleInsidePipes: no_space (default)
|
9
11
|
# # bad
|
@@ -156,6 +158,8 @@ module RuboCop
|
|
156
158
|
return if space_begin_pos >= space_end_pos
|
157
159
|
|
158
160
|
range = range_between(space_begin_pos, space_end_pos)
|
161
|
+
return if range.source.include?("\n")
|
162
|
+
|
159
163
|
add_offense(range, location: range,
|
160
164
|
message: "#{msg} block parameter detected.")
|
161
165
|
end
|
@@ -30,10 +30,12 @@ module RuboCop
|
|
30
30
|
|
31
31
|
DO = 'do'
|
32
32
|
SAFE_NAVIGATION = '&.'
|
33
|
+
NAMESPACE_OPERATOR = '::'
|
33
34
|
ACCEPT_LEFT_PAREN =
|
34
35
|
%w[break defined? next not rescue return super yield].freeze
|
35
36
|
ACCEPT_LEFT_SQUARE_BRACKET =
|
36
37
|
%w[super yield].freeze
|
38
|
+
ACCEPT_NAMESPACE_OPERATOR = 'super'
|
37
39
|
|
38
40
|
def on_and(node)
|
39
41
|
check(node, [:operator].freeze) if node.keyword?
|
@@ -193,6 +195,8 @@ module RuboCop
|
|
193
195
|
|
194
196
|
return false if accepted_opening_delimiter?(range, char)
|
195
197
|
return false if safe_navigation_call?(range, pos)
|
198
|
+
return false if accept_namespace_operator?(range) &&
|
199
|
+
namespace_operator?(range, pos)
|
196
200
|
|
197
201
|
char !~ /[\s;,#\\\)\}\]\.]/
|
198
202
|
end
|
@@ -212,10 +216,18 @@ module RuboCop
|
|
212
216
|
ACCEPT_LEFT_SQUARE_BRACKET.include?(range.source)
|
213
217
|
end
|
214
218
|
|
219
|
+
def accept_namespace_operator?(range)
|
220
|
+
ACCEPT_NAMESPACE_OPERATOR == range.source
|
221
|
+
end
|
222
|
+
|
215
223
|
def safe_navigation_call?(range, pos)
|
216
224
|
range.source_buffer.source[pos, 2].start_with?(SAFE_NAVIGATION)
|
217
225
|
end
|
218
226
|
|
227
|
+
def namespace_operator?(range, pos)
|
228
|
+
range.source_buffer.source[pos, 2].start_with?(NAMESPACE_OPERATOR)
|
229
|
+
end
|
230
|
+
|
219
231
|
def preceded_by_operator?(node, _range)
|
220
232
|
# regular dotted method calls bind more tightly than operators
|
221
233
|
# so we need to climb up the AST past them
|
@@ -3,24 +3,37 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks that operators have space around them, except for **
|
7
|
-
#
|
6
|
+
# Checks that operators have space around them, except for ** which
|
7
|
+
# should or shouldn't have surrounding space depending on configuration.
|
8
8
|
#
|
9
9
|
# @example
|
10
10
|
# # bad
|
11
11
|
# total = 3*4
|
12
12
|
# "apple"+"juice"
|
13
13
|
# my_number = 38/4
|
14
|
-
# a ** b
|
15
14
|
#
|
16
15
|
# # good
|
17
16
|
# total = 3 * 4
|
18
17
|
# "apple" + "juice"
|
19
18
|
# my_number = 38 / 4
|
19
|
+
#
|
20
|
+
# @example EnforcedStyleForExponentOperator: no_space (default)
|
21
|
+
# # bad
|
22
|
+
# a ** b
|
23
|
+
#
|
24
|
+
# # good
|
25
|
+
# a**b
|
26
|
+
#
|
27
|
+
# @example EnforcedStyleForExponentOperator: space
|
28
|
+
# # bad
|
20
29
|
# a**b
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# a ** b
|
21
33
|
class SpaceAroundOperators < Cop
|
22
34
|
include PrecedingFollowingAlignment
|
23
35
|
include RangeHelp
|
36
|
+
include RationalLiteral
|
24
37
|
|
25
38
|
IRREGULAR_METHODS = %i[[] ! []=].freeze
|
26
39
|
EXCESSIVE_SPACE = ' '
|
@@ -53,6 +66,8 @@ module RuboCop
|
|
53
66
|
end
|
54
67
|
|
55
68
|
def on_send(node)
|
69
|
+
return if rational_literal?(node)
|
70
|
+
|
56
71
|
if node.setter_method?
|
57
72
|
on_special_asgn(node)
|
58
73
|
elsif regular_operator?(node)
|
@@ -101,7 +116,7 @@ module RuboCop
|
|
101
116
|
|
102
117
|
def autocorrect(range)
|
103
118
|
lambda do |corrector|
|
104
|
-
if range.source =~ /\*\*/
|
119
|
+
if range.source =~ /\*\*/ && !space_around_exponent_operator?
|
105
120
|
corrector.replace(range, '**')
|
106
121
|
elsif range.source.end_with?("\n")
|
107
122
|
corrector.replace(range, " #{range.source.strip}\n")
|
@@ -138,8 +153,10 @@ module RuboCop
|
|
138
153
|
end
|
139
154
|
|
140
155
|
def offense_message(type, operator, with_space, right_operand)
|
141
|
-
if
|
142
|
-
|
156
|
+
if should_not_have_surrounding_space?(operator)
|
157
|
+
return if with_space.is?(operator.source)
|
158
|
+
|
159
|
+
"Space around operator `#{operator.source}` detected."
|
143
160
|
elsif with_space.source !~ /^\s.*\s$/
|
144
161
|
"Surrounding space missing for operator `#{operator.source}`."
|
145
162
|
elsif excess_leading_space?(type, operator, with_space) ||
|
@@ -169,13 +186,21 @@ module RuboCop
|
|
169
186
|
end
|
170
187
|
|
171
188
|
def align_hash_cop_config
|
172
|
-
config.for_cop('Layout/
|
189
|
+
config.for_cop('Layout/HashAlignment')
|
173
190
|
end
|
174
191
|
|
175
192
|
def hash_table_style?
|
176
193
|
align_hash_cop_config &&
|
177
194
|
align_hash_cop_config['EnforcedHashRocketStyle'] == 'table'
|
178
195
|
end
|
196
|
+
|
197
|
+
def space_around_exponent_operator?
|
198
|
+
cop_config['EnforcedStyleForExponentOperator'] == 'space'
|
199
|
+
end
|
200
|
+
|
201
|
+
def should_not_have_surrounding_space?(operator)
|
202
|
+
operator.is?('**') ? !space_around_exponent_operator? : false
|
203
|
+
end
|
179
204
|
end
|
180
205
|
end
|
181
206
|
end
|
@@ -41,6 +41,14 @@ module RuboCop
|
|
41
41
|
def on_block(node)
|
42
42
|
return if node.keywords?
|
43
43
|
|
44
|
+
# Do not register an offense for multi-line braces when specifying
|
45
|
+
# `EnforcedStyle: no_space`. It will conflict with auto-correction
|
46
|
+
# by `EnforcedStyle: line_count_based` of `Style/BlockDelimiters` cop.
|
47
|
+
# That means preventing auto-correction to incorrect auto-corrected
|
48
|
+
# code.
|
49
|
+
# See: https://github.com/rubocop-hq/rubocop/issues/7534
|
50
|
+
return if conflict_with_block_delimiters?
|
51
|
+
|
44
52
|
left_brace = node.loc.begin
|
45
53
|
space_plus_brace = range_with_surrounding_space(range: left_brace)
|
46
54
|
used_style =
|
@@ -110,6 +118,15 @@ module RuboCop
|
|
110
118
|
end
|
111
119
|
end
|
112
120
|
|
121
|
+
def conflict_with_block_delimiters?
|
122
|
+
block_delimiters_style == 'line_count_based' &&
|
123
|
+
style == :no_space && node.multiline?
|
124
|
+
end
|
125
|
+
|
126
|
+
def block_delimiters_style
|
127
|
+
config.for_cop('Style/BlockDelimiters')['EnforcedStyle']
|
128
|
+
end
|
129
|
+
|
113
130
|
def empty_braces?(loc)
|
114
131
|
loc.begin.end_pos == loc.end.begin_pos
|
115
132
|
end
|
@@ -48,9 +48,7 @@ module RuboCop
|
|
48
48
|
if style == :require_space
|
49
49
|
corrector.insert_before(children[1].source_range, ' ')
|
50
50
|
else
|
51
|
-
|
52
|
-
children[1].source_range.begin_pos)
|
53
|
-
corrector.remove(space_range)
|
51
|
+
corrector.remove(space_after_arrow(lambda_node))
|
54
52
|
end
|
55
53
|
end
|
56
54
|
end
|
@@ -62,10 +60,14 @@ module RuboCop
|
|
62
60
|
end
|
63
61
|
|
64
62
|
def space_after_arrow?(lambda_node)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
63
|
+
!space_after_arrow(lambda_node).empty?
|
64
|
+
end
|
65
|
+
|
66
|
+
def space_after_arrow(lambda_node)
|
67
|
+
arrow = lambda_node.parent.children[0].source_range
|
68
|
+
parentheses = lambda_node.parent.children[1].source_range
|
69
|
+
|
70
|
+
arrow.end.join(parentheses.begin)
|
69
71
|
end
|
70
72
|
|
71
73
|
def range_of_offense(node)
|
@@ -132,7 +132,7 @@ module RuboCop
|
|
132
132
|
line, col = line_and_column_for(token)
|
133
133
|
return true if col == -1
|
134
134
|
|
135
|
-
processed_source.lines[line][0..col]
|
135
|
+
processed_source.lines[line][0..col] !~ /\S/
|
136
136
|
end
|
137
137
|
|
138
138
|
def index_for(node, token)
|
@@ -210,18 +210,21 @@ module RuboCop
|
|
210
210
|
|
211
211
|
def compact_corrections(corrector, node, left, right)
|
212
212
|
if qualifies_for_compact?(node, left, side: :left)
|
213
|
-
|
214
|
-
corrector.remove(range)
|
213
|
+
compact(corrector, left, :right)
|
215
214
|
elsif !left.space_after?
|
216
215
|
corrector.insert_after(left.pos, ' ')
|
217
216
|
end
|
218
217
|
if qualifies_for_compact?(node, right)
|
219
|
-
|
220
|
-
corrector.remove(range)
|
218
|
+
compact(corrector, right, :left)
|
221
219
|
elsif !right.space_before?
|
222
220
|
corrector.insert_before(right.pos, ' ')
|
223
221
|
end
|
224
222
|
end
|
223
|
+
|
224
|
+
def compact(corrector, bracket, side)
|
225
|
+
range = side_space_range(range: bracket.pos, side: side)
|
226
|
+
corrector.remove(range)
|
227
|
+
end
|
225
228
|
end
|
226
229
|
end
|
227
230
|
end
|
@@ -84,6 +84,13 @@ module RuboCop
|
|
84
84
|
def on_block(node)
|
85
85
|
return if node.keywords?
|
86
86
|
|
87
|
+
# Do not register an offense for multi-line empty braces. That means
|
88
|
+
# preventing auto-correction to single-line empty braces. It will
|
89
|
+
# conflict with auto-correction by `Layout/SpaceInsideBlockBraces` cop
|
90
|
+
# if auto-corrected to a single-line empty braces.
|
91
|
+
# See: https://github.com/rubocop-hq/rubocop/issues/7363
|
92
|
+
return if node.body.nil? && node.multiline?
|
93
|
+
|
87
94
|
left_brace = node.loc.begin
|
88
95
|
right_brace = node.loc.end
|
89
96
|
|
@@ -72,7 +72,7 @@ module RuboCop
|
|
72
72
|
# If the second token is a comment, that means that a line break
|
73
73
|
# follows, and that the rules for space inside don't apply.
|
74
74
|
next if token2.comment?
|
75
|
-
next unless token2
|
75
|
+
next unless same_line?(token1, token2) && token1.space_after?
|
76
76
|
|
77
77
|
yield range_between(token1.end_pos, token2.begin_pos)
|
78
78
|
end
|
@@ -82,17 +82,18 @@ module RuboCop
|
|
82
82
|
tokens.each_cons(2) do |token1, token2|
|
83
83
|
next if can_be_ignored?(token1, token2)
|
84
84
|
|
85
|
-
next unless token2.line == token1.line && !token1.space_after?
|
86
|
-
|
87
85
|
if token1.left_parens?
|
88
86
|
yield range_between(token2.begin_pos, token2.begin_pos + 1)
|
89
|
-
|
90
87
|
elsif token2.right_parens?
|
91
88
|
yield range_between(token2.begin_pos, token2.end_pos)
|
92
89
|
end
|
93
90
|
end
|
94
91
|
end
|
95
92
|
|
93
|
+
def same_line?(token1, token2)
|
94
|
+
token1.line == token2.line
|
95
|
+
end
|
96
|
+
|
96
97
|
def parens?(token1, token2)
|
97
98
|
token1.left_parens? || token2.right_parens?
|
98
99
|
end
|
@@ -104,8 +105,7 @@ module RuboCop
|
|
104
105
|
# follows, and that the rules for space inside don't apply.
|
105
106
|
return true if token2.comment?
|
106
107
|
|
107
|
-
|
108
|
-
return true if token1.left_parens? && token2.right_parens?
|
108
|
+
return true unless same_line?(token1, token2) && !token1.space_after?
|
109
109
|
end
|
110
110
|
end
|
111
111
|
end
|
@@ -14,6 +14,20 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# x = 0
|
16
16
|
#
|
17
|
+
# @example AllowInHeredoc: false (default)
|
18
|
+
# # The line in this example contains spaces after the 0.
|
19
|
+
# # bad
|
20
|
+
# code = <<~RUBY
|
21
|
+
# x = 0
|
22
|
+
# RUBY
|
23
|
+
#
|
24
|
+
# @example AllowInHeredoc: true
|
25
|
+
# # The line in this example contains spaces after the 0.
|
26
|
+
# # good
|
27
|
+
# code = <<~RUBY
|
28
|
+
# x = 0
|
29
|
+
# RUBY
|
30
|
+
#
|
17
31
|
class TrailingWhitespace < Cop
|
18
32
|
include RangeHelp
|
19
33
|
|
@@ -22,11 +36,13 @@ module RuboCop
|
|
22
36
|
def investigate(processed_source)
|
23
37
|
heredoc_ranges = extract_heredoc_ranges(processed_source.ast)
|
24
38
|
processed_source.lines.each_with_index do |line, index|
|
39
|
+
lineno = index + 1
|
40
|
+
|
25
41
|
next unless line.end_with?(' ', "\t")
|
26
|
-
next if skip_heredoc? && inside_heredoc?(heredoc_ranges,
|
42
|
+
next if skip_heredoc? && inside_heredoc?(heredoc_ranges, lineno)
|
27
43
|
|
28
44
|
range = source_range(processed_source.buffer,
|
29
|
-
|
45
|
+
lineno,
|
30
46
|
(line.rstrip.length)...(line.length))
|
31
47
|
|
32
48
|
add_offense(range, location: range)
|