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.



288
289
290
291
292
293
294
295
296
297
298
# File 'lib/prism/parse_result.rb', line 288

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.



284
285
286
# File 'lib/prism/parse_result.rb', line 284

def length
  @length
end

#start_offsetObject (readonly)

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



281
282
283
# File 'lib/prism/parse_result.rb', line 281

def start_offset
  @start_offset
end

Instance Method Details

#==(other) ⇒ Object

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



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

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.



495
496
497
498
499
500
501
502
# File 'lib/prism/parse_result.rb', line 495

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.



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

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.



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

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.



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

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.



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

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.



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

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



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

def end_column
  source.column(end_offset)
end

#end_lineObject

The line number where this location ends.



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

def end_line
  source.line(end_offset)
end

#end_offsetObject

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



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

def end_offset
  start_offset + length
end

#inspectObject

Returns a string representation of this location.



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

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.



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

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.



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

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.



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

def leading_comments
  @leading_comments ||= []
end

#pretty_print(q) ⇒ Object

Implement the pretty print interface for Location.



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

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

#sliceObject

The source code that this location represents.



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

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.



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

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.



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

def source_lines
  source.lines
end

#start_character_columnObject

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



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

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.



364
365
366
# File 'lib/prism/parse_result.rb', line 364

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.



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

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.



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

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.



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

def start_column
  source.column(start_offset)
end

#start_lineObject

The line number where this location starts.



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

def start_line
  source.line(start_offset)
end

#start_line_sliceObject

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



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

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.



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

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.



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

def trailing_comments
  @trailing_comments ||= []
end