class RuboCop::Cop::Style::SymbolArray
support a version of Ruby lower than 2.0.
projects which do not want to use that syntax, perhaps because they
Alternatively, it checks for symbol arrays using the %i() syntax on
using the %i() syntax.
This cop can check for array literals made up of symbols that are not
def autocorrect(node)
def autocorrect(node) syms = node.children.map { |c| c.children[0].to_s } corrected = if style == :percent escape = syms.any? { |s| needs_escaping?(s) } syms = syms.map { |s| escape_string(s) } if escape syms = syms.map { |s| s.gsub(/\)/, '\\)') } if escape "%I(#{syms.join(' ')})" else "%i(#{syms.join(' ')})" end else syms = syms.map { |s| to_symbol_literal(s) } "[#{syms.join(', ')}]" end lambda do |corrector| corrector.replace(node.source_range, corrected) end end
def check_bracketed_array(node)
def check_bracketed_array(node) return if comments_in_array?(node) return if symbols_contain_spaces?(node) style_detected(:brackets) add_offense(node, :expression, PERCENT_MSG) if style == :percent end
def check_percent_array(node)
def check_percent_array(node) style_detected(:percent) add_offense(node, :expression, ARRAY_MSG) if style == :brackets end
def comments_in_array?(node)
def comments_in_array?(node) comments = processed_source.comments array_range = node.source_range.to_a comments.any? do |comment| !(comment.loc.expression.to_a & array_range).empty? end end
def on_array(node)
def on_array(node) if bracketed_array_of?(:sym, node) check_bracketed_array(node) elsif percent_array?(node) check_percent_array(node) end end
def percent_array?(node)
def percent_array?(node) node.loc.begin && node.loc.begin.source =~ /\A%[iI]/ end
def symbols_contain_spaces?(node)
def symbols_contain_spaces?(node) node.children.any? do |sym| content, = *sym content =~ / / end end
def validate_config
def validate_config if style == :percent && target_ruby_version < 2.0 raise ValidationError, 'The default `percent` style for the ' \ '`Style/SymbolArray` cop is only compatible' \ ' with Ruby 2.0 and up, but the target Ruby' \ " version for your project is 1.9.\nPlease " \ 'either disable this cop, configure it to ' \ 'use `array` style, or adjust the ' \ '`TargetRubyVersion` parameter in your ' \ 'configuration.' end end