class Prism::CodeUnitsCache

一个缓存,可用于快速计算字节偏移量对应的代码单元偏移量。它特意只提供一个 [] 方法来访问缓存,以尽量减少表面积。

请注意,这里有一些已知问题,未来可能会或可能不会解决

  • 第一个问题是,当缓存计算的值不在字符边界上时会出现问题。这可能会导致后续的计算偏差一个或多个代码单元。

  • 第二个问题是,此缓存目前是无界的。理论上,我们可以引入某种 LRU 缓存来限制条目的数量,但这尚未实现。

公共类方法

new(source, encoding) 点击切换源码

使用给定的源和编码初始化一个新的缓存。

# File prism/parse_result.rb, line 198
def initialize(source, encoding)
  @source = source
  @counter =
    if encoding == Encoding::UTF_16LE || encoding == Encoding::UTF_16BE
      UTF16Counter.new(source, encoding)
    else
      LengthCounter.new(source, encoding)
    end

  @cache = {} #: Hash[Integer, Integer]
  @offsets = [] #: Array[Integer]
end

公共实例方法

[](byte_offset) 点击切换源码

从给定的字节偏移量检索代码单元偏移量。

# File prism/parse_result.rb, line 212
def [](byte_offset)
  @cache[byte_offset] ||=
    if (index = @offsets.bsearch_index { |offset| offset > byte_offset }).nil?
      @offsets << byte_offset
      @counter.count(0, byte_offset)
    elsif index == 0
      @offsets.unshift(byte_offset)
      @counter.count(0, byte_offset)
    else
      @offsets.insert(index, byte_offset)
      offset = @offsets[index - 1]
      @cache[offset] + @counter.count(offset, byte_offset - offset)
    end
end