rubocop 1.50.2 → 1.59.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/README.md +5 -3
- data/config/default.yml +153 -16
- data/config/obsoletion.yml +5 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +10 -5
- data/lib/rubocop/cli/command/lsp.rb +19 -0
- data/lib/rubocop/cli.rb +4 -1
- data/lib/rubocop/config.rb +4 -0
- data/lib/rubocop/config_finder.rb +2 -2
- data/lib/rubocop/config_loader_resolver.rb +4 -3
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +13 -10
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -1
- data/lib/rubocop/cop/base.rb +6 -2
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +2 -2
- data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/gemspec/dependency_version.rb +2 -2
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +32 -8
- data/lib/rubocop/cop/internal_affairs/example_description.rb +42 -21
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +53 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +7 -7
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +7 -0
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -5
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +27 -4
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +7 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -10
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +6 -6
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +3 -3
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +17 -9
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
- data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -4
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +53 -21
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +4 -4
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -2
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +19 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +46 -19
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +6 -7
- data/lib/rubocop/cop/lint/float_comparison.rb +10 -0
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
- data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +78 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +34 -5
- data/lib/rubocop/cop/lint/mixed_case_range.rb +111 -0
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +14 -4
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +12 -3
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +63 -4
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +14 -8
- data/lib/rubocop/cop/lint/self_assignment.rb +38 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
- data/lib/rubocop/cop/lint/shadowed_exception.rb +5 -11
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +5 -3
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +94 -10
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +92 -11
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +8 -3
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -2
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +32 -4
- data/lib/rubocop/cop/migration/department_name.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +19 -11
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +14 -11
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -2
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -8
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/string_help.rb +4 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
- data/lib/rubocop/cop/naming/constant_name.rb +2 -3
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +26 -11
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -3
- data/lib/rubocop/cop/naming/variable_name.rb +6 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +6 -2
- data/lib/rubocop/cop/style/alias.rb +9 -8
- data/lib/rubocop/cop/style/arguments_forwarding.rb +342 -63
- data/lib/rubocop/cop/style/array_first_last.rb +64 -0
- data/lib/rubocop/cop/style/array_intersect.rb +13 -5
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +5 -4
- data/lib/rubocop/cop/style/case_like_if.rb +4 -4
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +24 -39
- data/lib/rubocop/cop/style/collection_compact.rb +22 -11
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_loops.rb +36 -8
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
- data/lib/rubocop/cop/style/copyright.rb +5 -2
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/dir_empty.rb +8 -14
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +8 -8
- data/lib/rubocop/cop/style/exact_regexp_match.rb +69 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/file_read.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +1 -1
- data/lib/rubocop/cop/style/format_string.rb +24 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -1
- data/lib/rubocop/cop/style/guard_clause.rb +28 -0
- data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +84 -32
- data/lib/rubocop/cop/style/hash_except.rb +21 -9
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +31 -5
- data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -5
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +10 -6
- data/lib/rubocop/cop/style/lambda.rb +3 -3
- data/lib/rubocop/cop/style/lambda_call.rb +5 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +3 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +10 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +12 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +2 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
- data/lib/rubocop/cop/style/next.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +8 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +9 -3
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +10 -2
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +38 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +93 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -3
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +9 -3
- data/lib/rubocop/cop/style/redundant_parentheses.rb +54 -21
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +100 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -1
- data/lib/rubocop/cop/style/redundant_return.rb +8 -3
- data/lib/rubocop/cop/style/redundant_self.rb +17 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +8 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -1
- data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
- data/lib/rubocop/cop/style/require_order.rb +11 -5
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
- data/lib/rubocop/cop/style/return_nil.rb +6 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +95 -0
- data/lib/rubocop/cop/style/sample.rb +2 -1
- data/lib/rubocop/cop/style/select_by_regexp.rb +22 -11
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +20 -4
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +7 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +6 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -2
- data/lib/rubocop/cop/style/yoda_expression.rb +8 -7
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/regexp_ranges.rb +113 -0
- data/lib/rubocop/cop/variable_force/assignment.rb +45 -4
- data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
- data/lib/rubocop/cop/variable_force.rb +1 -0
- data/lib/rubocop/cops_documentation_generator.rb +1 -1
- data/lib/rubocop/ext/regexp_parser.rb +4 -1
- data/lib/rubocop/file_finder.rb +4 -7
- data/lib/rubocop/formatter/html_formatter.rb +5 -4
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/lsp/logger.rb +22 -0
- data/lib/rubocop/lsp/routes.rb +246 -0
- data/lib/rubocop/lsp/runtime.rb +99 -0
- data/lib/rubocop/lsp/server.rb +68 -0
- data/lib/rubocop/lsp/severity.rb +27 -0
- data/lib/rubocop/magic_comment.rb +12 -10
- data/lib/rubocop/options.rb +11 -1
- data/lib/rubocop/result_cache.rb +5 -2
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +2 -3
- data/lib/rubocop/runner.rb +6 -4
- data/lib/rubocop/server/cache.rb +1 -0
- data/lib/rubocop/server/client_command/exec.rb +3 -2
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +7 -3
- data/lib/rubocop/target_ruby.rb +12 -7
- data/lib/rubocop/version.rb +10 -6
- data/lib/rubocop.rb +19 -0
- metadata +54 -15
@@ -32,25 +32,25 @@ module RuboCop
|
|
32
32
|
# @!method struct_new(node)
|
33
33
|
def_node_matcher :struct_new, <<~PATTERN
|
34
34
|
(send
|
35
|
-
(const
|
35
|
+
(const {nil? cbase} :Struct) :new ...)
|
36
36
|
PATTERN
|
37
37
|
|
38
38
|
def on_send(node)
|
39
|
-
return unless struct_new(node)
|
40
|
-
node.arguments.each_with_index do |arg, index|
|
41
|
-
# Ignore if the first argument is a class name
|
42
|
-
next if index.zero? && arg.str_type?
|
39
|
+
return unless struct_new(node)
|
43
40
|
|
44
|
-
|
45
|
-
|
41
|
+
node.arguments.each_with_index do |arg, index|
|
42
|
+
# Ignore if the first argument is a class name
|
43
|
+
next if index.zero? && arg.str_type?
|
46
44
|
|
47
|
-
|
45
|
+
# Ignore if the argument is not a member name
|
46
|
+
next unless STRUCT_MEMBER_NAME_TYPES.include?(arg.type)
|
48
47
|
|
49
|
-
|
48
|
+
member_name = arg.value
|
50
49
|
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
next unless STRUCT_METHOD_NAMES.include?(member_name.to_sym)
|
51
|
+
|
52
|
+
message = format(MSG, member_name: member_name.inspect, method_name: member_name.to_s)
|
53
|
+
add_offense(arg, message: message)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -117,9 +117,9 @@ module RuboCop
|
|
117
117
|
|
118
118
|
def comment_between_rescue_and_end?(node)
|
119
119
|
ancestor = node.each_ancestor(:kwbegin, :def, :defs, :block, :numblock).first
|
120
|
-
return unless ancestor
|
120
|
+
return false unless ancestor
|
121
121
|
|
122
|
-
end_line = ancestor.loc.end.
|
122
|
+
end_line = ancestor.loc.end&.line || ancestor.loc.last_line
|
123
123
|
processed_source[node.first_line...end_line].any? { |line| comment_line?(line) }
|
124
124
|
end
|
125
125
|
|
@@ -19,6 +19,7 @@ module RuboCop
|
|
19
19
|
# 'underscored_string'.to_sym
|
20
20
|
# :'underscored_symbol'
|
21
21
|
# 'hyphenated-string'.to_sym
|
22
|
+
# "string_#{interpolation}".to_sym
|
22
23
|
#
|
23
24
|
# # good
|
24
25
|
# :string
|
@@ -26,6 +27,7 @@ module RuboCop
|
|
26
27
|
# :underscored_string
|
27
28
|
# :underscored_symbol
|
28
29
|
# :'hyphenated-string'
|
30
|
+
# :"string_#{interpolation}"
|
29
31
|
#
|
30
32
|
# @example EnforcedStyle: strict (default)
|
31
33
|
#
|
@@ -75,9 +77,12 @@ module RuboCop
|
|
75
77
|
|
76
78
|
def on_send(node)
|
77
79
|
return unless node.receiver
|
78
|
-
return unless node.receiver.str_type? || node.receiver.sym_type?
|
79
80
|
|
80
|
-
|
81
|
+
if node.receiver.str_type? || node.receiver.sym_type?
|
82
|
+
register_offense(node, correction: node.receiver.value.to_sym.inspect)
|
83
|
+
elsif node.receiver.dstr_type?
|
84
|
+
register_offense(node, correction: ":\"#{node.receiver.value.to_sym}\"")
|
85
|
+
end
|
81
86
|
end
|
82
87
|
|
83
88
|
def on_sym(node)
|
@@ -124,7 +129,7 @@ module RuboCop
|
|
124
129
|
source == value ||
|
125
130
|
# `Symbol#inspect` uses double quotes, but allow single-quoted
|
126
131
|
# symbols to work as well.
|
127
|
-
source.tr("'", '"') == value
|
132
|
+
source.gsub('"', '\"').tr("'", '"') == value
|
128
133
|
end
|
129
134
|
|
130
135
|
def requires_quotes?(sym_node)
|
@@ -74,7 +74,7 @@ module RuboCop
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
77
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
78
78
|
def argument_match?(send_arg, def_arg)
|
79
79
|
def_arg_name = def_arg.children[0]
|
80
80
|
|
@@ -87,12 +87,14 @@ module RuboCop
|
|
87
87
|
send_arg.hash_type? &&
|
88
88
|
send_arg.pairs.any? { |pair| passing_keyword_arg?(pair, def_arg_name) }
|
89
89
|
when :kwrestarg
|
90
|
-
send_arg.each_child_node(:kwsplat).any?
|
90
|
+
send_arg.each_child_node(:kwsplat, :forwarded_kwrestarg).any? do |child|
|
91
|
+
child.source == def_arg.source
|
92
|
+
end
|
91
93
|
when :forward_arg
|
92
94
|
send_arg.forwarded_args_type?
|
93
95
|
end
|
94
96
|
end
|
95
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
97
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
96
98
|
end
|
97
99
|
end
|
98
100
|
end
|
@@ -8,25 +8,39 @@ module RuboCop
|
|
8
8
|
# always ignored. This is detected automatically since Ruby 2.7.
|
9
9
|
#
|
10
10
|
# @example
|
11
|
+
# # bad
|
12
|
+
# return 1
|
11
13
|
#
|
12
|
-
# #
|
13
|
-
# return
|
14
|
+
# # good
|
15
|
+
# return
|
14
16
|
class TopLevelReturnWithArgument < Base
|
15
|
-
|
16
|
-
# top-level return node's ancestors should not be of block, def, or
|
17
|
-
# defs type.
|
17
|
+
extend AutoCorrector
|
18
18
|
|
19
19
|
MSG = 'Top level return with argument detected.'
|
20
20
|
|
21
21
|
def on_return(return_node)
|
22
|
-
|
22
|
+
return unless top_level_return_with_any_argument?(return_node)
|
23
|
+
|
24
|
+
add_offense(return_node) do |corrector|
|
25
|
+
remove_arguments(corrector, return_node)
|
26
|
+
end
|
23
27
|
end
|
24
28
|
|
25
29
|
private
|
26
30
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
31
|
+
def top_level_return_with_any_argument?(return_node)
|
32
|
+
top_level_return?(return_node) && return_node.arguments?
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_arguments(corrector, return_node)
|
36
|
+
corrector.replace(return_node, 'return')
|
37
|
+
end
|
38
|
+
|
39
|
+
# This cop works by validating the ancestors of the return node. A
|
40
|
+
# top-level return node's ancestors should not be of block, def, or
|
41
|
+
# defs type.
|
42
|
+
def top_level_return?(return_node)
|
43
|
+
return_node.each_ancestor(:block, :def, :defs).none?
|
30
44
|
end
|
31
45
|
end
|
32
46
|
end
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
34
34
|
MSG = 'Avoid leaving a trailing comma in attribute declarations.'
|
35
35
|
|
36
36
|
def on_send(node)
|
37
|
-
return unless node.attribute_accessor? && node.
|
37
|
+
return unless node.attribute_accessor? && node.last_argument.def_type?
|
38
38
|
|
39
39
|
trailing_comma = trailing_comma_range(node)
|
40
40
|
|
@@ -69,8 +69,8 @@ module RuboCop
|
|
69
69
|
# @!method reduce_with_block?(node)
|
70
70
|
def_node_matcher :reduce_with_block?, <<~PATTERN
|
71
71
|
{
|
72
|
-
(block (
|
73
|
-
(numblock (
|
72
|
+
(block (call _recv {:reduce :inject} ...) args ...)
|
73
|
+
(numblock (call _recv {:reduce :inject} ...) ...)
|
74
74
|
}
|
75
75
|
PATTERN
|
76
76
|
|
@@ -256,7 +256,7 @@ module RuboCop
|
|
256
256
|
|
257
257
|
def any_method_definition?(child)
|
258
258
|
cop_config.fetch('MethodCreatingMethods', []).any? do |m|
|
259
|
-
matcher_name = "#{m}_method?"
|
259
|
+
matcher_name = :"#{m}_method?"
|
260
260
|
unless respond_to?(matcher_name)
|
261
261
|
self.class.def_node_matcher matcher_name, <<~PATTERN
|
262
262
|
{def (send nil? :#{m} ...)}
|
@@ -279,7 +279,7 @@ module RuboCop
|
|
279
279
|
|
280
280
|
def any_context_creating_methods?(child)
|
281
281
|
cop_config.fetch('ContextCreatingMethods', []).any? do |m|
|
282
|
-
matcher_name = "#{m}_block?"
|
282
|
+
matcher_name = :"#{m}_block?"
|
283
283
|
unless respond_to?(matcher_name)
|
284
284
|
self.class.def_node_matcher matcher_name, <<~PATTERN
|
285
285
|
({block numblock} (send {nil? const} {:#{m}} ...) ...)
|
@@ -7,12 +7,24 @@ module RuboCop
|
|
7
7
|
# scope.
|
8
8
|
# The basic idea for this cop was from the warning of `ruby -cw`:
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# [source,console]
|
11
|
+
# ----
|
12
|
+
# assigned but unused variable - foo
|
13
|
+
# ----
|
11
14
|
#
|
12
15
|
# Currently this cop has advanced logic that detects unreferenced
|
13
16
|
# reassignments and properly handles varied cases such as branch, loop,
|
14
17
|
# rescue, ensure, etc.
|
15
18
|
#
|
19
|
+
# NOTE: Given the assignment `foo = 1, bar = 2`, removing unused variables
|
20
|
+
# can lead to a syntax error, so this case is not autocorrected.
|
21
|
+
#
|
22
|
+
# @safety
|
23
|
+
# This cop's autocorrection is unsafe because removing assignment from
|
24
|
+
# operator assignment can cause NameError if this assignment has been used to declare
|
25
|
+
# local variable. For example, replacing `a ||= 1` to `a || 1` may cause
|
26
|
+
# "undefined local variable or method `a' for main:Object (NameError)".
|
27
|
+
#
|
16
28
|
# @example
|
17
29
|
#
|
18
30
|
# # bad
|
@@ -31,6 +43,10 @@ module RuboCop
|
|
31
43
|
# do_something(some_var)
|
32
44
|
# end
|
33
45
|
class UselessAssignment < Base
|
46
|
+
extend AutoCorrector
|
47
|
+
|
48
|
+
include RangeHelp
|
49
|
+
|
34
50
|
MSG = 'Useless assignment to variable - `%<variable>s`.'
|
35
51
|
|
36
52
|
def self.joining_forces
|
@@ -41,23 +57,24 @@ module RuboCop
|
|
41
57
|
scope.variables.each_value { |variable| check_for_unused_assignments(variable) }
|
42
58
|
end
|
43
59
|
|
60
|
+
# rubocop:disable Metrics/AbcSize
|
44
61
|
def check_for_unused_assignments(variable)
|
45
62
|
return if variable.should_be_unused?
|
46
63
|
|
47
64
|
variable.assignments.each do |assignment|
|
48
|
-
next if assignment.used?
|
65
|
+
next if assignment.used? || part_of_ignored_node?(assignment.node)
|
49
66
|
|
50
67
|
message = message_for_useless_assignment(assignment)
|
68
|
+
range = offense_range(assignment)
|
51
69
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
assignment.node.loc.name
|
56
|
-
end
|
70
|
+
add_offense(range, message: message) do |corrector|
|
71
|
+
autocorrect(corrector, assignment) unless sequential_assignment?(assignment.node)
|
72
|
+
end
|
57
73
|
|
58
|
-
|
74
|
+
ignore_node(assignment.node) if chained_assignment?(assignment.node)
|
59
75
|
end
|
60
76
|
end
|
77
|
+
# rubocop:enable Metrics/AbcSize
|
61
78
|
|
62
79
|
def message_for_useless_assignment(assignment)
|
63
80
|
variable = assignment.variable
|
@@ -65,6 +82,28 @@ module RuboCop
|
|
65
82
|
format(MSG, variable: variable.name) + message_specification(assignment, variable).to_s
|
66
83
|
end
|
67
84
|
|
85
|
+
def offense_range(assignment)
|
86
|
+
if assignment.regexp_named_capture?
|
87
|
+
assignment.node.children.first.source_range
|
88
|
+
else
|
89
|
+
assignment.node.loc.name
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def sequential_assignment?(node)
|
94
|
+
if node.lvasgn_type? && node.expression&.array_type? &&
|
95
|
+
node.each_descendant.any?(&:assignment?)
|
96
|
+
return true
|
97
|
+
end
|
98
|
+
return false unless node.parent
|
99
|
+
|
100
|
+
sequential_assignment?(node.parent)
|
101
|
+
end
|
102
|
+
|
103
|
+
def chained_assignment?(node)
|
104
|
+
node.respond_to?(:expression) && node.expression&.lvasgn_type?
|
105
|
+
end
|
106
|
+
|
68
107
|
def message_specification(assignment, variable)
|
69
108
|
if assignment.multiple_assignment?
|
70
109
|
multiple_assignment_message(variable.name)
|
@@ -84,8 +123,7 @@ module RuboCop
|
|
84
123
|
return_value_node = return_value_node_of_scope(scope)
|
85
124
|
return unless assignment.meta_assignment_node.equal?(return_value_node)
|
86
125
|
|
87
|
-
" Use `#{assignment.operator.
|
88
|
-
"instead of `#{assignment.operator}`."
|
126
|
+
" Use `#{assignment.operator.delete_suffix('=')}` instead of `#{assignment.operator}`."
|
89
127
|
end
|
90
128
|
|
91
129
|
def similar_name_message(variable)
|
@@ -119,6 +157,52 @@ module RuboCop
|
|
119
157
|
|
120
158
|
node.receiver.nil? && !node.arguments?
|
121
159
|
end
|
160
|
+
|
161
|
+
# rubocop:disable Metrics/AbcSize
|
162
|
+
def autocorrect(corrector, assignment)
|
163
|
+
if assignment.exception_assignment?
|
164
|
+
remove_exception_assignment_part(corrector, assignment.node)
|
165
|
+
elsif assignment.multiple_assignment? || assignment.rest_assignment? ||
|
166
|
+
assignment.for_assignment?
|
167
|
+
rename_variable_with_underscore(corrector, assignment.node)
|
168
|
+
elsif assignment.operator_assignment?
|
169
|
+
remove_trailing_character_from_operator(corrector, assignment.node)
|
170
|
+
elsif assignment.regexp_named_capture?
|
171
|
+
replace_named_capture_group_with_non_capturing_group(corrector, assignment.node,
|
172
|
+
assignment.variable.name)
|
173
|
+
else
|
174
|
+
remove_local_variable_assignment_part(corrector, assignment.node)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
# rubocop:enable Metrics/AbcSize
|
178
|
+
|
179
|
+
def remove_exception_assignment_part(corrector, node)
|
180
|
+
corrector.remove(
|
181
|
+
range_between(
|
182
|
+
(node.parent.children.first&.source_range || node.parent.location.keyword).end_pos,
|
183
|
+
node.source_range.end_pos
|
184
|
+
)
|
185
|
+
)
|
186
|
+
end
|
187
|
+
|
188
|
+
def rename_variable_with_underscore(corrector, node)
|
189
|
+
corrector.replace(node, '_')
|
190
|
+
end
|
191
|
+
|
192
|
+
def remove_trailing_character_from_operator(corrector, node)
|
193
|
+
corrector.remove(node.parent.location.operator.end.adjust(begin_pos: -1))
|
194
|
+
end
|
195
|
+
|
196
|
+
def replace_named_capture_group_with_non_capturing_group(corrector, node, variable_name)
|
197
|
+
corrector.replace(
|
198
|
+
node.children.first,
|
199
|
+
node.children.first.source.sub(/\(\?<#{variable_name}>/, '(?:')
|
200
|
+
)
|
201
|
+
end
|
202
|
+
|
203
|
+
def remove_local_variable_assignment_part(corrector, node)
|
204
|
+
corrector.replace(node, node.expression.source)
|
205
|
+
end
|
122
206
|
end
|
123
207
|
end
|
124
208
|
end
|
@@ -6,6 +6,16 @@ module RuboCop
|
|
6
6
|
# Checks for operators, variables, literals, lambda, proc and nonmutating
|
7
7
|
# methods used in void context.
|
8
8
|
#
|
9
|
+
# `each` blocks are allowed to prevent false positives.
|
10
|
+
# For example, the expression inside the `each` block below.
|
11
|
+
# It's not void, especially when the receiver is an `Enumerator`:
|
12
|
+
#
|
13
|
+
# [source,ruby]
|
14
|
+
# ----
|
15
|
+
# enumerator = [1, 2, 3].filter
|
16
|
+
# enumerator.each { |item| item >= 2 } #=> [2, 3]
|
17
|
+
# ----
|
18
|
+
#
|
9
19
|
# @example CheckForMethodsWithNoSideEffects: false (default)
|
10
20
|
# # bad
|
11
21
|
# def some_method
|
@@ -41,8 +51,13 @@ module RuboCop
|
|
41
51
|
# do_something(some_array)
|
42
52
|
# end
|
43
53
|
class Void < Base
|
54
|
+
extend AutoCorrector
|
55
|
+
|
56
|
+
include RangeHelp
|
57
|
+
|
44
58
|
OP_MSG = 'Operator `%<op>s` used in void context.'
|
45
59
|
VAR_MSG = 'Variable `%<var>s` used in void context.'
|
60
|
+
CONST_MSG = 'Constant `%<var>s` used in void context.'
|
46
61
|
LIT_MSG = 'Literal `%<lit>s` used in void context.'
|
47
62
|
SELF_MSG = '`self` used in void context.'
|
48
63
|
EXPRESSION_MSG = '`%<expression>s` used in void context.'
|
@@ -68,6 +83,7 @@ module RuboCop
|
|
68
83
|
return unless node.body && !node.body.begin_type?
|
69
84
|
return unless in_void_context?(node.body)
|
70
85
|
|
86
|
+
check_void_op(node.body) { node.method?(:each) }
|
71
87
|
check_expression(node.body)
|
72
88
|
end
|
73
89
|
|
@@ -83,11 +99,13 @@ module RuboCop
|
|
83
99
|
def check_begin(node)
|
84
100
|
expressions = *node
|
85
101
|
expressions.pop unless in_void_context?(node)
|
86
|
-
expressions.each
|
102
|
+
expressions.each do |expr|
|
103
|
+
check_void_op(expr)
|
104
|
+
check_expression(expr)
|
105
|
+
end
|
87
106
|
end
|
88
107
|
|
89
108
|
def check_expression(expr)
|
90
|
-
check_void_op(expr)
|
91
109
|
check_literal(expr)
|
92
110
|
check_var(expr)
|
93
111
|
check_self(expr)
|
@@ -97,38 +115,60 @@ module RuboCop
|
|
97
115
|
check_nonmutating(expr)
|
98
116
|
end
|
99
117
|
|
100
|
-
def check_void_op(node)
|
118
|
+
def check_void_op(node, &block)
|
101
119
|
return unless node.send_type? && OPERATORS.include?(node.method_name)
|
120
|
+
return if block && yield(node)
|
102
121
|
|
103
|
-
add_offense(node.loc.selector,
|
122
|
+
add_offense(node.loc.selector,
|
123
|
+
message: format(OP_MSG, op: node.method_name)) do |corrector|
|
124
|
+
autocorrect_void_op(corrector, node)
|
125
|
+
end
|
104
126
|
end
|
105
127
|
|
106
128
|
def check_var(node)
|
107
129
|
return unless node.variable? || node.const_type?
|
108
130
|
|
109
|
-
|
131
|
+
if node.const_type?
|
132
|
+
template = node.special_keyword? ? VAR_MSG : CONST_MSG
|
133
|
+
|
134
|
+
offense_range = node
|
135
|
+
message = format(template, var: node.source)
|
136
|
+
else
|
137
|
+
offense_range = node.loc.name
|
138
|
+
message = format(VAR_MSG, var: node.loc.name.source)
|
139
|
+
end
|
140
|
+
|
141
|
+
add_offense(offense_range, message: message) do |corrector|
|
142
|
+
autocorrect_void_expression(corrector, node)
|
143
|
+
end
|
110
144
|
end
|
111
145
|
|
112
146
|
def check_literal(node)
|
113
|
-
return if !node
|
147
|
+
return if !entirely_literal?(node) || node.xstr_type? || node.range_type?
|
114
148
|
|
115
|
-
add_offense(node, message: format(LIT_MSG, lit: node.source))
|
149
|
+
add_offense(node, message: format(LIT_MSG, lit: node.source)) do |corrector|
|
150
|
+
autocorrect_void_expression(corrector, node)
|
151
|
+
end
|
116
152
|
end
|
117
153
|
|
118
154
|
def check_self(node)
|
119
155
|
return unless node.self_type?
|
120
156
|
|
121
|
-
add_offense(node, message: SELF_MSG)
|
157
|
+
add_offense(node, message: SELF_MSG) do |corrector|
|
158
|
+
autocorrect_void_expression(corrector, node)
|
159
|
+
end
|
122
160
|
end
|
123
161
|
|
124
162
|
def check_void_expression(node)
|
125
163
|
return unless node.defined_type? || node.lambda_or_proc?
|
126
164
|
|
127
|
-
add_offense(node, message: format(EXPRESSION_MSG, expression: node.source))
|
165
|
+
add_offense(node, message: format(EXPRESSION_MSG, expression: node.source)) do |corrector|
|
166
|
+
autocorrect_void_expression(corrector, node)
|
167
|
+
end
|
128
168
|
end
|
129
169
|
|
130
170
|
def check_nonmutating(node)
|
131
|
-
return
|
171
|
+
return if !node.send_type? && !node.block_type? && !node.numblock_type?
|
132
172
|
|
133
173
|
method_name = node.method_name
|
134
174
|
return unless NONMUTATING_METHODS.include?(method_name)
|
@@ -139,7 +179,10 @@ module RuboCop
|
|
139
179
|
"#{method_name}!"
|
140
180
|
end
|
141
181
|
add_offense(node,
|
142
|
-
message: format(NONMUTATING_MSG, method: method_name,
|
182
|
+
message: format(NONMUTATING_MSG, method: method_name,
|
183
|
+
suggest: suggestion)) do |corrector|
|
184
|
+
autocorrect_nonmutating_send(corrector, node, suggestion)
|
185
|
+
end
|
143
186
|
end
|
144
187
|
|
145
188
|
def in_void_context?(node)
|
@@ -149,6 +192,44 @@ module RuboCop
|
|
149
192
|
|
150
193
|
VOID_CONTEXT_TYPES.include?(parent.type) && parent.void_context?
|
151
194
|
end
|
195
|
+
|
196
|
+
def autocorrect_void_op(corrector, node)
|
197
|
+
if node.arguments.empty?
|
198
|
+
corrector.replace(node, node.receiver.source)
|
199
|
+
else
|
200
|
+
corrector.replace(
|
201
|
+
range_with_surrounding_space(range: node.loc.selector, side: :both,
|
202
|
+
newlines: false),
|
203
|
+
"\n"
|
204
|
+
)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def autocorrect_void_expression(corrector, node)
|
209
|
+
corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
|
210
|
+
end
|
211
|
+
|
212
|
+
def autocorrect_nonmutating_send(corrector, node, suggestion)
|
213
|
+
send_node = if node.send_type?
|
214
|
+
node
|
215
|
+
else
|
216
|
+
node.send_node
|
217
|
+
end
|
218
|
+
corrector.replace(send_node.loc.selector, suggestion)
|
219
|
+
end
|
220
|
+
|
221
|
+
def entirely_literal?(node)
|
222
|
+
case node.type
|
223
|
+
when :array
|
224
|
+
node.each_value.all? { |value| entirely_literal?(value) }
|
225
|
+
when :hash
|
226
|
+
return false unless node.each_key.all? { |key| entirely_literal?(key) }
|
227
|
+
|
228
|
+
node.each_value.all? { |value| entirely_literal?(value) }
|
229
|
+
else
|
230
|
+
node.literal?
|
231
|
+
end
|
232
|
+
end
|
152
233
|
end
|
153
234
|
end
|
154
235
|
end
|
@@ -10,9 +10,9 @@ module RuboCop
|
|
10
10
|
#
|
11
11
|
# Interpreting ABC size:
|
12
12
|
#
|
13
|
-
# *
|
14
|
-
# * 18..30 unsatisfactory
|
15
|
-
# *
|
13
|
+
# * ``<= 17`` satisfactory
|
14
|
+
# * `18..30` unsatisfactory
|
15
|
+
# * `>` 30 dangerous
|
16
16
|
#
|
17
17
|
# You can have repeated "attributes" calls count as a single "branch".
|
18
18
|
# For this purpose, attributes are any method with no argument; no attempt
|
@@ -12,6 +12,7 @@ module RuboCop
|
|
12
12
|
# Available are: 'array', 'hash', 'heredoc', and 'method_call'. Each construct
|
13
13
|
# will be counted as one line regardless of its actual size.
|
14
14
|
#
|
15
|
+
# NOTE: This cop does not apply for `Struct` definitions.
|
15
16
|
#
|
16
17
|
# NOTE: The `ExcludedMethods` configuration is deprecated and only kept
|
17
18
|
# for backwards compatibility. Please use `AllowedMethods` and `AllowedPatterns`
|
@@ -40,7 +41,6 @@ module RuboCop
|
|
40
41
|
# )
|
41
42
|
# end # 6 points
|
42
43
|
#
|
43
|
-
# NOTE: This cop does not apply for `Struct` definitions.
|
44
44
|
class BlockLength < Base
|
45
45
|
include CodeLength
|
46
46
|
include AllowedMethods
|
@@ -11,6 +11,8 @@ module RuboCop
|
|
11
11
|
# Available are: 'array', 'hash', 'heredoc', and 'method_call'. Each construct
|
12
12
|
# will be counted as one line regardless of its actual size.
|
13
13
|
#
|
14
|
+
# NOTE: This cop also applies for `Struct` definitions.
|
15
|
+
#
|
14
16
|
# @example CountAsOne: ['array', 'heredoc', 'method_call']
|
15
17
|
#
|
16
18
|
# class Foo
|
@@ -34,15 +36,18 @@ module RuboCop
|
|
34
36
|
# )
|
35
37
|
# end # 6 points
|
36
38
|
#
|
37
|
-
#
|
38
|
-
# NOTE: This cop also applies for `Struct` definitions.
|
39
39
|
class ClassLength < Base
|
40
40
|
include CodeLength
|
41
41
|
|
42
42
|
def on_class(node)
|
43
43
|
check_code_length(node)
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
|
+
def on_sclass(node)
|
47
|
+
return if node.each_ancestor(:class).any?
|
48
|
+
|
49
|
+
on_class(node)
|
50
|
+
end
|
46
51
|
|
47
52
|
def on_casgn(node)
|
48
53
|
parent = node.parent
|