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
- OPEN_BRACKET =
'['.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::BASIC_LITERALS, Util::EQUALS_ASGN_NODES, Util::LITERALS, Util::OPERATOR_METHODS, Util::PROC_NEW_NODE, 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, #indentation, #offset, #start_of_line?
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?, inherited, #initialize, #join_force?, lint?, match?, #message, non_rails, qualified_cop_name, rails?, #reference_url, #relevant_file?, #style_guide_url
Methods included from NodePattern::Macros
#def_node_matcher, #def_node_search
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, command?, comment_line?, const_name, directions, first_part_of_call_chain, lambda?, lambda_or_proc?, line_range, move_pos, numeric_range_size, on_node, operator?, parentheses?, proc?, range_with_surrounding_comma, range_with_surrounding_space, source_range, strip_quotes, within_node?
Methods included from PathUtil
hidden?, issue_deprecation_warning, 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 |
# File 'lib/rubocop/cop/performance/case_when_splat.rb', line 81 def autocorrect(node) condition, = *node variable, = *condition if variable.array_type? correct_array_literal(condition, variable) else reorder_splat_condition(node) 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 conditions << condition end splat_offenses(when_conditions).reverse_each do |condition| range = condition.parent.loc.keyword.join(condition.loc.expression) variable, = *condition = variable.array_type? ? ARRAY_MSG : MSG add_offense(condition.parent, range, ) end end |