rubocop 1.69.2 → 1.72.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 +66 -2
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +17 -4
- data/lib/rubocop/config_loader.rb +48 -8
- data/lib/rubocop/config_loader_resolver.rb +33 -8
- data/lib/rubocop/config_validator.rb +18 -8
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/base.rb +6 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +4 -2
- 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/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/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -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/undefined_config.rb +7 -1
- data/lib/rubocop/cop/internal_affairs.rb +5 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
- 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 +2 -2
- 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 +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- 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 +2 -1
- 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 +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 +1 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +7 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
- 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 +1 -0
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -3
- 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/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 +1 -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 +1 -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_expression.rb +0 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +5 -2
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.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 +1 -1
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +231 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -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/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
- 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 +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- 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_constant_scoping.rb +80 -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_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +5 -9
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- 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/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/check_line_breakable.rb +11 -11
- data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
- data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
- data/lib/rubocop/cop/mixin/range_help.rb +3 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
- data/lib/rubocop/cop/security/compound_hash.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
- 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/block_delimiters.rb +7 -20
- 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/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
- 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 +3 -10
- 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 +1 -1
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
- data/lib/rubocop/cop/style/hash_except.rb +24 -148
- 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_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -6
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- 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 +19 -12
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
- 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/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +13 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
- 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 +6 -4
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -2
- 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_format.rb +238 -0
- 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 +34 -13
- data/lib/rubocop/cop/style/redundant_parentheses.rb +28 -14
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -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_self_assignment.rb +14 -28
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- 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/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -2
- 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 +2 -2
- data/lib/rubocop/cop/style/string_concatenation.rb +1 -1
- 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/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/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 +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +7 -5
- data/lib/rubocop/cop/variable_force/variable.rb +14 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cops_documentation_generator.rb +13 -13
- data/lib/rubocop/directive_comment.rb +44 -10
- 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 +17 -49
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +83 -0
- 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 +39 -0
- data/lib/rubocop/rake_task.rb +4 -1
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +9 -0
- 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/server/cache.rb +35 -2
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +15 -0
- data/lib/rubocop/version.rb +17 -2
- data/lib/rubocop.rb +11 -0
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
- metadata +53 -15
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,126 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Use `node.type?(:foo, :bar)` instead of `node.foo_type? || node.bar_type?`,
|
7
|
+
# and `!node.type?(:foo, :bar)` instead of `!node.foo_type? && !node.bar_type?`.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
#
|
11
|
+
# # bad
|
12
|
+
# node.str_type? || node.sym_type?
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# node.type?(:str, :sym)
|
16
|
+
#
|
17
|
+
# # bad
|
18
|
+
# node.type?(:str, :sym) || node.boolean_type?
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# node.type?(:str, :sym, :boolean)
|
22
|
+
#
|
23
|
+
# # bad
|
24
|
+
# !node.str_type? && !node.sym_type?
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# !node.type?(:str, :sym)
|
28
|
+
#
|
29
|
+
# # bad
|
30
|
+
# !node.type?(:str, :sym) && !node.boolean_type?
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# !node.type?(:str, :sym, :boolean)
|
34
|
+
#
|
35
|
+
class NodeTypeMultiplePredicates < Base
|
36
|
+
extend AutoCorrector
|
37
|
+
|
38
|
+
MSG_OR = 'Use `%<replacement>s` instead of checking for multiple node types.'
|
39
|
+
MSG_AND = 'Use `%<replacement>s` instead of checking against multiple node types.'
|
40
|
+
|
41
|
+
# @!method one_of_node_types?(node)
|
42
|
+
def_node_matcher :one_of_node_types?, <<~PATTERN
|
43
|
+
(or $(call _receiver #type_predicate?) (call _receiver #type_predicate?))
|
44
|
+
PATTERN
|
45
|
+
|
46
|
+
# @!method or_another_type?(node)
|
47
|
+
def_node_matcher :or_another_type?, <<~PATTERN
|
48
|
+
(or {
|
49
|
+
$(call _receiver :type? sym+) (call _receiver #type_predicate?) |
|
50
|
+
(call _receiver #type_predicate?) $(call _receiver :type? sym+)
|
51
|
+
})
|
52
|
+
PATTERN
|
53
|
+
|
54
|
+
# @!method none_of_node_types?(node)
|
55
|
+
def_node_matcher :none_of_node_types?, <<~PATTERN
|
56
|
+
(and
|
57
|
+
(send $(call _receiver #type_predicate?) :!)
|
58
|
+
(send (call _receiver #type_predicate?) :!)
|
59
|
+
)
|
60
|
+
PATTERN
|
61
|
+
|
62
|
+
# @!method and_not_another_type?(node)
|
63
|
+
def_node_matcher :and_not_another_type?, <<~PATTERN
|
64
|
+
(and {
|
65
|
+
(send $(call _receiver :type? sym+) :!) (send (call _receiver #type_predicate?) :!) |
|
66
|
+
(send (call _receiver #type_predicate?) :!) (send $(call _receiver :type? sym+) :!)
|
67
|
+
})
|
68
|
+
PATTERN
|
69
|
+
|
70
|
+
def on_or(node)
|
71
|
+
return unless (send_node = one_of_node_types?(node) || or_another_type?(node))
|
72
|
+
return unless send_node.receiver
|
73
|
+
|
74
|
+
replacement = replacement(node, send_node)
|
75
|
+
add_offense(node, message: format(MSG_OR, replacement: replacement)) do |corrector|
|
76
|
+
corrector.replace(node, replacement)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def on_and(node)
|
81
|
+
return unless (send_node = none_of_node_types?(node) || and_not_another_type?(node))
|
82
|
+
return unless send_node.receiver
|
83
|
+
|
84
|
+
replacement = "!#{replacement(node, send_node)}"
|
85
|
+
|
86
|
+
add_offense(node, message: format(MSG_AND, replacement: replacement)) do |corrector|
|
87
|
+
corrector.replace(node, replacement)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def type_predicate?(method_name)
|
94
|
+
method_name.end_with?('_type?')
|
95
|
+
end
|
96
|
+
|
97
|
+
def replacement(node, send_node)
|
98
|
+
send_node = send_node.children.first if send_node.method?(:!)
|
99
|
+
|
100
|
+
types = types(node)
|
101
|
+
receiver = send_node.receiver.source
|
102
|
+
dot = send_node.loc.dot.source
|
103
|
+
|
104
|
+
"#{receiver}#{dot}type?(:#{types.join(', :')})"
|
105
|
+
end
|
106
|
+
|
107
|
+
def types(node)
|
108
|
+
[types_in_branch(node.lhs), types_in_branch(node.rhs)]
|
109
|
+
end
|
110
|
+
|
111
|
+
def types_in_branch(branch)
|
112
|
+
branch = branch.children.first if branch.method?(:!)
|
113
|
+
|
114
|
+
if branch.method?(:type?)
|
115
|
+
branch.arguments.map(&:value)
|
116
|
+
elsif branch.method?(:defined_type?)
|
117
|
+
# `node.defined_type?` relates to `node.type == :defined?`
|
118
|
+
'defined?'
|
119
|
+
else
|
120
|
+
branch.method_name.to_s.delete_suffix('_type?')
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -21,16 +21,17 @@ module RuboCop
|
|
21
21
|
|
22
22
|
# @!method node_type_check(node)
|
23
23
|
def_node_matcher :node_type_check, <<~PATTERN
|
24
|
-
(send (
|
24
|
+
(send (call _ :type) :== (sym $_))
|
25
25
|
PATTERN
|
26
26
|
|
27
27
|
def on_send(node)
|
28
|
-
node_type_check(node) do |
|
28
|
+
node_type_check(node) do |node_type|
|
29
29
|
return unless Parser::Meta::NODE_TYPES.include?(node_type)
|
30
30
|
|
31
31
|
message = format(MSG, type: node_type)
|
32
32
|
add_offense(node, message: message) do |corrector|
|
33
|
-
range = node.
|
33
|
+
range = node.receiver.loc.selector.join(node.source_range.end)
|
34
|
+
|
34
35
|
corrector.replace(range, "#{node_type}_type?")
|
35
36
|
end
|
36
37
|
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Checks for cops that define `on_send` without define `on_csend`.
|
7
|
+
#
|
8
|
+
# Although in some cases it can be predetermined that safe navigation
|
9
|
+
# will never be used with the code checked by a specific cop, in general
|
10
|
+
# it is good practice to handle safe navigation methods if handling any
|
11
|
+
# `send` node.
|
12
|
+
#
|
13
|
+
# NOTE: It is expected to disable this cop for cops that check for method calls
|
14
|
+
# on receivers that cannot be nil (`self`, a literal, a constant), and
|
15
|
+
# method calls that will never have a receiver (ruby keywords like `raise`,
|
16
|
+
# macros like `attr_reader`, DSL methods, etc.), and other checks that wouldn't
|
17
|
+
# make sense to support safe navigation.
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
# # bad
|
21
|
+
# class MyCop < RuboCop::Cop:Base
|
22
|
+
# def on_send(node)
|
23
|
+
# # ...
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# # good - explicit method definition
|
28
|
+
# class MyCop < RuboCop::Cop:Base
|
29
|
+
# def on_send(node)
|
30
|
+
# # ...
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# def on_csend(node)
|
34
|
+
# # ...
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# # good - alias
|
39
|
+
# class MyCop < RuboCop::Cop:Base
|
40
|
+
# def on_send(node)
|
41
|
+
# # ...
|
42
|
+
# end
|
43
|
+
# alias on_csend on_send
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# # good - alias_method
|
47
|
+
# class MyCop < RuboCop::Cop:Base
|
48
|
+
# def on_send(node)
|
49
|
+
# # ...
|
50
|
+
# end
|
51
|
+
# alias_method :on_csend, :on_send
|
52
|
+
# end
|
53
|
+
class OnSendWithoutOnCSend < Base
|
54
|
+
RESTRICT_ON_SEND = %i[alias_method].freeze
|
55
|
+
MSG = 'Cop defines `on_send` but not `on_csend`.'
|
56
|
+
|
57
|
+
def on_new_investigation
|
58
|
+
@on_send_definition = nil
|
59
|
+
@on_csend_definition = nil
|
60
|
+
end
|
61
|
+
|
62
|
+
def on_investigation_end
|
63
|
+
return unless @on_send_definition && !@on_csend_definition
|
64
|
+
|
65
|
+
add_offense(@on_send_definition)
|
66
|
+
end
|
67
|
+
|
68
|
+
def on_def(node)
|
69
|
+
@on_send_definition = node if node.method?(:on_send)
|
70
|
+
@on_csend_definition = node if node.method?(:on_csend)
|
71
|
+
end
|
72
|
+
|
73
|
+
def on_alias(node)
|
74
|
+
@on_send_definition = node if node.new_identifier.value == :on_send
|
75
|
+
@on_csend_definition = node if node.new_identifier.value == :on_csend
|
76
|
+
end
|
77
|
+
|
78
|
+
def on_send(node) # rubocop:disable InternalAffairs/OnSendWithoutOnCSend
|
79
|
+
new_identifier = node.first_argument
|
80
|
+
return unless new_identifier.basic_literal?
|
81
|
+
|
82
|
+
new_identifier = new_identifier.value
|
83
|
+
|
84
|
+
@on_send_definition = node if new_identifier == :on_send
|
85
|
+
@on_csend_definition = node if new_identifier == :on_csend
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'lint_roller'
|
4
|
+
|
5
|
+
module RuboCop
|
6
|
+
module InternalAffairs
|
7
|
+
# A Plugin for `InternalAffairs` department, which has internal cops.
|
8
|
+
class Plugin < LintRoller::Plugin
|
9
|
+
def about
|
10
|
+
LintRoller::About.new(
|
11
|
+
name: 'rubocop-internal_affairs',
|
12
|
+
version: Version::STRING,
|
13
|
+
homepage: 'https://github.com/rubocop/rubocop/tree/master/lib/rubocop/cop/internal_affairs',
|
14
|
+
description: 'A collection of RuboCop cops to check for internal affairs.'
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
def supported?(context)
|
19
|
+
context.engine == :rubocop
|
20
|
+
end
|
21
|
+
|
22
|
+
def rules(_context)
|
23
|
+
require_relative '../internal_affairs'
|
24
|
+
|
25
|
+
LintRoller::Rules.new(
|
26
|
+
type: :path,
|
27
|
+
config_format: :rubocop,
|
28
|
+
value: Pathname.new(__dir__).join('../../../../config/internal_affairs.yml')
|
29
|
+
)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -47,7 +47,7 @@ module RuboCop
|
|
47
47
|
# @!method redundant_source_range(node)
|
48
48
|
def_node_matcher :redundant_source_range, <<~PATTERN
|
49
49
|
{
|
50
|
-
(
|
50
|
+
(call $(call _ :source_range) :source)
|
51
51
|
(send nil? :add_offense $(send _ :source_range) ...)
|
52
52
|
(send _ {
|
53
53
|
:replace :insert_before :insert_before_multi :insert_after :insert_after_multi
|
@@ -59,6 +59,7 @@ module RuboCop
|
|
59
59
|
|
60
60
|
def on_send(node)
|
61
61
|
return unless (source_range = redundant_source_range(node))
|
62
|
+
return unless source_range.receiver
|
62
63
|
return if source_range.receiver.send_type? && source_range.receiver.method?(:buffer)
|
63
64
|
|
64
65
|
selector = source_range.loc.selector
|
@@ -67,6 +68,7 @@ module RuboCop
|
|
67
68
|
corrector.remove(source_range.loc.dot.join(selector))
|
68
69
|
end
|
69
70
|
end
|
71
|
+
alias on_csend on_send
|
70
72
|
end
|
71
73
|
end
|
72
74
|
end
|
@@ -34,8 +34,8 @@ module RuboCop
|
|
34
34
|
# @!method single_line_comparison(node)
|
35
35
|
def_node_matcher :single_line_comparison, <<~PATTERN
|
36
36
|
{
|
37
|
-
(send (
|
38
|
-
(send (
|
37
|
+
(send (call $_receiver {:line :first_line}) {:== :!=} (call _receiver :last_line))
|
38
|
+
(send (call $_receiver :last_line) {:== :!=} (call _receiver {:line :first_line}))
|
39
39
|
}
|
40
40
|
PATTERN
|
41
41
|
|
@@ -43,7 +43,8 @@ module RuboCop
|
|
43
43
|
return unless (receiver = single_line_comparison(node))
|
44
44
|
|
45
45
|
bang = node.method?(:!=) ? '!' : ''
|
46
|
-
|
46
|
+
dot = receiver.parent.loc.dot.source
|
47
|
+
preferred = "#{bang}#{extract_receiver(receiver)}#{dot}single_line?"
|
47
48
|
|
48
49
|
add_offense(node, message: format(MSG, preferred: preferred)) do |corrector|
|
49
50
|
corrector.replace(node, preferred)
|
@@ -53,7 +54,7 @@ module RuboCop
|
|
53
54
|
private
|
54
55
|
|
55
56
|
def extract_receiver(node)
|
56
|
-
node = node.receiver if node.
|
57
|
+
node = node.receiver if node.call_type? && %i[loc source_range].include?(node.method_name)
|
57
58
|
node.source
|
58
59
|
end
|
59
60
|
end
|
@@ -17,7 +17,13 @@ module RuboCop
|
|
17
17
|
'in `config/default.yml`.'
|
18
18
|
CONFIG_PATH = find_file_upwards('config/default.yml', Dir.pwd)
|
19
19
|
CONFIG = if CONFIG_PATH
|
20
|
-
|
20
|
+
begin
|
21
|
+
original_debug = ConfigLoader.debug
|
22
|
+
ConfigLoader.debug = false
|
23
|
+
ConfigLoader.load_yaml_configuration(CONFIG_PATH)
|
24
|
+
ensure
|
25
|
+
ConfigLoader.debug = original_debug
|
26
|
+
end
|
21
27
|
else
|
22
28
|
{}
|
23
29
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'internal_affairs/cop_description'
|
4
|
+
require_relative 'internal_affairs/cop_enabled'
|
4
5
|
require_relative 'internal_affairs/create_empty_file'
|
5
6
|
require_relative 'internal_affairs/empty_line_between_expect_offense_and_correction'
|
6
7
|
require_relative 'internal_affairs/example_description'
|
7
8
|
require_relative 'internal_affairs/example_heredoc_delimiter'
|
8
9
|
require_relative 'internal_affairs/inherit_deprecated_cop_class'
|
9
10
|
require_relative 'internal_affairs/lambda_or_proc'
|
11
|
+
require_relative 'internal_affairs/location_exists'
|
10
12
|
require_relative 'internal_affairs/location_expression'
|
11
13
|
require_relative 'internal_affairs/location_line_equality_comparison'
|
12
14
|
require_relative 'internal_affairs/method_name_end_with'
|
@@ -14,9 +16,12 @@ require_relative 'internal_affairs/method_name_equal'
|
|
14
16
|
require_relative 'internal_affairs/node_destructuring'
|
15
17
|
require_relative 'internal_affairs/node_first_or_last_argument'
|
16
18
|
require_relative 'internal_affairs/node_matcher_directive'
|
19
|
+
require_relative 'internal_affairs/node_pattern_groups'
|
20
|
+
require_relative 'internal_affairs/node_type_multiple_predicates'
|
17
21
|
require_relative 'internal_affairs/node_type_predicate'
|
18
22
|
require_relative 'internal_affairs/numblock_handler'
|
19
23
|
require_relative 'internal_affairs/offense_location_keyword'
|
24
|
+
require_relative 'internal_affairs/on_send_without_on_csend'
|
20
25
|
require_relative 'internal_affairs/operator_keyword'
|
21
26
|
require_relative 'internal_affairs/processed_source_buffer_name'
|
22
27
|
require_relative 'internal_affairs/redundant_context_config_parameter'
|
@@ -32,19 +37,3 @@ require_relative 'internal_affairs/style_detected_api_use'
|
|
32
37
|
require_relative 'internal_affairs/undefined_config'
|
33
38
|
require_relative 'internal_affairs/useless_message_assertion'
|
34
39
|
require_relative 'internal_affairs/useless_restrict_on_send'
|
35
|
-
|
36
|
-
module RuboCop
|
37
|
-
# Patch in the InternalAffairs specific config values
|
38
|
-
module InternalAffairs
|
39
|
-
def self.inject!
|
40
|
-
path = File.join(ConfigLoader::RUBOCOP_HOME, 'config', 'internal_affairs.yml')
|
41
|
-
hash = ConfigLoader.load_yaml_configuration(path)
|
42
|
-
config = Config.new(hash, path)
|
43
|
-
puts "configuration from #{path}" if ConfigLoader.debug?
|
44
|
-
config = ConfigLoader.merge_with_default(config, path)
|
45
|
-
ConfigLoader.instance_variable_set(:@default_configuration, config)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
RuboCop::InternalAffairs.inject!
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
6
|
# Bare access modifiers (those not applying to specific methods) should be
|
7
|
-
# indented as deep as method definitions, or as deep as the class
|
7
|
+
# indented as deep as method definitions, or as deep as the `class`/`module`
|
8
8
|
# keyword, depending on configuration.
|
9
9
|
#
|
10
10
|
# @example EnforcedStyle: indent (default)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Check that the arguments on a multi-line method
|
6
|
+
# Check that the arguments on a multi-line method call are aligned.
|
7
7
|
#
|
8
8
|
# @example EnforcedStyle: with_first_argument (default)
|
9
9
|
# # good
|
@@ -141,16 +141,10 @@ module RuboCop
|
|
141
141
|
end
|
142
142
|
|
143
143
|
def enforce_hash_argument_with_separator?
|
144
|
-
return false unless hash_argument_config['Enabled']
|
145
|
-
|
146
144
|
RuboCop::Cop::Layout::HashAlignment::SEPARATOR_ALIGNMENT_STYLES.any? do |style|
|
147
|
-
|
145
|
+
config.for_enabled_cop('Layout/HashAlignment')[style]&.include?('separator')
|
148
146
|
end
|
149
147
|
end
|
150
|
-
|
151
|
-
def hash_argument_config
|
152
|
-
config.for_cop('Layout/HashAlignment')
|
153
|
-
end
|
154
148
|
end
|
155
149
|
end
|
156
150
|
end
|
@@ -73,6 +73,8 @@ module RuboCop
|
|
73
73
|
# @!method block_end_align_target?(node, child)
|
74
74
|
def_node_matcher :block_end_align_target?, <<~PATTERN
|
75
75
|
{assignment?
|
76
|
+
def
|
77
|
+
defs
|
76
78
|
splat
|
77
79
|
and
|
78
80
|
or
|
@@ -188,7 +190,7 @@ module RuboCop
|
|
188
190
|
# In offense message, we want to show the assignment LHS rather than
|
189
191
|
# the entire assignment.
|
190
192
|
def find_lhs_node(node)
|
191
|
-
node = node.lhs while node.
|
193
|
+
node = node.lhs while node.type?(:op_asgn, :masgn)
|
192
194
|
node
|
193
195
|
end
|
194
196
|
|
@@ -3,23 +3,23 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks if the code style follows the ExpectedOrder configuration:
|
6
|
+
# Checks if the code style follows the `ExpectedOrder` configuration:
|
7
7
|
#
|
8
8
|
# `Categories` allows us to map macro names into a category.
|
9
9
|
#
|
10
10
|
# Consider an example of code style that covers the following order:
|
11
11
|
#
|
12
|
-
# * Module inclusion (include
|
12
|
+
# * Module inclusion (`include`, `prepend`, `extend`)
|
13
13
|
# * Constants
|
14
|
-
# * Associations (has_one
|
15
|
-
# * Public attribute macros (attr_accessor
|
16
|
-
# * Other macros (validates
|
14
|
+
# * Associations (`has_one`, `has_many`)
|
15
|
+
# * Public attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
16
|
+
# * Other macros (`validates`, `validate`)
|
17
17
|
# * Public class methods
|
18
18
|
# * Initializer
|
19
19
|
# * Public instance methods
|
20
|
-
# * Protected attribute macros (attr_accessor
|
20
|
+
# * Protected attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
21
21
|
# * Protected instance methods
|
22
|
-
# * Private attribute macros (attr_accessor
|
22
|
+
# * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
23
23
|
# * Private instance methods
|
24
24
|
#
|
25
25
|
# You can configure the following order:
|
@@ -236,7 +236,7 @@ module RuboCop
|
|
236
236
|
|
237
237
|
return [] unless class_def
|
238
238
|
|
239
|
-
if class_def.
|
239
|
+
if class_def.type?(:def, :send)
|
240
240
|
[class_def]
|
241
241
|
else
|
242
242
|
class_def.children.compact
|
@@ -289,7 +289,7 @@ module RuboCop
|
|
289
289
|
def marked_as_private_constant?(node, name)
|
290
290
|
return false unless node.method?(:private_constant)
|
291
291
|
|
292
|
-
node.arguments.any? { |arg|
|
292
|
+
node.arguments.any? { |arg| arg.type?(:sym, :str) && arg.value == name }
|
293
293
|
end
|
294
294
|
|
295
295
|
def end_position_for(node)
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def on_rescue(node)
|
52
|
-
return unless node.loc
|
52
|
+
return unless node.loc?(:else)
|
53
53
|
|
54
54
|
check_alignment(base_range_of_rescue(node), node.loc.else)
|
55
55
|
end
|
@@ -92,7 +92,7 @@ module RuboCop
|
|
92
92
|
case parent.type
|
93
93
|
when :def, :defs then base_for_method_definition(parent)
|
94
94
|
when :kwbegin then parent.loc.begin
|
95
|
-
when :block
|
95
|
+
when :block, :numblock
|
96
96
|
assignment_node = assignment_node(parent)
|
97
97
|
if same_line?(parent, assignment_node)
|
98
98
|
assignment_node.source_range
|
@@ -22,8 +22,6 @@ module RuboCop
|
|
22
22
|
# def b
|
23
23
|
# end
|
24
24
|
#
|
25
|
-
# @example
|
26
|
-
#
|
27
25
|
# # good
|
28
26
|
# def a
|
29
27
|
# end
|
@@ -42,8 +40,6 @@ module RuboCop
|
|
42
40
|
# def b
|
43
41
|
# end
|
44
42
|
#
|
45
|
-
# @example
|
46
|
-
#
|
47
43
|
# # good
|
48
44
|
# class A
|
49
45
|
# end
|
@@ -65,8 +61,6 @@ module RuboCop
|
|
65
61
|
# def b
|
66
62
|
# end
|
67
63
|
#
|
68
|
-
# @example
|
69
|
-
#
|
70
64
|
# # good
|
71
65
|
# module A
|
72
66
|
# end
|
@@ -162,7 +156,7 @@ module RuboCop
|
|
162
156
|
private
|
163
157
|
|
164
158
|
def def_location(correction_node)
|
165
|
-
if correction_node.
|
159
|
+
if correction_node.any_block_type?
|
166
160
|
correction_node.source_range.join(correction_node.children.first.source_range)
|
167
161
|
else
|
168
162
|
correction_node.loc.keyword.join(correction_node.loc.name)
|
@@ -181,12 +175,12 @@ module RuboCop
|
|
181
175
|
end
|
182
176
|
|
183
177
|
def macro_candidate?(node)
|
184
|
-
node.
|
178
|
+
node.any_block_type? && node.children.first.macro? &&
|
185
179
|
empty_line_between_macros.include?(node.children.first.method_name)
|
186
180
|
end
|
187
181
|
|
188
182
|
def method_candidate?(node)
|
189
|
-
cop_config['EmptyLineBetweenMethodDefs'] &&
|
183
|
+
cop_config['EmptyLineBetweenMethodDefs'] && node.type?(:def, :defs)
|
190
184
|
end
|
191
185
|
|
192
186
|
def class_candidate?(node)
|
@@ -246,7 +240,7 @@ module RuboCop
|
|
246
240
|
end
|
247
241
|
|
248
242
|
def def_start(node)
|
249
|
-
if node.
|
243
|
+
if node.any_block_type? && node.children.first.send_type?
|
250
244
|
node.source_range.line
|
251
245
|
else
|
252
246
|
node.loc.keyword.line
|
@@ -258,7 +252,7 @@ module RuboCop
|
|
258
252
|
end
|
259
253
|
|
260
254
|
def end_loc(node)
|
261
|
-
if
|
255
|
+
if node.type?(:def, :defs) && node.endless?
|
262
256
|
node.source_range.end
|
263
257
|
else
|
264
258
|
node.loc.end
|
@@ -283,6 +277,8 @@ module RuboCop
|
|
283
277
|
case node.type
|
284
278
|
when :def, :defs
|
285
279
|
:method
|
280
|
+
when :numblock
|
281
|
+
:block
|
286
282
|
else
|
287
283
|
node.type
|
288
284
|
end
|
@@ -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
|
@@ -27,9 +27,14 @@ module RuboCop
|
|
27
27
|
KIND = 'method'
|
28
28
|
|
29
29
|
def on_def(node)
|
30
|
-
|
30
|
+
if node.endless?
|
31
|
+
return unless offending_endless_method?(node)
|
31
32
|
|
32
|
-
|
33
|
+
register_offense_for_endless_method(node)
|
34
|
+
else
|
35
|
+
first_line = node.arguments.source_range&.last_line
|
36
|
+
check(node, node.body, adjusted_first_line: first_line)
|
37
|
+
end
|
33
38
|
end
|
34
39
|
alias on_defs on_def
|
35
40
|
|
@@ -38,6 +43,21 @@ module RuboCop
|
|
38
43
|
def style
|
39
44
|
:no_empty_lines
|
40
45
|
end
|
46
|
+
|
47
|
+
def offending_endless_method?(node)
|
48
|
+
node.body.first_line > node.loc.assignment.line + 1 &&
|
49
|
+
processed_source.lines[node.loc.assignment.line].empty?
|
50
|
+
end
|
51
|
+
|
52
|
+
def register_offense_for_endless_method(node)
|
53
|
+
range = processed_source.buffer.line_range(node.loc.assignment.line + 1).resize(1)
|
54
|
+
|
55
|
+
msg = message(MSG_EXTRA, 'beginning')
|
56
|
+
|
57
|
+
add_offense(range, message: msg) do |corrector|
|
58
|
+
corrector.remove(range)
|
59
|
+
end
|
60
|
+
end
|
41
61
|
end
|
42
62
|
end
|
43
63
|
end
|