rubocop 1.50.2 → 1.62.1
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 +7 -5
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +196 -28
- data/config/obsoletion.yml +5 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +22 -8
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- data/lib/rubocop/cli.rb +10 -2
- data/lib/rubocop/config.rb +8 -2
- data/lib/rubocop/config_finder.rb +14 -4
- data/lib/rubocop/config_loader.rb +0 -1
- data/lib/rubocop/config_loader_resolver.rb +4 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +13 -10
- data/lib/rubocop/config_validator.rb +14 -7
- data/lib/rubocop/cop/autocorrect_logic.rb +9 -2
- data/lib/rubocop/cop/base.rb +23 -4
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +2 -2
- data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +5 -13
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/gemspec/dependency_version.rb +2 -2
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +32 -8
- data/lib/rubocop/cop/internal_affairs/example_description.rb +45 -24
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +53 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +127 -33
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
- data/lib/rubocop/cop/internal_affairs.rb +2 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +7 -0
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -5
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +27 -4
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +15 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -10
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +22 -7
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +3 -3
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +17 -9
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
- data/lib/rubocop/cop/layout/redundant_line_break.rb +30 -7
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -4
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +53 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +19 -10
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +4 -4
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -2
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +19 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +46 -19
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +6 -7
- data/lib/rubocop/cop/lint/float_comparison.rb +10 -0
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
- data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +34 -5
- data/lib/rubocop/cop/lint/mixed_case_range.rb +111 -0
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +14 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +12 -3
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +72 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -3
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +14 -8
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +38 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_exception.rb +5 -11
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +6 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +12 -5
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +94 -10
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +97 -11
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +8 -3
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -2
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +32 -4
- data/lib/rubocop/cop/migration/department_name.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +19 -11
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +14 -11
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -8
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/string_help.rb +4 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +13 -5
- data/lib/rubocop/cop/naming/constant_name.rb +2 -3
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +26 -11
- data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -3
- data/lib/rubocop/cop/naming/variable_name.rb +6 -1
- data/lib/rubocop/cop/registry.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +6 -2
- data/lib/rubocop/cop/style/alias.rb +9 -8
- data/lib/rubocop/cop/style/arguments_forwarding.rb +411 -63
- data/lib/rubocop/cop/style/array_first_last.rb +64 -0
- data/lib/rubocop/cop/style/array_intersect.rb +13 -5
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +5 -4
- data/lib/rubocop/cop/style/case_like_if.rb +5 -5
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +24 -39
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +32 -12
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_loops.rb +36 -8
- data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +11 -10
- data/lib/rubocop/cop/style/copyright.rb +5 -2
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/dir_empty.rb +8 -14
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +8 -19
- data/lib/rubocop/cop/style/exact_regexp_match.rb +69 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/file_read.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +24 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -1
- data/lib/rubocop/cop/style/guard_clause.rb +28 -0
- data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +106 -33
- data/lib/rubocop/cop/style/hash_except.rb +21 -9
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -2
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +34 -5
- data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +14 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +54 -8
- data/lib/rubocop/cop/style/lambda.rb +3 -3
- data/lib/rubocop/cop/style/lambda_call.rb +5 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +8 -10
- data/lib/rubocop/cop/style/map_to_hash.rb +17 -7
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +24 -9
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +2 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +6 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
- data/lib/rubocop/cop/style/next.rb +1 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +5 -3
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +8 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +3 -5
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +4 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +10 -4
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +10 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +10 -2
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +39 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +93 -5
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -3
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +32 -8
- data/lib/rubocop/cop/style/redundant_parentheses.rb +72 -23
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +100 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -1
- data/lib/rubocop/cop/style/redundant_return.rb +14 -3
- data/lib/rubocop/cop/style/redundant_self.rb +17 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +8 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -1
- data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
- data/lib/rubocop/cop/style/require_order.rb +11 -5
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
- data/lib/rubocop/cop/style/return_nil.rb +6 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +95 -0
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +22 -11
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +20 -4
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +7 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +6 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +36 -0
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -2
- data/lib/rubocop/cop/style/yoda_expression.rb +8 -7
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/regexp_ranges.rb +113 -0
- data/lib/rubocop/cop/variable_force/assignment.rb +45 -4
- data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
- data/lib/rubocop/cop/variable_force.rb +1 -0
- data/lib/rubocop/cops_documentation_generator.rb +16 -4
- data/lib/rubocop/directive_comment.rb +10 -8
- data/lib/rubocop/ext/regexp_node.rb +9 -4
- data/lib/rubocop/ext/regexp_parser.rb +4 -1
- data/lib/rubocop/file_finder.rb +4 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +17 -6
- data/lib/rubocop/formatter/html_formatter.rb +35 -14
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +12 -2
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +246 -0
- data/lib/rubocop/lsp/runtime.rb +99 -0
- data/lib/rubocop/lsp/server.rb +71 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/lsp.rb +29 -0
- data/lib/rubocop/magic_comment.rb +13 -11
- data/lib/rubocop/options.rb +22 -9
- data/lib/rubocop/path_util.rb +6 -2
- data/lib/rubocop/result_cache.rb +5 -2
- data/lib/rubocop/rspec/cop_helper.rb +8 -2
- data/lib/rubocop/rspec/expect_offense.rb +8 -8
- data/lib/rubocop/rspec/shared_contexts.rb +42 -18
- data/lib/rubocop/rspec/support.rb +2 -0
- data/lib/rubocop/runner.rb +15 -6
- data/lib/rubocop/server/cache.rb +1 -1
- data/lib/rubocop/server/client_command/exec.rb +3 -3
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +91 -81
- data/lib/rubocop/target_ruby.rb +85 -78
- data/lib/rubocop/version.rb +27 -8
- data/lib/rubocop.rb +19 -0
- metadata +56 -14
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -88,10 +88,7 @@ module RuboCop
|
|
88
88
|
return unless previous_older_sibling
|
89
89
|
|
90
90
|
add_offense(node, message: format(MSG, name: node.method_name)) do |corrector|
|
91
|
-
corrector
|
92
|
-
range_with_comments_and_lines(previous_older_sibling),
|
93
|
-
range_with_comments_and_lines(node.parent.if_type? ? node.parent : node)
|
94
|
-
)
|
91
|
+
autocorrect(corrector, node, previous_older_sibling)
|
95
92
|
end
|
96
93
|
end
|
97
94
|
|
@@ -109,11 +106,20 @@ module RuboCop
|
|
109
106
|
break unless sibling&.send_type? && sibling&.method?(node.method_name)
|
110
107
|
break unless sibling.arguments? && !sibling.receiver
|
111
108
|
break unless in_same_section?(sibling, node)
|
109
|
+
break unless node.first_argument.str_type? && sibling.first_argument.str_type?
|
112
110
|
|
113
|
-
node.first_argument.
|
111
|
+
node.first_argument.value < sibling.first_argument.value
|
114
112
|
end
|
115
113
|
end
|
116
114
|
|
115
|
+
def autocorrect(corrector, node, previous_older_sibling)
|
116
|
+
range1 = range_with_comments_and_lines(previous_older_sibling)
|
117
|
+
range2 = range_with_comments_and_lines(node.parent.if_type? ? node.parent : node)
|
118
|
+
|
119
|
+
corrector.remove(range2)
|
120
|
+
corrector.insert_before(range1, range2.source)
|
121
|
+
end
|
122
|
+
|
117
123
|
def search_node(node)
|
118
124
|
node.parent.if_type? ? node.parent : node
|
119
125
|
end
|
@@ -3,9 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks for uses of rescue in its modifier form
|
7
|
-
#
|
8
|
-
# The cop to check `rescue` in its modifier form is added for following
|
6
|
+
# Checks for uses of `rescue` in its modifier form is added for following
|
9
7
|
# reasons:
|
10
8
|
#
|
11
9
|
# * The syntax of modifier form `rescue` can be misleading because it
|
@@ -3,9 +3,13 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Enforces consistency between
|
6
|
+
# Enforces consistency between `return nil` and `return`.
|
7
7
|
#
|
8
|
-
#
|
8
|
+
# This cop is disabled by default. Because there seems to be a perceived semantic difference
|
9
|
+
# between `return` and `return nil`. The former can be seen as just halting evaluation,
|
10
|
+
# while the latter might be used when the return value is of specific concern.
|
11
|
+
#
|
12
|
+
# Supported styles are `return` and `return_nil`.
|
9
13
|
#
|
10
14
|
# @example EnforcedStyle: return (default)
|
11
15
|
# # bad
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks if `return` or `return nil` is used in predicate method definitions.
|
7
|
+
#
|
8
|
+
# @safety
|
9
|
+
# Autocorrection is marked as unsafe because the change of the return value
|
10
|
+
# from `nil` to `false` could potentially lead to incompatibility issues.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# # bad
|
14
|
+
# def foo?
|
15
|
+
# return if condition
|
16
|
+
#
|
17
|
+
# do_something?
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # bad
|
21
|
+
# def foo?
|
22
|
+
# return nil if condition
|
23
|
+
#
|
24
|
+
# do_something?
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# def foo?
|
29
|
+
# return false if condition
|
30
|
+
#
|
31
|
+
# do_something?
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# @example AllowedMethods: ['foo?']
|
35
|
+
# # good
|
36
|
+
# def foo?
|
37
|
+
# return if condition
|
38
|
+
#
|
39
|
+
# do_something?
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# @example AllowedPatterns: [/foo/]
|
43
|
+
# # good
|
44
|
+
# def foo?
|
45
|
+
# return if condition
|
46
|
+
#
|
47
|
+
# do_something?
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
class ReturnNilInPredicateMethodDefinition < Base
|
51
|
+
extend AutoCorrector
|
52
|
+
include AllowedMethods
|
53
|
+
include AllowedPattern
|
54
|
+
|
55
|
+
MSG = 'Return `false` instead of `nil` in predicate methods.'
|
56
|
+
|
57
|
+
# @!method return_nil?(node)
|
58
|
+
def_node_matcher :return_nil?, <<~PATTERN
|
59
|
+
{(return) (return (nil))}
|
60
|
+
PATTERN
|
61
|
+
|
62
|
+
def on_def(node)
|
63
|
+
return unless node.predicate_method?
|
64
|
+
return if allowed_method?(node.method_name) || matches_allowed_pattern?(node.method_name)
|
65
|
+
return unless (body = node.body)
|
66
|
+
|
67
|
+
body.each_descendant(:return) do |return_node|
|
68
|
+
register_offense(return_node, 'return false') if return_nil?(return_node)
|
69
|
+
end
|
70
|
+
|
71
|
+
return unless (nil_node = nil_node_at_the_end_of_method_body(body))
|
72
|
+
|
73
|
+
register_offense(nil_node, 'false')
|
74
|
+
end
|
75
|
+
alias on_defs on_def
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def nil_node_at_the_end_of_method_body(body)
|
80
|
+
return body if body.nil_type?
|
81
|
+
return unless body.begin_type?
|
82
|
+
return unless (last_child = body.children.last)
|
83
|
+
|
84
|
+
last_child if last_child.is_a?(AST::Node) && last_child.nil_type?
|
85
|
+
end
|
86
|
+
|
87
|
+
def register_offense(offense_node, replacement)
|
88
|
+
add_offense(offense_node) do |corrector|
|
89
|
+
corrector.replace(offense_node, replacement)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
|
36
36
|
# @!method sample_candidate?(node)
|
37
37
|
def_node_matcher :sample_candidate?, <<~PATTERN
|
38
|
-
(
|
38
|
+
(call $(call _ :shuffle $...) ${:#{RESTRICT_ON_SEND.join(' :')}} $...)
|
39
39
|
PATTERN
|
40
40
|
|
41
41
|
def on_send(node)
|
@@ -52,6 +52,7 @@ module RuboCop
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
55
|
+
alias on_csend on_send
|
55
56
|
|
56
57
|
private
|
57
58
|
|
@@ -109,9 +110,7 @@ module RuboCop
|
|
109
110
|
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
110
111
|
|
111
112
|
def source_range(shuffle_node, node)
|
112
|
-
|
113
|
-
shuffle_node.loc.selector.begin_pos,
|
114
|
-
node.source_range.end_pos)
|
113
|
+
shuffle_node.loc.selector.join(node.source_range.end)
|
115
114
|
end
|
116
115
|
|
117
116
|
def message(shuffle_arg, method, method_args, range)
|
@@ -55,8 +55,8 @@ module RuboCop
|
|
55
55
|
# @!method regexp_match?(node)
|
56
56
|
def_node_matcher :regexp_match?, <<~PATTERN
|
57
57
|
{
|
58
|
-
(block
|
59
|
-
(numblock
|
58
|
+
(block call (args (arg $_)) ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
59
|
+
(numblock call $1 ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
60
60
|
}
|
61
61
|
PATTERN
|
62
62
|
|
@@ -64,9 +64,9 @@ module RuboCop
|
|
64
64
|
# @!method creates_hash?(node)
|
65
65
|
def_node_matcher :creates_hash?, <<~PATTERN
|
66
66
|
{
|
67
|
-
(
|
68
|
-
(block (
|
69
|
-
(
|
67
|
+
(call (const _ :Hash) {:new :[]} ...)
|
68
|
+
(block (call (const _ :Hash) :new ...) ...)
|
69
|
+
(call _ { :to_h :to_hash } ...)
|
70
70
|
}
|
71
71
|
PATTERN
|
72
72
|
|
@@ -84,6 +84,7 @@ module RuboCop
|
|
84
84
|
}
|
85
85
|
PATTERN
|
86
86
|
|
87
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
87
88
|
def on_send(node)
|
88
89
|
return unless (block_node = node.block_node)
|
89
90
|
return if block_node.body&.begin_type?
|
@@ -91,11 +92,15 @@ module RuboCop
|
|
91
92
|
return unless (regexp_method_send_node = extract_send_node(block_node))
|
92
93
|
return if match_predicate_without_receiver?(regexp_method_send_node)
|
93
94
|
|
94
|
-
|
95
|
+
replacement = replacement(regexp_method_send_node, node)
|
96
|
+
return if target_ruby_version <= 2.2 && replacement == 'grep_v'
|
97
|
+
|
95
98
|
regexp = find_regexp(regexp_method_send_node, block_node)
|
96
99
|
|
97
|
-
register_offense(node, block_node, regexp,
|
100
|
+
register_offense(node, block_node, regexp, replacement)
|
98
101
|
end
|
102
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
103
|
+
alias on_csend on_send
|
99
104
|
|
100
105
|
private
|
101
106
|
|
@@ -105,9 +110,15 @@ module RuboCop
|
|
105
110
|
node.hash_type? || creates_hash?(node) || env_const?(node)
|
106
111
|
end
|
107
112
|
|
108
|
-
def
|
109
|
-
|
110
|
-
|
113
|
+
def replacement(regexp_method_send_node, node)
|
114
|
+
opposite = opposite?(regexp_method_send_node)
|
115
|
+
|
116
|
+
method_name = node.method_name
|
117
|
+
|
118
|
+
opposite ? OPPOSITE_REPLACEMENTS[method_name] : REPLACEMENTS[method_name]
|
119
|
+
end
|
120
|
+
|
121
|
+
def register_offense(node, block_node, regexp, replacement)
|
111
122
|
message = format(MSG, replacement: replacement, original_method: node.method_name)
|
112
123
|
|
113
124
|
add_offense(block_node, message: message) do |corrector|
|
@@ -136,7 +147,7 @@ module RuboCop
|
|
136
147
|
return node.child_nodes.first if node.match_with_lvasgn_type?
|
137
148
|
|
138
149
|
if node.receiver.lvar_type? &&
|
139
|
-
(block.numblock_type? || node.receiver.source == block.
|
150
|
+
(block.numblock_type? || node.receiver.source == block.first_argument.source)
|
140
151
|
node.first_argument
|
141
152
|
elsif node.first_argument.lvar_type?
|
142
153
|
node.receiver
|
@@ -62,9 +62,6 @@ module RuboCop
|
|
62
62
|
private
|
63
63
|
|
64
64
|
def check_for_line_terminator_or_opener
|
65
|
-
# Make the obvious check first
|
66
|
-
return unless processed_source.raw_source.include?(';')
|
67
|
-
|
68
65
|
each_semicolon do |line, column, token_before_semicolon|
|
69
66
|
register_semicolon(line, column, false, token_before_semicolon)
|
70
67
|
end
|
@@ -83,6 +80,7 @@ module RuboCop
|
|
83
80
|
processed_source.tokens.group_by(&:line)
|
84
81
|
end
|
85
82
|
|
83
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
86
84
|
def semicolon_position(tokens)
|
87
85
|
if tokens.last.semicolon?
|
88
86
|
-1
|
@@ -90,10 +88,16 @@ module RuboCop
|
|
90
88
|
0
|
91
89
|
elsif exist_semicolon_before_right_curly_brace?(tokens)
|
92
90
|
-3
|
93
|
-
elsif exist_semicolon_after_left_curly_brace?(tokens)
|
91
|
+
elsif exist_semicolon_after_left_curly_brace?(tokens) ||
|
92
|
+
exist_semicolon_after_left_string_interpolation_brace?(tokens)
|
94
93
|
2
|
94
|
+
elsif exist_semicolon_after_left_lambda_curly_brace?(tokens)
|
95
|
+
3
|
96
|
+
elsif exist_semicolon_before_right_string_interpolation_brace?(tokens)
|
97
|
+
-4
|
95
98
|
end
|
96
99
|
end
|
100
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
97
101
|
|
98
102
|
def exist_semicolon_before_right_curly_brace?(tokens)
|
99
103
|
tokens[-2]&.right_curly_brace? && tokens[-3]&.semicolon?
|
@@ -103,6 +107,18 @@ module RuboCop
|
|
103
107
|
tokens[1]&.left_curly_brace? && tokens[2]&.semicolon?
|
104
108
|
end
|
105
109
|
|
110
|
+
def exist_semicolon_after_left_lambda_curly_brace?(tokens)
|
111
|
+
tokens[2]&.type == :tLAMBEG && tokens[3]&.semicolon?
|
112
|
+
end
|
113
|
+
|
114
|
+
def exist_semicolon_before_right_string_interpolation_brace?(tokens)
|
115
|
+
tokens[-3]&.type == :tSTRING_DEND && tokens[-4]&.semicolon?
|
116
|
+
end
|
117
|
+
|
118
|
+
def exist_semicolon_after_left_string_interpolation_brace?(tokens)
|
119
|
+
tokens[1]&.type == :tSTRING_DBEG && tokens[2]&.semicolon?
|
120
|
+
end
|
121
|
+
|
106
122
|
def register_semicolon(line, column, after_expression, token_before_semicolon = nil)
|
107
123
|
range = source_range(processed_source.buffer, line, column)
|
108
124
|
|
@@ -3,8 +3,11 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Sometimes using dig method ends up with just a single
|
7
|
-
# argument. In such cases, dig should be replaced with []
|
6
|
+
# Sometimes using `dig` method ends up with just a single
|
7
|
+
# argument. In such cases, dig should be replaced with `[]`.
|
8
|
+
#
|
9
|
+
# Since replacing `hash&.dig(:key)` with `hash[:key]` could potentially lead to error,
|
10
|
+
# calls to the `dig` method using safe navigation will be ignored.
|
8
11
|
#
|
9
12
|
# @safety
|
10
13
|
# This cop is unsafe because it cannot be guaranteed that the receiver
|
@@ -33,6 +36,7 @@ module RuboCop
|
|
33
36
|
|
34
37
|
MSG = 'Use `%<receiver>s[%<argument>s]` instead of `%<original>s`.'
|
35
38
|
RESTRICT_ON_SEND = %i[dig].freeze
|
39
|
+
IGNORED_ARGUMENT_TYPES = %i[block_pass forwarded_restarg forwarded_args hash].freeze
|
36
40
|
|
37
41
|
# @!method single_argument_dig?(node)
|
38
42
|
def_node_matcher :single_argument_dig?, <<~PATTERN
|
@@ -44,7 +48,7 @@ module RuboCop
|
|
44
48
|
|
45
49
|
expression = single_argument_dig?(node)
|
46
50
|
return unless expression
|
47
|
-
return if expression.
|
51
|
+
return if IGNORED_ARGUMENT_TYPES.include?(expression.type)
|
48
52
|
|
49
53
|
receiver = node.receiver.source
|
50
54
|
argument = expression.source
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks for single-line `do`...`end` block.
|
7
|
+
#
|
8
|
+
# In practice a single line `do`...`end` is autocorrected when `EnforcedStyle: semantic`
|
9
|
+
# in `Style/BlockDelimiters`. The autocorrection maintains the `do` ... `end` syntax to
|
10
|
+
# preserve semantics and does not change it to `{`...`}` block.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
#
|
14
|
+
# # bad
|
15
|
+
# foo do |arg| bar(arg) end
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# foo do |arg|
|
19
|
+
# bar(arg)
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# # bad
|
23
|
+
# ->(arg) do bar(arg) end
|
24
|
+
#
|
25
|
+
# # good
|
26
|
+
# ->(arg) { bar(arg) }
|
27
|
+
#
|
28
|
+
class SingleLineDoEndBlock < Base
|
29
|
+
extend AutoCorrector
|
30
|
+
|
31
|
+
MSG = 'Prefer multiline `do`...`end` block.'
|
32
|
+
|
33
|
+
# rubocop:disable Metrics/AbcSize
|
34
|
+
def on_block(node)
|
35
|
+
return if !node.single_line? || node.braces?
|
36
|
+
|
37
|
+
add_offense(node) do |corrector|
|
38
|
+
corrector.insert_after(do_line(node), "\n")
|
39
|
+
|
40
|
+
node_body = node.body
|
41
|
+
|
42
|
+
if node_body.respond_to?(:heredoc?) && node_body.heredoc?
|
43
|
+
corrector.remove(node.loc.end)
|
44
|
+
corrector.insert_after(node_body.loc.heredoc_end, "\nend")
|
45
|
+
else
|
46
|
+
corrector.insert_before(node.loc.end, "\n")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
# rubocop:enable Metrics/AbcSize
|
51
|
+
alias on_numblock on_block
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def do_line(node)
|
56
|
+
if node.numblock_type? || node.arguments.children.empty? || node.send_node.lambda_literal?
|
57
|
+
node.loc.begin
|
58
|
+
else
|
59
|
+
node.arguments
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def x(corrector, node); end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -135,7 +135,7 @@ module RuboCop
|
|
135
135
|
|
136
136
|
def disallow_endless_method_style?
|
137
137
|
endless_method_config = config.for_cop('Style/EndlessMethod')
|
138
|
-
return
|
138
|
+
return true unless endless_method_config['Enabled']
|
139
139
|
|
140
140
|
endless_method_config['EnforcedStyle'] == 'disallow'
|
141
141
|
end
|
@@ -3,8 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks that arrays are sliced with
|
7
|
-
# `ary[start..-1]` on Ruby 2.6
|
6
|
+
# Checks that arrays are not sliced with the redundant `ary[0..-1]`, replacing it with `ary`,
|
7
|
+
# and ensures arrays are sliced with endless ranges instead of `ary[start..-1]` on Ruby 2.6+,
|
8
|
+
# and with beginless ranges instead of `ary[nil..end]` on Ruby 2.7+.
|
8
9
|
#
|
9
10
|
# @safety
|
10
11
|
# This cop is unsafe because `x..-1` and `x..` are only guaranteed to
|
@@ -21,29 +22,94 @@ module RuboCop
|
|
21
22
|
#
|
22
23
|
# @example
|
23
24
|
# # bad
|
24
|
-
# items[
|
25
|
+
# items[0..-1]
|
26
|
+
# items[0..nil]
|
27
|
+
# items[0...nil]
|
25
28
|
#
|
26
29
|
# # good
|
27
|
-
# items
|
30
|
+
# items
|
31
|
+
#
|
32
|
+
# # bad
|
33
|
+
# items[1..-1] # Ruby 2.6+
|
34
|
+
# items[1..nil] # Ruby 2.6+
|
35
|
+
#
|
36
|
+
# # good
|
37
|
+
# items[1..] # Ruby 2.6+
|
38
|
+
#
|
39
|
+
# # bad
|
40
|
+
# items[nil..42] # Ruby 2.7+
|
41
|
+
#
|
42
|
+
# # good
|
43
|
+
# items[..42] # Ruby 2.7+
|
44
|
+
# items[0..42] # Ruby 2.7+
|
45
|
+
#
|
28
46
|
class SlicingWithRange < Base
|
29
47
|
extend AutoCorrector
|
30
48
|
extend TargetRubyVersion
|
31
49
|
|
32
50
|
minimum_target_ruby_version 2.6
|
33
51
|
|
34
|
-
MSG = 'Prefer
|
52
|
+
MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
|
53
|
+
MSG_USELESS_RANGE = 'Remove the useless `%<prefer>s`.'
|
35
54
|
RESTRICT_ON_SEND = %i[[]].freeze
|
36
55
|
|
56
|
+
# @!method range_from_zero_till_minus_one?(node)
|
57
|
+
def_node_matcher :range_from_zero_till_minus_one?, <<~PATTERN
|
58
|
+
{
|
59
|
+
(irange (int 0) {(int -1) nil})
|
60
|
+
(erange (int 0) nil)
|
61
|
+
}
|
62
|
+
PATTERN
|
63
|
+
|
37
64
|
# @!method range_till_minus_one?(node)
|
38
|
-
def_node_matcher :range_till_minus_one?,
|
65
|
+
def_node_matcher :range_till_minus_one?, <<~PATTERN
|
66
|
+
{
|
67
|
+
(irange !nil? {(int -1) nil})
|
68
|
+
(erange !nil? nil)
|
69
|
+
}
|
70
|
+
PATTERN
|
71
|
+
|
72
|
+
# @!method range_from_zero?(node)
|
73
|
+
def_node_matcher :range_from_zero?, <<~PATTERN
|
74
|
+
(irange nil !nil?)
|
75
|
+
PATTERN
|
39
76
|
|
40
77
|
def on_send(node)
|
41
|
-
return unless node.arguments.
|
42
|
-
return unless range_till_minus_one?(node.arguments.first)
|
78
|
+
return unless node.arguments.one?
|
43
79
|
|
44
|
-
|
45
|
-
|
80
|
+
range_node = node.first_argument
|
81
|
+
selector = node.loc.selector
|
82
|
+
unless (message, removal_range = offense_message_with_removal_range(range_node, selector))
|
83
|
+
return
|
46
84
|
end
|
85
|
+
|
86
|
+
add_offense(selector, message: message) do |corrector|
|
87
|
+
corrector.remove(removal_range)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def offense_message_with_removal_range(range_node, selector)
|
94
|
+
if range_from_zero_till_minus_one?(range_node)
|
95
|
+
[format(MSG_USELESS_RANGE, prefer: selector.source), selector]
|
96
|
+
elsif range_till_minus_one?(range_node)
|
97
|
+
[
|
98
|
+
format(MSG, prefer: endless(range_node), current: selector.source), range_node.end
|
99
|
+
]
|
100
|
+
elsif range_from_zero?(range_node) && target_ruby_version >= 2.7
|
101
|
+
[
|
102
|
+
format(MSG, prefer: beginless(range_node), current: selector.source), range_node.begin
|
103
|
+
]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def endless(range_node)
|
108
|
+
"[#{range_node.begin.source}#{range_node.loc.operator.source}]"
|
109
|
+
end
|
110
|
+
|
111
|
+
def beginless(range_node)
|
112
|
+
"[#{range_node.loc.operator.source}#{range_node.end.source}]"
|
47
113
|
end
|
48
114
|
end
|
49
115
|
end
|
@@ -173,7 +173,9 @@ module RuboCop
|
|
173
173
|
end
|
174
174
|
|
175
175
|
def correct_for_comment(corrector, node, if_branch)
|
176
|
-
comments = processed_source.ast_with_comments[if_branch]
|
176
|
+
comments = processed_source.ast_with_comments[if_branch].select do |comment|
|
177
|
+
comment.loc.line < if_branch.condition.first_line
|
178
|
+
end
|
177
179
|
comment_text = comments.map(&:text).join("\n") << "\n"
|
178
180
|
|
179
181
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
@@ -186,7 +188,9 @@ module RuboCop
|
|
186
188
|
begin_pos = condition.first_argument.source_range.begin_pos
|
187
189
|
return if end_pos > begin_pos
|
188
190
|
|
189
|
-
|
191
|
+
range = range_between(end_pos, begin_pos)
|
192
|
+
corrector.remove(range)
|
193
|
+
corrector.insert_after(range, '(')
|
190
194
|
corrector.insert_after(condition.last_argument, ')')
|
191
195
|
end
|
192
196
|
|
@@ -3,8 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
7
|
-
# This cop looks for uses of Perl-style global variables.
|
6
|
+
# Looks for uses of Perl-style global variables.
|
8
7
|
# Correcting to global variables in the 'English' library
|
9
8
|
# will add a require statement to the top of the file if
|
10
9
|
# enabled by RequireEnglish config.
|
@@ -234,9 +233,9 @@ module RuboCop
|
|
234
233
|
end
|
235
234
|
|
236
235
|
def matching_styles(global)
|
237
|
-
STYLE_VARS_MAP.
|
236
|
+
STYLE_VARS_MAP.filter_map do |style, vars|
|
238
237
|
style if vars.values.flatten(1).include? global
|
239
|
-
end
|
238
|
+
end
|
240
239
|
end
|
241
240
|
|
242
241
|
def english_name_replacement(preferred_name, node)
|
@@ -3,22 +3,42 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks that quotes inside
|
6
|
+
# Checks that quotes inside string, symbol, and regexp interpolations
|
7
7
|
# match the configured preference.
|
8
8
|
#
|
9
9
|
# @example EnforcedStyle: single_quotes (default)
|
10
10
|
# # bad
|
11
|
-
#
|
11
|
+
# string = "Tests #{success ? "PASS" : "FAIL"}"
|
12
|
+
# symbol = :"Tests #{success ? "PASS" : "FAIL"}"
|
13
|
+
# heredoc = <<~TEXT
|
14
|
+
# Tests #{success ? "PASS" : "FAIL"}
|
15
|
+
# TEXT
|
16
|
+
# regexp = /Tests #{success ? "PASS" : "FAIL"}/
|
12
17
|
#
|
13
18
|
# # good
|
14
|
-
#
|
19
|
+
# string = "Tests #{success ? 'PASS' : 'FAIL'}"
|
20
|
+
# symbol = :"Tests #{success ? 'PASS' : 'FAIL'}"
|
21
|
+
# heredoc = <<~TEXT
|
22
|
+
# Tests #{success ? 'PASS' : 'FAIL'}
|
23
|
+
# TEXT
|
24
|
+
# regexp = /Tests #{success ? 'PASS' : 'FAIL'}/
|
15
25
|
#
|
16
26
|
# @example EnforcedStyle: double_quotes
|
17
27
|
# # bad
|
18
|
-
#
|
28
|
+
# string = "Tests #{success ? 'PASS' : 'FAIL'}"
|
29
|
+
# symbol = :"Tests #{success ? 'PASS' : 'FAIL'}"
|
30
|
+
# heredoc = <<~TEXT
|
31
|
+
# Tests #{success ? 'PASS' : 'FAIL'}
|
32
|
+
# TEXT
|
33
|
+
# regexp = /Tests #{success ? 'PASS' : 'FAIL'}/
|
19
34
|
#
|
20
35
|
# # good
|
21
|
-
#
|
36
|
+
# string = "Tests #{success ? "PASS" : "FAIL"}"
|
37
|
+
# symbol = :"Tests #{success ? "PASS" : "FAIL"}"
|
38
|
+
# heredoc = <<~TEXT
|
39
|
+
# Tests #{success ? "PASS" : "FAIL"}
|
40
|
+
# TEXT
|
41
|
+
# regexp = /Tests #{success ? "PASS" : "FAIL"}/
|
22
42
|
class StringLiteralsInInterpolation < Base
|
23
43
|
include ConfigurableEnforcedStyle
|
24
44
|
include StringLiteralsHelp
|
@@ -29,6 +49,11 @@ module RuboCop
|
|
29
49
|
StringLiteralCorrector.correct(corrector, node, style)
|
30
50
|
end
|
31
51
|
|
52
|
+
# Cop classes that include the StringHelp module usually ignore regexp
|
53
|
+
# nodes. Not so for this cop, which is why we override the on_regexp
|
54
|
+
# definition with an empty one.
|
55
|
+
def on_regexp(node); end
|
56
|
+
|
32
57
|
private
|
33
58
|
|
34
59
|
def message(_node)
|