Class: Puppet::Pops::Parser::Locator::Locator19

Inherits:
AbstractLocator show all
Defined in:
lib/puppet/pops/parser/locator.rb

Overview

This implementation is for Ruby19 and Ruby20. It uses byteslice to get strings from byte based offsets. For Ruby20 this is faster than using the Stringscanner.charpos method (byteslice outperforms it, when strings are frozen).

Constant Summary

Constants inherited from Puppet::Pops::Parser::Locator

LOCATOR_VERSION, MULTIBYTE, RUBYVER, RUBYVER_ARRAY, RUBY_1_9_3, RUBY_2_0_0

Instance Attribute Summary

Attributes inherited from AbstractLocator

#file, #line_index, #prev_line, #prev_offset, #string

Instance Method Summary collapse

Methods inherited from AbstractLocator

#ary_bsearch_i, #compute_line_index, #initialize, #line_for_offset, #pos_on_line, #to_location_hash

Methods inherited from Puppet::Pops::Parser::Locator

#file, #line_for_offset, #line_index, locator, locator_version, #pos_on_line, #string

Constructor Details

This class inherits a constructor from Puppet::Pops::Parser::Locator::AbstractLocator

Instance Method Details

#char_length(offset, end_offset) ⇒ Object

Returns the length measured in number of characters from the given start and end byte offseta



287
288
289
# File 'lib/puppet/pops/parser/locator.rb', line 287

def char_length(offset, end_offset)
  string.byteslice(offset, end_offset - offset).length
end

#char_offset(byte_offset) ⇒ Object

Returns the character offset for a given byte offset Ruby 19 is multibyte but has no character position methods, must use byteslice



282
283
284
# File 'lib/puppet/pops/parser/locator.rb', line 282

def char_offset(byte_offset)
  string.byteslice(0, byte_offset).length
end

#offset_on_line(offset) ⇒ Object

Returns the offset on line (first offset on a line is 0). Ruby 19 is multibyte but has no character position methods, must use byteslice



275
276
277
278
# File 'lib/puppet/pops/parser/locator.rb', line 275

def offset_on_line(offset)
  line_offset = line_index[ line_for_offset(offset)-1 ]
  string.byteslice(line_offset, offset-line_offset).length
end