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

Inherits:
AbstractLocator show all
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

Instance Method Summary collapse

Methods included from Types::PuppetObject

#_ptype

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

._ptypeObject



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