Class: Prism::Location
- Inherits:
-
Object
- Object
- Prism::Location
- Defined in:
- lib/prism/parse_result.rb,
ext/prism/extension.c
Overview
This represents a location in the source.
Instance Attribute Summary collapse
-
#length ⇒ Object
readonly
The length of this location in bytes.
-
#start_offset ⇒ Object
readonly
The byte offset from the beginning of the source where this location starts.
Instance Method Summary collapse
-
#==(other) ⇒ Object
Returns true if the given other location is equal to this location.
-
#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.
-
#cached_end_code_units_column(cache) ⇒ Object
The end column in code units using the given cache to fetch or calculate the value.
-
#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.
-
#cached_start_code_units_column(cache) ⇒ Object
The start column in code units using the given cache to fetch or calculate the value.
-
#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.
-
#chop ⇒ Object
Returns a new location that is the result of chopping off the last byte.
-
#comments ⇒ Object
Returns all comments that are associated with this location (both leading and trailing comments).
-
#copy(source: self.source, start_offset: self.start_offset, length: self.length) ⇒ Object
Create a new location object with the given options.
-
#deconstruct_keys(keys) ⇒ Object
Implement the hash pattern matching interface for Location.
-
#end_character_column ⇒ Object
The column number in characters where this location ends from the start of the line.
-
#end_character_offset ⇒ Object
The character offset from the beginning of the source where this location ends.
-
#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.
-
#end_code_units_offset(encoding = Encoding::UTF_16LE) ⇒ Object
The offset from the start of the file in code units of the given encoding.
-
#end_column ⇒ Object
The column number in bytes where this location ends from the start of the line.
-
#end_line ⇒ Object
The line number where this location ends.
-
#end_offset ⇒ Object
The byte offset from the beginning of the source where this location ends.
-
#initialize(source, start_offset, length) ⇒ Location
constructor
Create a new location object with the given source, start byte offset, and byte length.
-
#inspect ⇒ Object
Returns a string representation of this location.
-
#join(other) ⇒ Object
Returns a new location that stretches from this location to the given other location.
-
#leading_comment(comment) ⇒ Object
Attach a comment to the leading comments of this location.
-
#leading_comments ⇒ Object
These are the comments that are associated with this location that exist before the start of this location.
-
#pretty_print(q) ⇒ Object
Implement the pretty print interface for Location.
-
#slice ⇒ Object
The source code that this location represents.
-
#slice_lines ⇒ Object
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.
-
#source_lines ⇒ Object
Returns all of the lines of the source code associated with this location.
-
#start_character_column ⇒ Object
The column number in characters where this location ends from the start of the line.
-
#start_character_offset ⇒ Object
The character offset from the beginning of the source where this location starts.
-
#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.
-
#start_code_units_offset(encoding = Encoding::UTF_16LE) ⇒ Object
The offset from the start of the file in code units of the given encoding.
-
#start_column ⇒ Object
The column number in bytes where this location starts from the start of the line.
-
#start_line ⇒ Object
The line number where this location starts.
-
#start_line_slice ⇒ Object
The content of the line where this location starts before this location.
-
#trailing_comment(comment) ⇒ Object
Attach a comment to the trailing comments of this location.
-
#trailing_comments ⇒ Object
These are the comments that are associated with this location that exist after the end of this location.
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
#length ⇒ Object (readonly)
The length of this location in bytes.
301 302 303 |
# File 'lib/prism/parse_result.rb', line 301 def length @length end |
#start_offset ⇒ Object (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 |
#chop ⇒ Object
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 |
#comments ⇒ Object
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_column ⇒ Object
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_offset ⇒ Object
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_column ⇒ Object
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_line ⇒ Object
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_offset ⇒ Object
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 |
#inspect ⇒ Object
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_comments ⇒ Object
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 |
#slice ⇒ Object
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_lines ⇒ Object
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_lines ⇒ Object
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_column ⇒ Object
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_offset ⇒ Object
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_column ⇒ Object
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_line ⇒ Object
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_slice ⇒ Object
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_comments ⇒ Object
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 |