class RuboCop::Cop::Style::EmptyLiteral
This cop checks for the use of a method, the result of which would be a literal, like an empty array, hash or string.
Constants
- ARR_MSG
- HASH_MSG
- STR_MSG
Public Instance Methods
autocorrect(node)
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 35 def autocorrect(node) lambda do |corrector| corrector.replace(replacement_range(node), correction(node)) end end
on_send(node)
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 23 def on_send(node) add_offense(node, message: ARR_MSG) if offense_array_node?(node) add_offense(node, message: HASH_MSG) if offense_hash_node?(node) str_node(node) do return if frozen_string_literals_enabled? add_offense(node, message: format(STR_MSG, preferred_string_literal)) end end
Private Instance Methods
correction(node)
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 87 def correction(node) if offense_array_node?(node) '[]' elsif str_node(node) preferred_string_literal elsif offense_hash_node?(node) if first_argument_unparenthesized?(node) # `some_method {}` is not same as `some_method Hash.new` # because the braces are interpreted as a block. We will have # to rewrite the arguments to wrap them in parenthesis. _receiver, _method_name, *args = *node.parent "(#{args[1..-1].map(&:source).unshift('{}').join(', ')})" else '{}' end end end
enforce_double_quotes?()
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 47 def enforce_double_quotes? string_literals_config['EnforcedStyle'] == 'double_quotes' end
first_argument_unparenthesized?(node)
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 55 def first_argument_unparenthesized?(node) return false unless node.parent && node.parent.send_type? _receiver, _method_name, *args = *node.parent node.object_id == args.first.object_id && !parentheses?(node.parent) end
offense_array_node?(node)
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 78 def offense_array_node?(node) array_node(node) && !array_with_block(node.parent) end
offense_hash_node?(node)
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 82 def offense_hash_node?(node) # If Hash.new takes a block, it can't be changed to {}. hash_node(node) && !hash_with_block(node.parent) end
preferred_string_literal()
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 43 def preferred_string_literal enforce_double_quotes? ? '""' : "''" end
replacement_range(node)
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 62 def replacement_range(node) if hash_node(node) && first_argument_unparenthesized?(node) # `some_method {}` is not same as `some_method Hash.new` # because the braces are interpreted as a block. We will have # to rewrite the arguments to wrap them in parenthesis. _receiver, _method_name, *args = *node.parent Parser::Source::Range.new(node.parent.loc.expression, args[0].loc.expression.begin_pos - 1, args[-1].loc.expression.end_pos) else node.source_range end end
string_literals_config()
click to toggle source
# File lib/rubocop/cop/style/empty_literal.rb, line 51 def string_literals_config config.for_cop('Style/StringLiterals') end