Class: Shirobai::SourceOffsets
- Inherits:
-
Object
- Object
- Shirobai::SourceOffsets
- Defined in:
- lib/shirobai/source_offsets.rb
Overview
Converts the BYTE offsets Rust reports (prism) into the CHARACTER offsets ‘Parser::Source::Range` indexes the buffer with. On an ASCII-only source the two coincide and `#[]` returns its argument unchanged (`ascii_only?` is a cached coderange lookup, so the fast path costs one predicate per offset); on a non-ASCII source each distinct offset is converted once via `byteslice(0, offset).length` (O(offset), memoized — offenses are rare and repeat offsets, so the naive prefix count beats maintaining a table).
‘.for` memoizes the instance by source identity (`equal?`, the same single-slot scheme as `Dispatch`): cops run file by file, so every cop on the current file shares one converter (and its memo), while the autocorrect loop’s freshly built source naturally gets a new one.
NOTE for wrapper authors: convert ONLY what feeds ‘Parser::Source::Range` (or other char-indexed Ruby APIs). Values handed BACK to Rust (e.g. `IndentationWidth`’s accumulated prior correction ranges) must stay bytes.
Class Method Summary collapse
Instance Method Summary collapse
-
#[](byte_offset) ⇒ Object
The character offset for prism’s ‘byte_offset` into this source.
-
#initialize(source) ⇒ SourceOffsets
constructor
A new instance of SourceOffsets.
Constructor Details
#initialize(source) ⇒ SourceOffsets
Returns a new instance of SourceOffsets.
30 31 32 33 34 |
# File 'lib/shirobai/source_offsets.rb', line 30 def initialize(source) @source = source @ascii = source.ascii_only? @chars = nil end |
Class Method Details
.for(source) ⇒ Object
22 23 24 25 26 27 |
# File 'lib/shirobai/source_offsets.rb', line 22 def for(source) return @cached if defined?(@cached_source) && @cached_source.equal?(source) @cached_source = source @cached = new(source) end |
Instance Method Details
#[](byte_offset) ⇒ Object
The character offset for prism’s ‘byte_offset` into this source.
37 38 39 40 41 |
# File 'lib/shirobai/source_offsets.rb', line 37 def [](byte_offset) return byte_offset if @ascii (@chars ||= {})[byte_offset] ||= @source.byteslice(0, byte_offset).length end |