module RubbyCop::Cop::PercentLiteral
Common functionality for handling percent literals.
Constants
- PERCENT_LITERAL_TYPES
Private Instance Methods
autocorrect_words(word_nodes, escape, base_line_number, delimiters)
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 51 def autocorrect_words(word_nodes, escape, base_line_number, delimiters) previous_node_line_number = base_line_number word_nodes.map do |node| number_of_line_breaks = node.loc.line - previous_node_line_number line_breaks = "\n" * number_of_line_breaks previous_node_line_number = node.loc.line content = node.children.first.to_s content = escape ? escape_string(content) : content delimiters.each do |delimiter| content.gsub!(delimiter, "\\#{delimiter}") end line_breaks + content end.join(' ') end
begin_source(node)
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 21 def begin_source(node) node.loc.begin.source if node.loc.respond_to?(:begin) && node.loc.begin end
contents_range(node)
click to toggle source
A range containing only the contents of the percent literal (e.g. in %i{1 2 3} this will be the range covering '1 2 3' only)
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 31 def contents_range(node) range_between(node.loc.begin.end_pos, node.loc.end.begin_pos) end
correct_percent(node, char)
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 36 def correct_percent(node, char) words = node.children escape = words.any? { |w| needs_escaping?(w.children[0]) } char = char.upcase if escape delimiters = preferred_delimiters_for("%#{char}") contents = autocorrect_words(words, escape, node.loc.line, delimiters) lambda do |corrector| corrector.replace( node.source_range, "%#{char}#{delimiters[0]}#{contents}#{delimiters[1]}" ) end end
ensure_valid_preferred_delimiters()
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 66 def ensure_valid_preferred_delimiters invalid = preferred_delimiters_config.keys - (PERCENT_LITERAL_TYPES + %w[default]) return if invalid.empty? raise ArgumentError, "Invalid preferred delimiter config key: #{invalid.join(', ')}" end
percent_literal?(node)
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 11 def percent_literal?(node) return unless (begin_source = begin_source(node)) begin_source.start_with?('%') end
preferred_delimiters()
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 75 def preferred_delimiters @preferred_delimiters ||= begin ensure_valid_preferred_delimiters if preferred_delimiters_config.key?('default') Hash[PERCENT_LITERAL_TYPES.map do |type| [type, preferred_delimiters_config[type] || preferred_delimiters_config['default']] end] else preferred_delimiters_config end end end
preferred_delimiters_config()
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 91 def preferred_delimiters_config @config.for_cop('Style/PercentLiteralDelimiters')['PreferredDelimiters'] end
preferred_delimiters_for(type)
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 95 def preferred_delimiters_for(type) preferred_delimiters[type].split(//) end
process(node, *types)
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 16 def process(node, *types) return unless percent_literal?(node) && types.include?(type(node)) on_percent_literal(node) end
type(node)
click to toggle source
# File lib/rubbycop/cop/mixin/percent_literal.rb, line 25 def type(node) node.loc.begin.source[0..-2] end