Class: RuboCop::Cop::Performance::CaseWhenSplat
- Includes:
- AutocorrectAlignment
- Defined in:
- lib/rubocop/cop/performance/case_when_splat.rb
Overview
Place when conditions that use splat at the end of the list of when branches.
Ruby has to allocate memory for the splat expansion every time that the case when statement is run. Since Ruby does not support fall through inside of case when, like some other languages do, the order of the when branches does not matter. By placing any splat expansions at the end of the list of when branches we will reduce the number of times that memory has to be allocated for the expansion.
This is not a guaranteed performance improvement. If the data being processed by the case condition is normalized in a manner that favors hitting a condition in the splat expansion, it is possible that moving the splat condition to the end will use more memory, and run slightly slower.
Constant Summary collapse
- MSG =
'Place `when` conditions with a splat ' \ 'at the end of the `when` branches.'.freeze
- ARRAY_MSG =
'Do not expand array literals in `when` conditions.'.freeze
- PERCENT_W =
'%w'.freeze
- PERCENT_CAPITAL_W =
'%W'.freeze
- PERCENT_I =
'%i'.freeze
- PERCENT_CAPITAL_I =
'%I'.freeze
Constants included from AutocorrectAlignment
Constants included from Util
Util::ASGN_NODES, Util::BYTE_ORDER_MARK, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES
Instance Attribute Summary
Attributes inherited from Cop
#config, #corrections, #offenses, #processed_source
Instance Method Summary collapse
Methods included from AutocorrectAlignment
#check_alignment, #configured_indentation_width, #display_column, #indentation, #offset
Methods inherited from Cop
#add_offense, all, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, cop_type, #correct, #debug?, #details, #display_cop_names?, #display_style_guide?, #excluded_file?, #extra_details?, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #reference_url, #relevant_file?, #style_guide_url, #target_ruby_version
Methods included from Sexp
Methods included from NodePattern::Macros
#def_node_matcher, #def_node_search, #node_search_body
Methods included from AutocorrectLogic
#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?
Methods included from IgnoredNode
#ignore_node, #ignored_node?, #part_of_ignored_node?
Methods included from Util
begins_its_line?, block_length, comment_line?, directions, double_quotes_acceptable?, double_quotes_required?, effective_column, ends_its_line?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, move_pos, needs_escaping?, numeric_range_size, on_node, operator?, parentheses?, parenthesized_call?, range_with_surrounding_comma, range_with_surrounding_space, source_range, strip_quotes, to_string_literal, to_symbol_literal, within_node?
Methods included from PathUtil
absolute?, match_path?, relative_path
Constructor Details
This class inherits a constructor from RuboCop::Cop::Cop
Instance Method Details
#autocorrect(node) ⇒ Object
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/rubocop/cop/performance/case_when_splat.rb', line 81 def autocorrect(node) *conditions, _body = *node new_condition = conditions.each_with_object([]) do |condition, correction| variable, = *condition if variable.respond_to?(:array_type?) && variable.array_type? correction << (variable) next end correction << condition.source end new_condition = new_condition.join(', ') lambda do |corrector| if needs_reorder?(conditions) reorder_condition(corrector, node, new_condition) else inline_fix_branch(corrector, node, conditions, new_condition) end end end |
#on_case(node) ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/rubocop/cop/performance/case_when_splat.rb', line 65 def on_case(node) _case_branch, *when_branches, _else_branch = *node when_conditions = when_branches.each_with_object([]) do |branch, conditions| *condition, _ = *branch condition.each { |c| conditions << c } end splat_offenses(when_conditions).reverse_each do |condition| range = condition.parent.loc.keyword.join(condition.source_range) variable, = *condition = variable.array_type? ? ARRAY_MSG : MSG add_offense(condition.parent, range, ) end end |