rubocop 0.85.1 → 0.89.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 +16 -4
- data/bin/rubocop-profile +32 -0
- data/config/default.yml +227 -26
- data/lib/rubocop.rb +33 -5
- data/lib/rubocop/cli.rb +2 -4
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +20 -3
- data/lib/rubocop/config_loader.rb +40 -68
- data/lib/rubocop/config_loader_resolver.rb +4 -4
- data/lib/rubocop/config_obsoletion.rb +6 -2
- data/lib/rubocop/config_store.rb +4 -0
- data/lib/rubocop/config_validator.rb +1 -3
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +407 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +47 -50
- data/lib/rubocop/cop/cop.rb +85 -236
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
- data/lib/rubocop/cop/layout/class_structure.rb +2 -37
- data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +9 -16
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +49 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/debugger.rb +7 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
- data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
- data/lib/rubocop/cop/lint/empty_when.rb +2 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
- data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
- data/lib/rubocop/cop/lint/loop.rb +23 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
- data/lib/rubocop/cop/lint/missing_super.rb +99 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
- data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +61 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
- data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
- data/lib/rubocop/cop/lint/rand_one.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +31 -25
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
- data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
- data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
- data/lib/rubocop/cop/lint/script_permission.rb +10 -7
- data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
- data/lib/rubocop/cop/lint/syntax.rb +11 -26
- data/lib/rubocop/cop/lint/to_json.rb +4 -6
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
- data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +11 -31
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
- data/lib/rubocop/cop/lint/void.rb +3 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +24 -2
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +26 -3
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
- data/lib/rubocop/cop/metrics/method_length.rb +25 -2
- data/lib/rubocop/cop/metrics/module_length.rb +26 -3
- data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
- data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
- data/lib/rubocop/cop/migration/department_name.rb +13 -15
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +26 -5
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +5 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +1 -1
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +38 -9
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
- data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/registry.rb +3 -3
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +6 -8
- data/lib/rubocop/cop/security/marshal_load.rb +2 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +6 -6
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +11 -1
- data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
- data/lib/rubocop/cop/style/alias.rb +7 -3
- data/lib/rubocop/cop/style/array_coercion.rb +63 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +144 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -4
- data/lib/rubocop/cop/style/case_equality.rb +22 -3
- data/lib/rubocop/cop/style/case_like_if.rb +217 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +21 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +3 -3
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +11 -2
- data/lib/rubocop/cop/style/copyright.rb +3 -3
- data/lib/rubocop/cop/style/date_time.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +6 -6
- data/lib/rubocop/cop/style/each_with_object.rb +0 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
- data/lib/rubocop/cop/style/empty_literal.rb +5 -5
- data/lib/rubocop/cop/style/empty_method.rb +5 -5
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +6 -2
- data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
- data/lib/rubocop/cop/style/exponential_notation.rb +8 -10
- data/lib/rubocop/cop/style/float_division.rb +7 -10
- data/lib/rubocop/cop/style/format_string.rb +4 -0
- data/lib/rubocop/cop/style/format_string_token.rb +6 -5
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
- data/lib/rubocop/cop/style/guard_clause.rb +2 -2
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -28
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +3 -4
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +1 -11
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +9 -2
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
- data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +28 -12
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +3 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
- data/lib/rubocop/cop/style/symbol_array.rb +6 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
- data/lib/rubocop/cop/team.rb +98 -82
- data/lib/rubocop/cop/tokens_util.rb +84 -0
- data/lib/rubocop/cop/util.rb +3 -15
- data/lib/rubocop/cop/utils/format_string.rb +2 -3
- data/lib/rubocop/cop/variable_force.rb +0 -2
- data/lib/rubocop/cop/variable_force/branch.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +7 -5
- data/lib/rubocop/cops_documentation_generator.rb +282 -0
- data/lib/rubocop/error.rb +1 -0
- data/lib/rubocop/file_finder.rb +12 -12
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +15 -8
- data/lib/rubocop/path_util.rb +19 -19
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +7 -9
- data/lib/rubocop/result_cache.rb +12 -8
- data/lib/rubocop/rspec/cop_helper.rb +4 -4
- data/lib/rubocop/rspec/expect_offense.rb +63 -22
- data/lib/rubocop/rspec/shared_contexts.rb +19 -16
- data/lib/rubocop/runner.rb +34 -33
- data/lib/rubocop/target_finder.rb +14 -11
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +2 -2
- metadata +49 -11
- data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
- data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
- data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -28,6 +28,8 @@ module RuboCop
|
|
28
28
|
# attr_reader :baz
|
29
29
|
# end
|
30
30
|
class TrivialAccessors < Cop
|
31
|
+
include AllowedMethods
|
32
|
+
|
31
33
|
MSG = 'Use `attr_%<kind>s` to define trivial %<kind>s methods.'
|
32
34
|
|
33
35
|
def on_def(node)
|
@@ -95,9 +97,8 @@ module RuboCop
|
|
95
97
|
cop_config['IgnoreClassMethods']
|
96
98
|
end
|
97
99
|
|
98
|
-
def
|
99
|
-
allowed_methods
|
100
|
-
Array(allowed_methods).map(&:to_sym) + [:initialize]
|
100
|
+
def allowed_method_names
|
101
|
+
allowed_methods.map(&:to_sym) + [:initialize]
|
101
102
|
end
|
102
103
|
|
103
104
|
def dsl_writer?(method_name)
|
@@ -106,7 +107,7 @@ module RuboCop
|
|
106
107
|
|
107
108
|
def trivial_reader?(node)
|
108
109
|
looks_like_trivial_reader?(node) &&
|
109
|
-
!
|
110
|
+
!allowed_method_name?(node) && !allowed_reader?(node)
|
110
111
|
end
|
111
112
|
|
112
113
|
def looks_like_trivial_reader?(node)
|
@@ -115,7 +116,7 @@ module RuboCop
|
|
115
116
|
|
116
117
|
def trivial_writer?(node)
|
117
118
|
looks_like_trivial_writer?(node) &&
|
118
|
-
!
|
119
|
+
!allowed_method_name?(node) && !allowed_writer?(node.method_name)
|
119
120
|
end
|
120
121
|
|
121
122
|
def_node_matcher :looks_like_trivial_writer?, <<~PATTERN
|
@@ -123,8 +124,8 @@ module RuboCop
|
|
123
124
|
(defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
|
124
125
|
PATTERN
|
125
126
|
|
126
|
-
def
|
127
|
-
|
127
|
+
def allowed_method_name?(node)
|
128
|
+
allowed_method_names.include?(node.method_name) ||
|
128
129
|
exact_name_match? && !names_match?(node)
|
129
130
|
end
|
130
131
|
|
@@ -19,6 +19,8 @@ module RuboCop
|
|
19
19
|
# foo == "bar"
|
20
20
|
# foo <= 42
|
21
21
|
# bar > 10
|
22
|
+
# "#{interpolation}" == foo
|
23
|
+
# /#{interpolation}/ == foo
|
22
24
|
#
|
23
25
|
# @example EnforcedStyle: forbid_for_equality_operators_only
|
24
26
|
# # bad
|
@@ -109,7 +111,8 @@ module RuboCop
|
|
109
111
|
rhs = node.first_argument
|
110
112
|
|
111
113
|
return true if lhs.literal? && rhs.literal? ||
|
112
|
-
!lhs.literal? && !rhs.literal?
|
114
|
+
!lhs.literal? && !rhs.literal? ||
|
115
|
+
interpolation?(lhs)
|
113
116
|
|
114
117
|
enforce_yoda? ? lhs.literal? : rhs.literal?
|
115
118
|
end
|
@@ -150,6 +153,20 @@ module RuboCop
|
|
150
153
|
def program_name?(name)
|
151
154
|
PROGRAM_NAMES.include?(name)
|
152
155
|
end
|
156
|
+
|
157
|
+
def interpolation?(node)
|
158
|
+
return true if node.dstr_type?
|
159
|
+
|
160
|
+
# TODO: Use `RegexpNode#interpolation?` when the following is released.
|
161
|
+
# https://github.com/rubocop-hq/rubocop-ast/pull/18
|
162
|
+
if node.regexp_type?
|
163
|
+
return true if node.children.any? do |child|
|
164
|
+
child.respond_to?(:begin_type?) && child.begin_type?
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
false
|
169
|
+
end
|
153
170
|
end
|
154
171
|
end
|
155
172
|
end
|
@@ -30,6 +30,8 @@ module RuboCop
|
|
30
30
|
NONZERO_MSG = 'Use `!empty?` instead of ' \
|
31
31
|
'`%<lhs>s %<opr>s %<rhs>s`.'
|
32
32
|
|
33
|
+
LENGTH_METHODS = %i[size length].freeze
|
34
|
+
|
33
35
|
def on_send(node)
|
34
36
|
check_zero_length_predicate(node)
|
35
37
|
check_nonzero_length_predicate(node)
|
@@ -44,31 +46,33 @@ module RuboCop
|
|
44
46
|
private
|
45
47
|
|
46
48
|
def check_zero_length_predicate(node)
|
47
|
-
|
49
|
+
return unless LENGTH_METHODS.include?(node.method_name)
|
48
50
|
|
51
|
+
zero_length_predicate = zero_length_predicate(node.parent)
|
49
52
|
return unless zero_length_predicate
|
50
53
|
|
51
54
|
lhs, opr, rhs = zero_length_predicate
|
52
55
|
|
53
|
-
return if non_polymorphic_collection?(node)
|
56
|
+
return if non_polymorphic_collection?(node.parent)
|
54
57
|
|
55
58
|
add_offense(
|
56
|
-
node,
|
59
|
+
node.parent,
|
57
60
|
message: format(ZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
|
58
61
|
)
|
59
62
|
end
|
60
63
|
|
61
64
|
def check_nonzero_length_predicate(node)
|
62
|
-
|
65
|
+
return unless LENGTH_METHODS.include?(node.method_name)
|
63
66
|
|
67
|
+
nonzero_length_predicate = nonzero_length_predicate(node.parent)
|
64
68
|
return unless nonzero_length_predicate
|
65
69
|
|
66
70
|
lhs, opr, rhs = nonzero_length_predicate
|
67
71
|
|
68
|
-
return if non_polymorphic_collection?(node)
|
72
|
+
return if non_polymorphic_collection?(node.parent)
|
69
73
|
|
70
74
|
add_offense(
|
71
|
-
node,
|
75
|
+
node.parent,
|
72
76
|
message: format(NONZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
|
73
77
|
)
|
74
78
|
end
|
@@ -108,8 +112,8 @@ module RuboCop
|
|
108
112
|
# implement `#size`, but not `#empty`. We ignore those to
|
109
113
|
# reduce false positives.
|
110
114
|
def_node_matcher :non_polymorphic_collection?, <<~PATTERN
|
111
|
-
{(send (send (send (const nil? :File) :stat _) ...) ...)
|
112
|
-
(send (send (send (const nil? {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
|
115
|
+
{(send (send (send (const {nil? cbase} :File) :stat _) ...) ...)
|
116
|
+
(send (send (send (const {nil? cbase} {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
|
113
117
|
PATTERN
|
114
118
|
end
|
115
119
|
end
|
data/lib/rubocop/cop/team.rb
CHANGED
@@ -10,23 +10,16 @@ module RuboCop
|
|
10
10
|
# first the ones needed for autocorrection (if any), then the rest
|
11
11
|
# (unless autocorrections happened).
|
12
12
|
class Team
|
13
|
-
DEFAULT_OPTIONS = {
|
14
|
-
auto_correct: false,
|
15
|
-
debug: false
|
16
|
-
}.freeze
|
17
|
-
|
18
|
-
Investigation = Struct.new(:offenses, :errors)
|
19
|
-
|
20
13
|
attr_reader :errors, :warnings, :updated_source_file, :cops
|
21
14
|
|
22
15
|
alias updated_source_file? updated_source_file
|
23
16
|
|
24
|
-
def initialize(cops, config = nil, options =
|
17
|
+
def initialize(cops, config = nil, options = {})
|
25
18
|
@cops = cops
|
26
19
|
@config = config
|
27
|
-
@options = options
|
28
|
-
|
29
|
-
@
|
20
|
+
@options = options
|
21
|
+
reset
|
22
|
+
@ready = true
|
30
23
|
|
31
24
|
validate_config
|
32
25
|
end
|
@@ -40,18 +33,17 @@ module RuboCop
|
|
40
33
|
end
|
41
34
|
|
42
35
|
# @return [Team] with cops assembled from the given `cop_classes`
|
43
|
-
def self.mobilize(cop_classes, config, options =
|
44
|
-
options ||= DEFAULT_OPTIONS
|
36
|
+
def self.mobilize(cop_classes, config, options = {})
|
45
37
|
cops = mobilize_cops(cop_classes, config, options)
|
46
38
|
new(cops, config, options)
|
47
39
|
end
|
48
40
|
|
49
41
|
# @return [Array<Cop::Cop>]
|
50
|
-
def self.mobilize_cops(cop_classes, config, options =
|
51
|
-
|
42
|
+
def self.mobilize_cops(cop_classes, config, options = {})
|
43
|
+
cop_classes = Registry.new(cop_classes.to_a) unless cop_classes.is_a?(Registry)
|
52
44
|
only = options.fetch(:only, [])
|
53
45
|
safe = options.fetch(:safe, false)
|
54
|
-
cop_classes.enabled(config, only, safe).map do |cop_class|
|
46
|
+
cop_classes.enabled(config, only, only_safe: safe).map do |cop_class|
|
55
47
|
cop_class.new(config, options)
|
56
48
|
end
|
57
49
|
end
|
@@ -64,93 +56,102 @@ module RuboCop
|
|
64
56
|
@options[:debug]
|
65
57
|
end
|
66
58
|
|
59
|
+
# @deprecated. Use investigate
|
60
|
+
# @return Array<offenses>
|
67
61
|
def inspect_file(processed_source)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
62
|
+
investigate(processed_source).offenses
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [Commissioner::InvestigationReport]
|
66
|
+
def investigate(processed_source)
|
67
|
+
be_ready
|
68
|
+
|
69
|
+
# The autocorrection process may have to be repeated multiple times
|
70
|
+
# until there are no corrections left to perform
|
71
|
+
# To speed things up, run auto-correcting cops by themselves, and only
|
72
|
+
# run the other cops when no corrections are left
|
73
|
+
on_duty = roundup_relevant_cops(processed_source.file_path)
|
74
|
+
|
75
|
+
autocorrect_cops, other_cops = on_duty.partition(&:autocorrect?)
|
76
|
+
|
77
|
+
report = investigate_partial(autocorrect_cops, processed_source)
|
78
|
+
|
79
|
+
unless autocorrect(processed_source, report)
|
80
|
+
# If we corrected some errors, another round of inspection will be
|
81
|
+
# done, and any other offenses will be caught then, so only need
|
82
|
+
# to check other_cops if no correction was done
|
83
|
+
report = report.merge(investigate_partial(other_cops, processed_source))
|
73
84
|
end
|
74
85
|
|
75
|
-
|
86
|
+
process_errors(processed_source.path, report.errors)
|
87
|
+
|
88
|
+
report
|
89
|
+
ensure
|
90
|
+
@ready = false
|
76
91
|
end
|
77
92
|
|
93
|
+
# @deprecated
|
78
94
|
def forces
|
79
|
-
@forces ||= forces_for(cops)
|
95
|
+
@forces ||= self.class.forces_for(cops)
|
80
96
|
end
|
81
97
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
98
|
+
# @return [Array<Force>] needed for the given cops
|
99
|
+
def self.forces_for(cops)
|
100
|
+
needed = Hash.new { |h, k| h[k] = [] }
|
101
|
+
cops.each do |cop|
|
102
|
+
Array(cop.class.joining_forces).each { |force| needed[force] << cop }
|
103
|
+
end
|
86
104
|
|
87
|
-
|
105
|
+
needed.map do |force_class, joining_cops|
|
106
|
+
force_class.new(joining_cops)
|
88
107
|
end
|
89
108
|
end
|
90
109
|
|
91
|
-
def
|
110
|
+
def external_dependency_checksum
|
111
|
+
keys = cops.map(&:external_dependency_checksum).compact
|
112
|
+
Digest::SHA1.hexdigest(keys.join)
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def autocorrect(processed_source, report)
|
92
118
|
@updated_source_file = false
|
93
119
|
return unless autocorrect?
|
94
120
|
|
95
|
-
new_source =
|
121
|
+
new_source = autocorrect_report(report)
|
96
122
|
|
97
|
-
return
|
123
|
+
return unless new_source
|
98
124
|
|
99
125
|
if @options[:stdin]
|
100
126
|
# holds source read in from stdin, when --stdin option is used
|
101
127
|
@options[:stdin] = new_source
|
102
128
|
else
|
103
|
-
filename = buffer.name
|
129
|
+
filename = processed_source.buffer.name
|
104
130
|
File.open(filename, 'w') { |f| f.write(new_source) }
|
105
131
|
end
|
106
132
|
@updated_source_file = true
|
107
|
-
rescue RuboCop::ErrorWithAnalyzedFileLocation => e
|
108
|
-
process_errors(buffer.name, [e])
|
109
|
-
raise e.cause
|
110
|
-
end
|
111
|
-
|
112
|
-
def external_dependency_checksum
|
113
|
-
keys = cops.map(&:external_dependency_checksum).compact
|
114
|
-
Digest::SHA1.hexdigest(keys.join)
|
115
133
|
end
|
116
134
|
|
117
|
-
|
118
|
-
|
119
|
-
def offenses(processed_source) # rubocop:disable Metrics/AbcSize
|
120
|
-
# The autocorrection process may have to be repeated multiple times
|
121
|
-
# until there are no corrections left to perform
|
122
|
-
# To speed things up, run auto-correcting cops by themselves, and only
|
123
|
-
# run the other cops when no corrections are left
|
124
|
-
on_duty = roundup_relevant_cops(processed_source.file_path)
|
125
|
-
|
126
|
-
autocorrect_cops, other_cops = on_duty.partition(&:autocorrect?)
|
127
|
-
|
128
|
-
autocorrect = investigate(autocorrect_cops, processed_source)
|
129
|
-
|
130
|
-
if autocorrect(processed_source.buffer, autocorrect_cops)
|
131
|
-
# We corrected some errors. Another round of inspection will be
|
132
|
-
# done, and any other offenses will be caught then, so we don't
|
133
|
-
# need to continue.
|
134
|
-
return autocorrect.offenses
|
135
|
-
end
|
136
|
-
|
137
|
-
other = investigate(other_cops, processed_source)
|
135
|
+
def be_ready
|
136
|
+
return if @ready
|
138
137
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
autocorrect.offenses.concat(other.offenses)
|
138
|
+
reset
|
139
|
+
@cops.map!(&:ready)
|
140
|
+
@ready = true
|
143
141
|
end
|
144
142
|
|
145
|
-
def
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
offenses = commissioner.investigate(processed_source)
|
143
|
+
def reset
|
144
|
+
@errors = []
|
145
|
+
@warnings = []
|
146
|
+
end
|
150
147
|
|
151
|
-
|
148
|
+
# @return [Commissioner::InvestigationReport]
|
149
|
+
def investigate_partial(cops, processed_source)
|
150
|
+
commissioner = Commissioner.new(cops, self.class.forces_for(cops), @options)
|
151
|
+
commissioner.investigate(processed_source)
|
152
152
|
end
|
153
153
|
|
154
|
+
# @return [Array<cop>]
|
154
155
|
def roundup_relevant_cops(filename)
|
155
156
|
cops.reject do |cop|
|
156
157
|
cop.excluded_file?(filename) ||
|
@@ -171,30 +172,45 @@ module RuboCop
|
|
171
172
|
cop.class.support_target_rails_version?(cop.target_rails_version)
|
172
173
|
end
|
173
174
|
|
174
|
-
def
|
175
|
-
corrector =
|
175
|
+
def autocorrect_report(report)
|
176
|
+
corrector = collate_corrections(report)
|
176
177
|
|
177
|
-
|
178
|
+
corrector.rewrite unless corrector.empty?
|
179
|
+
end
|
178
180
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
181
|
+
def collate_corrections(report)
|
182
|
+
corrector = Corrector.new(report.processed_source)
|
183
|
+
|
184
|
+
each_corrector(report) do |to_merge|
|
185
|
+
suppress_clobbering do
|
186
|
+
corrector.merge!(to_merge)
|
187
|
+
end
|
183
188
|
end
|
189
|
+
|
190
|
+
corrector
|
184
191
|
end
|
185
192
|
|
186
|
-
def
|
193
|
+
def each_corrector(report)
|
187
194
|
skips = Set.new
|
195
|
+
report.cop_reports.each do |cop_report|
|
196
|
+
cop = cop_report.cop
|
197
|
+
corrector = cop_report.corrector
|
188
198
|
|
189
|
-
|
190
|
-
next if cop.corrections.empty?
|
199
|
+
next if corrector.nil? || corrector.empty?
|
191
200
|
next if skips.include?(cop.class)
|
192
201
|
|
193
|
-
corrector
|
202
|
+
yield corrector
|
203
|
+
|
194
204
|
skips.merge(cop.class.autocorrect_incompatible_with)
|
195
205
|
end
|
196
206
|
end
|
197
207
|
|
208
|
+
def suppress_clobbering
|
209
|
+
yield
|
210
|
+
rescue ::Parser::ClobberingError
|
211
|
+
# ignore Clobbering errors
|
212
|
+
end
|
213
|
+
|
198
214
|
def validate_config
|
199
215
|
cops.each do |cop|
|
200
216
|
cop.validate_config if cop.respond_to?(:validate_config)
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
# Common methods and behaviors for dealing with tokens.
|
5
|
+
module TokensUtil
|
6
|
+
module_function
|
7
|
+
|
8
|
+
# rubocop:disable Metrics/AbcSize
|
9
|
+
def tokens(node)
|
10
|
+
@tokens ||= {}
|
11
|
+
return @tokens[node.object_id] if @tokens[node.object_id]
|
12
|
+
|
13
|
+
@tokens[node.object_id] =
|
14
|
+
# The tokens list is always sorted by token position,
|
15
|
+
# except for cases when heredoc is passed as a method argument.
|
16
|
+
# In this case tokens are interleaved by heredoc contents' tokens.
|
17
|
+
# We can try a fast (binary) search, assuming the mentioned cases are rare,
|
18
|
+
# and fallback to linear search if failed.
|
19
|
+
if (tokens = fast_tokens(node))
|
20
|
+
tokens
|
21
|
+
else
|
22
|
+
begin_pos = node.source_range.begin_pos
|
23
|
+
end_pos = node.source_range.end_pos
|
24
|
+
|
25
|
+
processed_source.tokens.select do |token|
|
26
|
+
token.end_pos <= end_pos && token.begin_pos >= begin_pos
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
# rubocop:enable Metrics/AbcSize
|
31
|
+
|
32
|
+
def index_of_first_token(node)
|
33
|
+
index = fast_index_of_first_token(node)
|
34
|
+
return index if index
|
35
|
+
|
36
|
+
begin_pos = node.source_range.begin_pos
|
37
|
+
processed_source.tokens.index { |token| token.begin_pos == begin_pos }
|
38
|
+
end
|
39
|
+
|
40
|
+
def index_of_last_token(node)
|
41
|
+
index = fast_index_of_last_token(node)
|
42
|
+
return index if index
|
43
|
+
|
44
|
+
end_pos = node.source_range.end_pos
|
45
|
+
processed_source.tokens.index { |token| token.end_pos == end_pos }
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def fast_index_of_first_token(node)
|
51
|
+
begin_pos = node.source_range.begin_pos
|
52
|
+
tokens = processed_source.tokens
|
53
|
+
|
54
|
+
index = tokens.bsearch_index { |token| token.begin_pos >= begin_pos }
|
55
|
+
index if index && tokens[index].begin_pos == begin_pos
|
56
|
+
end
|
57
|
+
|
58
|
+
def fast_index_of_last_token(node)
|
59
|
+
end_pos = node.source_range.end_pos
|
60
|
+
tokens = processed_source.tokens
|
61
|
+
|
62
|
+
index = tokens.bsearch_index { |token| token.end_pos >= end_pos }
|
63
|
+
index if index && tokens[index].end_pos == end_pos
|
64
|
+
end
|
65
|
+
|
66
|
+
def fast_tokens(node)
|
67
|
+
begin_index = index_of_first_token(node)
|
68
|
+
end_index = index_of_last_token(node)
|
69
|
+
|
70
|
+
tokens = processed_source.tokens[begin_index..end_index]
|
71
|
+
tokens if sorted_tokens?(tokens)
|
72
|
+
end
|
73
|
+
|
74
|
+
def sorted_tokens?(tokens)
|
75
|
+
prev_begin_pos = -1
|
76
|
+
tokens.each do |token|
|
77
|
+
return false if token.begin_pos < prev_begin_pos
|
78
|
+
|
79
|
+
prev_begin_pos = token.begin_pos
|
80
|
+
end
|
81
|
+
true
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|