module Prism::Serialize

A module responsible for deserializing parse results.

Constants

MAJOR_VERSION

The major version of prism that we are expecting to find in the serialized strings.

MINOR_VERSION

The minor version of prism that we are expecting to find in the serialized strings.

PATCH_VERSION

The patch version of prism that we are expecting to find in the serialized strings.

TOKEN_TYPES

The token types that can be indexed by their enum values.

Public Class Methods

load_lex(input, serialized, freeze) click to toggle source

Deserialize the dumped output from a request to lex or lex_file.

The formatting of the source of this method is purposeful to illustrate the structure of the serialized data.

# File lib/prism/serialize.rb, line 87
def self.load_lex(input, serialized, freeze)
  source = Source.for(input)
  loader = Loader.new(source, serialized)

  tokens =         loader.load_tokens
  encoding =       loader.load_encoding
  start_line =     loader.load_varsint
  offsets =        loader.load_line_offsets(freeze)

  source.replace_start_line(start_line)
  source.replace_offsets(offsets)

  comments =       loader.load_comments(freeze)
  magic_comments = loader.load_magic_comments(freeze)
  data_loc =       loader.load_optional_location_object(freeze)
  errors =         loader.load_errors(encoding, freeze)
  warnings =       loader.load_warnings(encoding, freeze)
  raise unless     loader.eof?

  result = LexResult.new(tokens, comments, magic_comments, data_loc, errors, warnings, source)

  tokens.each do |token|
    token[0].value.force_encoding(encoding)

    if freeze
      token[0].deep_freeze
      token.freeze
    end
  end

  if freeze
    source.deep_freeze
    tokens.freeze
    result.freeze
  end

  result
end
load_parse(input, serialized, freeze) click to toggle source

Deserialize the dumped output from a request to parse or parse_file.

The formatting of the source of this method is purposeful to illustrate the structure of the serialized data.

# File lib/prism/serialize.rb, line 34
def self.load_parse(input, serialized, freeze)
  input = input.dup
  source = Source.for(input)
  loader = Loader.new(source, serialized)

                   loader.load_header
  encoding =       loader.load_encoding
  start_line =     loader.load_varsint
  offsets =        loader.load_line_offsets(freeze)

  source.replace_start_line(start_line)
  source.replace_offsets(offsets)

  comments =       loader.load_comments(freeze)
  magic_comments = loader.load_magic_comments(freeze)
  data_loc =       loader.load_optional_location_object(freeze)
  errors =         loader.load_errors(encoding, freeze)
  warnings =       loader.load_warnings(encoding, freeze)
  cpool_base =     loader.load_uint32
  cpool_size =     loader.load_varuint

  constant_pool = ConstantPool.new(input, serialized, cpool_base, cpool_size)

  node =           loader.load_node(constant_pool, encoding, freeze)
                   loader.load_constant_pool(constant_pool)
  raise unless     loader.eof?

  result = ParseResult.new(node, comments, magic_comments, data_loc, errors, warnings, source)
  result.freeze if freeze

  input.force_encoding(encoding)

  # This is an extremely niche use-case where the file was marked as binary
  # but it contained UTF-8-encoded characters. In that case we will actually
  # put it back to UTF-8 to give the location APIs the best chance of being
  # correct.
  if !input.ascii_only? && input.encoding == Encoding::BINARY
    input.force_encoding(Encoding::UTF_8)
    input.force_encoding(Encoding::BINARY) unless input.valid_encoding?
  end

  if freeze
    input.freeze
    source.deep_freeze
  end

  result
end
load_parse_comments(input, serialized, freeze) click to toggle source

Deserialize the dumped output from a request to parse_comments or parse_file_comments.

The formatting of the source of this method is purposeful to illustrate the structure of the serialized data.

# File lib/prism/serialize.rb, line 131
def self.load_parse_comments(input, serialized, freeze)
  source = Source.for(input)
  loader = Loader.new(source, serialized)

               loader.load_header
               loader.load_encoding
  start_line = loader.load_varsint

  source.replace_start_line(start_line)

  result =     loader.load_comments(freeze)
  raise unless loader.eof?

  source.deep_freeze if freeze
  result
end
load_parse_lex(input, serialized, freeze) click to toggle source

Deserialize the dumped output from a request to parse_lex or parse_lex_file.

The formatting of the source of this method is purposeful to illustrate the structure of the serialized data.

# File lib/prism/serialize.rb, line 153
def self.load_parse_lex(input, serialized, freeze)
  source = Source.for(input)
  loader = Loader.new(source, serialized)

  tokens =         loader.load_tokens
                   loader.load_header
  encoding =       loader.load_encoding
  start_line =     loader.load_varsint
  offsets =        loader.load_line_offsets(freeze)

  source.replace_start_line(start_line)
  source.replace_offsets(offsets)

  comments =       loader.load_comments(freeze)
  magic_comments = loader.load_magic_comments(freeze)
  data_loc =       loader.load_optional_location_object(freeze)
  errors =         loader.load_errors(encoding, freeze)
  warnings =       loader.load_warnings(encoding, freeze)
  cpool_base =     loader.load_uint32
  cpool_size =     loader.load_varuint

  constant_pool = ConstantPool.new(input, serialized, cpool_base, cpool_size)

  node =           loader.load_node(constant_pool, encoding, freeze)
                   loader.load_constant_pool(constant_pool)
  raise unless     loader.eof?

  value = [node, tokens]
  result = ParseLexResult.new(value, comments, magic_comments, data_loc, errors, warnings, source)

  tokens.each do |token|
    token[0].value.force_encoding(encoding)

    if freeze
      token[0].deep_freeze
      token.freeze
    end
  end

  if freeze
    source.deep_freeze
    tokens.freeze
    value.freeze
    result.freeze
  end

  result
end