Class: Prism::Location

Inherits:
Object
  • Object
show all
Defined in:
lib/prism/parse_result.rb,
ext/prism/extension.c

Overview

This represents a location in the source.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source, start_offset, length) ⇒ Location

Create a new location object with the given source, start byte offset, and byte length.


305
306
307
308
309
310
311
312
313
314
315
# File 'lib/prism/parse_result.rb', line 305

def initialize(source, start_offset, length)
  @source = source
  @start_offset = start_offset
  @length = length

  # These are used to store comments that are associated with this location.
  # They are initialized to `nil` to save on memory when there are no
  # comments to be attached and/or the comment-related APIs are not used.
  @leading_comments = nil
  @trailing_comments = nil
end

Instance Attribute Details

#lengthObject (readonly)

The length of this location in bytes.


301
302
303
# File 'lib/prism/parse_result.rb', line 301

def length
  @length
end

#start_offsetObject (readonly)

The byte offset from the beginning of the source where this location starts.


298
299
300
# File 'lib/prism/parse_result.rb', line 298

def start_offset
  @start_offset
end

Instance Method Details

#==(other) ⇒ Object

Returns true if the given other location is equal to this location.


493
494
495
496
497
# File 'lib/prism/parse_result.rb', line 493

def ==(other)
  Location === other &&
    other.start_offset == start_offset &&
    other.end_offset == end_offset
end

#adjoin(string) ⇒ Object

Join this location with the first occurrence of the string in the source that occurs after this location on the same line, and return the new location. This will raise an error if the string does not exist.


512
513
514
515
516
517
518
519
# File 'lib/prism/parse_result.rb', line 512

def adjoin(string)
  line_suffix = source.slice(end_offset, source.line_end(end_offset) - end_offset)

  line_suffix_index = line_suffix.byteindex(string)
  raise "Could not find #{string}" if line_suffix_index.nil?

  Location.new(source, start_offset, length + line_suffix_index + string.bytesize)
end

#cached_end_code_units_column(cache) ⇒ Object

The end column in code units using the given cache to fetch or calculate the value.


478
479
480
# File 'lib/prism/parse_result.rb', line 478

def cached_end_code_units_column(cache)
  cache[end_offset] - cache[source.line_start(end_offset)]
end

#cached_end_code_units_offset(cache) ⇒ Object

The end offset from the start of the file in code units using the given cache to fetch or calculate the value.


414
415
416
# File 'lib/prism/parse_result.rb', line 414

def cached_end_code_units_offset(cache)
  cache[end_offset]
end

#cached_start_code_units_column(cache) ⇒ Object

The start column in code units using the given cache to fetch or calculate the value.


454
455
456
# File 'lib/prism/parse_result.rb', line 454

def cached_start_code_units_column(cache)
  cache[start_offset] - cache[source.line_start(start_offset)]
end

#cached_start_code_units_offset(cache) ⇒ Object

The start offset from the start of the file in code units using the given cache to fetch or calculate the value.


392
393
394
# File 'lib/prism/parse_result.rb', line 392

def cached_start_code_units_offset(cache)
  cache[start_offset]
end

#chopObject

Returns a new location that is the result of chopping off the last byte.


351
352
353
# File 'lib/prism/parse_result.rb', line 351

def chop
  copy(length: length == 0 ? length : length - 1)
end

#commentsObject

Returns all comments that are associated with this location (both leading and trailing comments).


341
342
343
# File 'lib/prism/parse_result.rb', line 341

def comments
  [*@leading_comments, *@trailing_comments]
end

#copy(source: self.source, start_offset: self.start_offset, length: self.length) ⇒ Object

Create a new location object with the given options.


346
347
348
# File 'lib/prism/parse_result.rb', line 346

def copy(source: self.source, start_offset: self.start_offset, length: self.length)
  Location.new(source, start_offset, length)
end

#deconstruct_keys(keys) ⇒ Object

Implement the hash pattern matching interface for Location.


483
484
485
# File 'lib/prism/parse_result.rb', line 483

def deconstruct_keys(keys)
  { start_offset: start_offset, end_offset: end_offset }
end

#end_character_columnObject

The column number in characters where this location ends from the start of the line.


466
467
468
# File 'lib/prism/parse_result.rb', line 466

def end_character_column
  source.character_column(end_offset)
end

#end_character_offsetObject

The character offset from the beginning of the source where this location ends.


403
404
405
# File 'lib/prism/parse_result.rb', line 403

def end_character_offset
  source.character_offset(end_offset)
end

#end_code_units_column(encoding = Encoding::UTF_16LE) ⇒ Object

The column number in code units of the given encoding where this location ends from the start of the line.


472
473
474
# File 'lib/prism/parse_result.rb', line 472

def end_code_units_column(encoding = Encoding::UTF_16LE)
  source.code_units_column(end_offset, encoding)
end

#end_code_units_offset(encoding = Encoding::UTF_16LE) ⇒ Object

