rubocop 0.49.1 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -3
- data/bin/rubocop +1 -1
- data/config/default.yml +160 -99
- data/config/disabled.yml +4 -5
- data/config/enabled.yml +149 -47
- data/lib/rubocop.rb +41 -14
- data/lib/rubocop/ast/builder.rb +4 -1
- data/lib/rubocop/ast/node.rb +36 -42
- data/lib/rubocop/ast/node/args_node.rb +1 -13
- data/lib/rubocop/ast/node/array_node.rb +9 -0
- data/lib/rubocop/ast/node/block_node.rb +9 -0
- data/lib/rubocop/ast/node/def_node.rb +71 -0
- data/lib/rubocop/ast/node/for_node.rb +8 -0
- data/lib/rubocop/ast/node/if_node.rb +10 -2
- data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
- data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
- data/lib/rubocop/ast/node/regexp_node.rb +35 -0
- data/lib/rubocop/ast/node/send_node.rb +1 -154
- data/lib/rubocop/ast/node/super_node.rb +3 -24
- data/lib/rubocop/ast/node/yield_node.rb +21 -0
- data/lib/rubocop/ast/traversal.rb +6 -6
- data/lib/rubocop/cli.rb +7 -3
- data/lib/rubocop/config.rb +45 -8
- data/lib/rubocop/config_loader.rb +7 -5
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +64 -0
- data/lib/rubocop/cop/bundler/ordered_gems.rb +12 -12
- data/lib/rubocop/cop/commissioner.rb +8 -2
- data/lib/rubocop/cop/cop.rb +3 -1
- data/lib/rubocop/cop/generator.rb +94 -21
- data/lib/rubocop/cop/internal_affairs.rb +3 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +14 -3
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +43 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +49 -0
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/align_array.rb +2 -2
- data/lib/rubocop/cop/layout/align_hash.rb +2 -2
- data/lib/rubocop/cop/layout/align_parameters.rb +5 -11
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +9 -0
- data/lib/rubocop/cop/layout/else_alignment.rb +30 -13
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +4 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +20 -4
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -3
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +5 -2
- data/lib/rubocop/cop/layout/indent_heredoc.rb +19 -24
- data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +12 -8
- data/lib/rubocop/cop/layout/leading_comment_space.rb +33 -18
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -17
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +3 -3
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
- data/lib/rubocop/cop/layout/space_after_colon.rb +7 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +10 -0
- data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -3
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +13 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -5
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -5
- data/lib/rubocop/cop/layout/space_before_comment.rb +7 -0
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +8 -4
- data/lib/rubocop/cop/layout/tab.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +4 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/block_alignment.rb +15 -6
- data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
- data/lib/rubocop/cop/lint/condition_position.rb +5 -1
- data/lib/rubocop/cop/lint/debugger.rb +16 -9
- data/lib/rubocop/cop/lint/def_end_alignment.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +73 -5
- data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
- 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_expression.rb +1 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/empty_when.rb +1 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +35 -40
- data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +18 -13
- data/lib/rubocop/cop/lint/inherit_exception.rb +8 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +36 -0
- data/lib/rubocop/cop/lint/literal_in_condition.rb +3 -3
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +5 -7
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +3 -12
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +7 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +77 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +13 -6
- data/lib/rubocop/cop/lint/rescue_without_error_class.rb +38 -0
- data/lib/rubocop/cop/lint/return_in_void_context.rb +63 -0
- data/lib/rubocop/cop/lint/script_permission.rb +6 -0
- data/lib/rubocop/cop/lint/syntax.rb +17 -20
- data/lib/rubocop/cop/lint/unified_integer.rb +3 -2
- data/lib/rubocop/cop/lint/unneeded_disable.rb +1 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -8
- data/lib/rubocop/cop/lint/useless_setter_call.rb +10 -11
- data/lib/rubocop/cop/lint/void.rb +29 -23
- data/lib/rubocop/cop/metrics/line_length.rb +2 -2
- data/lib/rubocop/cop/metrics/method_length.rb +8 -3
- data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
- data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -2
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
- data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +9 -6
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +68 -31
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +18 -0
- data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/accessor_method_name.rb +11 -12
- data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +2 -2
- data/lib/rubocop/cop/{style → naming}/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/constant_name.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/file_name.rb +8 -4
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +68 -0
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +58 -0
- data/lib/rubocop/cop/{style → naming}/method_name.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/predicate_name.rb +6 -7
- data/lib/rubocop/cop/{style → naming}/variable_name.rb +11 -15
- data/lib/rubocop/cop/{style → naming}/variable_number.rb +1 -1
- data/lib/rubocop/cop/performance/caller.rb +39 -11
- data/lib/rubocop/cop/performance/casecmp.rb +4 -4
- data/lib/rubocop/cop/performance/compare_with_block.rb +4 -4
- data/lib/rubocop/cop/performance/double_start_end_with.rb +4 -4
- data/lib/rubocop/cop/performance/end_with.rb +3 -3
- data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
- data/lib/rubocop/cop/performance/hash_each_methods.rb +66 -25
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
- data/lib/rubocop/cop/performance/range_include.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_block_call.rb +6 -6
- data/lib/rubocop/cop/performance/redundant_match.rb +5 -5
- data/lib/rubocop/cop/performance/redundant_merge.rb +39 -23
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/performance/regexp_match.rb +13 -5
- data/lib/rubocop/cop/performance/size.rb +1 -1
- data/lib/rubocop/cop/performance/start_with.rb +3 -3
- data/lib/rubocop/cop/performance/times_map.rb +23 -12
- data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
- data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
- data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
- data/lib/rubocop/cop/rails/delegate.rb +36 -7
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -2
- data/lib/rubocop/cop/rails/file_path.rb +3 -4
- data/lib/rubocop/cop/rails/find_each.rb +1 -1
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +48 -0
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +5 -5
- data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +2 -2
- data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
- data/lib/rubocop/cop/rails/request_referer.rb +2 -2
- data/lib/rubocop/cop/rails/reversible_migration.rb +12 -12
- data/lib/rubocop/cop/rails/save_bang.rb +8 -6
- data/lib/rubocop/cop/rails/scope_args.rb +1 -1
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +2 -2
- data/lib/rubocop/cop/security/marshal_load.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +2 -2
- data/lib/rubocop/cop/style/alias.rb +44 -20
- data/lib/rubocop/cop/style/and_or.rb +48 -34
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +3 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/command_literal.rb +20 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +30 -28
- data/lib/rubocop/cop/style/copyright.rb +10 -10
- data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -5
- data/lib/rubocop/cop/style/dir.rb +52 -0
- data/lib/rubocop/cop/style/documentation_method.rb +2 -6
- data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
- data/lib/rubocop/cop/style/empty_else.rb +3 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -2
- data/lib/rubocop/cop/style/empty_method.rb +27 -17
- data/lib/rubocop/cop/style/flip_flop.rb +2 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +4 -2
- data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +5 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +1 -1
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +4 -3
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +20 -8
- data/lib/rubocop/cop/style/lambda.rb +19 -9
- data/lib/rubocop/cop/style/lambda_call.rb +22 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -20
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -26
- data/lib/rubocop/cop/style/method_missing.rb +5 -18
- data/lib/rubocop/cop/style/min_max.rb +67 -0
- data/lib/rubocop/cop/style/missing_else.rb +16 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
- data/lib/rubocop/cop/style/module_function.rb +8 -4
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +5 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +25 -3
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -6
- data/lib/rubocop/cop/style/negated_if.rb +8 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +8 -8
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +14 -14
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -2
- data/lib/rubocop/cop/style/numeric_literals.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +8 -4
- data/lib/rubocop/cop/style/one_line_conditional.rb +8 -3
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
- data/lib/rubocop/cop/style/or_assignment.rb +88 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +12 -11
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +16 -17
- data/lib/rubocop/cop/style/redundant_begin.rb +6 -5
- data/lib/rubocop/cop/style/redundant_conditional.rb +95 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -11
- data/lib/rubocop/cop/style/redundant_return.rb +23 -11
- data/lib/rubocop/cop/style/redundant_self.rb +18 -9
- data/lib/rubocop/cop/style/regexp_literal.rb +12 -4
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +98 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +80 -43
- data/lib/rubocop/cop/style/single_line_block_params.rb +14 -13
- data/lib/rubocop/cop/style/single_line_methods.rb +9 -13
- data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -39
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +22 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +5 -25
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -18
- data/lib/rubocop/cop/style/ternary_parentheses.rb +14 -10
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +28 -9
- data/lib/rubocop/cop/style/trivial_accessors.rb +39 -56
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +8 -3
- data/lib/rubocop/cop/style/word_array.rb +7 -24
- data/lib/rubocop/cop/style/yoda_condition.rb +49 -14
- data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -18
- data/lib/rubocop/cop/team.rb +16 -8
- data/lib/rubocop/cop/util.rb +11 -0
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +71 -0
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
- data/lib/rubocop/node_pattern.rb +44 -26
- data/lib/rubocop/options.rb +1 -0
- data/lib/rubocop/processed_source.rb +3 -1
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +1 -0
- data/lib/rubocop/rspec/cop_helper.rb +10 -10
- data/lib/rubocop/rspec/expect_offense.rb +6 -8
- data/lib/rubocop/rspec/shared_examples.rb +8 -8
- data/lib/rubocop/string_util.rb +2 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +51 -18
- data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
- data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
@@ -19,8 +19,8 @@ module RuboCop
|
|
19
19
|
def_node_matcher :symbol_proc?, <<-PATTERN
|
20
20
|
(block
|
21
21
|
${(send ...) (super ...) zsuper}
|
22
|
-
|
23
|
-
|
22
|
+
(args (arg _var))
|
23
|
+
(send (lvar _var) $_))
|
24
24
|
PATTERN
|
25
25
|
|
26
26
|
def self.autocorrect_incompatible_with
|
@@ -28,7 +28,7 @@ module RuboCop
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def on_block(node)
|
31
|
-
symbol_proc?(node) do |send_or_super,
|
31
|
+
symbol_proc?(node) do |send_or_super, method|
|
32
32
|
block_method_name = resolve_block_method_name(send_or_super)
|
33
33
|
|
34
34
|
# TODO: Rails-specific handling that we should probably make
|
@@ -37,7 +37,6 @@ module RuboCop
|
|
37
37
|
return if proc_node?(send_or_super)
|
38
38
|
return if %i[lambda proc].include?(block_method_name)
|
39
39
|
return if ignored_method?(block_method_name)
|
40
|
-
return unless can_shorten?(block_args, block_body)
|
41
40
|
|
42
41
|
offense(node, method, block_method_name)
|
43
42
|
end
|
@@ -124,20 +123,6 @@ module RuboCop
|
|
124
123
|
ignored_methods.include?(name.to_s)
|
125
124
|
end
|
126
125
|
|
127
|
-
def can_shorten?(block_args, block_body)
|
128
|
-
argument_matches_receiver?(block_args, block_body)
|
129
|
-
end
|
130
|
-
|
131
|
-
# TODO: This might be clearer as a node matcher with unification
|
132
|
-
def argument_matches_receiver?(block_args, block_body)
|
133
|
-
receiver, = *block_body
|
134
|
-
|
135
|
-
block_arg_name, = *block_args.children.first
|
136
|
-
receiver_name, = *receiver
|
137
|
-
|
138
|
-
block_arg_name == receiver_name
|
139
|
-
end
|
140
|
-
|
141
126
|
def super?(node)
|
142
127
|
SUPER_TYPES.include?(node.type)
|
143
128
|
end
|
@@ -54,6 +54,9 @@ module RuboCop
|
|
54
54
|
include ConfigurableEnforcedStyle
|
55
55
|
include SurroundingSpace
|
56
56
|
|
57
|
+
VARIABLE_TYPES = AST::Node::VARIABLES
|
58
|
+
NON_COMPLEX_TYPES = [*VARIABLE_TYPES, :const, :defined?, :yield].freeze
|
59
|
+
|
57
60
|
MSG = '%s parentheses for ternary conditions.'.freeze
|
58
61
|
MSG_COMPLEX = '%s parentheses for ternary expressions with' \
|
59
62
|
' complex conditions.'.freeze
|
@@ -61,7 +64,7 @@ module RuboCop
|
|
61
64
|
def on_if(node)
|
62
65
|
return unless node.ternary? && !infinite_loop? && offense?(node)
|
63
66
|
|
64
|
-
add_offense(node, node.source_range
|
67
|
+
add_offense(node, node.source_range)
|
65
68
|
end
|
66
69
|
|
67
70
|
private
|
@@ -102,17 +105,21 @@ module RuboCop
|
|
102
105
|
if condition.begin_type?
|
103
106
|
condition.to_a.any? { |x| complex_condition?(x) }
|
104
107
|
else
|
105
|
-
|
108
|
+
non_complex_expression?(condition) ? false : true
|
106
109
|
end
|
107
110
|
end
|
108
111
|
|
109
112
|
# Anything that is not a variable, constant, or method/.method call
|
110
113
|
# will be counted as a complex expression.
|
111
|
-
def
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
114
|
+
def non_complex_expression?(condition)
|
115
|
+
NON_COMPLEX_TYPES.include?(condition.type) ||
|
116
|
+
non_complex_send?(condition)
|
117
|
+
end
|
118
|
+
|
119
|
+
def non_complex_send?(node)
|
120
|
+
return false unless node.send_type?
|
121
|
+
|
122
|
+
!node.operator_method? || node.method?(:[])
|
116
123
|
end
|
117
124
|
|
118
125
|
def message(node)
|
@@ -165,9 +172,6 @@ module RuboCop
|
|
165
172
|
(send {_ nil} _ $(send nil _)...)}
|
166
173
|
PATTERN
|
167
174
|
|
168
|
-
def_node_matcher :square_brackets?,
|
169
|
-
'(send {(send _recv _msg) str array hash} :[] ...)'
|
170
|
-
|
171
175
|
def correct_parenthesized(condition)
|
172
176
|
lambda do |corrector|
|
173
177
|
corrector.remove(condition.loc.begin)
|
@@ -96,16 +96,35 @@ module RuboCop
|
|
96
96
|
|
97
97
|
return unless first_offense
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
99
|
+
if unused_variables_only?(first_offense, variables)
|
100
|
+
return left_side_range(left, right)
|
101
|
+
end
|
102
|
+
|
103
|
+
if Util.parentheses?(left)
|
104
|
+
return range_for_parentheses(first_offense, left)
|
105
|
+
end
|
106
|
+
|
107
|
+
range_between(
|
108
|
+
first_offense.source_range.begin_pos,
|
109
|
+
node.loc.operator.begin_pos
|
110
|
+
)
|
111
|
+
end
|
112
|
+
|
113
|
+
def unused_variables_only?(offense, variables)
|
114
|
+
offense.source_range == variables.first.source_range
|
115
|
+
end
|
116
|
+
|
117
|
+
def left_side_range(left, right)
|
118
|
+
range_between(
|
119
|
+
left.source_range.begin_pos, right.source_range.begin_pos
|
120
|
+
)
|
121
|
+
end
|
105
122
|
|
106
|
-
|
107
|
-
|
108
|
-
|
123
|
+
def range_for_parentheses(offense, left)
|
124
|
+
range_between(
|
125
|
+
offense.source_range.begin_pos - 1,
|
126
|
+
left.loc.expression.end_pos - 1
|
127
|
+
)
|
109
128
|
end
|
110
129
|
end
|
111
130
|
end
|
@@ -10,16 +10,11 @@ module RuboCop
|
|
10
10
|
|
11
11
|
def on_def(node)
|
12
12
|
return if in_module_or_instance_eval?(node)
|
13
|
-
|
14
|
-
on_method_def(node, method_name, args, body)
|
15
|
-
end
|
13
|
+
return if ignore_class_methods? && node.defs_type?
|
16
14
|
|
17
|
-
|
18
|
-
return if in_module_or_instance_eval?(node)
|
19
|
-
return if ignore_class_methods?
|
20
|
-
_scope, method_name, args, body = *node
|
21
|
-
on_method_def(node, method_name, args, body)
|
15
|
+
on_method_def(node)
|
22
16
|
end
|
17
|
+
alias on_defs on_def
|
23
18
|
|
24
19
|
private
|
25
20
|
|
@@ -37,10 +32,10 @@ module RuboCop
|
|
37
32
|
false
|
38
33
|
end
|
39
34
|
|
40
|
-
def on_method_def(node
|
41
|
-
kind = if trivial_reader?(
|
35
|
+
def on_method_def(node)
|
36
|
+
kind = if trivial_reader?(node)
|
42
37
|
'reader'
|
43
|
-
elsif trivial_writer?(
|
38
|
+
elsif trivial_writer?(node)
|
44
39
|
'writer'
|
45
40
|
end
|
46
41
|
return unless kind
|
@@ -69,61 +64,53 @@ module RuboCop
|
|
69
64
|
Array(whitelist).map(&:to_sym) + [:initialize]
|
70
65
|
end
|
71
66
|
|
72
|
-
def predicate?(method_name)
|
73
|
-
method_name[-1] == '?'
|
74
|
-
end
|
75
|
-
|
76
67
|
def dsl_writer?(method_name)
|
77
68
|
!method_name.to_s.end_with?('=')
|
78
69
|
end
|
79
70
|
|
80
|
-
def trivial_reader?(
|
81
|
-
looks_like_trivial_reader?(
|
82
|
-
!allowed_method?(
|
83
|
-
!allowed_reader?(method_name)
|
71
|
+
def trivial_reader?(node)
|
72
|
+
looks_like_trivial_reader?(node) &&
|
73
|
+
!allowed_method?(node) && !allowed_reader?(node)
|
84
74
|
end
|
85
75
|
|
86
|
-
def looks_like_trivial_reader?(
|
87
|
-
|
76
|
+
def looks_like_trivial_reader?(node)
|
77
|
+
!node.arguments? && node.body && node.body.ivar_type?
|
88
78
|
end
|
89
79
|
|
90
|
-
def trivial_writer?(
|
91
|
-
looks_like_trivial_writer?(
|
92
|
-
!allowed_method?(
|
93
|
-
!allowed_writer?(method_name)
|
80
|
+
def trivial_writer?(node)
|
81
|
+
looks_like_trivial_writer?(node) &&
|
82
|
+
!allowed_method?(node) && !allowed_writer?(node.method_name)
|
94
83
|
end
|
95
84
|
|
96
|
-
|
97
|
-
args
|
98
|
-
|
99
|
-
|
100
|
-
body.children[1] && body.children[1].lvar_type?
|
101
|
-
end
|
85
|
+
def_node_matcher :looks_like_trivial_writer?, <<-PATTERN
|
86
|
+
{(def _ (args (arg ...)) (ivasgn _ (lvar _)))
|
87
|
+
(defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
|
88
|
+
PATTERN
|
102
89
|
|
103
|
-
def allowed_method?(
|
104
|
-
whitelist.include?(method_name) ||
|
105
|
-
exact_name_match? && !names_match?(
|
90
|
+
def allowed_method?(node)
|
91
|
+
whitelist.include?(node.method_name) ||
|
92
|
+
exact_name_match? && !names_match?(node)
|
106
93
|
end
|
107
94
|
|
108
95
|
def allowed_writer?(method_name)
|
109
96
|
allow_dsl_writers? && dsl_writer?(method_name)
|
110
97
|
end
|
111
98
|
|
112
|
-
def allowed_reader?(
|
113
|
-
allow_predicates? &&
|
99
|
+
def allowed_reader?(node)
|
100
|
+
allow_predicates? && node.predicate_method?
|
114
101
|
end
|
115
102
|
|
116
|
-
def names_match?(
|
117
|
-
ivar_name, = *body
|
103
|
+
def names_match?(node)
|
104
|
+
ivar_name, = *node.body
|
118
105
|
|
119
|
-
method_name.to_s.sub(/[=?]$/, '') == ivar_name[1..-1]
|
106
|
+
node.method_name.to_s.sub(/[=?]$/, '') == ivar_name[1..-1]
|
120
107
|
end
|
121
108
|
|
122
|
-
def trivial_accessor_kind(
|
123
|
-
if trivial_writer?(
|
124
|
-
!dsl_writer?(method_name)
|
109
|
+
def trivial_accessor_kind(node)
|
110
|
+
if trivial_writer?(node) &&
|
111
|
+
!dsl_writer?(node.method_name)
|
125
112
|
'writer'
|
126
|
-
elsif trivial_reader?(
|
113
|
+
elsif trivial_reader?(node)
|
127
114
|
'reader'
|
128
115
|
end
|
129
116
|
end
|
@@ -141,31 +128,27 @@ module RuboCop
|
|
141
128
|
end
|
142
129
|
|
143
130
|
def autocorrect_instance(node)
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
(kind = trivial_accessor_kind(method_name, args, body))
|
148
|
-
return
|
149
|
-
end
|
131
|
+
kind = trivial_accessor_kind(node)
|
132
|
+
|
133
|
+
return unless names_match?(node) && !node.predicate_method? && kind
|
150
134
|
|
151
135
|
lambda do |corrector|
|
152
|
-
corrector.replace(node.source_range,
|
136
|
+
corrector.replace(node.source_range,
|
137
|
+
accessor(kind, node.method_name))
|
153
138
|
end
|
154
139
|
end
|
155
140
|
|
156
141
|
def autocorrect_class(node)
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
return
|
161
|
-
end
|
142
|
+
kind = trivial_accessor_kind(node)
|
143
|
+
|
144
|
+
return unless names_match?(node) && kind
|
162
145
|
|
163
146
|
lambda do |corrector|
|
164
147
|
indent = ' ' * node.loc.column
|
165
148
|
corrector.replace(
|
166
149
|
node.source_range,
|
167
150
|
['class << self',
|
168
|
-
"#{indent} #{accessor(kind, method_name)}",
|
151
|
+
"#{indent} #{accessor(kind, node.method_name)}",
|
169
152
|
"#{indent}end"].join("\n")
|
170
153
|
)
|
171
154
|
end
|
@@ -5,9 +5,11 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop checks for variable interpolation (like "#@ivar").
|
7
7
|
class VariableInterpolation < Cop
|
8
|
+
# rubocop:disable Lint/InterpolationCheck
|
8
9
|
MSG = 'Replace interpolated variable `%s` ' \
|
9
10
|
'with expression `#{%s}`.'.freeze
|
10
11
|
|
12
|
+
# rubocop:enable Lint/InterpolationCheck
|
11
13
|
def on_dstr(node)
|
12
14
|
check_for_interpolation(node)
|
13
15
|
end
|
@@ -23,12 +25,15 @@ module RuboCop
|
|
23
25
|
private
|
24
26
|
|
25
27
|
def check_for_interpolation(node)
|
26
|
-
var_nodes(node.children).each do |
|
27
|
-
|
28
|
-
add_offense(v, :expression, format(MSG, var, var))
|
28
|
+
var_nodes(node.children).each do |var_node|
|
29
|
+
add_offense(var_node)
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
33
|
+
def message(node)
|
34
|
+
format(MSG, node.source, node.source)
|
35
|
+
end
|
36
|
+
|
32
37
|
def autocorrect(node)
|
33
38
|
lambda do |corrector|
|
34
39
|
corrector.replace(node.source_range, "{#{node.source}}")
|
@@ -35,6 +35,7 @@ module RuboCop
|
|
35
35
|
include ArrayMinSize
|
36
36
|
include ArraySyntax
|
37
37
|
include ConfigurableEnforcedStyle
|
38
|
+
include PercentArray
|
38
39
|
include PercentLiteral
|
39
40
|
|
40
41
|
PERCENT_MSG = 'Use `%w` or `%W` for an array of words.'.freeze
|
@@ -47,12 +48,16 @@ module RuboCop
|
|
47
48
|
|
48
49
|
def on_array(node)
|
49
50
|
if bracketed_array_of?(:str, node)
|
51
|
+
return if complex_content?(node.values)
|
52
|
+
|
50
53
|
check_bracketed_array(node)
|
51
54
|
elsif node.percent_literal?(:string)
|
52
55
|
check_percent_array(node)
|
53
56
|
end
|
54
57
|
end
|
55
58
|
|
59
|
+
private
|
60
|
+
|
56
61
|
def autocorrect(node)
|
57
62
|
if style == :percent
|
58
63
|
correct_percent(node, 'w')
|
@@ -61,33 +66,11 @@ module RuboCop
|
|
61
66
|
end
|
62
67
|
end
|
63
68
|
|
64
|
-
private
|
65
|
-
|
66
69
|
def check_bracketed_array(node)
|
67
|
-
return if
|
68
|
-
comments_in_array?(node) ||
|
69
|
-
below_array_length?(node)
|
70
|
+
return if allowed_bracket_array?(node)
|
70
71
|
|
71
72
|
array_style_detected(:brackets, node.values.size)
|
72
|
-
add_offense(node
|
73
|
-
end
|
74
|
-
|
75
|
-
def check_percent_array(node)
|
76
|
-
array_style_detected(:percent, node.values.size)
|
77
|
-
add_offense(node, :expression, ARRAY_MSG) if style == :brackets
|
78
|
-
end
|
79
|
-
|
80
|
-
def percent_syntax?(node)
|
81
|
-
node.loc.begin && node.loc.begin.source =~ /\A%[wW]/
|
82
|
-
end
|
83
|
-
|
84
|
-
def comments_in_array?(node)
|
85
|
-
comments = processed_source.comments
|
86
|
-
array_range = node.source_range.to_a
|
87
|
-
|
88
|
-
comments.any? do |comment|
|
89
|
-
!(comment.loc.expression.to_a & array_range).empty?
|
90
|
-
end
|
73
|
+
add_offense(node) if style == :percent
|
91
74
|
end
|
92
75
|
|
93
76
|
def complex_content?(strings)
|