class PuppetLint::Lexer::StringSlurper

Document this TODO

Constants

END_INTERP_PATTERN
END_STRING_PATTERN
ESC_DQUOTE_PATTERN
LBRACE_PATTERN
START_INTERP_PATTERN
UNENC_VAR_PATTERN

Attributes

interp_stack[RW]
results[RW]
scanner[RW]

Public Class Methods

new(string) click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 21
def initialize(string)
  @scanner = StringScanner.new(string)
  @results = []
  @interp_stack = []
  @segment = []
end

Public Instance Methods

consumed_bytes() click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 101
def consumed_bytes
  scanner.pos
end
end_heredoc(pattern) click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 147
def end_heredoc(pattern)
  results << [:HEREDOC, @segment.join]
  results << [:HEREDOC_TERM, scanner.scan(pattern)]
end
end_interp() click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 122
def end_interp
  if interp_stack.empty?
    @segment << scanner.scan(END_INTERP_PATTERN)
    return
  else
    interp_stack.pop
  end

  if interp_stack.empty?
    results << [:INTERP, @segment.join]
    @segment = []
    scanner.skip(END_INTERP_PATTERN)
  else
    @segment << scanner.scan(END_INTERP_PATTERN)
  end
end
end_string() click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 152
def end_string
  if interp_stack.empty?
    @segment << scanner.scan(END_STRING_PATTERN).gsub!(%r{"\Z}, '')
    results << [@segment_type, @segment.join]
  else
    @segment << scanner.scan(END_STRING_PATTERN)
  end
end
parse() click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 28
def parse
  @segment_type = :STRING

  until scanner.eos?
    if scanner.match?(START_INTERP_PATTERN)
      start_interp
    elsif !interp_stack.empty? && scanner.match?(LBRACE_PATTERN)
      read_char
    elsif scanner.match?(END_INTERP_PATTERN)
      end_interp
    elsif unenclosed_variable?
      unenclosed_variable
    elsif scanner.match?(END_STRING_PATTERN)
      end_string
      break if interp_stack.empty?
    elsif scanner.match?(ESC_DQUOTE_PATTERN)
      @segment << scanner.scan(ESC_DQUOTE_PATTERN)
    else
      read_char
    end
  end

  raise UnterminatedStringError if results.empty? && scanner.matched?

  results
end
parse_heredoc(heredoc_tag) click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 61
def parse_heredoc(heredoc_tag)
  heredoc_name = heredoc_tag[%r{\A"?(.+?)"?(:.+?)?#{PuppetLint::Lexer::WHITESPACE_RE}*(/.*)?\Z}, 1]
  end_heredoc_pattern = %r{\A\|?\s*-?\s*#{Regexp.escape(heredoc_name)}}
  interpolation = heredoc_tag.start_with?('"')

  @segment_type = :HEREDOC

  until scanner.eos?
    if scanner.match?(end_heredoc_pattern)
      end_heredoc(end_heredoc_pattern)
      break if interp_stack.empty?
    elsif interpolation && scanner.match?(START_INTERP_PATTERN)
      start_interp
    elsif interpolation && !interp_stack.empty? && scanner.match?(LBRACE_PATTERN)
      read_char
    elsif interpolation && unenclosed_variable?
      unenclosed_variable
    elsif interpolation && scanner.match?(END_INTERP_PATTERN)
      end_interp
    else
      read_char
    end
  end

  results
end
read_char() click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 88
def read_char
  @segment << scanner.getch

  return if interp_stack.empty?

  case @segment.last
  when '{'
    interp_stack.push(true)
  when '}'
    interp_stack.pop
  end
end
start_interp() click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 105
def start_interp
  if @segment.last && @segment.last == '\\'
    read_char
    return
  end

  if interp_stack.empty?
    scanner.skip(START_INTERP_PATTERN)
    results << [@segment_type, @segment.join]
    @segment = []
  else
    @segment << scanner.scan(START_INTERP_PATTERN)
  end

  interp_stack.push(true)
end
unenclosed_variable() click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 139
def unenclosed_variable
  read_char if scanner.match?(%r{.\$})

  results << [@segment_type, @segment.join]
  results << [:UNENC_VAR, scanner.scan(UNENC_VAR_PATTERN)]
  @segment = []
end
unenclosed_variable?() click to toggle source
# File lib/puppet-lint/lexer/string_slurper.rb, line 55
def unenclosed_variable?
  interp_stack.empty? &&
    scanner.match?(UNENC_VAR_PATTERN) &&
    (@segment.last.nil? ? true : !@segment.last.end_with?('\\'))
end