The offset from the start of the file in code units of the given encoding.


408
409
410
# File 'lib/prism/parse_result.rb', line 408

def end_code_units_offset(encoding = Encoding::UTF_16LE)
  source.code_units_offset(end_offset, encoding)
end

#end_columnObject

The column number in bytes where this location ends from the start of the line.


460
461
462
# File 'lib/prism/parse_result.rb', line 460

def end_column
  source.column(end_offset)
end

#end_lineObject

The line number where this location ends.


430
431
432
# File 'lib/prism/parse_result.rb', line 430

def end_line
  source.line(end_offset)
end

#end_offsetObject

The byte offset from the beginning of the source where this location ends.


397
398
399
# File 'lib/prism/parse_result.rb', line 397

def end_offset
  start_offset + length
end

#inspectObject

Returns a string representation of this location.


356
357
358
# File 'lib/prism/parse_result.rb', line 356

def inspect
  "#<Prism::Location @start_offset=#{@start_offset} @length=#{@length} start_line=#{start_line}>"
end

#join(other) ⇒ Object

Returns a new location that stretches from this location to the given other location. Raises an error if this location is not before the other location or if they don’t share the same source.


502
503
504
505
506
507
# File 'lib/prism/parse_result.rb', line 502

def join(other)
  raise "Incompatible sources" if source != other.source
  raise "Incompatible locations" if start_offset > other.start_offset

  Location.new(source, start_offset, other.end_offset - start_offset)
end

#leading_comment(comment) ⇒ Object

Attach a comment to the leading comments of this location.


324
325
326
# File 'lib/prism/parse_result.rb', line 324

def leading_comment(comment)
  leading_comments << comment
end

#leading_commentsObject

These are the comments that are associated with this location that exist before the start of this location.


319
320
321
# File 'lib/prism/parse_result.rb', line 319

def leading_comments
  @leading_comments ||= []
end

#pretty_print(q) ⇒ Object

Implement the pretty print interface for Location.


488
489
490
# File 'lib/prism/parse_result.rb', line 488

def pretty_print(q)
  q.text("(#{start_line},#{start_column})-(#{end_line},#{end_column})")
end

#sliceObject

The source code that this location represents.


366
367
368
# File 'lib/prism/parse_result.rb', line 366

def slice
  source.slice(start_offset, length)
end

#slice_linesObject

The source code that this location represents starting from the beginning of the line that this location starts on to the end of the line that this location ends on.


373
374
375
376
377
# File 'lib/prism/parse_result.rb', line 373

def slice_lines
  line_start = source.line_start(start_offset)
  line_end = source.line_end(end_offset)
  source.slice(line_start, line_end - line_start)
end

#source_linesObject

Returns all of the lines of the source code associated with this location.


361
362
363
# File 'lib/prism/parse_result.rb', line 361

def source_lines
  source.lines
end

#start_character_columnObject

The column number in characters where this location ends from the start of the line.


442
443
444
# File 'lib/prism/parse_result.rb', line 442

def start_character_column
  source.character_column(start_offset)
end

#start_character_offsetObject

The character offset from the beginning of the source where this location starts.


381
382
383
# File 'lib/prism/parse_result.rb', line 381

def start_character_offset
  source.character_offset(start_offset)
end

#start_code_units_column(encoding = Encoding::UTF_16LE) ⇒ Object

The column number in code units of the given encoding where this location starts from the start of the line.


448
449
450
# File 'lib/prism/parse_result.rb', line 448

def start_code_units_column(encoding = Encoding::UTF_16LE)
  source.code_units_column(start_offset, encoding)
end

#start_code_units_offset(encoding = Encoding::UTF_16LE) ⇒ Object

The offset from the start of the file in code units of the given encoding.


386
387
388
# File 'lib/prism/parse_result.rb', line 386

def start_code_units_offset(encoding = Encoding::UTF_16LE)
  source.code_units_offset(start_offset, encoding)
end

#start_columnObject

The column number in bytes where this location starts from the start of the line.


436
437
438
# File 'lib/prism/parse_result.rb', line 436

def start_column
  source.column(start_offset)
end

#start_lineObject

The line number where this location starts.


419
420
421
# File 'lib/prism/parse_result.rb', line 419

def start_line
  source.line(start_offset)
end

#start_line_sliceObject

The content of the line where this location starts before this location.


424
425
426
427
# File 'lib/prism/parse_result.rb', line 424

def start_line_slice
  offset = source.line_start(start_offset)
  source.slice(offset, start_offset - offset)
end

#trailing_comment(comment) ⇒ Object

Attach a comment to the trailing comments of this location.


335
336
337
# File 'lib/prism/parse_result.rb', line 335

def trailing_comment(comment)
  trailing_comments << comment
end

#trailing_commentsObject

These are the comments that are associated with this location that exist after the end of this location.


330
331
332
# File 'lib/prism/parse_result.rb', line 330

def trailing_comments
  @trailing_comments ||= []
end