rubocop 1.67.0 → 1.81.6
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 +23 -19
- data/config/default.yml +384 -72
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +19 -4
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +56 -48
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +53 -28
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +158 -10
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +31 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +125 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +39 -15
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +23 -12
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -3
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +27 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +2 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +2 -3
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +49 -31
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +17 -4
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +11 -3
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +18 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +41 -38
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +55 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +15 -18
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +21 -6
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +68 -102
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +30 -19
- data/lib/rubocop/cops_documentation_generator.rb +54 -28
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +20 -6
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +66 -26
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +2 -4
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +4 -1
- data/lib/rubocop/result_cache.rb +27 -25
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +31 -18
- data/lib/rubocop/server/cache.rb +51 -13
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +14 -9
- data/lib/rubocop/target_ruby.rb +27 -3
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +44 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +91 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -2,16 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
require 'pathname'
|
|
4
4
|
require 'yaml'
|
|
5
|
+
require_relative 'plugin'
|
|
5
6
|
|
|
6
7
|
module RuboCop
|
|
7
8
|
# A help class for ConfigLoader that handles configuration resolution.
|
|
8
9
|
# @api private
|
|
9
10
|
class ConfigLoaderResolver # rubocop:disable Metrics/ClassLength
|
|
11
|
+
def resolve_plugins(rubocop_config, plugins)
|
|
12
|
+
plugins = Array(plugins) - ConfigLoader.loaded_plugins.map { |plugin| plugin.about.name }
|
|
13
|
+
return if plugins.empty?
|
|
14
|
+
|
|
15
|
+
Plugin.integrate_plugins(rubocop_config, plugins)
|
|
16
|
+
end
|
|
17
|
+
|
|
10
18
|
def resolve_requires(path, hash)
|
|
11
19
|
config_dir = File.dirname(path)
|
|
12
20
|
hash.delete('require').tap do |loaded_features|
|
|
13
21
|
Array(loaded_features).each do |feature|
|
|
14
|
-
|
|
22
|
+
if Plugin.plugin_capable?(feature)
|
|
23
|
+
# NOTE: Compatibility for before plugins style.
|
|
24
|
+
warn Rainbow(<<~MESSAGE).yellow
|
|
25
|
+
#{feature} extension supports plugin, specify `plugins: #{feature}` instead of `require: #{feature}` in #{path}.
|
|
26
|
+
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
|
|
27
|
+
MESSAGE
|
|
28
|
+
rubocop_config = Config.create(hash, path, check: false)
|
|
29
|
+
|
|
30
|
+
resolve_plugins(rubocop_config, feature)
|
|
31
|
+
else
|
|
32
|
+
FeatureLoader.load(config_directory_path: config_dir, feature: feature)
|
|
33
|
+
end
|
|
15
34
|
end
|
|
16
35
|
end
|
|
17
36
|
end
|
|
@@ -105,7 +124,7 @@ module RuboCop
|
|
|
105
124
|
elsif merge_hashes?(base_hash, derived_hash, key)
|
|
106
125
|
result[key] = merge(base_hash[key], derived_hash[key], **opts)
|
|
107
126
|
elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key)
|
|
108
|
-
result[key] = base_hash[key] | derived_hash[key]
|
|
127
|
+
result[key] = Array(base_hash[key]) | Array(derived_hash[key])
|
|
109
128
|
elsif opts[:debug]
|
|
110
129
|
warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
|
111
130
|
end
|
|
@@ -157,20 +176,27 @@ module RuboCop
|
|
|
157
176
|
return false if inherited_file.nil? # Not inheritance resolving merge
|
|
158
177
|
return false if inherited_file.start_with?('..') # Legitimate override
|
|
159
178
|
return false if base_hash[key] == derived_hash[key] # Same value
|
|
160
|
-
return false if remote_file?(inherited_file) # Can't change
|
|
179
|
+
return false if PathUtil.remote_file?(inherited_file) # Can't change
|
|
161
180
|
|
|
162
181
|
Gem.path.none? { |dir| inherited_file.start_with?(dir) } # Can change?
|
|
163
182
|
end
|
|
164
183
|
|
|
165
184
|
def warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
|
|
185
|
+
# If the file being considered is remote, don't bother checking for duplicates
|
|
186
|
+
return if remote_config?(opts[:file])
|
|
187
|
+
|
|
166
188
|
return unless duplicate_setting?(base_hash, derived_hash, key, opts[:inherited_file])
|
|
167
189
|
|
|
168
190
|
inherit_mode = opts[:inherit_mode]['merge'] || opts[:inherit_mode]['override']
|
|
169
191
|
return if base_hash[key].is_a?(Array) && inherit_mode&.include?(key)
|
|
170
192
|
|
|
171
|
-
puts
|
|
172
|
-
|
|
173
|
-
|
|
193
|
+
puts duplicate_setting_warning(opts, key)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def duplicate_setting_warning(opts, key)
|
|
197
|
+
"#{PathUtil.smart_path(opts[:file])}: " \
|
|
198
|
+
"#{opts[:cop_name]}:#{key} overrides " \
|
|
199
|
+
"the same parameter in #{opts[:inherited_file]}"
|
|
174
200
|
end
|
|
175
201
|
|
|
176
202
|
def determine_inherit_mode(hash, key)
|
|
@@ -180,7 +206,7 @@ module RuboCop
|
|
|
180
206
|
end
|
|
181
207
|
|
|
182
208
|
def should_union?(derived_hash, base_hash, root_mode, key)
|
|
183
|
-
return false unless base_hash[key].is_a?(Array)
|
|
209
|
+
return false unless base_hash[key].is_a?(Array) || derived_hash[key].is_a?(Array)
|
|
184
210
|
|
|
185
211
|
derived_mode = derived_hash['inherit_mode']
|
|
186
212
|
return false if should_override?(derived_mode, key)
|
|
@@ -218,7 +244,7 @@ module RuboCop
|
|
|
218
244
|
end
|
|
219
245
|
|
|
220
246
|
def inherited_file(path, inherit_from, file)
|
|
221
|
-
if remote_file?(inherit_from)
|
|
247
|
+
if PathUtil.remote_file?(inherit_from)
|
|
222
248
|
# A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
|
|
223
249
|
RemoteConfig.new(inherit_from, File.dirname(path))
|
|
224
250
|
elsif Pathname.new(inherit_from).absolute?
|
|
@@ -238,8 +264,8 @@ module RuboCop
|
|
|
238
264
|
end
|
|
239
265
|
end
|
|
240
266
|
|
|
241
|
-
def
|
|
242
|
-
|
|
267
|
+
def remote_config?(file)
|
|
268
|
+
file.is_a?(RemoteConfig)
|
|
243
269
|
end
|
|
244
270
|
|
|
245
271
|
def handle_disabled_by_default(config, new_default_configuration)
|
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def violated?
|
|
18
|
-
return false if
|
|
18
|
+
return false if plugin_loaded?
|
|
19
19
|
|
|
20
20
|
affected_cops.any?
|
|
21
21
|
end
|
|
@@ -38,8 +38,9 @@ module RuboCop
|
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
def
|
|
42
|
-
|
|
41
|
+
def plugin_loaded?
|
|
42
|
+
# Plugins loaded via `require` are included in `loaded_features`.
|
|
43
|
+
config.loaded_plugins.include?(gem) || config.loaded_features.include?(gem)
|
|
43
44
|
end
|
|
44
45
|
end
|
|
45
46
|
end
|
|
@@ -6,17 +6,28 @@ module RuboCop
|
|
|
6
6
|
# a cop or moving it to a new department.
|
|
7
7
|
# @api private
|
|
8
8
|
class RenamedCop < CopRule
|
|
9
|
-
attr_reader :new_name
|
|
9
|
+
attr_reader :new_name, :metadata
|
|
10
10
|
|
|
11
|
-
def initialize(config, old_name,
|
|
11
|
+
def initialize(config, old_name, name_or_hash)
|
|
12
12
|
super(config, old_name)
|
|
13
|
-
|
|
13
|
+
|
|
14
|
+
if name_or_hash.is_a?(Hash)
|
|
15
|
+
@metadata = name_or_hash
|
|
16
|
+
@new_name = name_or_hash['new_name']
|
|
17
|
+
else
|
|
18
|
+
@metadata = {}
|
|
19
|
+
@new_name = name_or_hash
|
|
20
|
+
end
|
|
14
21
|
end
|
|
15
22
|
|
|
16
23
|
def rule_message
|
|
17
24
|
"The `#{old_name}` cop has been #{verb} to `#{new_name}`."
|
|
18
25
|
end
|
|
19
26
|
|
|
27
|
+
def warning?
|
|
28
|
+
severity == 'warning'
|
|
29
|
+
end
|
|
30
|
+
|
|
20
31
|
private
|
|
21
32
|
|
|
22
33
|
def moved?
|
|
@@ -29,6 +40,10 @@ module RuboCop
|
|
|
29
40
|
def verb
|
|
30
41
|
moved? ? 'moved' : 'renamed'
|
|
31
42
|
end
|
|
43
|
+
|
|
44
|
+
def severity
|
|
45
|
+
metadata['severity']
|
|
46
|
+
end
|
|
32
47
|
end
|
|
33
48
|
end
|
|
34
49
|
end
|
|
@@ -23,9 +23,40 @@ module RuboCop
|
|
|
23
23
|
class << self
|
|
24
24
|
attr_accessor :files
|
|
25
25
|
|
|
26
|
+
def global
|
|
27
|
+
@global ||= new(Config.new)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def reset!
|
|
31
|
+
@global = nil
|
|
32
|
+
@deprecated_names = {}
|
|
33
|
+
LOAD_RULES_CACHE[rules_cache_key] = nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def rules_cache_key
|
|
37
|
+
files.hash
|
|
38
|
+
end
|
|
39
|
+
|
|
26
40
|
def legacy_cop_names
|
|
27
41
|
# Used by DepartmentName#qualified_legacy_cop_name
|
|
28
|
-
|
|
42
|
+
global.legacy_cop_names
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def deprecated_cop_name?(name)
|
|
46
|
+
global.deprecated_cop_name?(name)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def deprecated_names_for(cop)
|
|
50
|
+
@deprecated_names ||= {}
|
|
51
|
+
return @deprecated_names[cop] if @deprecated_names.key?(cop)
|
|
52
|
+
|
|
53
|
+
@deprecated_names[cop] = global.rules.filter_map do |rule|
|
|
54
|
+
next unless rule.cop_rule?
|
|
55
|
+
next unless rule.respond_to?(:new_name)
|
|
56
|
+
next unless rule.new_name == cop
|
|
57
|
+
|
|
58
|
+
rule.old_name
|
|
59
|
+
end
|
|
29
60
|
end
|
|
30
61
|
end
|
|
31
62
|
|
|
@@ -45,12 +76,21 @@ module RuboCop
|
|
|
45
76
|
raise ValidationError, messages.join("\n")
|
|
46
77
|
end
|
|
47
78
|
|
|
79
|
+
def legacy_cop_names
|
|
80
|
+
# Used by DepartmentName#qualified_legacy_cop_name
|
|
81
|
+
cop_rules.map(&:old_name)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def deprecated_cop_name?(name)
|
|
85
|
+
legacy_cop_names.include?(name)
|
|
86
|
+
end
|
|
87
|
+
|
|
48
88
|
private
|
|
49
89
|
|
|
50
90
|
# Default rules for obsoletions are in config/obsoletion.yml
|
|
51
91
|
# Additional rules files can be added with `RuboCop::ConfigObsoletion.files << filename`
|
|
52
92
|
def load_rules # rubocop:disable Metrics/AbcSize
|
|
53
|
-
rules = LOAD_RULES_CACHE[self.class.
|
|
93
|
+
rules = LOAD_RULES_CACHE[self.class.rules_cache_key] ||=
|
|
54
94
|
self.class.files.each_with_object({}) do |filename, hash|
|
|
55
95
|
hash.merge!(YAML.safe_load(File.read(filename)) || {}) do |_key, first, second|
|
|
56
96
|
case first
|
|
@@ -107,5 +147,9 @@ module RuboCop
|
|
|
107
147
|
rule.message
|
|
108
148
|
end
|
|
109
149
|
end
|
|
150
|
+
|
|
151
|
+
def cop_rules
|
|
152
|
+
rules.select(&:cop_rule?)
|
|
153
|
+
end
|
|
110
154
|
end
|
|
111
155
|
end
|
data/lib/rubocop/config_store.rb
CHANGED
|
@@ -25,6 +25,11 @@ module RuboCop
|
|
|
25
25
|
@validated = true
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
def apply_options!(options)
|
|
29
|
+
self.options_config = options[:config] if options[:config]
|
|
30
|
+
force_default_config! if options[:force_default_config]
|
|
31
|
+
end
|
|
32
|
+
|
|
28
33
|
def options_config=(options_config)
|
|
29
34
|
loaded_config = ConfigLoader.load_file(options_config)
|
|
30
35
|
@options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
|
|
@@ -3,21 +3,22 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
# Handles validation of configuration, for example cop names, parameter
|
|
5
5
|
# names, and Ruby versions.
|
|
6
|
+
# rubocop:disable Metrics/ClassLength
|
|
6
7
|
class ConfigValidator
|
|
7
8
|
extend SimpleForwardable
|
|
8
9
|
|
|
9
10
|
# @api private
|
|
10
11
|
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
|
|
11
|
-
Enabled].freeze
|
|
12
|
+
Enabled Reference References].freeze
|
|
12
13
|
# @api private
|
|
13
14
|
INTERNAL_PARAMS = %w[Description StyleGuide
|
|
14
15
|
VersionAdded VersionChanged VersionRemoved
|
|
15
|
-
Reference Safe SafeAutoCorrect].freeze
|
|
16
|
+
Reference References Safe SafeAutoCorrect].freeze
|
|
16
17
|
# @api private
|
|
17
18
|
NEW_COPS_VALUES = %w[pending disable enable].freeze
|
|
18
19
|
|
|
19
20
|
# @api private
|
|
20
|
-
CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze
|
|
21
|
+
CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect References].to_set.freeze
|
|
21
22
|
CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
|
|
22
23
|
CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
|
|
23
24
|
private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
|
|
@@ -41,8 +42,9 @@ module RuboCop
|
|
|
41
42
|
ConfigLoader.default_configuration.key?(key)
|
|
42
43
|
end
|
|
43
44
|
|
|
44
|
-
|
|
45
|
+
validate_parameter_shape(valid_cop_names)
|
|
45
46
|
|
|
47
|
+
check_obsoletions
|
|
46
48
|
alert_about_unrecognized_cops(invalid_cop_names)
|
|
47
49
|
validate_new_cops_parameter
|
|
48
50
|
validate_parameter_names(valid_cop_names)
|
|
@@ -64,12 +66,6 @@ module RuboCop
|
|
|
64
66
|
target_ruby.version
|
|
65
67
|
end
|
|
66
68
|
|
|
67
|
-
def validate_section_presence(name)
|
|
68
|
-
return unless @config.key?(name) && @config[name].nil?
|
|
69
|
-
|
|
70
|
-
raise ValidationError, "empty section #{name} found in #{smart_loaded_path}"
|
|
71
|
-
end
|
|
72
|
-
|
|
73
69
|
private
|
|
74
70
|
|
|
75
71
|
attr_reader :target_ruby
|
|
@@ -122,6 +118,7 @@ module RuboCop
|
|
|
122
118
|
invalid_cop_names.each do |name|
|
|
123
119
|
# There could be a custom cop with this name. If so, don't warn
|
|
124
120
|
next if Cop::Registry.global.contains_cop_matching?([name])
|
|
121
|
+
next if ConfigObsoletion.deprecated_cop_name?(name)
|
|
125
122
|
|
|
126
123
|
# Special case for inherit_mode, which is a directive that we keep in
|
|
127
124
|
# the configuration (even though it's not a cop), because it's easier
|
|
@@ -177,9 +174,22 @@ module RuboCop
|
|
|
177
174
|
raise ValidationError, message
|
|
178
175
|
end
|
|
179
176
|
|
|
177
|
+
def validate_parameter_shape(valid_cop_names)
|
|
178
|
+
valid_cop_names.each do |name|
|
|
179
|
+
if @config[name].nil?
|
|
180
|
+
raise ValidationError, "empty section #{name.inspect} found in #{smart_loaded_path}"
|
|
181
|
+
elsif !@config[name].is_a?(Hash)
|
|
182
|
+
raise ValidationError, <<~MESSAGE
|
|
183
|
+
The configuration for #{name.inspect} in #{smart_loaded_path} is not a Hash.
|
|
184
|
+
|
|
185
|
+
Found: #{@config[name].inspect}
|
|
186
|
+
MESSAGE
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
180
191
|
def validate_parameter_names(valid_cop_names)
|
|
181
192
|
valid_cop_names.each do |name|
|
|
182
|
-
validate_section_presence(name)
|
|
183
193
|
each_invalid_parameter(name) do |param, supported_params|
|
|
184
194
|
warn Rainbow(<<~MESSAGE).yellow
|
|
185
195
|
Warning: #{name} does not support #{param} parameter.
|
|
@@ -250,8 +260,7 @@ module RuboCop
|
|
|
250
260
|
end
|
|
251
261
|
end
|
|
252
262
|
|
|
253
|
-
# rubocop:disable Metrics/
|
|
254
|
-
def check_cop_config_value(hash, parent = nil)
|
|
263
|
+
def check_cop_config_value(hash, parent = nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
255
264
|
hash.each do |key, value|
|
|
256
265
|
check_cop_config_value(value, key) if value.is_a?(Hash)
|
|
257
266
|
|
|
@@ -261,6 +270,8 @@ module RuboCop
|
|
|
261
270
|
supposed_values = 'a boolean'
|
|
262
271
|
elsif key == 'AutoCorrect' && !CONFIG_CHECK_AUTOCORRECTS.include?(value)
|
|
263
272
|
supposed_values = '`always`, `contextual`, `disabled`, or a boolean'
|
|
273
|
+
elsif key == 'References'
|
|
274
|
+
supposed_values = 'an array of strings'
|
|
264
275
|
else
|
|
265
276
|
next
|
|
266
277
|
end
|
|
@@ -268,7 +279,6 @@ module RuboCop
|
|
|
268
279
|
raise ValidationError, param_error_message(parent, key, value, supposed_values)
|
|
269
280
|
end
|
|
270
281
|
end
|
|
271
|
-
# rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
|
272
282
|
|
|
273
283
|
# FIXME: Handling colors in exception messages like this is ugly.
|
|
274
284
|
def param_error_message(parent, key, value, supposed_values)
|
|
@@ -277,4 +287,5 @@ module RuboCop
|
|
|
277
287
|
"is supposed to be #{supposed_values} and #{Rainbow(value).yellow} is not."
|
|
278
288
|
end
|
|
279
289
|
end
|
|
290
|
+
# rubocop:enable Metrics/ClassLength
|
|
280
291
|
end
|
|
@@ -35,8 +35,8 @@ module RuboCop
|
|
|
35
35
|
# `false` is the same as `disabled` for backward compatibility.
|
|
36
36
|
return false if ['disabled', false].include?(cop_config['AutoCorrect'])
|
|
37
37
|
|
|
38
|
-
# When LSP is enabled, it is considered as editing
|
|
39
|
-
# and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
38
|
+
# When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
|
|
39
|
+
# source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
40
40
|
return false if contextual_autocorrect? && LSP.enabled?
|
|
41
41
|
|
|
42
42
|
# :safe_autocorrect is a derived option based on several command-line
|
|
@@ -49,47 +49,68 @@ module RuboCop
|
|
|
49
49
|
private
|
|
50
50
|
|
|
51
51
|
def disable_offense(offense_range)
|
|
52
|
-
|
|
52
|
+
unbreakable_range = multiline_ranges(offense_range)&.find do |range|
|
|
53
|
+
eol_comment_would_be_inside_literal?(offense_range, range)
|
|
54
|
+
end
|
|
53
55
|
|
|
54
|
-
if
|
|
55
|
-
disable_offense_before_and_after(range_by_lines(
|
|
56
|
+
if unbreakable_range
|
|
57
|
+
disable_offense_before_and_after(range_by_lines(unbreakable_range))
|
|
56
58
|
else
|
|
57
59
|
disable_offense_with_eol_or_surround_comment(offense_range)
|
|
58
60
|
end
|
|
59
61
|
end
|
|
60
62
|
|
|
61
|
-
def
|
|
62
|
-
|
|
63
|
-
needed_line_length = (range.source_line + eol_comment).length
|
|
63
|
+
def multiline_ranges(offense_range)
|
|
64
|
+
return if offense_range.empty?
|
|
64
65
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
processed_source.ast.each_node.filter_map do |node|
|
|
67
|
+
if surrounding_heredoc?(node)
|
|
68
|
+
heredoc_range(node)
|
|
69
|
+
elsif string_continuation?(node)
|
|
70
|
+
range_by_lines(node.source_range)
|
|
71
|
+
elsif surrounding_percent_array?(node) || multiline_string?(node)
|
|
72
|
+
node.source_range
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def disable_offense_with_eol_or_surround_comment(range)
|
|
78
|
+
if line_with_eol_comment_too_long?(range)
|
|
68
79
|
disable_offense_before_and_after(range_by_lines(range))
|
|
80
|
+
else
|
|
81
|
+
disable_offense_at_end_of_line(range_of_first_line(range))
|
|
69
82
|
end
|
|
70
83
|
end
|
|
71
84
|
|
|
72
|
-
def
|
|
73
|
-
|
|
74
|
-
return nil if offense_range.empty?
|
|
85
|
+
def eol_comment_would_be_inside_literal?(offense_range, literal_range)
|
|
86
|
+
return true if line_with_eol_comment_too_long?(offense_range)
|
|
75
87
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
88
|
+
offense_line = offense_range.line
|
|
89
|
+
offense_line >= literal_range.first_line && offense_line < literal_range.last_line
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def line_with_eol_comment_too_long?(range)
|
|
93
|
+
(range.source_line + eol_comment).length > max_line_length
|
|
81
94
|
end
|
|
82
95
|
|
|
83
|
-
def
|
|
84
|
-
|
|
96
|
+
def surrounding_heredoc?(node)
|
|
97
|
+
node.any_str_type? && node.heredoc?
|
|
98
|
+
end
|
|
85
99
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
100
|
+
def heredoc_range(node)
|
|
101
|
+
node.source_range.join(node.loc.heredoc_end)
|
|
102
|
+
end
|
|
89
103
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
104
|
+
def surrounding_percent_array?(node)
|
|
105
|
+
node.array_type? && node.percent_literal?
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def string_continuation?(node)
|
|
109
|
+
node.any_str_type? && node.source.match?(/\\\s*$/)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def multiline_string?(node)
|
|
113
|
+
node.dstr_type? && node.multiline?
|
|
93
114
|
end
|
|
94
115
|
|
|
95
116
|
def range_of_first_line(range)
|
|
@@ -115,10 +136,14 @@ module RuboCop
|
|
|
115
136
|
config.for_cop('Layout/LineLength')['Max'] || 120
|
|
116
137
|
end
|
|
117
138
|
|
|
118
|
-
def disable_offense_at_end_of_line(range
|
|
139
|
+
def disable_offense_at_end_of_line(range)
|
|
119
140
|
Corrector.new(range).insert_after(range, eol_comment)
|
|
120
141
|
end
|
|
121
142
|
|
|
143
|
+
def eol_comment
|
|
144
|
+
" # rubocop:todo #{cop_name}"
|
|
145
|
+
end
|
|
146
|
+
|
|
122
147
|
def disable_offense_before_and_after(range_by_lines)
|
|
123
148
|
range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
|
|
124
149
|
leading_whitespace = range_by_lines.source_line[/^\s*/]
|
data/lib/rubocop/cop/base.rb
CHANGED
|
@@ -60,7 +60,7 @@ module RuboCop
|
|
|
60
60
|
[]
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
-
# Returns
|
|
63
|
+
# Returns a url to view this cops documentation online.
|
|
64
64
|
# Requires 'DocumentationBaseURL' to be set for your department.
|
|
65
65
|
# Will follow the convention of RuboCops own documentation structure,
|
|
66
66
|
# overwrite this method to accommodate your custom layout.
|
|
@@ -261,6 +261,12 @@ module RuboCop
|
|
|
261
261
|
@config.target_ruby_version
|
|
262
262
|
end
|
|
263
263
|
|
|
264
|
+
# Returns a gems locked versions (i.e. from Gemfile.lock or gems.locked)
|
|
265
|
+
# @returns [Gem::Version | nil] The locked gem version, or nil if the gem is not present.
|
|
266
|
+
def target_gem_version(gem_name)
|
|
267
|
+
@config.gem_versions_in_target && @config.gem_versions_in_target[gem_name]
|
|
268
|
+
end
|
|
269
|
+
|
|
264
270
|
def parser_engine
|
|
265
271
|
@config.parser_engine
|
|
266
272
|
end
|
|
@@ -66,14 +66,14 @@ module RuboCop
|
|
|
66
66
|
|
|
67
67
|
def conditional_declaration?(nodes)
|
|
68
68
|
parent = nodes[0].each_ancestor.find { |ancestor| !ancestor.begin_type? }
|
|
69
|
-
return false unless parent&.
|
|
69
|
+
return false unless parent&.type?(:if, :when)
|
|
70
70
|
|
|
71
71
|
root_conditional_node = parent.if_type? ? parent : parent.parent
|
|
72
72
|
nodes.all? { |node| within_conditional?(node, root_conditional_node) }
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
def within_conditional?(node, conditional_node)
|
|
76
|
-
conditional_node.branches.any? do |branch|
|
|
76
|
+
conditional_node.branches.compact.any? do |branch|
|
|
77
77
|
branch == node || branch.child_nodes.include?(node)
|
|
78
78
|
end
|
|
79
79
|
end
|
|
@@ -27,7 +27,6 @@ module RuboCop
|
|
|
27
27
|
# Project contains gems.rb and gems.locked files
|
|
28
28
|
class GemFilename < Base
|
|
29
29
|
include ConfigurableEnforcedStyle
|
|
30
|
-
include RangeHelp
|
|
31
30
|
|
|
32
31
|
MSG_GEMFILE_REQUIRED = '`gems.rb` file was found but `Gemfile` is required ' \
|
|
33
32
|
'(file path: %<file_path>s).'
|
|
@@ -45,7 +45,7 @@ module RuboCop
|
|
|
45
45
|
|
|
46
46
|
gem_declarations(processed_source.ast)
|
|
47
47
|
.each_cons(2) do |previous, current|
|
|
48
|
-
next unless consecutive_lines(previous, current)
|
|
48
|
+
next unless consecutive_lines?(previous, current)
|
|
49
49
|
next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous))
|
|
50
50
|
|
|
51
51
|
register_offense(previous, current)
|
|
@@ -29,10 +29,13 @@ module RuboCop
|
|
|
29
29
|
def align_end(corrector, processed_source, node, align_to)
|
|
30
30
|
@processed_source = processed_source
|
|
31
31
|
whitespace = whitespace_range(node)
|
|
32
|
-
return false unless whitespace.source.strip.empty?
|
|
33
|
-
|
|
34
32
|
column = alignment_column(align_to)
|
|
35
|
-
|
|
33
|
+
|
|
34
|
+
if whitespace.source.strip.empty?
|
|
35
|
+
corrector.replace(whitespace, ' ' * column)
|
|
36
|
+
else
|
|
37
|
+
corrector.insert_after(whitespace, "\n#{' ' * column}")
|
|
38
|
+
end
|
|
36
39
|
end
|
|
37
40
|
|
|
38
41
|
private
|
|
@@ -47,14 +50,14 @@ module RuboCop
|
|
|
47
50
|
if column_delta.positive? && range.resize(1).source != "\n"
|
|
48
51
|
corrector.insert_before(range, ' ' * column_delta)
|
|
49
52
|
elsif /\A[ \t]+\z/.match?(range.source)
|
|
50
|
-
remove(range
|
|
53
|
+
corrector.remove(range)
|
|
51
54
|
end
|
|
52
55
|
end
|
|
53
56
|
|
|
54
57
|
def inside_string_ranges(node)
|
|
55
58
|
return [] unless node.is_a?(Parser::AST::Node)
|
|
56
59
|
|
|
57
|
-
node.each_node(:
|
|
60
|
+
node.each_node(:any_str).filter_map { |n| inside_string_range(n) }
|
|
58
61
|
end
|
|
59
62
|
|
|
60
63
|
def inside_string_range(node)
|
|
@@ -96,17 +99,6 @@ module RuboCop
|
|
|
96
99
|
end
|
|
97
100
|
end
|
|
98
101
|
|
|
99
|
-
def remove(range, corrector)
|
|
100
|
-
original_stderr = $stderr
|
|
101
|
-
$stderr = StringIO.new # Avoid error messages on console
|
|
102
|
-
corrector.remove(range)
|
|
103
|
-
rescue RuntimeError
|
|
104
|
-
range = range_between(range.begin_pos + 1, range.end_pos + 1)
|
|
105
|
-
retry if /^ +$/.match?(range.source)
|
|
106
|
-
ensure
|
|
107
|
-
$stderr = original_stderr
|
|
108
|
-
end
|
|
109
|
-
|
|
110
102
|
def each_line(expr)
|
|
111
103
|
line_begin_pos = expr.begin_pos
|
|
112
104
|
expr.source.each_line do |line|
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
class ForToEachCorrector
|
|
7
7
|
extend NodePattern::Macros
|
|
8
8
|
|
|
9
|
-
CORRECTION = '%<collection>s
|
|
9
|
+
CORRECTION = '%<collection>s%<dot>seach do |%<argument>s|'
|
|
10
10
|
|
|
11
11
|
def initialize(for_node)
|
|
12
12
|
@for_node = for_node
|
|
@@ -25,7 +25,12 @@ module RuboCop
|
|
|
25
25
|
attr_reader :for_node, :variable_node, :collection_node
|
|
26
26
|
|
|
27
27
|
def correction
|
|
28
|
-
format(
|
|
28
|
+
format(
|
|
29
|
+
CORRECTION,
|
|
30
|
+
collection: collection_source,
|
|
31
|
+
dot: collection_node.csend_type? ? '&.' : '.',
|
|
32
|
+
argument: variable_node.source
|
|
33
|
+
)
|
|
29
34
|
end
|
|
30
35
|
|
|
31
36
|
def collection_source
|
|
@@ -39,7 +44,7 @@ module RuboCop
|
|
|
39
44
|
def requires_parentheses?
|
|
40
45
|
return true if collection_node.send_type? && collection_node.operator_method?
|
|
41
46
|
|
|
42
|
-
collection_node.range_type? || collection_node.
|
|
47
|
+
collection_node.range_type? || collection_node.operator_keyword?
|
|
43
48
|
end
|
|
44
49
|
|
|
45
50
|
def end_range
|
|
@@ -10,8 +10,11 @@ module RuboCop
|
|
|
10
10
|
COMMA_REGEXP = /(?<=\))\s*,/.freeze
|
|
11
11
|
|
|
12
12
|
def correct(corrector, node)
|
|
13
|
-
|
|
14
|
-
corrector.remove(node.loc.
|
|
13
|
+
buffer = node.source_range.source_buffer
|
|
14
|
+
corrector.remove(range_with_surrounding_space(range: node.loc.begin, buffer: buffer,
|
|
15
|
+
side: :right, whitespace: true))
|
|
16
|
+
corrector.remove(range_with_surrounding_space(range: node.loc.end, buffer: buffer,
|
|
17
|
+
side: :left))
|
|
15
18
|
handle_orphaned_comma(corrector, node)
|
|
16
19
|
|
|
17
20
|
return unless ternary_condition?(node) && next_char_is_question_mark?(node)
|