rubocop 1.65.1 → 1.75.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 +72 -72
- data/config/default.yml +299 -55
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +3 -1
- data/exe/rubocop +4 -3
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +6 -7
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +57 -11
- data/lib/rubocop/config_loader.rb +66 -17
- data/lib/rubocop/config_loader_resolver.rb +39 -14
- 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_validator.rb +27 -15
- data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
- data/lib/rubocop/cop/base.rb +17 -3
- 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/gem_version.rb +1 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/cop.rb +8 -0
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/documentation.rb +18 -1
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- 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_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
- 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 +2 -2
- 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 +230 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -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_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- 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 +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs.rb +7 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- 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 +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- 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 +4 -4
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +9 -12
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +30 -4
- 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_exception_handling_keywords.rb +12 -8
- 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 +3 -8
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -10
- 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_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +12 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
- 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 +135 -16
- 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 +3 -4
- 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 +6 -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 +2 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +23 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
- 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 +11 -1
- 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 +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +4 -1
- 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/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
- 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_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -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 +3 -2
- 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 +46 -19
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
- 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/ensure_return.rb +1 -4
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -7
- data/lib/rubocop/cop/lint/float_comparison.rb +21 -17
- 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/implicit_string_concatenation.rb +13 -5
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +8 -14
- data/lib/rubocop/cop/lint/literal_as_condition.rb +118 -9
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -8
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- 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 +93 -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 +6 -11
- 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 +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +13 -8
- 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/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- 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 +109 -41
- data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -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 +2 -2
- 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_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +20 -11
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -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 +78 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/void.rb +40 -14
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/block_length.rb +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +15 -14
- 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 +15 -6
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- 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 +2 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- 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/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 +22 -11
- 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 +12 -6
- 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/percent_array.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 +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- 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 +11 -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 +0 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +12 -3
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_name.rb +46 -2
- 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 +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +96 -28
- data/lib/rubocop/cop/style/accessor_grouping.rb +29 -7
- data/lib/rubocop/cop/style/alias.rb +1 -1
- 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 +94 -30
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +42 -30
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +51 -20
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- 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_compact.rb +10 -10
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +10 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +25 -2
- 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 +40 -28
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
- 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 +4 -4
- 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 +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +35 -22
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +5 -5
- 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 +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
- data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
- 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 +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +12 -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 +11 -5
- 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 +26 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +25 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -12
- 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 +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +100 -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 +2 -1
- 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/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_into_array.rb +75 -14
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +38 -23
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +10 -13
- 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/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 +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
- 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_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- 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/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +2 -2
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +30 -5
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +25 -7
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +14 -22
- 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 -3
- 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_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +6 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -24
- 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_format.rb +257 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +56 -20
- data/lib/rubocop/cop/style/redundant_parentheses.rb +57 -27
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +9 -15
- 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/require_order.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +123 -54
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +14 -8
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +2 -2
- 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 +6 -7
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -106
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -15
- 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 +9 -2
- 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_proc.rb +2 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- 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 +2 -2
- 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 +14 -3
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
- 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 +5 -11
- data/lib/rubocop/cops_documentation_generator.rb +117 -53
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -2
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +6 -4
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +19 -49
- data/lib/rubocop/lsp/server.rb +0 -3
- data/lib/rubocop/lsp/stdin_runner.rb +85 -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/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/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +15 -21
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +7 -2
- data/lib/rubocop/rspec/shared_contexts.rb +40 -3
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +27 -13
- data/lib/rubocop/server/cache.rb +52 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/core.rb +1 -0
- data/lib/rubocop/target_finder.rb +7 -2
- data/lib/rubocop/target_ruby.rb +36 -17
- data/lib/rubocop/version.rb +54 -11
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +36 -2
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +83 -40
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -25,19 +25,19 @@ module RuboCop
|
|
25
25
|
# * `Layout/ArrayAlignment`
|
26
26
|
# * `Layout/BlockAlignment`
|
27
27
|
# * `Layout/BlockEndNewline`
|
28
|
-
# * `
|
29
|
-
# * `
|
30
|
-
# * `
|
31
|
-
# * `
|
32
|
-
# * `
|
33
|
-
# * `
|
34
|
-
# * `
|
35
|
-
# * `
|
36
|
-
# * `
|
37
|
-
# * `
|
38
|
-
# * `
|
39
|
-
# * `
|
40
|
-
# * `
|
28
|
+
# * `Layout/ClosingParenthesisIndentation`
|
29
|
+
# * `Layout/FirstArgumentIndentation`
|
30
|
+
# * `Layout/FirstArrayElementIndentation`
|
31
|
+
# * `Layout/FirstHashElementIndentation`
|
32
|
+
# * `Layout/FirstParameterIndentation`
|
33
|
+
# * `Layout/HashAlignment`
|
34
|
+
# * `Layout/IndentationWidth`
|
35
|
+
# * `Layout/MultilineArrayLineBreaks`
|
36
|
+
# * `Layout/MultilineBlockLayout`
|
37
|
+
# * `Layout/MultilineHashBraceLayout`
|
38
|
+
# * `Layout/MultilineHashKeyLineBreaks`
|
39
|
+
# * `Layout/MultilineMethodArgumentLineBreaks`
|
40
|
+
# * `Layout/MultilineMethodParameterLineBreaks`
|
41
41
|
# * `Layout/ParameterAlignment`
|
42
42
|
# * `Style/BlockDelimiters`
|
43
43
|
#
|
@@ -60,7 +60,7 @@ module RuboCop
|
|
60
60
|
# bar: "0000000000",
|
61
61
|
# baz: "0000000000",
|
62
62
|
# }
|
63
|
-
class LineLength < Base
|
63
|
+
class LineLength < Base # rubocop:disable Metrics/ClassLength
|
64
64
|
include CheckLineBreakable
|
65
65
|
include AllowedPattern
|
66
66
|
include RangeHelp
|
@@ -74,8 +74,16 @@ module RuboCop
|
|
74
74
|
def on_block(node)
|
75
75
|
check_for_breakable_block(node)
|
76
76
|
end
|
77
|
-
|
78
77
|
alias on_numblock on_block
|
78
|
+
alias on_itblock on_block
|
79
|
+
|
80
|
+
def on_str(node)
|
81
|
+
check_for_breakable_str(node)
|
82
|
+
end
|
83
|
+
|
84
|
+
def on_dstr(node)
|
85
|
+
check_for_breakable_dstr(node)
|
86
|
+
end
|
79
87
|
|
80
88
|
def on_potential_breakable_node(node)
|
81
89
|
check_for_breakable_node(node)
|
@@ -83,7 +91,9 @@ module RuboCop
|
|
83
91
|
alias on_array on_potential_breakable_node
|
84
92
|
alias on_hash on_potential_breakable_node
|
85
93
|
alias on_send on_potential_breakable_node
|
94
|
+
alias on_csend on_potential_breakable_node
|
86
95
|
alias on_def on_potential_breakable_node
|
96
|
+
alias on_defs on_potential_breakable_node
|
87
97
|
|
88
98
|
def on_new_investigation
|
89
99
|
return unless processed_source.raw_source.include?(';')
|
@@ -132,6 +142,42 @@ module RuboCop
|
|
132
142
|
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
133
143
|
end
|
134
144
|
|
145
|
+
def check_for_breakable_str(node)
|
146
|
+
line_index = node.loc.line - 1
|
147
|
+
return if breakable_range_by_line_index[line_index]
|
148
|
+
|
149
|
+
return unless breakable_string?(node)
|
150
|
+
return unless (delimiter = string_delimiter(node))
|
151
|
+
return unless (pos = breakable_string_position(node))
|
152
|
+
|
153
|
+
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
154
|
+
breakable_string_delimiters[line_index] = delimiter
|
155
|
+
end
|
156
|
+
|
157
|
+
def check_for_breakable_dstr(node) # rubocop:disable Metrics/AbcSize
|
158
|
+
line_index = node.loc.line - 1
|
159
|
+
return if breakable_range_by_line_index[line_index]
|
160
|
+
|
161
|
+
return unless breakable_dstr?(node)
|
162
|
+
return unless (delimiter = string_delimiter(node))
|
163
|
+
|
164
|
+
node.each_child_node(:begin).detect do |begin_node|
|
165
|
+
next unless (pos = breakable_dstr_begin_position(begin_node))
|
166
|
+
|
167
|
+
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
168
|
+
breakable_string_delimiters[line_index] = delimiter
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def breakable_string?(node)
|
173
|
+
allow_string_split? &&
|
174
|
+
node.single_line? &&
|
175
|
+
!node.heredoc? &&
|
176
|
+
# TODO: strings inside hashes, kwargs and arrays are currently ignored,
|
177
|
+
# but could be considered in the future
|
178
|
+
!node.parent&.type?(:pair, :kwoptarg, :array)
|
179
|
+
end
|
180
|
+
|
135
181
|
def breakable_block_range(block_node)
|
136
182
|
if block_node.arguments? && !block_node.lambda?
|
137
183
|
block_node.arguments.loc.end
|
@@ -153,10 +199,47 @@ module RuboCop
|
|
153
199
|
next_range
|
154
200
|
end
|
155
201
|
|
202
|
+
def breakable_string_position(node)
|
203
|
+
source_range = node.source_range
|
204
|
+
return if source_range.last_column < max
|
205
|
+
return unless (pos = breakable_string_range(node))
|
206
|
+
|
207
|
+
pos.end_pos unless pos.end_pos == source_range.begin_pos
|
208
|
+
end
|
209
|
+
|
210
|
+
# Locate where to break a string that is too long, ensuring that escape characters
|
211
|
+
# are not bisected.
|
212
|
+
# If the string contains spaces, use them to determine a place for a clean break;
|
213
|
+
# otherwise, the string will be broken at the line length limit.
|
214
|
+
def breakable_string_range(node)
|
215
|
+
source_range = node.source_range
|
216
|
+
relevant_substr = largest_possible_string(node)
|
217
|
+
|
218
|
+
if (space_pos = relevant_substr.rindex(/\s/))
|
219
|
+
source_range.resize(space_pos + 1)
|
220
|
+
elsif (escape_pos = relevant_substr.rindex(/\\(u[\da-f]{0,4}|x[\da-f]{0,2})?\z/))
|
221
|
+
source_range.resize(escape_pos)
|
222
|
+
else
|
223
|
+
adjustment = max - source_range.last_column - 3
|
224
|
+
return if adjustment.abs > source_range.size
|
225
|
+
|
226
|
+
source_range.adjust(end_pos: adjustment)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def breakable_dstr_begin_position(node)
|
231
|
+
source_range = node.source_range
|
232
|
+
source_range.begin_pos if source_range.column < max && source_range.last_column >= max
|
233
|
+
end
|
234
|
+
|
156
235
|
def breakable_range_by_line_index
|
157
236
|
@breakable_range_by_line_index ||= {}
|
158
237
|
end
|
159
238
|
|
239
|
+
def breakable_string_delimiters
|
240
|
+
@breakable_string_delimiters ||= {}
|
241
|
+
end
|
242
|
+
|
160
243
|
def heredocs
|
161
244
|
@heredocs ||= extract_heredocs(processed_source.ast)
|
162
245
|
end
|
@@ -197,7 +280,14 @@ module RuboCop
|
|
197
280
|
|
198
281
|
add_offense(loc, message: message) do |corrector|
|
199
282
|
self.max = line_length(line)
|
200
|
-
|
283
|
+
|
284
|
+
insertion = if (delimiter = breakable_string_delimiters[line_index])
|
285
|
+
[delimiter, " \\\n", delimiter].join
|
286
|
+
else
|
287
|
+
"\n"
|
288
|
+
end
|
289
|
+
|
290
|
+
corrector.insert_before(breakable_range, insertion) unless breakable_range.nil?
|
201
291
|
end
|
202
292
|
end
|
203
293
|
|
@@ -224,6 +314,10 @@ module RuboCop
|
|
224
314
|
cop_config['AllowHeredoc']
|
225
315
|
end
|
226
316
|
|
317
|
+
def allow_string_split?
|
318
|
+
cop_config['SplitStrings']
|
319
|
+
end
|
320
|
+
|
227
321
|
def extract_heredocs(ast)
|
228
322
|
return [] unless ast
|
229
323
|
|
@@ -270,6 +364,31 @@ module RuboCop
|
|
270
364
|
|
271
365
|
register_offense(excess_range(uri_range, line, line_index), line, line_index)
|
272
366
|
end
|
367
|
+
|
368
|
+
def breakable_dstr?(node)
|
369
|
+
# If the `dstr` only contains one child, it cannot be broken
|
370
|
+
breakable_string?(node) && !node.child_nodes.one?
|
371
|
+
end
|
372
|
+
|
373
|
+
def string_delimiter(node)
|
374
|
+
delimiter = node.loc.begin
|
375
|
+
if node.parent&.dstr_type? && node.parent.loc.respond_to?(:begin)
|
376
|
+
delimiter ||= node.parent.loc.begin
|
377
|
+
end
|
378
|
+
delimiter = delimiter&.source
|
379
|
+
|
380
|
+
delimiter if %w[' "].include?(delimiter)
|
381
|
+
end
|
382
|
+
|
383
|
+
# Find the largest possible substring of a string node to retain before a break
|
384
|
+
def largest_possible_string(node)
|
385
|
+
# The maximum allowed length of a string value is:
|
386
|
+
# `Max` - end delimiter (quote) - continuation characters (space and slash)
|
387
|
+
max_length = max - 3
|
388
|
+
# If the string doesn't start at the beginning of the line, the max length is offset
|
389
|
+
max_length -= column_offset_between(node.loc, node.parent.loc) if node.parent
|
390
|
+
node.source[0...(max_length)]
|
391
|
+
end
|
273
392
|
end
|
274
393
|
end
|
275
394
|
end
|
@@ -52,7 +52,7 @@ module RuboCop
|
|
52
52
|
def on_hash(node)
|
53
53
|
# This cop only deals with hashes wrapped by a set of curly
|
54
54
|
# braces like {foo: 1}. That is, not a kwargs hashes.
|
55
|
-
#
|
55
|
+
# Layout/MultilineMethodArgumentLineBreaks handles those.
|
56
56
|
return unless starts_with_curly_brace?(node)
|
57
57
|
return unless node.loc.begin
|
58
58
|
|
@@ -33,6 +33,18 @@ module RuboCop
|
|
33
33
|
#
|
34
34
|
# @example AllowMultilineFinalElement: false (default)
|
35
35
|
#
|
36
|
+
# # bad
|
37
|
+
# foo(a, b,
|
38
|
+
# c
|
39
|
+
# )
|
40
|
+
#
|
41
|
+
# # bad
|
42
|
+
# foo(
|
43
|
+
# a, b, {
|
44
|
+
# foo: "bar",
|
45
|
+
# }
|
46
|
+
# )
|
47
|
+
#
|
36
48
|
# # good
|
37
49
|
# foo(
|
38
50
|
# a,
|
@@ -44,6 +56,18 @@ module RuboCop
|
|
44
56
|
#
|
45
57
|
# @example AllowMultilineFinalElement: true
|
46
58
|
#
|
59
|
+
# # bad
|
60
|
+
# foo(a, b,
|
61
|
+
# c
|
62
|
+
# )
|
63
|
+
#
|
64
|
+
# # good
|
65
|
+
# foo(
|
66
|
+
# a, b, {
|
67
|
+
# foo: "bar",
|
68
|
+
# }
|
69
|
+
# )
|
70
|
+
#
|
47
71
|
# # good
|
48
72
|
# foo(
|
49
73
|
# a,
|
@@ -75,6 +99,7 @@ module RuboCop
|
|
75
99
|
|
76
100
|
check_line_breaks(node, args, ignore_last: ignore_last_element?)
|
77
101
|
end
|
102
|
+
alias on_csend on_send
|
78
103
|
|
79
104
|
private
|
80
105
|
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# argument of the call, then the closing brace should be on the same
|
13
13
|
# line as the last argument of the call.
|
14
14
|
#
|
15
|
-
# If
|
15
|
+
# If a method call's opening brace is on the line above the first
|
16
16
|
# argument of the call, then the closing brace should be on the line
|
17
17
|
# below the last argument of the call.
|
18
18
|
#
|
@@ -109,6 +109,7 @@ module RuboCop
|
|
109
109
|
def on_send(node)
|
110
110
|
check_brace_layout(node)
|
111
111
|
end
|
112
|
+
alias on_csend on_send
|
112
113
|
|
113
114
|
private
|
114
115
|
|
@@ -100,7 +100,7 @@ module RuboCop
|
|
100
100
|
|
101
101
|
def extra_indentation(given_style, parent)
|
102
102
|
if given_style == :indented_relative_to_receiver
|
103
|
-
if parent
|
103
|
+
if parent&.type?(:splat, :kwsplat)
|
104
104
|
configured_indentation_width - parent.loc.operator.length
|
105
105
|
else
|
106
106
|
configured_indentation_width
|
@@ -216,7 +216,7 @@ module RuboCop
|
|
216
216
|
|
217
217
|
def get_dot_right_above(node)
|
218
218
|
node.each_ancestor.find do |a|
|
219
|
-
dot = a.loc.
|
219
|
+
dot = a.loc.dot if a.loc?(:dot)
|
220
220
|
next unless dot
|
221
221
|
|
222
222
|
dot.line == node.loc.dot.line - 1 && dot.column == node.loc.dot.column
|
@@ -224,7 +224,7 @@ module RuboCop
|
|
224
224
|
end
|
225
225
|
|
226
226
|
def find_multiline_block_chain_node(node)
|
227
|
-
return unless (block_node = node.each_descendant(:
|
227
|
+
return unless (block_node = node.each_descendant(:any_block).first)
|
228
228
|
return unless block_node.multiline? && block_node.parent.call_type?
|
229
229
|
|
230
230
|
if node.receiver.call_type?
|
@@ -239,7 +239,7 @@ module RuboCop
|
|
239
239
|
node = node.receiver while node.receiver
|
240
240
|
# ascend to first call which has a dot
|
241
241
|
node = node.parent
|
242
|
-
node = node.parent until node.loc
|
242
|
+
node = node.parent until node.loc?(:dot)
|
243
243
|
|
244
244
|
node
|
245
245
|
end
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# first parameter of the definition, then the closing brace should be
|
13
13
|
# on the same line as the last parameter of the definition.
|
14
14
|
#
|
15
|
-
# If
|
15
|
+
# If a method definition's opening brace is on the line above the first
|
16
16
|
# parameter of the definition, then the closing brace should be on the
|
17
17
|
# line below the last parameter of the definition.
|
18
18
|
#
|
@@ -76,9 +76,8 @@ module RuboCop
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def check_and_or(node)
|
79
|
-
lhs, rhs
|
80
|
-
range
|
81
|
-
check(range, node, lhs, rhs.source_range)
|
79
|
+
range = offending_range(node, node.lhs, node.rhs.source_range, style)
|
80
|
+
check(range, node, node.lhs, node.rhs.source_range)
|
82
81
|
end
|
83
82
|
|
84
83
|
def offending_range(node, lhs, rhs, given_style)
|
@@ -119,7 +118,7 @@ module RuboCop
|
|
119
118
|
end
|
120
119
|
|
121
120
|
def right_hand_side(send_node)
|
122
|
-
send_node.first_argument
|
121
|
+
send_node.first_argument&.source_range
|
123
122
|
end
|
124
123
|
end
|
125
124
|
end
|
@@ -3,11 +3,10 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
#
|
7
|
-
# definition are aligned.
|
6
|
+
# Check that the parameters on a multi-line method call or definition are aligned.
|
8
7
|
#
|
9
|
-
# To set the alignment of the first argument, use the
|
10
|
-
# FirstParameterIndentation.
|
8
|
+
# To set the alignment of the first argument, use the
|
9
|
+
# `Layout/FirstParameterIndentation` cop.
|
11
10
|
#
|
12
11
|
# @example EnforcedStyle: with_first_parameter (default)
|
13
12
|
# # good
|
@@ -6,25 +6,29 @@ module RuboCop
|
|
6
6
|
# Checks whether certain expressions, e.g. method calls, that could fit
|
7
7
|
# completely on a single line, are broken up into multiple lines unnecessarily.
|
8
8
|
#
|
9
|
-
# @example
|
9
|
+
# @example
|
10
10
|
# # bad
|
11
11
|
# foo(
|
12
12
|
# a,
|
13
13
|
# b
|
14
14
|
# )
|
15
15
|
#
|
16
|
+
# # good
|
17
|
+
# foo(a, b)
|
18
|
+
#
|
19
|
+
# # bad
|
16
20
|
# puts 'string that fits on ' \
|
17
21
|
# 'a single line'
|
18
22
|
#
|
23
|
+
# # good
|
24
|
+
# puts 'string that fits on a single line'
|
25
|
+
#
|
26
|
+
# # bad
|
19
27
|
# things
|
20
28
|
# .select { |thing| thing.cond? }
|
21
29
|
# .join('-')
|
22
30
|
#
|
23
31
|
# # good
|
24
|
-
# foo(a, b)
|
25
|
-
#
|
26
|
-
# puts 'string that fits on a single line'
|
27
|
-
#
|
28
32
|
# things.select { |thing| thing.cond? }.join('-')
|
29
33
|
#
|
30
34
|
# @example InspectBlocks: false (default)
|
@@ -44,6 +48,7 @@ module RuboCop
|
|
44
48
|
#
|
45
49
|
class RedundantLineBreak < Base
|
46
50
|
include CheckAssignment
|
51
|
+
include CheckSingleLineSuitability
|
47
52
|
extend AutoCorrector
|
48
53
|
|
49
54
|
MSG = 'Redundant line break detected.'
|
@@ -84,8 +89,8 @@ module RuboCop
|
|
84
89
|
end
|
85
90
|
|
86
91
|
def offense?(node)
|
87
|
-
return false
|
88
|
-
return require_backslash?(node) if node.
|
92
|
+
return false unless node.multiline? && suitable_as_single_line?(node)
|
93
|
+
return require_backslash?(node) if node.operator_keyword?
|
89
94
|
|
90
95
|
!index_access_call_chained?(node) && !configured_to_not_be_inspected?(node)
|
91
96
|
end
|
@@ -102,58 +107,26 @@ module RuboCop
|
|
102
107
|
|
103
108
|
def configured_to_not_be_inspected?(node)
|
104
109
|
return true if other_cop_takes_precedence?(node)
|
110
|
+
return false if cop_config['InspectBlocks']
|
105
111
|
|
106
|
-
|
107
|
-
any_descendant?(node, :block, &:multiline?))
|
112
|
+
node.any_block_type? || any_descendant?(node, :any_block, &:multiline?)
|
108
113
|
end
|
109
114
|
|
110
115
|
def other_cop_takes_precedence?(node)
|
111
|
-
single_line_block_chain_enabled? && any_descendant?(node, :
|
116
|
+
single_line_block_chain_enabled? && any_descendant?(node, :any_block) do |block_node|
|
112
117
|
block_node.parent.send_type? && block_node.parent.loc.dot && !block_node.multiline?
|
113
118
|
end
|
114
119
|
end
|
115
120
|
|
116
121
|
def single_line_block_chain_enabled?
|
117
|
-
@config.
|
118
|
-
end
|
119
|
-
|
120
|
-
def suitable_as_single_line?(node)
|
121
|
-
!comment_within?(node) &&
|
122
|
-
node.each_descendant(:if, :case, :kwbegin, :def, :defs).none? &&
|
123
|
-
node.each_descendant(:dstr, :str).none? { |n| n.heredoc? || n.value.include?("\n") } &&
|
124
|
-
node.each_descendant(:begin, :sym).none? { |b| !b.single_line? }
|
122
|
+
@config.cop_enabled?('Layout/SingleLineBlockChain')
|
125
123
|
end
|
126
124
|
|
127
125
|
def convertible_block?(node)
|
128
|
-
parent = node.parent
|
129
|
-
parent&.block_type? && node == parent.send_node &&
|
130
|
-
(node.parenthesized? || !node.arguments?)
|
131
|
-
end
|
132
|
-
|
133
|
-
def comment_within?(node)
|
134
|
-
comment_line_numbers = processed_source.comments.map { |comment| comment.loc.line }
|
135
|
-
|
136
|
-
comment_line_numbers.any? do |comment_line_number|
|
137
|
-
comment_line_number >= node.first_line && comment_line_number <= node.last_line
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def too_long?(node)
|
142
|
-
lines = processed_source.lines[(node.first_line - 1)...node.last_line]
|
143
|
-
to_single_line(lines.join("\n")).length > max_line_length
|
144
|
-
end
|
126
|
+
return false unless (parent = node.parent)
|
145
127
|
|
146
|
-
|
147
|
-
|
148
|
-
.gsub(/" *\\\n\s*'/, %q(" + ')) # Double quote, backslash, and then single quote
|
149
|
-
.gsub(/' *\\\n\s*"/, %q(' + ")) # Single quote, backslash, and then double quote
|
150
|
-
.gsub(/(["']) *\\\n\s*\1/, '') # Double or single quote, backslash, then same quote
|
151
|
-
.gsub(/\n\s*(?=(&)?\.\w)/, '') # Extra space within method chaining which includes `&.`
|
152
|
-
.gsub(/\s*\\?\n\s*/, ' ') # Any other line break, with or without backslash
|
153
|
-
end
|
154
|
-
|
155
|
-
def max_line_length
|
156
|
-
config.for_cop('Layout/LineLength')['Max']
|
128
|
+
parent.any_block_type? && node == parent.send_node &&
|
129
|
+
(node.parenthesized? || !node.arguments?)
|
157
130
|
end
|
158
131
|
end
|
159
132
|
end
|
@@ -29,8 +29,7 @@ module RuboCop
|
|
29
29
|
MSG = '`%<kw_loc>s` at %<kw_loc_line>d, %<kw_loc_column>d is not ' \
|
30
30
|
'aligned with `%<beginning>s` at ' \
|
31
31
|
'%<begin_loc_line>d, %<begin_loc_column>d.'
|
32
|
-
ANCESTOR_TYPES = %i[kwbegin
|
33
|
-
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS = %i[def defs].freeze
|
32
|
+
ANCESTOR_TYPES = %i[kwbegin any_def class module any_block].freeze
|
34
33
|
ALTERNATIVE_ACCESS_MODIFIERS = %i[public_class_method private_class_method].freeze
|
35
34
|
|
36
35
|
def on_resbody(node)
|
@@ -92,17 +91,17 @@ module RuboCop
|
|
92
91
|
)
|
93
92
|
end
|
94
93
|
|
94
|
+
# rubocop:disable Metrics/AbcSize
|
95
95
|
def alignment_source(node, starting_loc)
|
96
96
|
ending_loc =
|
97
97
|
case node.type
|
98
|
-
when :block, :numblock, :kwbegin
|
98
|
+
when :block, :numblock, :itblock, :kwbegin
|
99
99
|
node.loc.begin
|
100
100
|
when :def, :defs, :class, :module,
|
101
101
|
:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
|
102
102
|
node.loc.name
|
103
103
|
when :masgn
|
104
|
-
|
105
|
-
mlhs_node.source_range
|
104
|
+
node.lhs.source_range
|
106
105
|
else
|
107
106
|
# It is a wrapper with receiver of object attribute or access modifier.
|
108
107
|
node.receiver&.source_range || node.child_nodes.first.loc.name
|
@@ -110,6 +109,7 @@ module RuboCop
|
|
110
109
|
|
111
110
|
range_between(starting_loc.begin_pos, ending_loc.end_pos).source
|
112
111
|
end
|
112
|
+
# rubocop:enable Metrics/AbcSize
|
113
113
|
|
114
114
|
# We will use ancestor or wrapper with access modifier.
|
115
115
|
|
@@ -161,8 +161,7 @@ module RuboCop
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def access_modifier_node(node)
|
164
|
-
return nil unless
|
165
|
-
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS.include?(node.type)
|
164
|
+
return nil unless node.any_def_type?
|
166
165
|
|
167
166
|
access_modifier_node = node.ancestors.first
|
168
167
|
return nil unless access_modifier?(access_modifier_node)
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
|
40
40
|
def offending_range(node)
|
41
41
|
receiver = node.receiver
|
42
|
-
return unless receiver&.
|
42
|
+
return unless receiver&.any_block_type?
|
43
43
|
|
44
44
|
receiver_location = receiver.loc
|
45
45
|
closing_block_delimiter_line_num = receiver_location.end.line
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks for colon (
|
6
|
+
# Checks for colon (`:`) not followed by some kind of space.
|
7
7
|
# N.B. this cop does not handle spaces after a ternary operator, which are
|
8
|
-
# instead handled by Layout/SpaceAroundOperators
|
8
|
+
# instead handled by `Layout/SpaceAroundOperators`.
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
# # bad
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks for semicolon (
|
6
|
+
# Checks for semicolon (`;`) not followed by some kind of space.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
# # bad
|
@@ -23,6 +23,16 @@ module RuboCop
|
|
23
23
|
def kind(token)
|
24
24
|
'semicolon' if token.semicolon?
|
25
25
|
end
|
26
|
+
|
27
|
+
def space_missing?(token1, token2)
|
28
|
+
super && !semicolon_sequence?(token1, token2)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def semicolon_sequence?(token, next_token)
|
34
|
+
token.semicolon? && next_token.semicolon?
|
35
|
+
end
|
26
36
|
end
|
27
37
|
end
|
28
38
|
end
|
@@ -36,6 +36,7 @@ module RuboCop
|
|
36
36
|
ACCEPT_LEFT_PAREN = %w[break defined? next not rescue return super yield].freeze
|
37
37
|
ACCEPT_LEFT_SQUARE_BRACKET = %w[super yield].freeze
|
38
38
|
ACCEPT_NAMESPACE_OPERATOR = 'super'
|
39
|
+
RESTRICT_ON_SEND = %i[!].freeze
|
39
40
|
|
40
41
|
def on_and(node)
|
41
42
|
check(node, [:operator].freeze) if node.keyword?
|
@@ -256,7 +257,7 @@ module RuboCop
|
|
256
257
|
# regular dotted method calls bind more tightly than operators
|
257
258
|
# so we need to climb up the AST past them
|
258
259
|
node.each_ancestor do |ancestor|
|
259
|
-
return true if ancestor.
|
260
|
+
return true if ancestor.operator_keyword? || ancestor.range_type?
|
260
261
|
return false unless ancestor.send_type?
|
261
262
|
return true if ancestor.operator_method?
|
262
263
|
end
|