rubocop 1.67.0 → 1.81.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +384 -72
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +19 -4
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +56 -48
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +53 -28
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
- 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 +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- 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 +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
- 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 +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +158 -10
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +31 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- 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_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +125 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +39 -15
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -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/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +23 -12
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -3
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +27 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +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 +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +2 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +2 -3
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +49 -31
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- 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 +5 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +17 -4
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +11 -3
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +18 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +41 -38
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- 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_fetch_block.rb +1 -9
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +55 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +15 -18
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +21 -6
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +68 -102
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +30 -19
- data/lib/rubocop/cops_documentation_generator.rb +54 -28
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +20 -6
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +66 -26
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +2 -4
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- 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 +27 -25
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +31 -18
- data/lib/rubocop/server/cache.rb +51 -13
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +14 -9
- data/lib/rubocop/target_ruby.rb +27 -3
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +44 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +91 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../feature_loader'
|
|
4
|
+
require_relative 'load_error'
|
|
5
|
+
|
|
6
|
+
module RuboCop
|
|
7
|
+
module Plugin
|
|
8
|
+
# A class for loading and resolving plugins.
|
|
9
|
+
# @api private
|
|
10
|
+
class Loader
|
|
11
|
+
# rubocop:disable Layout/LineLength
|
|
12
|
+
DEFAULT_PLUGIN_CONFIG = {
|
|
13
|
+
'enabled' => true,
|
|
14
|
+
'require_path' => nil, # If not set, will be set to the plugin name
|
|
15
|
+
'plugin_class_name' => nil # If not set, looks for gemspec `spec.metadata["default_lint_roller_plugin"]`
|
|
16
|
+
}.freeze
|
|
17
|
+
|
|
18
|
+
# rubocop:enable Layout/LineLength
|
|
19
|
+
class << self
|
|
20
|
+
def load(plugins)
|
|
21
|
+
normalized_plugin_configs = normalize(plugins)
|
|
22
|
+
normalized_plugin_configs.filter_map do |plugin_name, plugin_config|
|
|
23
|
+
next unless plugin_config['enabled']
|
|
24
|
+
|
|
25
|
+
plugin_class = constantize_plugin_from(plugin_name, plugin_config)
|
|
26
|
+
|
|
27
|
+
plugin_class.new(plugin_config)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# rubocop:disable Metrics/MethodLength
|
|
34
|
+
def normalize(plugin_configs)
|
|
35
|
+
plugin_configs.to_h do |plugin_config|
|
|
36
|
+
if plugin_config == Plugin::OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME
|
|
37
|
+
warn Rainbow(<<~MESSAGE).yellow
|
|
38
|
+
Specify `rubocop-internal_affairs` instead of `rubocop/cop/internal_affairs` in your configuration.
|
|
39
|
+
MESSAGE
|
|
40
|
+
plugin_config = Plugin::INTERNAL_AFFAIRS_PLUGIN_NAME
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
if plugin_config.is_a?(Hash)
|
|
44
|
+
plugin_name = plugin_config.keys.first
|
|
45
|
+
|
|
46
|
+
[
|
|
47
|
+
plugin_name, DEFAULT_PLUGIN_CONFIG.merge(
|
|
48
|
+
{ 'require_path' => plugin_name }, plugin_config.values.first
|
|
49
|
+
)
|
|
50
|
+
]
|
|
51
|
+
# NOTE: Compatibility is maintained when `require: rubocop/cop/internal_affairs` remains
|
|
52
|
+
# specified in `.rubocop.yml`.
|
|
53
|
+
elsif (builtin_plugin_config = Plugin::BUILTIN_INTERNAL_PLUGINS[plugin_config])
|
|
54
|
+
[plugin_config, builtin_plugin_config]
|
|
55
|
+
else
|
|
56
|
+
[plugin_config, DEFAULT_PLUGIN_CONFIG.merge('require_path' => plugin_config)]
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def constantize_plugin_from(plugin_name, plugin_config)
|
|
62
|
+
if plugin_name.is_a?(String) || plugin_name.is_a?(Symbol)
|
|
63
|
+
constantize(plugin_name, plugin_config)
|
|
64
|
+
else
|
|
65
|
+
plugin_name
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# rubocop:enable Metrics/MethodLength
|
|
70
|
+
def constantize(plugin_name, plugin_config)
|
|
71
|
+
require_plugin(plugin_config['require_path'])
|
|
72
|
+
|
|
73
|
+
if (constant_name = plugin_config['plugin_class_name'])
|
|
74
|
+
begin
|
|
75
|
+
Kernel.const_get(constant_name)
|
|
76
|
+
rescue StandardError
|
|
77
|
+
raise <<~MESSAGE
|
|
78
|
+
Failed while configuring plugin `#{plugin_name}': no constant with name `#{constant_name}' was found.
|
|
79
|
+
MESSAGE
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
constantize_plugin_from_gemspec_metadata(plugin_name)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def require_plugin(require_path)
|
|
87
|
+
FeatureLoader.load(config_directory_path: Dir.pwd, feature: require_path)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def constantize_plugin_from_gemspec_metadata(plugin_name)
|
|
91
|
+
plugin_class_name = Gem.loaded_specs[plugin_name].metadata['default_lint_roller_plugin']
|
|
92
|
+
|
|
93
|
+
Kernel.const_get(plugin_class_name)
|
|
94
|
+
rescue LoadError, StandardError
|
|
95
|
+
raise Plugin::LoadError, plugin_name
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Plugin
|
|
5
|
+
# An exception raised when a plugin is not supported by the RuboCop engine.
|
|
6
|
+
# @api private
|
|
7
|
+
class NotSupportedError < Error
|
|
8
|
+
def initialize(unsupported_plugins)
|
|
9
|
+
super
|
|
10
|
+
|
|
11
|
+
@unsupported_plugins = unsupported_plugins
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def message
|
|
15
|
+
if @unsupported_plugins.one?
|
|
16
|
+
about = @unsupported_plugins.first.about
|
|
17
|
+
|
|
18
|
+
"#{about.name} #{about.version} is not a plugin supported by RuboCop engine."
|
|
19
|
+
else
|
|
20
|
+
unsupported_plugin_names = @unsupported_plugins.map do |plugin|
|
|
21
|
+
"#{plugin.about.name} #{plugin.about.version}"
|
|
22
|
+
end.join(', ')
|
|
23
|
+
|
|
24
|
+
"#{unsupported_plugin_names} are not plugins supported by RuboCop engine."
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'plugin/configuration_integrator'
|
|
4
|
+
require_relative 'plugin/loader'
|
|
5
|
+
|
|
6
|
+
module RuboCop
|
|
7
|
+
# Provides a plugin for RuboCop extensions that conform to lint_roller.
|
|
8
|
+
# https://github.com/standardrb/lint_roller
|
|
9
|
+
# @api private
|
|
10
|
+
module Plugin
|
|
11
|
+
BUILTIN_INTERNAL_PLUGINS = {
|
|
12
|
+
'rubocop-internal_affairs' => {
|
|
13
|
+
'enabled' => true,
|
|
14
|
+
'require_path' => 'rubocop/cop/internal_affairs/plugin',
|
|
15
|
+
'plugin_class_name' => 'RuboCop::InternalAffairs::Plugin'
|
|
16
|
+
}
|
|
17
|
+
}.freeze
|
|
18
|
+
INTERNAL_AFFAIRS_PLUGIN_NAME = Plugin::BUILTIN_INTERNAL_PLUGINS.keys.first
|
|
19
|
+
OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME = 'rubocop/cop/internal_affairs'
|
|
20
|
+
|
|
21
|
+
class << self
|
|
22
|
+
def plugin_capable?(feature_name)
|
|
23
|
+
return true if BUILTIN_INTERNAL_PLUGINS.key?(feature_name)
|
|
24
|
+
return true if feature_name == OBSOLETE_INTERNAL_AFFAIRS_PLUGIN_NAME
|
|
25
|
+
|
|
26
|
+
begin
|
|
27
|
+
# When not using Bundler. Makes the spec available but does not require it.
|
|
28
|
+
gem feature_name
|
|
29
|
+
rescue Gem::LoadError
|
|
30
|
+
# The user requested a gem that they do not have installed
|
|
31
|
+
end
|
|
32
|
+
return false unless (spec = Gem.loaded_specs[feature_name])
|
|
33
|
+
|
|
34
|
+
!!spec.metadata['default_lint_roller_plugin']
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def integrate_plugins(rubocop_config, plugins)
|
|
38
|
+
plugins = Plugin::Loader.load(plugins)
|
|
39
|
+
|
|
40
|
+
ConfigurationIntegrator.integrate_plugins_into_rubocop_config(rubocop_config, plugins)
|
|
41
|
+
|
|
42
|
+
plugins
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
data/lib/rubocop/rake_task.rb
CHANGED
|
@@ -12,7 +12,8 @@ module RuboCop
|
|
|
12
12
|
# Use global Rake namespace here to avoid namespace issues with custom
|
|
13
13
|
# rubocop-rake tasks
|
|
14
14
|
class RakeTask < ::Rake::TaskLib
|
|
15
|
-
attr_accessor :name, :verbose, :fail_on_error, :patterns, :formatters, :
|
|
15
|
+
attr_accessor :name, :verbose, :fail_on_error, :patterns, :formatters, :plugins, :requires,
|
|
16
|
+
:options
|
|
16
17
|
|
|
17
18
|
def initialize(name = :rubocop, *args, &task_block)
|
|
18
19
|
super()
|
|
@@ -54,6 +55,7 @@ module RuboCop
|
|
|
54
55
|
|
|
55
56
|
def full_options
|
|
56
57
|
formatters.map { |f| ['--format', f] }.flatten
|
|
58
|
+
.concat(plugins.map { |plugin| ['--plugin', plugin] }.flatten)
|
|
57
59
|
.concat(requires.map { |r| ['--require', r] }.flatten)
|
|
58
60
|
.concat(options.flatten)
|
|
59
61
|
.concat(patterns)
|
|
@@ -64,6 +66,7 @@ module RuboCop
|
|
|
64
66
|
@verbose = true
|
|
65
67
|
@fail_on_error = true
|
|
66
68
|
@patterns = []
|
|
69
|
+
@plugins = []
|
|
67
70
|
@requires = []
|
|
68
71
|
@options = []
|
|
69
72
|
@formatters = []
|
data/lib/rubocop/result_cache.rb
CHANGED
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
|
9
9
|
# Provides functionality for caching RuboCop runs.
|
|
10
10
|
# @api private
|
|
11
11
|
class ResultCache
|
|
12
|
-
NON_CHANGING = %i[color format formatters out debug fail_level
|
|
12
|
+
NON_CHANGING = %i[color format formatters out debug display_time fail_level
|
|
13
13
|
fix_layout autocorrect safe_autocorrect autocorrect_all
|
|
14
14
|
cache fail_fast stdin parallel].freeze
|
|
15
15
|
|
|
@@ -25,16 +25,16 @@ module RuboCop
|
|
|
25
25
|
# cleaning should be done relatively seldom, since there is a slight risk
|
|
26
26
|
# that some other RuboCop process was just about to read the file, when
|
|
27
27
|
# there's parallel execution and the cache is shared.
|
|
28
|
-
def self.cleanup(config_store, verbose,
|
|
28
|
+
def self.cleanup(config_store, verbose, cache_root_override = nil)
|
|
29
29
|
return if inhibit_cleanup # OPTIMIZE: For faster testing
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
return unless File.exist?(
|
|
31
|
+
rubocop_cache_dir = cache_root(config_store, cache_root_override)
|
|
32
|
+
return unless File.exist?(rubocop_cache_dir)
|
|
33
33
|
|
|
34
|
-
files, dirs = Find.find(
|
|
34
|
+
files, dirs = Find.find(rubocop_cache_dir).partition { |path| File.file?(path) }
|
|
35
35
|
return unless requires_file_removal?(files.length, config_store)
|
|
36
36
|
|
|
37
|
-
remove_oldest_files(files, dirs,
|
|
37
|
+
remove_oldest_files(files, dirs, rubocop_cache_dir, verbose)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
class << self
|
|
@@ -49,11 +49,11 @@ module RuboCop
|
|
|
49
49
|
file_count > 1 && file_count > config_store.for_pwd.for_all_cops['MaxFilesInCache']
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
def remove_oldest_files(files, dirs,
|
|
52
|
+
def remove_oldest_files(files, dirs, rubocop_cache_dir, verbose)
|
|
53
53
|
# Add 1 to half the number of files, so that we remove the file if
|
|
54
54
|
# there's only 1 left.
|
|
55
55
|
remove_count = (files.length / 2) + 1
|
|
56
|
-
puts "Removing the #{remove_count} oldest files from #{
|
|
56
|
+
puts "Removing the #{remove_count} oldest files from #{rubocop_cache_dir}" if verbose
|
|
57
57
|
sorted = files.sort_by { |path| File.mtime(path) }
|
|
58
58
|
remove_files(sorted, dirs, remove_count)
|
|
59
59
|
rescue Errno::ENOENT
|
|
@@ -72,9 +72,9 @@ module RuboCop
|
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
def self.cache_root(config_store)
|
|
75
|
+
def self.cache_root(config_store, cache_root_override = nil)
|
|
76
76
|
CacheConfig.root_dir do
|
|
77
|
-
config_store.for_pwd.for_all_cops['CacheRootDirectory']
|
|
77
|
+
cache_root_override || config_store.for_pwd.for_all_cops['CacheRootDirectory']
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
80
|
|
|
@@ -84,12 +84,12 @@ module RuboCop
|
|
|
84
84
|
|
|
85
85
|
attr_reader :path
|
|
86
86
|
|
|
87
|
-
def initialize(file, team, options, config_store,
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
def initialize(file, team, options, config_store, cache_root_override = nil)
|
|
88
|
+
cache_root_override ||= options[:cache_root] if options[:cache_root]
|
|
89
|
+
rubocop_cache_dir = ResultCache.cache_root(config_store, cache_root_override)
|
|
90
90
|
@allow_symlinks_in_cache_location =
|
|
91
91
|
ResultCache.allow_symlinks_in_cache_location?(config_store)
|
|
92
|
-
@path = File.join(
|
|
92
|
+
@path = File.join(rubocop_cache_dir,
|
|
93
93
|
rubocop_checksum,
|
|
94
94
|
context_checksum(team, options),
|
|
95
95
|
file_checksum(file, config_store))
|
|
@@ -198,20 +198,22 @@ module RuboCop
|
|
|
198
198
|
end
|
|
199
199
|
|
|
200
200
|
def rubocop_extra_features
|
|
201
|
-
|
|
202
|
-
|
|
201
|
+
@rubocop_extra_features ||= begin
|
|
202
|
+
lib_root = File.join(File.dirname(__FILE__), '..')
|
|
203
|
+
exe_root = File.join(lib_root, '..', 'exe')
|
|
203
204
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
205
|
+
# Make sure to use an absolute path to prevent errors on Windows
|
|
206
|
+
# when traversing the relative paths with symlinks.
|
|
207
|
+
exe_root = File.absolute_path(exe_root)
|
|
207
208
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
209
|
+
# These are all the files we have `require`d plus everything in the
|
|
210
|
+
# exe directory. A change to any of them could affect the cop output
|
|
211
|
+
# so we include them in the cache hash.
|
|
212
|
+
source_files = $LOADED_FEATURES + Find.find(exe_root).to_a
|
|
213
|
+
source_files -= ResultCache.rubocop_required_features # Rely on gem versions
|
|
213
214
|
|
|
214
|
-
|
|
215
|
+
source_files
|
|
216
|
+
end
|
|
215
217
|
end
|
|
216
218
|
|
|
217
219
|
# Return a hash of the options given at invocation, minus the ones that have
|
|
@@ -10,9 +10,21 @@ module CopHelper
|
|
|
10
10
|
# The minimum version Prism can parse is 3.3.
|
|
11
11
|
ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : RuboCop::TargetRuby::DEFAULT_VERSION
|
|
12
12
|
end
|
|
13
|
-
let(:parser_engine)
|
|
13
|
+
let(:parser_engine) do
|
|
14
|
+
# The maximum version Parser can correctly parse is 3.3.
|
|
15
|
+
ruby_version >= 3.4 ? :parser_prism : ENV.fetch('PARSER_ENGINE', :parser_whitequark).to_sym
|
|
16
|
+
end
|
|
14
17
|
let(:rails_version) { false }
|
|
15
18
|
|
|
19
|
+
before(:all) do
|
|
20
|
+
next if ENV['RUBOCOP_CORE_DEVELOPMENT']
|
|
21
|
+
|
|
22
|
+
plugins = Gem.loaded_specs.filter_map do |feature_name, feature_specification|
|
|
23
|
+
feature_name if feature_specification.metadata['default_lint_roller_plugin']
|
|
24
|
+
end
|
|
25
|
+
RuboCop::Plugin.integrate_plugins(RuboCop::Config.new, plugins)
|
|
26
|
+
end
|
|
27
|
+
|
|
16
28
|
def inspect_source(source, file = nil)
|
|
17
29
|
RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
|
|
18
30
|
RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
|
|
@@ -72,9 +72,15 @@ module RuboCop
|
|
|
72
72
|
#
|
|
73
73
|
# expect_no_corrections
|
|
74
74
|
#
|
|
75
|
-
# If your code has variables of different lengths, you can use
|
|
76
|
-
#
|
|
77
|
-
#
|
|
75
|
+
# If your code has variables of different lengths, you can use the
|
|
76
|
+
# following markers to format your template by passing the variables as a
|
|
77
|
+
# keyword arguments:
|
|
78
|
+
#
|
|
79
|
+
# - `%{foo}`: Interpolates `foo`
|
|
80
|
+
# - `^{foo}`: Inserts `'^' * foo.size` for dynamic offense range length
|
|
81
|
+
# - `_{foo}`: Inserts `' ' * foo.size` for dynamic offense range indentation
|
|
82
|
+
#
|
|
83
|
+
# You can also abbreviate offense messages with `[...]`.
|
|
78
84
|
#
|
|
79
85
|
# %w[raise fail].each do |keyword|
|
|
80
86
|
# expect_offense(<<~RUBY, keyword: keyword)
|
|
@@ -190,7 +196,10 @@ module RuboCop
|
|
|
190
196
|
def expect_no_offenses(source, file = nil)
|
|
191
197
|
offenses = inspect_source(source, file)
|
|
192
198
|
|
|
193
|
-
|
|
199
|
+
# Since source given `expect_no_offenses` does not have annotations, we do not need to parse
|
|
200
|
+
# for them, and can just build an `AnnotatedSource` object from the source lines.
|
|
201
|
+
# This also prevents treating source lines that begin with a caret as an annotation.
|
|
202
|
+
expected_annotations = AnnotatedSource.new(source.each_line.to_a, [])
|
|
194
203
|
actual_annotations = expected_annotations.with_offense_annotations(offenses)
|
|
195
204
|
expect(actual_annotations.to_s).to eq(source)
|
|
196
205
|
end
|
|
@@ -221,7 +230,8 @@ module RuboCop
|
|
|
221
230
|
|
|
222
231
|
# Parsed representation of code annotated with the `^^^ Message` style
|
|
223
232
|
class AnnotatedSource
|
|
224
|
-
|
|
233
|
+
# Ignore escaped carets, don't treat as annotations
|
|
234
|
+
ANNOTATION_PATTERN = /\A\s*((?<!\\)\^+|\^{}) ?/.freeze
|
|
225
235
|
ABBREV = "[...]\n"
|
|
226
236
|
|
|
227
237
|
# @param annotated_source [String] string passed to the matchers
|
|
@@ -80,6 +80,21 @@ RSpec.shared_context 'maintain registry' do
|
|
|
80
80
|
end
|
|
81
81
|
end
|
|
82
82
|
|
|
83
|
+
RSpec.shared_context 'maintain default configuration' do
|
|
84
|
+
around(:each) do |example|
|
|
85
|
+
# Make a copy of the current configuration that will not change when source hash changes
|
|
86
|
+
default_configuration = RuboCop::ConfigLoader.default_configuration
|
|
87
|
+
config = RuboCop::Config.create(
|
|
88
|
+
default_configuration.to_h.clone,
|
|
89
|
+
default_configuration.loaded_path
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
example.run
|
|
93
|
+
|
|
94
|
+
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, config)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
83
98
|
# This context assumes nothing and defines `cop`, among others.
|
|
84
99
|
RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
|
85
100
|
### Meant to be overridden at will
|
|
@@ -98,6 +113,8 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
|
|
98
113
|
|
|
99
114
|
let(:cop_options) { {} }
|
|
100
115
|
|
|
116
|
+
let(:gem_versions) { {} }
|
|
117
|
+
|
|
101
118
|
### Utilities
|
|
102
119
|
|
|
103
120
|
def source_range(range, buffer: source_buffer)
|
|
@@ -138,7 +155,8 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
|
|
138
155
|
|
|
139
156
|
allow(config).to receive(:gem_versions_in_target).and_return(
|
|
140
157
|
{
|
|
141
|
-
'railties' => rails_version_in_gemfile
|
|
158
|
+
'railties' => rails_version_in_gemfile,
|
|
159
|
+
**gem_versions.transform_values { |value| Gem::Version.new(value) }
|
|
142
160
|
}
|
|
143
161
|
)
|
|
144
162
|
|
|
@@ -160,6 +178,21 @@ RSpec.shared_context 'mock console output' do
|
|
|
160
178
|
end
|
|
161
179
|
end
|
|
162
180
|
|
|
181
|
+
RSpec.shared_context 'mock obsoletion' do
|
|
182
|
+
include_context 'mock console output'
|
|
183
|
+
|
|
184
|
+
let(:obsoletion_configuration_path) { 'obsoletions.yml' }
|
|
185
|
+
|
|
186
|
+
before do
|
|
187
|
+
RuboCop::ConfigObsoletion.reset!
|
|
188
|
+
allow(RuboCop::ConfigObsoletion).to receive(:files).and_return([obsoletion_configuration_path])
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
after do
|
|
192
|
+
RuboCop::ConfigObsoletion.reset!
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
163
196
|
RSpec.shared_context 'lsp' do
|
|
164
197
|
before do
|
|
165
198
|
RuboCop::LSP.enable
|
|
@@ -232,3 +265,7 @@ end
|
|
|
232
265
|
RSpec.shared_context 'ruby 3.4' do
|
|
233
266
|
let(:ruby_version) { 3.4 }
|
|
234
267
|
end
|
|
268
|
+
|
|
269
|
+
RSpec.shared_context 'ruby 3.5' do
|
|
270
|
+
let(:ruby_version) { 3.5 }
|
|
271
|
+
end
|
|
@@ -4,18 +4,19 @@
|
|
|
4
4
|
|
|
5
5
|
require_relative 'cop_helper'
|
|
6
6
|
require_relative 'expect_offense'
|
|
7
|
-
require_relative 'host_environment_simulation_helper'
|
|
8
7
|
require_relative 'parallel_formatter'
|
|
9
8
|
require_relative 'shared_contexts'
|
|
10
9
|
|
|
11
10
|
RSpec.configure do |config|
|
|
12
11
|
config.include CopHelper
|
|
13
|
-
config.include
|
|
12
|
+
config.include RuboCop::RSpec::ExpectOffense
|
|
14
13
|
config.include_context 'config', :config
|
|
15
14
|
config.include_context 'isolated environment', :isolated_environment
|
|
16
15
|
config.include_context 'isolated bundler', :isolated_bundler
|
|
17
16
|
config.include_context 'lsp', :lsp
|
|
18
17
|
config.include_context 'maintain registry', :restore_registry
|
|
18
|
+
config.include_context 'maintain default configuration', :restore_configuration
|
|
19
|
+
config.include_context 'mock obsoletion', :mock_obsoletion
|
|
19
20
|
config.include_context 'ruby 2.0', :ruby20
|
|
20
21
|
config.include_context 'ruby 2.1', :ruby21
|
|
21
22
|
config.include_context 'ruby 2.2', :ruby22
|
|
@@ -29,4 +30,5 @@ RSpec.configure do |config|
|
|
|
29
30
|
config.include_context 'ruby 3.2', :ruby32
|
|
30
31
|
config.include_context 'ruby 3.3', :ruby33
|
|
31
32
|
config.include_context 'ruby 3.4', :ruby34
|
|
33
|
+
config.include_context 'ruby 3.5', :ruby35
|
|
32
34
|
end
|
data/lib/rubocop/runner.rb
CHANGED
|
@@ -20,11 +20,7 @@ module RuboCop
|
|
|
20
20
|
message = 'Infinite loop detected'
|
|
21
21
|
message += " in #{path}" if path
|
|
22
22
|
message += " and caused by #{root_cause}" if root_cause
|
|
23
|
-
message
|
|
24
|
-
hint = 'Hint: Please update to the latest RuboCop version if not already in use, ' \
|
|
25
|
-
"and report a bug if the issue still occurs on this version.\n" \
|
|
26
|
-
'Please check the latest version at https://rubygems.org/gems/rubocop.'
|
|
27
|
-
super(Rainbow(message).red + Rainbow(hint).yellow)
|
|
23
|
+
super(message)
|
|
28
24
|
end
|
|
29
25
|
end
|
|
30
26
|
|
|
@@ -139,7 +135,7 @@ module RuboCop
|
|
|
139
135
|
offenses = process_file(file)
|
|
140
136
|
yield file
|
|
141
137
|
|
|
142
|
-
if offenses.any? { |o| considered_failure?(o) }
|
|
138
|
+
if offenses.any? { |o| considered_failure?(o) && offense_displayed?(o) }
|
|
143
139
|
break false if @options[:fail_fast]
|
|
144
140
|
|
|
145
141
|
next false
|
|
@@ -157,8 +153,11 @@ module RuboCop
|
|
|
157
153
|
file_started(file)
|
|
158
154
|
offenses = file_offenses(file)
|
|
159
155
|
rescue InfiniteCorrectionLoop => e
|
|
156
|
+
raise e if @options[:raise_cop_error]
|
|
157
|
+
|
|
158
|
+
errors << e
|
|
159
|
+
warn Rainbow(e.message).red
|
|
160
160
|
offenses = e.offenses.compact.sort.freeze
|
|
161
|
-
raise
|
|
162
161
|
ensure
|
|
163
162
|
file_finished(file, offenses || [])
|
|
164
163
|
end
|
|
@@ -274,7 +273,8 @@ module RuboCop
|
|
|
274
273
|
end
|
|
275
274
|
|
|
276
275
|
def do_inspection_loop(file)
|
|
277
|
-
|
|
276
|
+
# We can reuse the prism result since the source did not change yet.
|
|
277
|
+
processed_source = get_processed_source(file, @prism_result)
|
|
278
278
|
# This variable is 2d array used to track corrected offenses after each
|
|
279
279
|
# inspection iteration. This is used to output meaningful infinite loop
|
|
280
280
|
# error message.
|
|
@@ -296,7 +296,8 @@ module RuboCop
|
|
|
296
296
|
# loop if we find any.
|
|
297
297
|
break unless updated_source_file
|
|
298
298
|
|
|
299
|
-
|
|
299
|
+
# Autocorrect has happened, don't use the prism result since it is stale.
|
|
300
|
+
processed_source = get_processed_source(file, nil)
|
|
300
301
|
end
|
|
301
302
|
|
|
302
303
|
# Return summary of corrected offenses after all iterations
|
|
@@ -363,8 +364,12 @@ module RuboCop
|
|
|
363
364
|
result = ruby_extractor.call(processed_source)
|
|
364
365
|
break result if result
|
|
365
366
|
rescue StandardError
|
|
366
|
-
|
|
367
|
-
|
|
367
|
+
location = if ruby_extractor.is_a?(Proc)
|
|
368
|
+
ruby_extractor.source_location
|
|
369
|
+
else
|
|
370
|
+
ruby_extractor.method(:call).source_location
|
|
371
|
+
end
|
|
372
|
+
raise Error, "Ruby extractor #{location[0]} failed to process #{processed_source.path}."
|
|
368
373
|
end
|
|
369
374
|
end
|
|
370
375
|
|
|
@@ -436,18 +441,22 @@ module RuboCop
|
|
|
436
441
|
!offense.corrected? && offense.severity >= minimum_severity_to_fail
|
|
437
442
|
end
|
|
438
443
|
|
|
439
|
-
def
|
|
444
|
+
def offense_displayed?(offense)
|
|
440
445
|
if @options[:display_only_fail_level_offenses]
|
|
441
|
-
|
|
446
|
+
considered_failure?(offense)
|
|
442
447
|
elsif @options[:display_only_safe_correctable]
|
|
443
|
-
|
|
448
|
+
supports_safe_autocorrect?(offense)
|
|
444
449
|
elsif @options[:display_only_correctable]
|
|
445
|
-
|
|
450
|
+
offense.correctable?
|
|
446
451
|
else
|
|
447
|
-
|
|
452
|
+
true
|
|
448
453
|
end
|
|
449
454
|
end
|
|
450
455
|
|
|
456
|
+
def offenses_to_report(offenses)
|
|
457
|
+
offenses.select { |o| offense_displayed?(o) }
|
|
458
|
+
end
|
|
459
|
+
|
|
451
460
|
def supports_safe_autocorrect?(offense)
|
|
452
461
|
cop_class = Cop::Registry.global.find_by_cop_name(offense.cop_name)
|
|
453
462
|
default_cfg = default_config(offense.cop_name)
|
|
@@ -475,14 +484,18 @@ module RuboCop
|
|
|
475
484
|
end
|
|
476
485
|
|
|
477
486
|
# rubocop:disable Metrics/MethodLength
|
|
478
|
-
def get_processed_source(file)
|
|
487
|
+
def get_processed_source(file, prism_result)
|
|
479
488
|
config = @config_store.for_file(file)
|
|
480
489
|
ruby_version = config.target_ruby_version
|
|
481
490
|
parser_engine = config.parser_engine
|
|
482
491
|
|
|
483
492
|
processed_source = if @options[:stdin]
|
|
484
493
|
ProcessedSource.new(
|
|
485
|
-
@options[:stdin],
|
|
494
|
+
@options[:stdin],
|
|
495
|
+
ruby_version,
|
|
496
|
+
file,
|
|
497
|
+
parser_engine: parser_engine,
|
|
498
|
+
prism_result: prism_result
|
|
486
499
|
)
|
|
487
500
|
else
|
|
488
501
|
begin
|