rubocop 1.68.0 → 1.71.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/config/default.yml +77 -8
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +13 -4
- data/lib/rubocop/config_loader.rb +4 -0
- data/lib/rubocop/config_loader_resolver.rb +14 -3
- data/lib/rubocop/config_validator.rb +18 -8
- data/lib/rubocop/cop/autocorrect_logic.rb +32 -35
- 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/correctors/for_to_each_corrector.rb +1 -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_enabled.rb +85 -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 +1 -1
- 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 +229 -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/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.rb +5 -0
- 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 +1 -2
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- 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 +3 -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 -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 +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -0
- data/lib/rubocop/cop/layout/indentation_width.rb +7 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +15 -0
- 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 +119 -4
- 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 +2 -2
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
- 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 +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
- 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 +6 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -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/array_literal_in_regexp.rb +119 -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/circular_argument_reference.rb +6 -0
- 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/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- 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 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +19 -8
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- 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 +1 -0
- 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_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
- 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 +5 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- 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 +1 -2
- 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/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
- 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/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/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +2 -0
- 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/shared_mutable_default.rb +65 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- 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 +2 -1
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- 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 +8 -11
- 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 +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +8 -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 +2 -3
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +7 -2
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +4 -4
- data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +0 -1
- 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 +1 -1
- 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 +3 -3
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- 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/memoized_instance_variable_name.rb +11 -12
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +3 -4
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- 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 +86 -28
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +5 -4
- data/lib/rubocop/cop/style/bitwise_predicate.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +24 -22
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +11 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +25 -25
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- 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 +3 -3
- 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 +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- 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 +0 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +1 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +0 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
- 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 +6 -7
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +2 -2
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +3 -2
- data/lib/rubocop/cop/style/map_into_array.rb +1 -1
- 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 +20 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -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 +2 -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 +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
- 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/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
- 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 +9 -18
- 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/proc.rb +1 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +7 -5
- 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 +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +38 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
- 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_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +44 -23
- data/lib/rubocop/cop/style/redundant_parentheses.rb +12 -12
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- 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 +8 -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_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +2 -3
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- 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 +12 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +14 -13
- 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/super_arguments.rb +65 -17
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- 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/util.rb +11 -4
- data/lib/rubocop/cop/variable_force/variable.rb +14 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cop/variable_force.rb +4 -10
- data/lib/rubocop/cops_documentation_generator.rb +22 -14
- data/lib/rubocop/directive_comment.rb +9 -8
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- 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 +15 -49
- data/lib/rubocop/lsp/stdin_runner.rb +83 -0
- data/lib/rubocop/magic_comment.rb +3 -3
- data/lib/rubocop/options.rb +2 -1
- data/lib/rubocop/path_util.rb +11 -8
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -1
- data/lib/rubocop/rspec/support.rb +1 -2
- data/lib/rubocop/runner.rb +5 -6
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +15 -0
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +14 -0
- data/lib/ruby_lsp/rubocop/addon.rb +78 -0
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +50 -0
- metadata +36 -15
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
# Checks if empty lines exist around the bodies of `begin`
|
7
7
|
# sections. This cop doesn't check empty lines at `begin` body
|
8
8
|
# beginning/end and around method definition body.
|
9
|
-
# `
|
9
|
+
# `Layout/EmptyLinesAroundBeginBody` or `Layout/EmptyLinesAroundMethodBody`
|
10
10
|
# can be used for this purpose.
|
11
11
|
#
|
12
12
|
# @example
|
@@ -72,8 +72,7 @@ module RuboCop
|
|
72
72
|
alias on_numblock on_def
|
73
73
|
|
74
74
|
def on_kwbegin(node)
|
75
|
-
|
76
|
-
check_body(body, node.loc.line)
|
75
|
+
check_body(node.children.first, node.loc.line)
|
77
76
|
end
|
78
77
|
|
79
78
|
private
|
@@ -128,10 +127,10 @@ module RuboCop
|
|
128
127
|
end
|
129
128
|
|
130
129
|
def keyword_locations_in_ensure(node)
|
131
|
-
|
130
|
+
rescue_body_without_ensure = node.children.first
|
132
131
|
[
|
133
132
|
node.loc.keyword,
|
134
|
-
*keyword_locations(
|
133
|
+
*keyword_locations(rescue_body_without_ensure)
|
135
134
|
]
|
136
135
|
end
|
137
136
|
end
|
@@ -182,7 +182,7 @@ module RuboCop
|
|
182
182
|
end
|
183
183
|
|
184
184
|
def alignment_node_for_variable_style(node)
|
185
|
-
if
|
185
|
+
if node.type?(:case, :case_match) && node.argument? &&
|
186
186
|
same_line?(node, node.parent)
|
187
187
|
return node.parent
|
188
188
|
end
|
@@ -70,7 +70,7 @@ module RuboCop
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def check_assignment(token)
|
73
|
-
return unless
|
73
|
+
return unless aligned_with_preceding_equals_operator(token) == :no
|
74
74
|
|
75
75
|
message = format(MSG_UNALIGNED_ASGN, location: 'preceding')
|
76
76
|
add_offense(token.pos, message: message) do |corrector|
|
@@ -225,7 +225,7 @@ module RuboCop
|
|
225
225
|
|
226
226
|
def base_range(send_node, arg_node)
|
227
227
|
parent = send_node.parent
|
228
|
-
start_node = if parent
|
228
|
+
start_node = if parent&.type?(:splat, :kwsplat)
|
229
229
|
send_node.parent
|
230
230
|
else
|
231
231
|
send_node
|
@@ -269,17 +269,12 @@ module RuboCop
|
|
269
269
|
end
|
270
270
|
|
271
271
|
def enforce_first_argument_with_fixed_indentation?
|
272
|
-
|
273
|
-
|
272
|
+
argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment')
|
274
273
|
argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
275
274
|
end
|
276
275
|
|
277
276
|
def enable_layout_first_method_argument_line_break?
|
278
|
-
config.
|
279
|
-
end
|
280
|
-
|
281
|
-
def argument_alignment_config
|
282
|
-
config.for_cop('Layout/ArgumentAlignment')
|
277
|
+
config.cop_enabled?('Layout/FirstMethodArgumentLineBreak')
|
283
278
|
end
|
284
279
|
end
|
285
280
|
end
|
@@ -180,13 +180,8 @@ module RuboCop
|
|
180
180
|
end
|
181
181
|
|
182
182
|
def enforce_first_argument_with_fixed_indentation?
|
183
|
-
|
184
|
-
|
185
|
-
array_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
186
|
-
end
|
187
|
-
|
188
|
-
def array_alignment_config
|
189
|
-
config.for_cop('Layout/ArrayAlignment')
|
183
|
+
argument_alignment_config = config.for_enabled_cop('Layout/ArrayAlignment')
|
184
|
+
argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
190
185
|
end
|
191
186
|
end
|
192
187
|
end
|
@@ -7,7 +7,7 @@ module RuboCop
|
|
7
7
|
# where the opening brace and the first key are on separate lines. The
|
8
8
|
# other keys' indentations are handled by the HashAlignment cop.
|
9
9
|
#
|
10
|
-
# By default, Hash literals that are arguments in a method call with
|
10
|
+
# By default, `Hash` literals that are arguments in a method call with
|
11
11
|
# parentheses, and where the opening curly brace of the hash is on the
|
12
12
|
# same line as the opening parenthesis of the method call, shall have
|
13
13
|
# their first key indented one step (two spaces) more than the position
|
@@ -225,14 +225,9 @@ module RuboCop
|
|
225
225
|
end
|
226
226
|
|
227
227
|
def enforce_first_argument_with_fixed_indentation?
|
228
|
-
|
229
|
-
|
228
|
+
argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment')
|
230
229
|
argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
231
230
|
end
|
232
|
-
|
233
|
-
def argument_alignment_config
|
234
|
-
config.for_cop('Layout/ArgumentAlignment')
|
235
|
-
end
|
236
231
|
end
|
237
232
|
end
|
238
233
|
end
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
|
52
52
|
def on_hash(node)
|
53
53
|
# node.loc.begin tells us whether the hash opens with a {
|
54
|
-
# If it doesn't,
|
54
|
+
# If it doesn't, Layout/FirstMethodArgumentLineBreak will handle it
|
55
55
|
return unless node.loc.begin
|
56
56
|
|
57
57
|
check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
|
@@ -5,10 +5,10 @@ module RuboCop
|
|
5
5
|
module Layout
|
6
6
|
# Checks the indentation of the first parameter in a method
|
7
7
|
# definition. Parameters after the first one are checked by
|
8
|
-
# Layout/ParameterAlignment
|
8
|
+
# `Layout/ParameterAlignment`, not by this cop.
|
9
9
|
#
|
10
10
|
# For indenting the first argument of method _calls_, check out
|
11
|
-
# Layout/FirstArgumentIndentation
|
11
|
+
# `Layout/FirstArgumentIndentation`, which supports options related to
|
12
12
|
# nesting that are irrelevant for method _definitions_.
|
13
13
|
#
|
14
14
|
# @example
|
@@ -202,6 +202,7 @@ module RuboCop
|
|
202
202
|
|
203
203
|
ignore_node(last_argument)
|
204
204
|
end
|
205
|
+
alias on_csend on_send
|
205
206
|
alias on_super on_send
|
206
207
|
alias on_yield on_send
|
207
208
|
|
@@ -227,6 +228,7 @@ module RuboCop
|
|
227
228
|
left_sibling = argument_before_hash(node)
|
228
229
|
parent_loc = node.parent.loc
|
229
230
|
selector = left_sibling || parent_loc.selector || parent_loc.expression
|
231
|
+
|
230
232
|
same_line?(selector, node.pairs.first)
|
231
233
|
end
|
232
234
|
|
@@ -382,13 +384,13 @@ module RuboCop
|
|
382
384
|
end
|
383
385
|
|
384
386
|
def enforce_first_argument_with_fixed_indentation?
|
385
|
-
|
386
|
-
|
387
|
+
argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment')
|
387
388
|
argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
388
389
|
end
|
389
390
|
|
390
|
-
def
|
391
|
-
|
391
|
+
def same_line?(node1, node2)
|
392
|
+
# Override `Util#same_line?`
|
393
|
+
super || node1.last_line == line(node2)
|
392
394
|
end
|
393
395
|
end
|
394
396
|
end
|
@@ -58,16 +58,17 @@ module RuboCop
|
|
58
58
|
PATTERN
|
59
59
|
|
60
60
|
def on_rescue(node)
|
61
|
-
|
62
|
-
check_indentation(node.loc.else, else_node)
|
61
|
+
check_indentation(node.loc.else, node.else_branch)
|
63
62
|
end
|
64
63
|
|
65
|
-
def
|
64
|
+
def on_resbody(node)
|
66
65
|
check_indentation(node.loc.keyword, node.body)
|
67
66
|
end
|
67
|
+
alias on_for on_resbody
|
68
68
|
|
69
|
-
|
70
|
-
|
69
|
+
def on_ensure(node)
|
70
|
+
check_indentation(node.loc.keyword, node.branch)
|
71
|
+
end
|
71
72
|
|
72
73
|
def on_kwbegin(node)
|
73
74
|
# Check indentation against end keyword but only if it's first on its
|
@@ -325,8 +326,7 @@ module RuboCop
|
|
325
326
|
if body_node.rescue_type?
|
326
327
|
check_rescue?(body_node)
|
327
328
|
elsif body_node.ensure_type?
|
328
|
-
block_body, = *body_node
|
329
|
-
|
329
|
+
block_body, = *body_node # rubocop:disable InternalAffairs/NodeDestructuring
|
330
330
|
if block_body&.rescue_type?
|
331
331
|
check_rescue?(block_body)
|
332
332
|
else
|
@@ -96,6 +96,7 @@ module RuboCop
|
|
96
96
|
processed_source.comments.each do |comment|
|
97
97
|
next unless /\A(?!#\+\+|#--)(#+[^#\s=])/.match?(comment.text)
|
98
98
|
next if comment.loc.line == 1 && allowed_on_first_line?(comment)
|
99
|
+
next if shebang_continuation?(comment)
|
99
100
|
next if doxygen_comment_style?(comment)
|
100
101
|
next if gemfile_ruby_comment?(comment)
|
101
102
|
next if rbs_inline_annotation?(comment)
|
@@ -123,6 +124,20 @@ module RuboCop
|
|
123
124
|
comment.text.start_with?('#!')
|
124
125
|
end
|
125
126
|
|
127
|
+
def shebang_continuation?(comment)
|
128
|
+
return false unless shebang?(comment)
|
129
|
+
return true if comment.loc.line == 1
|
130
|
+
|
131
|
+
previous_line_comment = processed_source.comment_at_line(comment.loc.line - 1)
|
132
|
+
return false unless previous_line_comment
|
133
|
+
|
134
|
+
# If the comment is a shebang but not on the first line, check if the previous
|
135
|
+
# line has a shebang comment that wasn't marked as an offense; if so, this comment
|
136
|
+
# continues the shebang and is acceptable.
|
137
|
+
shebang?(previous_line_comment) &&
|
138
|
+
!current_offense_locations.include?(previous_line_comment.source_range)
|
139
|
+
end
|
140
|
+
|
126
141
|
def rackup_options?(comment)
|
127
142
|
comment.text.start_with?('#\\')
|
128
143
|
end
|
@@ -51,6 +51,15 @@ module RuboCop
|
|
51
51
|
private_constant :LINE_1_ENDING, :LINE_2_BEGINNING,
|
52
52
|
:LEADING_STYLE_OFFENSE, :TRAILING_STYLE_OFFENSE
|
53
53
|
|
54
|
+
# When both cops are activated and run in the same iteration of the correction loop,
|
55
|
+
# `Style/StringLiterals` undoes the moving of spaces that
|
56
|
+
# `Layout/LineContinuationLeadingSpace` performs. This is because `Style/StringLiterals`
|
57
|
+
# takes the original string content and transforms it, rather than just modifying the
|
58
|
+
# delimiters, in order to handle escaping for quotes within the string.
|
59
|
+
def self.autocorrect_incompatible_with
|
60
|
+
[Style::StringLiterals]
|
61
|
+
end
|
62
|
+
|
54
63
|
def on_dstr(node)
|
55
64
|
# Quick check if we possibly have line continuations.
|
56
65
|
return unless node.source.include?('\\')
|
@@ -129,9 +138,9 @@ module RuboCop
|
|
129
138
|
|
130
139
|
def message(_range)
|
131
140
|
if enforced_style_leading?
|
132
|
-
'Move trailing spaces to the start of next line.'
|
141
|
+
'Move trailing spaces to the start of the next line.'
|
133
142
|
else
|
134
|
-
'Move leading spaces to the end of previous line.'
|
143
|
+
'Move leading spaces to the end of the previous line.'
|
135
144
|
end
|
136
145
|
end
|
137
146
|
|
@@ -101,7 +101,7 @@ module RuboCop
|
|
101
101
|
ranges << loc.expression
|
102
102
|
elsif literal.heredoc?
|
103
103
|
ranges << loc.heredoc_body
|
104
|
-
elsif loc.respond_to?(:begin) && loc.begin
|
104
|
+
elsif (loc.respond_to?(:begin) && loc.begin) || ignored_parent?(literal)
|
105
105
|
ranges << loc.expression
|
106
106
|
end
|
107
107
|
end
|
@@ -127,6 +127,12 @@ module RuboCop
|
|
127
127
|
comment_ranges(processed_source.comments)
|
128
128
|
end
|
129
129
|
|
130
|
+
def ignored_parent?(node)
|
131
|
+
return false unless node.parent
|
132
|
+
|
133
|
+
node.parent.type?(:regexp, :xstr)
|
134
|
+
end
|
135
|
+
|
130
136
|
def no_space_style?
|
131
137
|
cop_config['EnforcedStyle'] == 'no_space'
|
132
138
|
end
|
@@ -102,7 +102,7 @@ module RuboCop
|
|
102
102
|
|
103
103
|
def strings_concatenated_with_backslash?(dstr_node)
|
104
104
|
dstr_node.multiline? &&
|
105
|
-
dstr_node.children.all? { |c| c.
|
105
|
+
dstr_node.children.all? { |c| c.type?(:str, :dstr) } &&
|
106
106
|
dstr_node.children.none?(&:multiline?)
|
107
107
|
end
|
108
108
|
|
@@ -127,7 +127,7 @@ module RuboCop
|
|
127
127
|
|
128
128
|
def base_column(child)
|
129
129
|
grandparent = child.parent.parent
|
130
|
-
if grandparent&.
|
130
|
+
if grandparent&.pair_type?
|
131
131
|
grandparent.loc.column
|
132
132
|
else
|
133
133
|
child.source_range.source_line =~ /\S/
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
38
38
|
# * `Layout/MultilineHashKeyLineBreaks`
|
39
39
|
# * `Layout/MultilineMethodArgumentLineBreaks`
|
40
40
|
# * `Layout/MultilineMethodParameterLineBreaks`
|
41
|
-
# * `Layout
|
41
|
+
# * `Layout/ParameterAlignment`
|
42
42
|
# * `Style/BlockDelimiters`
|
43
43
|
#
|
44
44
|
# Together, these cops will pretty print hashes, arrays,
|
@@ -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,15 +74,23 @@ 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
|
79
78
|
|
79
|
+
def on_str(node)
|
80
|
+
check_for_breakable_str(node)
|
81
|
+
end
|
82
|
+
|
83
|
+
def on_dstr(node)
|
84
|
+
check_for_breakable_dstr(node)
|
85
|
+
end
|
86
|
+
|
80
87
|
def on_potential_breakable_node(node)
|
81
88
|
check_for_breakable_node(node)
|
82
89
|
end
|
83
90
|
alias on_array on_potential_breakable_node
|
84
91
|
alias on_hash on_potential_breakable_node
|
85
92
|
alias on_send on_potential_breakable_node
|
93
|
+
alias on_csend on_potential_breakable_node
|
86
94
|
alias on_def on_potential_breakable_node
|
87
95
|
|
88
96
|
def on_new_investigation
|
@@ -132,6 +140,42 @@ module RuboCop
|
|
132
140
|
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
133
141
|
end
|
134
142
|
|
143
|
+
def check_for_breakable_str(node)
|
144
|
+
line_index = node.loc.line - 1
|
145
|
+
return if breakable_range_by_line_index[line_index]
|
146
|
+
|
147
|
+
return unless breakable_string?(node)
|
148
|
+
return unless (delimiter = string_delimiter(node))
|
149
|
+
return unless (pos = breakable_string_position(node))
|
150
|
+
|
151
|
+
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
152
|
+
breakable_string_delimiters[line_index] = delimiter
|
153
|
+
end
|
154
|
+
|
155
|
+
def check_for_breakable_dstr(node) # rubocop:disable Metrics/AbcSize
|
156
|
+
line_index = node.loc.line - 1
|
157
|
+
return if breakable_range_by_line_index[line_index]
|
158
|
+
|
159
|
+
return unless breakable_dstr?(node)
|
160
|
+
return unless (delimiter = string_delimiter(node))
|
161
|
+
|
162
|
+
node.each_child_node(:begin).detect do |begin_node|
|
163
|
+
next unless (pos = breakable_dstr_begin_position(begin_node))
|
164
|
+
|
165
|
+
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
166
|
+
breakable_string_delimiters[line_index] = delimiter
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def breakable_string?(node)
|
171
|
+
allow_string_split? &&
|
172
|
+
node.single_line? &&
|
173
|
+
!node.heredoc? &&
|
174
|
+
# TODO: strings inside hashes, kwargs and arrays are currently ignored,
|
175
|
+
# but could be considered in the future
|
176
|
+
!node.parent&.type?(:pair, :kwoptarg, :array)
|
177
|
+
end
|
178
|
+
|
135
179
|
def breakable_block_range(block_node)
|
136
180
|
if block_node.arguments? && !block_node.lambda?
|
137
181
|
block_node.arguments.loc.end
|
@@ -153,10 +197,47 @@ module RuboCop
|
|
153
197
|
next_range
|
154
198
|
end
|
155
199
|
|
200
|
+
def breakable_string_position(node)
|
201
|
+
source_range = node.source_range
|
202
|
+
return if source_range.last_column < max
|
203
|
+
return unless (pos = breakable_string_range(node))
|
204
|
+
|
205
|
+
pos.end_pos unless pos.end_pos == source_range.begin_pos
|
206
|
+
end
|
207
|
+
|
208
|
+
# Locate where to break a string that is too long, ensuring that escape characters
|
209
|
+
# are not bisected.
|
210
|
+
# If the string contains spaces, use them to determine a place for a clean break;
|
211
|
+
# otherwise, the string will be broken at the line length limit.
|
212
|
+
def breakable_string_range(node) # rubocop:disable Metrics/AbcSize
|
213
|
+
source_range = node.source_range
|
214
|
+
relevant_substr = largest_possible_string(node)
|
215
|
+
|
216
|
+
if (space_pos = relevant_substr.rindex(/\s/))
|
217
|
+
source_range.resize(space_pos + 1)
|
218
|
+
elsif (escape_pos = relevant_substr.rindex(/\\(u[\da-f]{0,4}|x[\da-f]{0,2})?\z/))
|
219
|
+
source_range.resize(escape_pos)
|
220
|
+
else
|
221
|
+
adjustment = max - source_range.last_column - 3
|
222
|
+
return if adjustment.abs > source_range.size
|
223
|
+
|
224
|
+
source_range.adjust(end_pos: max - source_range.last_column - 3)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def breakable_dstr_begin_position(node)
|
229
|
+
source_range = node.source_range
|
230
|
+
source_range.begin_pos if source_range.begin_pos < max && source_range.end_pos >= max
|
231
|
+
end
|
232
|
+
|
156
233
|
def breakable_range_by_line_index
|
157
234
|
@breakable_range_by_line_index ||= {}
|
158
235
|
end
|
159
236
|
|
237
|
+
def breakable_string_delimiters
|
238
|
+
@breakable_string_delimiters ||= {}
|
239
|
+
end
|
240
|
+
|
160
241
|
def heredocs
|
161
242
|
@heredocs ||= extract_heredocs(processed_source.ast)
|
162
243
|
end
|
@@ -197,7 +278,14 @@ module RuboCop
|
|
197
278
|
|
198
279
|
add_offense(loc, message: message) do |corrector|
|
199
280
|
self.max = line_length(line)
|
200
|
-
|
281
|
+
|
282
|
+
insertion = if (delimiter = breakable_string_delimiters[line_index])
|
283
|
+
[delimiter, " \\\n", delimiter].join
|
284
|
+
else
|
285
|
+
"\n"
|
286
|
+
end
|
287
|
+
|
288
|
+
corrector.insert_before(breakable_range, insertion) unless breakable_range.nil?
|
201
289
|
end
|
202
290
|
end
|
203
291
|
|
@@ -224,6 +312,10 @@ module RuboCop
|
|
224
312
|
cop_config['AllowHeredoc']
|
225
313
|
end
|
226
314
|
|
315
|
+
def allow_string_split?
|
316
|
+
cop_config['SplitStrings']
|
317
|
+
end
|
318
|
+
|
227
319
|
def extract_heredocs(ast)
|
228
320
|
return [] unless ast
|
229
321
|
|
@@ -270,6 +362,29 @@ module RuboCop
|
|
270
362
|
|
271
363
|
register_offense(excess_range(uri_range, line, line_index), line, line_index)
|
272
364
|
end
|
365
|
+
|
366
|
+
def breakable_dstr?(node)
|
367
|
+
# If the `dstr` only contains one child, it cannot be broken
|
368
|
+
breakable_string?(node) && !node.child_nodes.one?
|
369
|
+
end
|
370
|
+
|
371
|
+
def string_delimiter(node)
|
372
|
+
delimiter = node.loc.begin
|
373
|
+
delimiter ||= node.parent.loc.begin if node.parent&.dstr_type?
|
374
|
+
delimiter = delimiter&.source
|
375
|
+
|
376
|
+
delimiter if %w[' "].include?(delimiter)
|
377
|
+
end
|
378
|
+
|
379
|
+
# Find the largest possible substring of a string node to retain before a break
|
380
|
+
def largest_possible_string(node)
|
381
|
+
# The maximum allowed length of a string value is:
|
382
|
+
# `Max` - end delimiter (quote) - continuation characters (space and slash)
|
383
|
+
max_length = max - 3
|
384
|
+
# If the string doesn't start at the beginning of the line, the max length is offset
|
385
|
+
max_length -= column_offset_between(node.loc, node.parent.loc) if node.parent
|
386
|
+
node.source[0...(max_length)]
|
387
|
+
end
|
273
388
|
end
|
274
389
|
end
|
275
390
|
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
|
@@ -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?
|
@@ -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)
|
@@ -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
|