Class: Puppet::Pops::Parser::Locator::Locator19
- Inherits:
-
AbstractLocator
- Object
- Puppet::Pops::Parser::Locator
- AbstractLocator
- Puppet::Pops::Parser::Locator::Locator19
- Includes:
- Types::PuppetObject
- 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).
Instance Attribute Summary
Attributes inherited from AbstractLocator
#file, #line_index, #prev_line, #prev_offset, #string
Class Method Summary collapse
- ._ptype ⇒ Object
-
.register_ptype(loader, ir) ⇒ Object
private
The Locator is not part of the Ecore model so no ObjectType is automatically inferred.
Instance Method Summary collapse
-
#char_length(offset, end_offset) ⇒ Object
Returns the length measured in number of characters from the given start and end byte offseta.
-
#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.
-
#extract_text(offset, length) ⇒ Object
Extracts the text from byte offset with given byte length.
-
#offset_on_line(offset) ⇒ Object
Returns the offset on line (first offset on a line is 0).
Methods included from Types::PuppetObject
Methods inherited from AbstractLocator
#ary_bsearch_i, #compute_line_index, #eql?, #hash, #initialize, #line_for_offset, #pos_on_line, #to_location_hash
Methods inherited from Puppet::Pops::Parser::Locator
#file, #line_for_offset, #line_index, locator, #pos_on_line, #string
Constructor Details
This class inherits a constructor from Puppet::Pops::Parser::Locator::AbstractLocator
Class Method Details
._ptype ⇒ Object
276 277 278 |
# File 'lib/puppet/pops/parser/locator.rb', line 276 def self._ptype @type end |
.register_ptype(loader, ir) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
The Locator is not part of the Ecore model so no ObjectType is automatically inferred. Instead the type is explicitly added here. TODO: LocatorForChars is never added. It looks like it could be removed (remnant from Ruby 1.8 compatibility?)
284 285 286 287 288 289 290 291 292 293 |
# File 'lib/puppet/pops/parser/locator.rb', line 284 def self.register_ptype(loader, ir) @type = Pcore::create_object_type(loader, ir, self, 'Puppet::AST::Locator', 'Any', 'string' => Types::PStringType::DEFAULT, 'file' => Types::PStringType::DEFAULT, 'line_index' => { Types::KEY_TYPE => Types::POptionalType.new(Types::PArrayType.new(Types::PIntegerType::DEFAULT)), Types::KEY_VALUE => nil } ).resolve(Types::TypeParser.singleton, loader) end |
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
309 310 311 |
# File 'lib/puppet/pops/parser/locator.rb', line 309 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
304 305 306 |
# File 'lib/puppet/pops/parser/locator.rb', line 304 def char_offset(byte_offset) string.byteslice(0, byte_offset).length end |
#extract_text(offset, length) ⇒ Object
Extracts the text from byte offset with given byte length
315 316 317 |
# File 'lib/puppet/pops/parser/locator.rb', line 315 def extract_text(offset, length) string.byteslice(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
297 298 299 300 |
# File 'lib/puppet/pops/parser/locator.rb', line 297 def offset_on_line(offset) line_offset = line_index[ line_for_offset(offset)-1 ] string.byteslice(line_offset, offset-line_offset).length end |