rubocop 1.69.2 → 1.74.0
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 +4 -4
- data/config/default.yml +122 -17
- data/config/internal_affairs.yml +20 -0
- 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 -9
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion.rb +1 -1
- data/lib/rubocop/config_validator.rb +19 -9
- 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 +7 -3
- 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_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/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 +6 -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/closing_parenthesis_indentation.rb +4 -4
- 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 +27 -1
- 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 +4 -3
- 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_methods.rb +0 -14
- 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_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
- 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_as_condition.rb +103 -9
- 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 -3
- 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 +3 -3
- 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_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +258 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +4 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.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 +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 +71 -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 +11 -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/check_single_line_suitability.rb +1 -1
- 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 +203 -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 +15 -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/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -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/naming/variable_name.rb +64 -6
- 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/accessor_grouping.rb +19 -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 +35 -10
- 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 +10 -3
- data/lib/rubocop/cop/style/comparable_between.rb +75 -0
- 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 +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 +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/endless_method.rb +163 -18
- 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/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
- 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/format_string_token.rb +38 -11
- 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 +5 -5
- 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 +14 -11
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- 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 +22 -15
- 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 +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- 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 +47 -2
- 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 +250 -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_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/rescue_modifier.rb +3 -0
- 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 +6 -7
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -8
- data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
- 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/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/trivial_accessors.rb +1 -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 +10 -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 +25 -14
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- 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 +46 -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 +19 -1
- data/lib/rubocop/rspec/support.rb +2 -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 +12 -1
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
- metadata +55 -16
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Checks for useless constant scoping. Private constants must be defined using
|
7
|
+
# `private_constant`. Even if `private` access modifier is used, it is public scope despite
|
8
|
+
# its appearance.
|
9
|
+
#
|
10
|
+
# It does not support autocorrection due to behavior change and multiple ways to fix it.
|
11
|
+
# Or a public constant may be intended.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
#
|
15
|
+
# # bad
|
16
|
+
# class Foo
|
17
|
+
# private
|
18
|
+
# PRIVATE_CONST = 42
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# # good
|
22
|
+
# class Foo
|
23
|
+
# PRIVATE_CONST = 42
|
24
|
+
# private_constant :PRIVATE_CONST
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# class Foo
|
29
|
+
# PUBLIC_CONST = 42 # If private scope is not intended.
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
class UselessConstantScoping < Base
|
33
|
+
MSG = 'Useless `private` access modifier for constant scope.'
|
34
|
+
|
35
|
+
# @!method private_constants(node)
|
36
|
+
def_node_matcher :private_constants, <<~PATTERN
|
37
|
+
(send nil? :private_constant $...)
|
38
|
+
PATTERN
|
39
|
+
|
40
|
+
def on_casgn(node)
|
41
|
+
return unless after_private_modifier?(node.left_siblings)
|
42
|
+
return if private_constantize?(node.right_siblings, node.name)
|
43
|
+
|
44
|
+
add_offense(node)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def after_private_modifier?(left_siblings)
|
50
|
+
access_modifier_candidates = left_siblings.compact.select do |left_sibling|
|
51
|
+
left_sibling.respond_to?(:send_type?) && left_sibling.send_type?
|
52
|
+
end
|
53
|
+
|
54
|
+
access_modifier_candidates.any? do |candidate|
|
55
|
+
candidate.command?(:private) && candidate.arguments.none?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def private_constantize?(right_siblings, const_value)
|
60
|
+
private_constant_arguments = right_siblings.map { |node| private_constants(node) }
|
61
|
+
|
62
|
+
private_constant_values = private_constant_arguments.flatten.filter_map do |constant|
|
63
|
+
constant.value.to_sym if constant.respond_to?(:value)
|
64
|
+
end
|
65
|
+
|
66
|
+
private_constant_values.include?(const_value)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def use_rest_or_optional_args?(node)
|
62
|
-
node.arguments.any? { |arg| arg.
|
62
|
+
node.arguments.any? { |arg| arg.type?(:restarg, :optarg, :kwoptarg) }
|
63
63
|
end
|
64
64
|
|
65
65
|
def delegating?(node, def_node)
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
RESTRICT_ON_SEND = %i[+ - * / **].freeze
|
36
36
|
|
37
37
|
# @!method useless_operation?(node)
|
38
|
-
def_node_matcher :useless_operation?, '(
|
38
|
+
def_node_matcher :useless_operation?, '(call (call nil? $_) $_ (int $_))'
|
39
39
|
|
40
40
|
# @!method useless_abbreviated_assignment?(node)
|
41
41
|
def_node_matcher :useless_abbreviated_assignment?, '(op-asgn (lvasgn $_) $_ (int $_))'
|
@@ -50,6 +50,7 @@ module RuboCop
|
|
50
50
|
corrector.replace(node, variable)
|
51
51
|
end
|
52
52
|
end
|
53
|
+
alias on_csend on_send
|
53
54
|
|
54
55
|
def on_op_asgn(node)
|
55
56
|
return unless useless_abbreviated_assignment?(node)
|
@@ -72,7 +72,7 @@ module RuboCop
|
|
72
72
|
def_node_matcher :method_definition, <<~PATTERN
|
73
73
|
{
|
74
74
|
(def %1 ...)
|
75
|
-
(
|
75
|
+
(any_block (send _ :define_method (sym %1)) ...)
|
76
76
|
}
|
77
77
|
PATTERN
|
78
78
|
|
@@ -108,7 +108,7 @@ module RuboCop
|
|
108
108
|
|
109
109
|
def find_method_definition(node, method_name)
|
110
110
|
node.each_ancestor.lazy.map do |ancestor|
|
111
|
-
ancestor.each_child_node(:def, :
|
111
|
+
ancestor.each_child_node(:def, :any_block).find do |child|
|
112
112
|
method_definition(child, method_name)
|
113
113
|
end
|
114
114
|
end.find(&:itself)
|
@@ -103,7 +103,7 @@ module RuboCop
|
|
103
103
|
expressions.pop unless in_void_context?(node)
|
104
104
|
expressions.each do |expr|
|
105
105
|
check_void_op(expr) do
|
106
|
-
block_node = node.each_ancestor(:
|
106
|
+
block_node = node.each_ancestor(:any_block).first
|
107
107
|
|
108
108
|
block_node&.method?(:each)
|
109
109
|
end
|
@@ -113,7 +113,8 @@ module RuboCop
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def check_expression(expr)
|
116
|
-
expr = expr.body if expr.if_type?
|
116
|
+
expr = expr.body if expr.if_type?
|
117
|
+
return unless expr
|
117
118
|
|
118
119
|
check_literal(expr)
|
119
120
|
check_var(expr)
|
@@ -124,9 +125,14 @@ module RuboCop
|
|
124
125
|
check_nonmutating(expr)
|
125
126
|
end
|
126
127
|
|
128
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
127
129
|
def check_void_op(node, &block)
|
128
130
|
node = node.children.first while node.begin_type?
|
129
131
|
return unless node.call_type? && OPERATORS.include?(node.method_name)
|
132
|
+
if !UNARY_OPERATORS.include?(node.method_name) && node.loc.dot && node.arguments.none?
|
133
|
+
return
|
134
|
+
end
|
135
|
+
|
130
136
|
return if block && yield(node)
|
131
137
|
|
132
138
|
add_offense(node.loc.selector,
|
@@ -134,6 +140,7 @@ module RuboCop
|
|
134
140
|
autocorrect_void_op(corrector, node)
|
135
141
|
end
|
136
142
|
end
|
143
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
137
144
|
|
138
145
|
def check_var(node)
|
139
146
|
return unless node.variable? || node.const_type?
|
@@ -178,7 +185,7 @@ module RuboCop
|
|
178
185
|
end
|
179
186
|
|
180
187
|
def check_nonmutating(node)
|
181
|
-
return
|
188
|
+
return unless node.type?(:send, :any_block)
|
182
189
|
|
183
190
|
method_name = node.method_name
|
184
191
|
return unless NONMUTATING_METHODS.include?(method_name)
|
@@ -200,11 +207,6 @@ module RuboCop
|
|
200
207
|
# NOTE: the `begin` node case is already handled via `on_begin`
|
201
208
|
return if body.begin_type?
|
202
209
|
|
203
|
-
check_void_op(body) do
|
204
|
-
block_node = node.each_ancestor(:block).first
|
205
|
-
block_node&.method?(:each)
|
206
|
-
end
|
207
|
-
|
208
210
|
check_expression(body)
|
209
211
|
end
|
210
212
|
|
@@ -229,7 +231,7 @@ module RuboCop
|
|
229
231
|
end
|
230
232
|
|
231
233
|
def autocorrect_void_expression(corrector, node)
|
232
|
-
return if node.parent.if_type?
|
234
|
+
return if node.parent.if_type?
|
233
235
|
|
234
236
|
corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
|
235
237
|
end
|
@@ -52,12 +52,19 @@ module RuboCop
|
|
52
52
|
'Prefer reading the data from an external source.'
|
53
53
|
RESTRICT_ON_SEND = [:[]].freeze
|
54
54
|
|
55
|
+
# @!method set_const?(node)
|
56
|
+
def_node_matcher :set_const?, <<~PATTERN
|
57
|
+
(const {cbase nil?} :Set)
|
58
|
+
PATTERN
|
59
|
+
|
55
60
|
def on_array(node)
|
56
61
|
add_offense(node) if node.children.length >= collection_threshold
|
57
62
|
end
|
58
63
|
alias on_hash on_array
|
59
64
|
|
60
65
|
def on_index(node)
|
66
|
+
return unless set_const?(node.receiver)
|
67
|
+
|
61
68
|
add_offense(node) if node.arguments.length >= collection_threshold
|
62
69
|
end
|
63
70
|
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
36
36
|
include MethodComplexity
|
37
37
|
include Utils::IteratingBlock
|
38
38
|
|
39
|
-
MSG = 'Cyclomatic complexity for
|
39
|
+
MSG = 'Cyclomatic complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
|
40
40
|
COUNTED_NODES = %i[if while until for csend block block_pass
|
41
41
|
rescue when in_pattern and or or_asgn and_asgn].freeze
|
42
42
|
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
48
48
|
LABEL = 'Method'
|
49
49
|
|
50
50
|
def on_def(node)
|
51
|
-
return if
|
51
|
+
return if allowed?(node.method_name)
|
52
52
|
|
53
53
|
check_code_length(node)
|
54
54
|
end
|
@@ -57,6 +57,9 @@ module RuboCop
|
|
57
57
|
def on_block(node)
|
58
58
|
return unless node.method?(:define_method)
|
59
59
|
|
60
|
+
method_name = node.send_node.first_argument
|
61
|
+
return if method_name.basic_literal? && allowed?(method_name.value)
|
62
|
+
|
60
63
|
check_code_length(node)
|
61
64
|
end
|
62
65
|
alias on_numblock on_block
|
@@ -66,6 +69,10 @@ module RuboCop
|
|
66
69
|
def cop_label
|
67
70
|
LABEL
|
68
71
|
end
|
72
|
+
|
73
|
+
def allowed?(method_name)
|
74
|
+
allowed_method?(method_name) || matches_allowed_pattern?(method_name)
|
75
|
+
end
|
69
76
|
end
|
70
77
|
end
|
71
78
|
end
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
|
51
51
|
# @!method module_definition?(node)
|
52
52
|
def_node_matcher :module_definition?, <<~PATTERN
|
53
|
-
(casgn nil? _ (
|
53
|
+
(casgn nil? _ (any_block (send (const {nil? cbase} :Module) :new) ...))
|
54
54
|
PATTERN
|
55
55
|
|
56
56
|
def message(length, max_length)
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
27
27
|
# end # ===
|
28
28
|
# end # 7 complexity points
|
29
29
|
class PerceivedComplexity < CyclomaticComplexity
|
30
|
-
MSG = 'Perceived complexity for
|
30
|
+
MSG = 'Perceived complexity for `%<method>s` is too high. [%<complexity>d/%<max>d]'
|
31
31
|
|
32
32
|
COUNTED_NODES = (CyclomaticComplexity::COUNTED_NODES - [:when] + [:case]).freeze
|
33
33
|
|
@@ -26,6 +26,13 @@ module RuboCop
|
|
26
26
|
extend NodePattern::Macros
|
27
27
|
include RuboCop::AST::Sexp
|
28
28
|
|
29
|
+
VAR_SETTER_TO_GETTER = {
|
30
|
+
lvasgn: :lvar,
|
31
|
+
ivasgn: :ivar,
|
32
|
+
cvasgn: :cvar,
|
33
|
+
gvasgn: :gvar
|
34
|
+
}.freeze
|
35
|
+
|
29
36
|
# Plug into the calculator
|
30
37
|
def initialize(node, discount_repeated_attributes: false)
|
31
38
|
super(node)
|
@@ -114,13 +121,6 @@ module RuboCop
|
|
114
121
|
calls.fetch(value) { yield [calls, value] }
|
115
122
|
end
|
116
123
|
|
117
|
-
VAR_SETTER_TO_GETTER = {
|
118
|
-
lvasgn: :lvar,
|
119
|
-
ivasgn: :ivar,
|
120
|
-
cvasgn: :cvar,
|
121
|
-
gvasgn: :gvar
|
122
|
-
}.freeze
|
123
|
-
|
124
124
|
# @returns `[receiver, method | nil]` for the given setter `node`
|
125
125
|
# or `nil` if it is not a setter.
|
126
126
|
def setter_to_getter(node)
|
@@ -5,10 +5,10 @@ module RuboCop
|
|
5
5
|
# This module checks for nodes that should be aligned to the left or right.
|
6
6
|
# This amount is determined by the instance variable @column_delta.
|
7
7
|
module Alignment
|
8
|
-
private
|
9
|
-
|
10
8
|
SPACE = ' '
|
11
9
|
|
10
|
+
private
|
11
|
+
|
12
12
|
attr_reader :column_delta
|
13
13
|
|
14
14
|
def configured_indentation_width
|
@@ -18,12 +18,12 @@ module RuboCop
|
|
18
18
|
end
|
19
19
|
|
20
20
|
# @deprecated Use allowed_line? instead
|
21
|
-
def ignored_line?
|
21
|
+
def ignored_line?(line)
|
22
22
|
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
23
23
|
`ignored_line?` is deprecated. Use `allowed_line?` instead.
|
24
24
|
WARNING
|
25
25
|
|
26
|
-
allowed_line?
|
26
|
+
allowed_line?(line)
|
27
27
|
end
|
28
28
|
|
29
29
|
def matches_allowed_pattern?(line)
|
@@ -31,12 +31,12 @@ module RuboCop
|
|
31
31
|
end
|
32
32
|
|
33
33
|
# @deprecated Use matches_allowed_pattern? instead
|
34
|
-
def matches_ignored_pattern?
|
34
|
+
def matches_ignored_pattern?(line)
|
35
35
|
warn Rainbow(<<~WARNING).yellow, uplevel: 1
|
36
36
|
`matches_ignored_pattern?` is deprecated. Use `matches_allowed_pattern?` instead.
|
37
37
|
WARNING
|
38
38
|
|
39
|
-
matches_allowed_pattern?
|
39
|
+
matches_allowed_pattern?(line)
|
40
40
|
end
|
41
41
|
|
42
42
|
def allowed_patterns
|
@@ -43,14 +43,14 @@ module RuboCop
|
|
43
43
|
# (Note: Passes may not happen exactly in this sequence.)
|
44
44
|
module CheckLineBreakable
|
45
45
|
def extract_breakable_node(node, max)
|
46
|
-
if node.
|
46
|
+
if node.call_type?
|
47
47
|
return if chained_to_heredoc?(node)
|
48
48
|
|
49
49
|
args = process_args(node.arguments)
|
50
50
|
return extract_breakable_node_from_elements(node, args, max)
|
51
51
|
elsif node.def_type?
|
52
52
|
return extract_breakable_node_from_elements(node, node.arguments, max)
|
53
|
-
elsif node.
|
53
|
+
elsif node.type?(:array, :hash)
|
54
54
|
return extract_breakable_node_from_elements(node, node.children, max)
|
55
55
|
end
|
56
56
|
nil
|
@@ -74,9 +74,9 @@ module RuboCop
|
|
74
74
|
def extract_first_element_over_column_limit(node, elements, max)
|
75
75
|
line = node.first_line
|
76
76
|
|
77
|
-
# If a `send` node is not parenthesized, don't move the first element, because it
|
77
|
+
# If a `send` or `csend` node is not parenthesized, don't move the first element, because it
|
78
78
|
# can result in changed behavior or a syntax error.
|
79
|
-
if node.
|
79
|
+
if node.call_type? && !node.parenthesized? && !first_argument_is_heredoc?(node)
|
80
80
|
elements = elements.drop(1)
|
81
81
|
end
|
82
82
|
|
@@ -98,10 +98,10 @@ module RuboCop
|
|
98
98
|
end
|
99
99
|
|
100
100
|
# @api private
|
101
|
-
# If a send node contains a heredoc argument, splitting cannot happen
|
101
|
+
# If a `send` or `csend` node contains a heredoc argument, splitting cannot happen
|
102
102
|
# after the heredoc or else it will cause a syntax error.
|
103
103
|
def shift_elements_for_heredoc_arg(node, elements, index)
|
104
|
-
return index unless node.
|
104
|
+
return index unless node.type?(:call, :array)
|
105
105
|
|
106
106
|
heredoc_index = elements.index { |arg| arg.respond_to?(:heredoc?) && arg.heredoc? }
|
107
107
|
return index unless heredoc_index
|
@@ -154,9 +154,9 @@ module RuboCop
|
|
154
154
|
# Ignore ancestors on different lines.
|
155
155
|
break if ancestor.first_line != node.first_line
|
156
156
|
|
157
|
-
if ancestor.
|
157
|
+
if ancestor.type?(:hash, :array)
|
158
158
|
elements = ancestor.children
|
159
|
-
elsif ancestor.
|
159
|
+
elsif ancestor.call_type?
|
160
160
|
elements = process_args(ancestor.arguments)
|
161
161
|
else
|
162
162
|
next
|
@@ -171,12 +171,12 @@ module RuboCop
|
|
171
171
|
# @api private
|
172
172
|
def contained_by_multiline_collection_that_could_be_broken_up?(node)
|
173
173
|
node.each_ancestor.find do |ancestor|
|
174
|
-
if
|
174
|
+
if ancestor.type?(:hash, :array) &&
|
175
175
|
breakable_collection?(ancestor, ancestor.children)
|
176
176
|
return children_could_be_broken_up?(ancestor.children)
|
177
177
|
end
|
178
178
|
|
179
|
-
next unless ancestor.
|
179
|
+
next unless ancestor.call_type?
|
180
180
|
|
181
181
|
args = process_args(ancestor.arguments)
|
182
182
|
return children_could_be_broken_up?(args) if breakable_collection?(ancestor, args)
|
@@ -227,7 +227,7 @@ module RuboCop
|
|
227
227
|
|
228
228
|
def chained_to_heredoc?(node)
|
229
229
|
while (node = node.receiver)
|
230
|
-
return true if
|
230
|
+
return true if node.type?(:str, :dstr, :xstr) && node.heredoc?
|
231
231
|
end
|
232
232
|
|
233
233
|
false
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
comment_line_numbers = processed_source.comments.map { |comment| comment.loc.line }
|
36
36
|
|
37
37
|
comment_line_numbers.any? do |comment_line_number|
|
38
|
-
comment_line_number
|
38
|
+
comment_line_number.between?(node.first_line, node.last_line)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -73,14 +73,16 @@ module RuboCop
|
|
73
73
|
node.else_branch.loc.line
|
74
74
|
elsif node.elsif?
|
75
75
|
node.each_ancestor(:if).find(&:if?).loc.end.line
|
76
|
+
elsif node.if? && node.parent && parentheses?(node.parent)
|
77
|
+
node.parent.loc.end.line
|
76
78
|
end
|
77
|
-
elsif node.
|
79
|
+
elsif node.any_block_type?
|
78
80
|
node.loc.end.line
|
79
81
|
elsif (next_sibling = node.right_sibling) && next_sibling.is_a?(AST::Node) &&
|
80
82
|
next_sibling.source_range
|
81
83
|
next_sibling.loc.line
|
82
84
|
elsif (parent = node.parent)
|
83
|
-
if parent.loc
|
85
|
+
if parent.loc?(:end)
|
84
86
|
parent.loc.end.line
|
85
87
|
else
|
86
88
|
parent.loc.line
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
module FrozenStringLiteral
|
7
7
|
module_function
|
8
8
|
|
9
|
-
|
9
|
+
FROZEN_STRING_LITERAL_REGEXP = /#\s*frozen[-_]?string[-_]?literal:/i.freeze
|
10
10
|
FROZEN_STRING_LITERAL_ENABLED = '# frozen_string_literal: true'
|
11
11
|
FROZEN_STRING_LITERAL_TYPES_RUBY27 = %i[str dstr].freeze
|
12
12
|
|
@@ -11,6 +11,24 @@ module RuboCop
|
|
11
11
|
DO_NOT_MIX_OMIT_VALUE_MSG = "#{DO_NOT_MIX_MSG_PREFIX} #{OMIT_HASH_VALUE_MSG}"
|
12
12
|
DO_NOT_MIX_EXPLICIT_VALUE_MSG = "#{DO_NOT_MIX_MSG_PREFIX} #{EXPLICIT_HASH_VALUE_MSG}"
|
13
13
|
|
14
|
+
DefNode = Struct.new(:node) do
|
15
|
+
def selector
|
16
|
+
if node.loc.respond_to?(:selector)
|
17
|
+
node.loc.selector
|
18
|
+
else
|
19
|
+
node.loc.keyword
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def first_argument
|
24
|
+
node.first_argument
|
25
|
+
end
|
26
|
+
|
27
|
+
def last_argument
|
28
|
+
node.last_argument
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
14
32
|
def on_hash_for_mixed_shorthand(hash_node)
|
15
33
|
return if ignore_mixed_hash_shorthand_syntax?(hash_node)
|
16
34
|
|
@@ -86,7 +104,7 @@ module RuboCop
|
|
86
104
|
return true if !node.key.sym_type? || require_hash_value_for_around_hash_literal?(node)
|
87
105
|
|
88
106
|
hash_value = node.value
|
89
|
-
return true unless hash_value.
|
107
|
+
return true unless hash_value.type?(:send, :lvar)
|
90
108
|
|
91
109
|
hash_key_source != hash_value.source || hash_key_source.end_with?('!', '?')
|
92
110
|
end
|
@@ -109,7 +127,7 @@ module RuboCop
|
|
109
127
|
return if dispatch_node.parent && parentheses?(dispatch_node.parent)
|
110
128
|
return if last_expression?(dispatch_node) && !method_dispatch_as_argument?(dispatch_node)
|
111
129
|
|
112
|
-
def_node = node.each_ancestor(:
|
130
|
+
def_node = node.each_ancestor(:call, :super, :yield).first
|
113
131
|
|
114
132
|
DefNode.new(def_node) unless def_node && def_node.arguments.empty?
|
115
133
|
end
|
@@ -117,7 +135,7 @@ module RuboCop
|
|
117
135
|
|
118
136
|
def find_ancestor_method_dispatch_node(node)
|
119
137
|
return unless (ancestor = node.parent.parent)
|
120
|
-
return unless ancestor.
|
138
|
+
return unless ancestor.type?(:call, :super, :yield)
|
121
139
|
return if brackets?(ancestor)
|
122
140
|
|
123
141
|
ancestor
|
@@ -150,7 +168,7 @@ module RuboCop
|
|
150
168
|
parent = method_dispatch_node.parent
|
151
169
|
return false unless parent
|
152
170
|
|
153
|
-
parent.
|
171
|
+
parent.type?(:call, :super, :yield)
|
154
172
|
end
|
155
173
|
|
156
174
|
def breakdown_value_types_of_hash(hash_node)
|
@@ -212,24 +230,6 @@ module RuboCop
|
|
212
230
|
register_offense(pair_node, OMIT_HASH_VALUE_MSG, replacement)
|
213
231
|
end
|
214
232
|
end
|
215
|
-
|
216
|
-
DefNode = Struct.new(:node) do
|
217
|
-
def selector
|
218
|
-
if node.loc.respond_to?(:selector)
|
219
|
-
node.loc.selector
|
220
|
-
else
|
221
|
-
node.loc.keyword
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
def first_argument
|
226
|
-
node.first_argument
|
227
|
-
end
|
228
|
-
|
229
|
-
def last_argument
|
230
|
-
node.last_argument
|
231
|
-
end
|
232
|
-
end
|
233
233
|
end
|
234
234
|
end
|
235
235
|
# rubocop:enable Metrics/ModuleLength
|