123456789_123456789_123456789_123456789_123456789_

Class: RDoc::Parser::RubyColorizer::DeferredContext

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/rdoc/parser/ruby_colorizer.rb

Overview

Defers colorization for all nodes in one source file until first access.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(source) ⇒ DeferredContext

: (String) -> void

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 18

def initialize(source)
  @source = source
  @token_streams = {}
end

Instance Attribute Details

#materialized? ⇒ Boolean (readonly, private)

: () -> Boolean

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 38

def materialized?
  !@source
end

Instance Method Details

#materialize (private)

: () -> void

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 43

def materialize
  program_node, unordered_tokens = Prism.parse_lex(@source).value
  prism_tokens = unordered_tokens.map(&:first).sort_by! { |token| token.location.start_offset }
  staged_tokens = {}
  nodes = [program_node]
  until nodes.empty?
    node = nodes.pop
    if @token_streams.key?(node.node_id)
      staged_tokens[node.node_id] = RubyColorizer.partial_colorize(@source, node, prism_tokens)
    end
    nodes.concat(node.compact_child_nodes)
  end

  @token_streams = staged_tokens
  @source = nil
end

#token_stream_for(node_id)

: (Integer) -> Array

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 30

def token_stream_for(node_id)
  materialize unless materialized?
  @token_streams.fetch(node_id)
end

#token_stream_loader(node_id)

: (Integer) -> ^() -> Array

[ GitHub ]

  
# File 'lib/rdoc/parser/ruby_colorizer.rb', line 24

def token_stream_loader(node_id)
  @token_streams[node_id] = nil
  #=> { token_stream_for(node_id) }
end