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.



293
294
295
296
297
298
299
300
301
302
303
# File 'lib/prism/parse_result.rb', line 293

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.



289
290
291
# File 'lib/prism/parse_result.rb', line 289

def length
  @length
end

#start_offsetObject (readonly)

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



286
287
288
# File 'lib/prism/parse_result.rb', line 286

def start_offset
  @start_offset
end

Instance Method Details

#==(other) ⇒ Object

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



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



339
340
341
# File 'lib/prism/parse_result.rb', line 339

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).



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

def end_column
  source.column(end_offset)
end

#end_lineObject

The line number where this location ends.



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

def end_line
  source.line(end_offset)
end

#end_offsetObject

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



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

def end_offset
  start_offset + length
end

#inspectObject

Returns a string representation of this location.



344
345
346
# File 'lib/prism/parse_result.rb', line 344

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.



490
491
492
493
494
495
# File 'lib/prism/parse_result.rb', line 490

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.



312
313
314
# File 'lib/prism/parse_result.rb', line 312

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.



307
308
309
# File 'lib/prism/parse_result.rb', line 307

def leading_comments
  @leading_comments ||= []
end

#pretty_print(q) ⇒ Object

Implement the pretty print interface for Location.



476
477
478
# File 'lib/prism/parse_result.rb', line 476

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

#sliceObject

The source code that this location represents.



354
355
356
# File 'lib/prism/parse_result.rb', line 354

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.



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

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.



349
350
351
# File 'lib/prism/parse_result.rb', line 349

def source_lines
  source.lines
end

#start_character_columnObject

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



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

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.



369
370
371
# File 'lib/prism/parse_result.rb', line 369

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.



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

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.



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

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.



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

def start_column
  source.column(start_offset)
end

#start_lineObject

The line number where this location starts.



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

def start_line
  source.line(start_offset)
end

#start_line_sliceObject

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



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

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.



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

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.



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

def trailing_comments
  @trailing_comments ||= []
end