rubocop 0.52.1 → 0.53.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/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/config/default.yml +118 -46
- data/config/disabled.yml +8 -8
- data/config/enabled.yml +84 -28
- data/lib/rubocop.rb +28 -8
- data/lib/rubocop/ast/builder.rb +35 -37
- data/lib/rubocop/ast/node.rb +16 -1
- data/lib/rubocop/ast/node/and_node.rb +0 -8
- data/lib/rubocop/ast/node/block_node.rb +1 -9
- data/lib/rubocop/ast/node/case_node.rb +0 -8
- data/lib/rubocop/ast/node/ensure_node.rb +0 -8
- data/lib/rubocop/ast/node/for_node.rb +0 -8
- data/lib/rubocop/ast/node/or_node.rb +0 -8
- data/lib/rubocop/ast/node/pair_node.rb +0 -8
- data/lib/rubocop/ast/node/resbody_node.rb +0 -8
- data/lib/rubocop/ast/node/send_node.rb +0 -8
- data/lib/rubocop/ast/node/symbol_node.rb +0 -8
- data/lib/rubocop/ast/node/until_node.rb +0 -8
- data/lib/rubocop/ast/node/when_node.rb +0 -8
- data/lib/rubocop/ast/node/while_node.rb +0 -8
- data/lib/rubocop/cli.rb +17 -7
- data/lib/rubocop/comment_config.rb +24 -3
- data/lib/rubocop/config.rb +75 -6
- data/lib/rubocop/config_loader.rb +18 -28
- data/lib/rubocop/config_loader_resolver.rb +61 -9
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -2
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/commissioner.rb +2 -2
- data/lib/rubocop/cop/cop.rb +4 -0
- data/lib/rubocop/cop/corrector.rb +11 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +59 -0
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +13 -0
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -1
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +3 -5
- data/lib/rubocop/cop/generator.rb +29 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +2 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -0
- data/lib/rubocop/cop/layout/align_hash.rb +106 -37
- data/lib/rubocop/cop/{lint → layout}/block_alignment.rb +8 -5
- data/lib/rubocop/cop/layout/block_end_newline.rb +7 -17
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +6 -7
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/{lint → layout}/condition_position.rb +3 -3
- data/lib/rubocop/cop/{lint → layout}/def_end_alignment.rb +2 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +140 -0
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines.rb +3 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +7 -5
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +20 -10
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +20 -0
- data/lib/rubocop/cop/{lint → layout}/end_alignment.rb +37 -6
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -0
- data/lib/rubocop/cop/layout/extra_spacing.rb +30 -37
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -0
- data/lib/rubocop/cop/layout/indent_heredoc.rb +38 -2
- data/lib/rubocop/cop/layout/indentation_consistency.rb +105 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +4 -3
- data/lib/rubocop/cop/layout/initial_indentation.rb +15 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +4 -2
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +62 -29
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +74 -33
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +16 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -0
- data/lib/rubocop/cop/layout/space_after_not.rb +2 -0
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -0
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +15 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +15 -13
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +13 -1
- data/lib/rubocop/cop/layout/space_before_comment.rb +6 -4
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +30 -45
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +3 -2
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +48 -18
- data/lib/rubocop/cop/layout/space_inside_parens.rb +8 -7
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +57 -11
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -0
- data/lib/rubocop/cop/layout/tab.rb +42 -16
- data/lib/rubocop/cop/layout/trailing_blank_lines.rb +46 -13
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +12 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +5 -3
- data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -2
- data/lib/rubocop/cop/lint/debugger.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +5 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +20 -9
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +16 -10
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +5 -4
- data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
- data/lib/rubocop/cop/lint/literal_as_condition.rb +2 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +2 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +7 -5
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +59 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -2
- data/lib/rubocop/cop/lint/rand_one.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -0
- data/lib/rubocop/cop/lint/rescue_type.rb +6 -3
- data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -21
- data/lib/rubocop/cop/lint/script_permission.rb +30 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -2
- data/lib/rubocop/cop/lint/unified_integer.rb +2 -2
- data/lib/rubocop/cop/lint/{unneeded_disable.rb → unneeded_cop_disable_directive.rb} +13 -7
- data/lib/rubocop/cop/lint/unneeded_cop_enable_directive.rb +97 -0
- data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +3 -3
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +11 -10
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +7 -5
- data/lib/rubocop/cop/lint/useless_assignment.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +49 -10
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/line_length.rb +5 -2
- data/lib/rubocop/cop/mixin/alignment.rb +4 -0
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -1
- data/lib/rubocop/cop/mixin/def_node.rb +4 -0
- data/lib/rubocop/cop/mixin/documentation_comment.rb +11 -3
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +20 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -0
- data/lib/rubocop/cop/mixin/hash_alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/match_range.rb +2 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +6 -0
- data/lib/rubocop/cop/mixin/nil_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +57 -9
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -5
- data/lib/rubocop/cop/mixin/range_help.rb +102 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +1 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -7
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -9
- data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -10
- data/lib/rubocop/cop/mixin/surrounding_space.rb +38 -8
- data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
- data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +104 -0
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -1
- data/lib/rubocop/cop/naming/file_name.rb +5 -10
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +76 -0
- data/lib/rubocop/cop/naming/uncommunicative_block_param_name.rb +48 -0
- data/lib/rubocop/cop/naming/uncommunicative_method_param_name.rb +57 -0
- data/lib/rubocop/cop/offense.rb +3 -2
- data/lib/rubocop/cop/performance/case_when_splat.rb +1 -0
- data/lib/rubocop/cop/performance/casecmp.rb +17 -8
- data/lib/rubocop/cop/performance/compare_with_block.rb +2 -0
- data/lib/rubocop/cop/performance/count.rb +1 -0
- data/lib/rubocop/cop/performance/fixed_size.rb +41 -0
- data/lib/rubocop/cop/performance/flat_map.rb +2 -0
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -0
- data/lib/rubocop/cop/performance/redundant_merge.rb +1 -1
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -0
- data/lib/rubocop/cop/performance/regexp_match.rb +4 -0
- data/lib/rubocop/cop/performance/reverse_each.rb +2 -0
- data/lib/rubocop/cop/performance/string_replacement.rb +2 -0
- data/lib/rubocop/cop/rails/active_record_aliases.rb +46 -0
- data/lib/rubocop/cop/rails/blank.rb +3 -3
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +6 -0
- data/lib/rubocop/cop/rails/delegate.rb +6 -6
- data/lib/rubocop/cop/rails/file_path.rb +7 -1
- data/lib/rubocop/cop/rails/find_by.rb +2 -0
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +17 -5
- data/lib/rubocop/cop/rails/inverse_of.rb +21 -2
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +45 -9
- data/lib/rubocop/cop/rails/presence.rb +8 -2
- data/lib/rubocop/cop/rails/present.rb +5 -5
- data/lib/rubocop/cop/rails/read_write_attribute.rb +4 -3
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -0
- data/lib/rubocop/cop/rails/relative_date_constant.rb +4 -3
- data/lib/rubocop/cop/rails/request_referer.rb +3 -2
- data/lib/rubocop/cop/rails/reversible_migration.rb +9 -8
- data/lib/rubocop/cop/rails/safe_navigation.rb +3 -2
- data/lib/rubocop/cop/rails/save_bang.rb +11 -12
- data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
- data/lib/rubocop/cop/rails/time_zone.rb +38 -16
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +26 -16
- data/lib/rubocop/cop/rails/validation.rb +30 -2
- data/lib/rubocop/cop/security/open.rb +48 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +3 -1
- data/lib/rubocop/cop/style/attr.rb +2 -0
- data/lib/rubocop/cop/style/block_comments.rb +3 -1
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +2 -5
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -0
- data/lib/rubocop/cop/style/class_vars.rb +23 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +6 -4
- data/lib/rubocop/cop/style/commented_keyword.rb +3 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
- data/lib/rubocop/cop/style/copyright.rb +3 -1
- data/lib/rubocop/cop/style/each_with_object.rb +15 -1
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -0
- data/lib/rubocop/cop/style/empty_else.rb +9 -5
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -0
- data/lib/rubocop/cop/style/empty_line_after_guard_clause.rb +80 -0
- data/lib/rubocop/cop/style/empty_literal.rb +1 -0
- data/lib/rubocop/cop/style/encoding.rb +2 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
- data/lib/rubocop/cop/style/for.rb +33 -0
- data/lib/rubocop/cop/style/format_string.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +4 -5
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -0
- data/lib/rubocop/cop/style/missing_else.rb +72 -7
- data/lib/rubocop/cop/style/mixin_usage.rb +3 -5
- data/lib/rubocop/cop/style/module_function.rb +10 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +2 -0
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -0
- data/lib/rubocop/cop/style/next.rb +1 -0
- data/lib/rubocop/cop/style/not.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +2 -2
- data/lib/rubocop/cop/style/redundant_exception.rb +8 -3
- data/lib/rubocop/cop/style/redundant_return.rb +37 -3
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +74 -32
- data/lib/rubocop/cop/style/semicolon.rb +3 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +14 -23
- data/lib/rubocop/cop/style/stderr_puts.rb +2 -0
- data/lib/rubocop/cop/style/string_hash_keys.rb +12 -0
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +29 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +7 -54
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
- data/lib/rubocop/cop/style/{trailing_comma_in_literal.rb → trailing_comma_in_array_literal.rb} +2 -20
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +56 -0
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +17 -20
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -0
- data/lib/rubocop/cop/style/unless_else.rb +2 -0
- data/lib/rubocop/cop/style/word_array.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -0
- data/lib/rubocop/cop/team.rb +5 -5
- data/lib/rubocop/cop/util.rb +23 -188
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/file_finder.rb +45 -0
- data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -14
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +12 -5
- data/lib/rubocop/formatter/json_formatter.rb +1 -1
- data/lib/rubocop/node_pattern.rb +8 -5
- data/lib/rubocop/options.rb +40 -33
- data/lib/rubocop/path_util.rb +5 -8
- data/lib/rubocop/processed_source.rb +53 -0
- data/lib/rubocop/remote_config.rb +1 -1
- data/lib/rubocop/result_cache.rb +1 -1
- data/lib/rubocop/rspec/cop_helper.rb +0 -4
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -4
- data/lib/rubocop/rspec/shared_contexts.rb +3 -1
- data/lib/rubocop/rspec/shared_examples.rb +23 -25
- data/lib/rubocop/rspec/support.rb +5 -0
- data/lib/rubocop/runner.rb +3 -2
- data/lib/rubocop/string_util.rb +10 -9
- data/lib/rubocop/target_finder.rb +4 -1
- data/lib/rubocop/token.rb +26 -16
- data/lib/rubocop/version.rb +6 -4
- metadata +31 -17
- data/lib/rubocop/cop/performance/hash_each_methods.rb +0 -129
@@ -20,6 +20,7 @@ module RuboCop
|
|
20
20
|
# a**b
|
21
21
|
class SpaceAroundOperators < Cop
|
22
22
|
include PrecedingFollowingAlignment
|
23
|
+
include RangeHelp
|
23
24
|
|
24
25
|
IRREGULAR_METHODS = %i[[] ! []=].freeze
|
25
26
|
|
@@ -110,34 +111,35 @@ module RuboCop
|
|
110
111
|
!IRREGULAR_METHODS.include?(send_node.method_name)
|
111
112
|
end
|
112
113
|
|
113
|
-
def check_operator(
|
114
|
-
with_space = range_with_surrounding_space(range:
|
114
|
+
def check_operator(operator, right_operand)
|
115
|
+
with_space = range_with_surrounding_space(range: operator)
|
115
116
|
return if with_space.source.start_with?("\n")
|
116
117
|
|
117
|
-
offense(
|
118
|
-
add_offense(with_space, location:
|
118
|
+
offense(operator, with_space, right_operand) do |msg|
|
119
|
+
add_offense(with_space, location: operator, message: msg)
|
119
120
|
end
|
120
121
|
end
|
121
122
|
|
122
|
-
def offense(
|
123
|
-
msg = offense_message(
|
123
|
+
def offense(operator, with_space, right_operand)
|
124
|
+
msg = offense_message(operator, with_space, right_operand)
|
124
125
|
yield msg if msg
|
125
126
|
end
|
126
127
|
|
127
|
-
def offense_message(
|
128
|
-
if
|
128
|
+
def offense_message(operator, with_space, right_operand)
|
129
|
+
if operator.is?('**')
|
129
130
|
'Space around operator `**` detected.' unless with_space.is?('**')
|
130
131
|
elsif with_space.source !~ /^\s.*\s$/
|
131
|
-
"Surrounding space missing for operator `#{
|
132
|
-
elsif excess_leading_space?(
|
132
|
+
"Surrounding space missing for operator `#{operator.source}`."
|
133
|
+
elsif excess_leading_space?(operator, with_space) ||
|
133
134
|
excess_trailing_space?(right_operand, with_space)
|
134
|
-
"Operator `#{
|
135
|
+
"Operator `#{operator.source}` should be surrounded " \
|
136
|
+
'by a single space.'
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
138
|
-
def excess_leading_space?(
|
140
|
+
def excess_leading_space?(operator, with_space)
|
139
141
|
with_space.source =~ /^ / &&
|
140
|
-
(!allow_for_alignment? || !aligned_with_operator?(
|
142
|
+
(!allow_for_alignment? || !aligned_with_operator?(operator))
|
141
143
|
end
|
142
144
|
|
143
145
|
def excess_trailing_space?(right_operand, with_space)
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
# Checks that block braces have or don't have a space before the opening
|
7
7
|
# brace depending on configuration.
|
8
8
|
#
|
9
|
-
# @example
|
9
|
+
# @example EnforcedStyle: space (default)
|
10
10
|
# # bad
|
11
11
|
# foo.map{ |a|
|
12
12
|
# a.bar.to_s
|
@@ -16,8 +16,20 @@ module RuboCop
|
|
16
16
|
# foo.map { |a|
|
17
17
|
# a.bar.to_s
|
18
18
|
# }
|
19
|
+
#
|
20
|
+
# @example EnforcedStyle: no_space
|
21
|
+
# # bad
|
22
|
+
# foo.map { |a|
|
23
|
+
# a.bar.to_s
|
24
|
+
# }
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# foo.map{ |a|
|
28
|
+
# a.bar.to_s
|
29
|
+
# }
|
19
30
|
class SpaceBeforeBlockBraces < Cop
|
20
31
|
include ConfigurableEnforcedStyle
|
32
|
+
include RangeHelp
|
21
33
|
|
22
34
|
MISSING_MSG = 'Space missing to the left of {.'.freeze
|
23
35
|
DETECTED_MSG = 'Space detected to the left of {.'.freeze
|
@@ -16,10 +16,12 @@ module RuboCop
|
|
16
16
|
MSG = 'Put a space before an end-of-line comment.'.freeze
|
17
17
|
|
18
18
|
def investigate(processed_source)
|
19
|
-
processed_source.tokens.each_cons(2) do |
|
20
|
-
next unless
|
21
|
-
next unless
|
22
|
-
|
19
|
+
processed_source.tokens.each_cons(2) do |token1, token2|
|
20
|
+
next unless token2.comment?
|
21
|
+
next unless token1.line == token2.line
|
22
|
+
if token1.pos.end == token2.pos.begin
|
23
|
+
add_offense(token2.pos, location: token2.pos)
|
24
|
+
end
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
@@ -16,7 +16,7 @@ module RuboCop
|
|
16
16
|
# # good
|
17
17
|
# array = [ a, b, c, d ]
|
18
18
|
#
|
19
|
-
# @example EnforcedStyle: no_space
|
19
|
+
# @example EnforcedStyle: no_space (default)
|
20
20
|
# # The `no_space` style enforces that array literals have
|
21
21
|
# # no surrounding space.
|
22
22
|
#
|
@@ -36,6 +36,32 @@ module RuboCop
|
|
36
36
|
#
|
37
37
|
# # good
|
38
38
|
# array = [ a, [ b, c ]]
|
39
|
+
#
|
40
|
+
#
|
41
|
+
# @example EnforcedStyleForEmptyBrackets: no_space (default)
|
42
|
+
# # The `no_space` EnforcedStyleForEmptyBrackets style enforces that
|
43
|
+
# # empty array brackets do not contain spaces.
|
44
|
+
#
|
45
|
+
# # bad
|
46
|
+
# foo = [ ]
|
47
|
+
# bar = [ ]
|
48
|
+
#
|
49
|
+
# # good
|
50
|
+
# foo = []
|
51
|
+
# bar = []
|
52
|
+
#
|
53
|
+
# @example EnforcedStyleForEmptyBrackets: space
|
54
|
+
# # The `space` EnforcedStyleForEmptyBrackets style enforces that
|
55
|
+
# # empty array brackets contain exactly one space.
|
56
|
+
#
|
57
|
+
# # bad
|
58
|
+
# foo = []
|
59
|
+
# bar = [ ]
|
60
|
+
#
|
61
|
+
# # good
|
62
|
+
# foo = [ ]
|
63
|
+
# bar = [ ]
|
64
|
+
#
|
39
65
|
class SpaceInsideArrayLiteralBrackets < Cop
|
40
66
|
include SurroundingSpace
|
41
67
|
include ConfigurableEnforcedStyle
|
@@ -47,7 +73,7 @@ module RuboCop
|
|
47
73
|
return unless node.square_brackets?
|
48
74
|
left, right = array_brackets(node)
|
49
75
|
if empty_brackets?(left, right)
|
50
|
-
return empty_offenses(node, left, right)
|
76
|
+
return empty_offenses(node, left, right, EMPTY_MSG)
|
51
77
|
end
|
52
78
|
|
53
79
|
start_ok = next_to_newline?(node, left)
|
@@ -61,7 +87,8 @@ module RuboCop
|
|
61
87
|
|
62
88
|
lambda do |corrector|
|
63
89
|
if empty_brackets?(left, right)
|
64
|
-
empty_corrections(
|
90
|
+
SpaceCorrector.empty_corrections(processed_source, corrector,
|
91
|
+
empty_config, left, right)
|
65
92
|
elsif style == :no_space
|
66
93
|
SpaceCorrector.remove_space(processed_source, corrector,
|
67
94
|
left, right)
|
@@ -87,52 +114,10 @@ module RuboCop
|
|
87
114
|
tokens(node).reverse.find(&:right_bracket?)
|
88
115
|
end
|
89
116
|
|
90
|
-
def empty_brackets?(left, right)
|
91
|
-
processed_source.tokens.index(left) ==
|
92
|
-
processed_source.tokens.index(right) - 1
|
93
|
-
end
|
94
|
-
|
95
|
-
def empty_offenses(node, left, right)
|
96
|
-
empty_offense(node, 'Use one') if offending_empty_space?(left, right)
|
97
|
-
return unless offending_empty_no_space?(left, right)
|
98
|
-
empty_offense(node, 'Do not use')
|
99
|
-
end
|
100
|
-
|
101
|
-
def empty_offense(node, command)
|
102
|
-
add_offense(node, message: format(EMPTY_MSG, command: command))
|
103
|
-
end
|
104
|
-
|
105
|
-
def offending_empty_space?(left, right)
|
106
|
-
empty_config == 'space' && !space_between?(left, right)
|
107
|
-
end
|
108
|
-
|
109
|
-
def offending_empty_no_space?(left, right)
|
110
|
-
empty_config == 'no_space' && !no_space_between?(left, right)
|
111
|
-
end
|
112
|
-
|
113
|
-
def space_between?(left, right)
|
114
|
-
left.end_pos + 1 == right.begin_pos
|
115
|
-
end
|
116
|
-
|
117
|
-
def no_space_between?(left, right)
|
118
|
-
left.end_pos == right.begin_pos
|
119
|
-
end
|
120
|
-
|
121
117
|
def empty_config
|
122
118
|
cop_config['EnforcedStyleForEmptyBrackets']
|
123
119
|
end
|
124
120
|
|
125
|
-
def empty_corrections(corrector, left, right)
|
126
|
-
if offending_empty_space?(left, right)
|
127
|
-
range = side_space_range(range: left.pos, side: :right)
|
128
|
-
corrector.remove(range)
|
129
|
-
corrector.insert_after(left.pos, ' ')
|
130
|
-
elsif offending_empty_no_space?(left, right)
|
131
|
-
range = side_space_range(range: left.pos, side: :right)
|
132
|
-
corrector.remove(range)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
121
|
def next_to_newline?(node, token)
|
137
122
|
tokens(node)[index_for(node, token) + 1].line != token.line
|
138
123
|
end
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
#
|
44
44
|
# @example EnforcedStyleForEmptyBraces: space
|
45
45
|
# # The `space` EnforcedStyleForEmptyBraces style enforces that
|
46
|
-
# # block braces have at least a
|
46
|
+
# # block braces have at least a space in between when empty.
|
47
47
|
#
|
48
48
|
# # bad
|
49
49
|
# some_array.each {}
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
65
65
|
# # good
|
66
66
|
# [1, 2, 3].each { |n| n * 2 }
|
67
67
|
#
|
68
|
-
# @example SpaceBeforeBlockParameters:
|
68
|
+
# @example SpaceBeforeBlockParameters: false
|
69
69
|
# # The SpaceBeforeBlockParameters style set to `false` enforces that
|
70
70
|
# # there is no space between `{` and `|`. Overrides `EnforcedStyle`
|
71
71
|
# # if there is a conflict.
|
@@ -79,6 +79,7 @@ module RuboCop
|
|
79
79
|
class SpaceInsideBlockBraces < Cop
|
80
80
|
include ConfigurableEnforcedStyle
|
81
81
|
include SurroundingSpace
|
82
|
+
include RangeHelp
|
82
83
|
|
83
84
|
def on_block(node)
|
84
85
|
return if node.keywords?
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
# Checks that braces used for hash literals have or don't have
|
7
7
|
# surrounding space depending on configuration.
|
8
8
|
#
|
9
|
-
# @example EnforcedStyle: space
|
9
|
+
# @example EnforcedStyle: space (default)
|
10
10
|
# # The `space` style enforces that hash literals have
|
11
11
|
# # surrounding space.
|
12
12
|
#
|
@@ -36,11 +36,38 @@ module RuboCop
|
|
36
36
|
#
|
37
37
|
# # good
|
38
38
|
# h = { a: { b: 2 }}
|
39
|
+
#
|
40
|
+
#
|
41
|
+
# @example EnforcedStyleForEmptyBraces: no_space (default)
|
42
|
+
# # The `no_space` EnforcedStyleForEmptyBraces style enforces that
|
43
|
+
# # empty hash braces do not contain spaces.
|
44
|
+
#
|
45
|
+
# # bad
|
46
|
+
# foo = { }
|
47
|
+
# bar = { }
|
48
|
+
#
|
49
|
+
# # good
|
50
|
+
# foo = {}
|
51
|
+
# bar = {}
|
52
|
+
#
|
53
|
+
# @example EnforcedStyleForEmptyBraces: space
|
54
|
+
# # The `space` EnforcedStyleForEmptyBraces style enforces that
|
55
|
+
# # empty hash braces contain space.
|
56
|
+
#
|
57
|
+
# # bad
|
58
|
+
# foo = {}
|
59
|
+
#
|
60
|
+
# # good
|
61
|
+
# foo = { }
|
62
|
+
# foo = { }
|
63
|
+
# foo = { }
|
64
|
+
#
|
39
65
|
class SpaceInsideHashLiteralBraces < Cop
|
40
66
|
include SurroundingSpace
|
41
67
|
include ConfigurableEnforcedStyle
|
68
|
+
include RangeHelp
|
42
69
|
|
43
|
-
MSG = 'Space inside
|
70
|
+
MSG = 'Space inside %<problem>s.'.freeze
|
44
71
|
|
45
72
|
def on_hash(node)
|
46
73
|
tokens = processed_source.tokens
|
@@ -83,24 +110,25 @@ module RuboCop
|
|
83
110
|
yield begin_index, end_index
|
84
111
|
end
|
85
112
|
|
86
|
-
def check(
|
113
|
+
def check(token1, token2)
|
87
114
|
# No offense if line break inside.
|
88
|
-
return if
|
89
|
-
return if
|
115
|
+
return if token1.line < token2.line
|
116
|
+
return if token2.comment? # Also indicates there's a line break.
|
90
117
|
|
91
|
-
is_empty_braces =
|
92
|
-
expect_space = expect_space?(
|
118
|
+
is_empty_braces = token1.left_brace? && token2.right_curly_brace?
|
119
|
+
expect_space = expect_space?(token1, token2)
|
93
120
|
|
94
|
-
if offense?(
|
95
|
-
incorrect_style_detected(
|
121
|
+
if offense?(token1, expect_space)
|
122
|
+
incorrect_style_detected(token1, token2,
|
123
|
+
expect_space, is_empty_braces)
|
96
124
|
else
|
97
125
|
correct_style_detected
|
98
126
|
end
|
99
127
|
end
|
100
128
|
|
101
|
-
def expect_space?(
|
102
|
-
is_same_braces =
|
103
|
-
is_empty_braces =
|
129
|
+
def expect_space?(token1, token2)
|
130
|
+
is_same_braces = token1.type == token2.type
|
131
|
+
is_empty_braces = token1.left_brace? && token2.right_curly_brace?
|
104
132
|
|
105
133
|
if is_same_braces && style == :compact
|
106
134
|
false
|
@@ -111,8 +139,9 @@ module RuboCop
|
|
111
139
|
end
|
112
140
|
end
|
113
141
|
|
114
|
-
def incorrect_style_detected(
|
115
|
-
|
142
|
+
def incorrect_style_detected(token1, token2,
|
143
|
+
expect_space, is_empty_braces)
|
144
|
+
brace = (token1.text == '{' ? token1 : token2).pos
|
116
145
|
range = expect_space ? brace : space_range(brace)
|
117
146
|
add_offense(
|
118
147
|
range,
|
@@ -120,7 +149,8 @@ module RuboCop
|
|
120
149
|
message: message(brace, is_empty_braces, expect_space)
|
121
150
|
) do
|
122
151
|
style = expect_space ? :no_space : :space
|
123
|
-
ambiguous_or_unexpected_style_detected(style,
|
152
|
+
ambiguous_or_unexpected_style_detected(style,
|
153
|
+
token1.text == token2.text)
|
124
154
|
end
|
125
155
|
end
|
126
156
|
|
@@ -132,8 +162,8 @@ module RuboCop
|
|
132
162
|
end
|
133
163
|
end
|
134
164
|
|
135
|
-
def offense?(
|
136
|
-
has_space =
|
165
|
+
def offense?(token1, expect_space)
|
166
|
+
has_space = token1.space_after?
|
137
167
|
expect_space ? !has_space : has_space
|
138
168
|
end
|
139
169
|
|
@@ -144,7 +174,7 @@ module RuboCop
|
|
144
174
|
brace.source
|
145
175
|
end
|
146
176
|
problem = expect_space ? 'missing' : 'detected'
|
147
|
-
format(MSG, "#{inside_what} #{problem}")
|
177
|
+
format(MSG, problem: "#{inside_what} #{problem}")
|
148
178
|
end
|
149
179
|
|
150
180
|
def space_range(token_range)
|
@@ -15,6 +15,7 @@ module RuboCop
|
|
15
15
|
# g = (a + 3)
|
16
16
|
class SpaceInsideParens < Cop
|
17
17
|
include SurroundingSpace
|
18
|
+
include RangeHelp
|
18
19
|
|
19
20
|
MSG = 'Space inside parentheses detected.'.freeze
|
20
21
|
|
@@ -32,20 +33,20 @@ module RuboCop
|
|
32
33
|
private
|
33
34
|
|
34
35
|
def each_extraneous_space(tokens)
|
35
|
-
tokens.each_cons(2) do |
|
36
|
-
next unless parens?(
|
36
|
+
tokens.each_cons(2) do |token1, token2|
|
37
|
+
next unless parens?(token1, token2)
|
37
38
|
|
38
39
|
# If the second token is a comment, that means that a line break
|
39
40
|
# follows, and that the rules for space inside don't apply.
|
40
|
-
next if
|
41
|
-
next unless
|
41
|
+
next if token2.comment?
|
42
|
+
next unless token2.line == token1.line && token1.space_after?
|
42
43
|
|
43
|
-
yield range_between(
|
44
|
+
yield range_between(token1.end_pos, token2.begin_pos)
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
def parens?(
|
48
|
-
|
48
|
+
def parens?(token1, token2)
|
49
|
+
token1.left_parens? || token2.right_parens?
|
49
50
|
end
|
50
51
|
end
|
51
52
|
end
|
@@ -29,17 +29,50 @@ module RuboCop
|
|
29
29
|
# # good
|
30
30
|
# hash[ :key ]
|
31
31
|
# array[ index ]
|
32
|
+
#
|
33
|
+
#
|
34
|
+
# @example EnforcedStyleForEmptyBrackets: no_space (default)
|
35
|
+
# # The `no_space` EnforcedStyleForEmptyBrackets style enforces that
|
36
|
+
# # empty reference brackets do not contain spaces.
|
37
|
+
#
|
38
|
+
# # bad
|
39
|
+
# foo[ ]
|
40
|
+
# foo[ ]
|
41
|
+
#
|
42
|
+
# # good
|
43
|
+
# foo[]
|
44
|
+
#
|
45
|
+
# @example EnforcedStyleForEmptyBrackets: space
|
46
|
+
# # The `space` EnforcedStyleForEmptyBrackets style enforces that
|
47
|
+
# # empty reference brackets contain exactly one space.
|
48
|
+
#
|
49
|
+
# # bad
|
50
|
+
# foo[]
|
51
|
+
# foo[ ]
|
52
|
+
#
|
53
|
+
# # good
|
54
|
+
# foo[ ]
|
55
|
+
#
|
32
56
|
class SpaceInsideReferenceBrackets < Cop
|
33
57
|
include SurroundingSpace
|
34
58
|
include ConfigurableEnforcedStyle
|
35
59
|
|
36
60
|
MSG = '%<command>s space inside reference brackets.'.freeze
|
61
|
+
EMPTY_MSG = '%<command>s space inside empty reference brackets.'.freeze
|
62
|
+
|
63
|
+
BRACKET_METHODS = %i[[] []=].freeze
|
37
64
|
|
38
65
|
def on_send(node)
|
39
66
|
return if node.multiline?
|
40
|
-
return unless
|
41
|
-
|
42
|
-
|
67
|
+
return unless bracket_method?(node)
|
68
|
+
tokens = tokens(node)
|
69
|
+
left_token = left_ref_bracket(tokens)
|
70
|
+
return unless left_token
|
71
|
+
right_token = closing_bracket(tokens, left_token)
|
72
|
+
|
73
|
+
if empty_brackets?(left_token, right_token)
|
74
|
+
return empty_offenses(node, left_token, right_token, EMPTY_MSG)
|
75
|
+
end
|
43
76
|
|
44
77
|
if style == :no_space
|
45
78
|
no_space_offenses(node, left_token, right_token, MSG)
|
@@ -52,7 +85,10 @@ module RuboCop
|
|
52
85
|
lambda do |corrector|
|
53
86
|
left, right = reference_brackets(node)
|
54
87
|
|
55
|
-
if
|
88
|
+
if empty_brackets?(left, right)
|
89
|
+
SpaceCorrector.empty_corrections(processed_source, corrector,
|
90
|
+
empty_config, left, right)
|
91
|
+
elsif style == :no_space
|
56
92
|
SpaceCorrector.remove_space(processed_source, corrector,
|
57
93
|
left, right)
|
58
94
|
else
|
@@ -64,19 +100,25 @@ module RuboCop
|
|
64
100
|
private
|
65
101
|
|
66
102
|
def reference_brackets(node)
|
67
|
-
|
68
|
-
|
103
|
+
tokens = tokens(node)
|
104
|
+
left = left_ref_bracket(tokens)
|
105
|
+
[left, closing_bracket(tokens, left)]
|
69
106
|
end
|
70
107
|
|
71
|
-
def
|
72
|
-
|
108
|
+
def bracket_method?(node)
|
109
|
+
_, method, = *node
|
110
|
+
BRACKET_METHODS.include?(method)
|
73
111
|
end
|
74
112
|
|
75
|
-
def
|
76
|
-
|
113
|
+
def left_ref_bracket(tokens)
|
114
|
+
tokens.reverse.find(&:left_ref_bracket?)
|
115
|
+
end
|
116
|
+
|
117
|
+
def closing_bracket(tokens, opening_bracket)
|
118
|
+
i = tokens.index(opening_bracket)
|
77
119
|
inner_left_brackets_needing_closure = 0
|
78
120
|
|
79
|
-
tokens
|
121
|
+
tokens[i..-1].each do |token|
|
80
122
|
inner_left_brackets_needing_closure += 1 if token.left_bracket?
|
81
123
|
inner_left_brackets_needing_closure -= 1 if token.right_bracket?
|
82
124
|
if inner_left_brackets_needing_closure.zero? && token.right_bracket?
|
@@ -84,6 +126,10 @@ module RuboCop
|
|
84
126
|
end
|
85
127
|
end
|
86
128
|
end
|
129
|
+
|
130
|
+
def empty_config
|
131
|
+
cop_config['EnforcedStyleForEmptyBrackets']
|
132
|
+
end
|
87
133
|
end
|
88
134
|
end
|
89
135
|
end
|