module Prism::Serialize
Модуль, отвечающий за десериализацию результатов разбора.
Константы
- MAJOR_VERSION
-
Основная версия Prism, которую мы ожидаем найти в сериализованных строках.
- MINOR_VERSION
-
Дополнительная версия Prism, которую мы ожидаем найти в сериализованных строках.
- PATCH_VERSION
-
Версия исправления Prism, которую мы ожидаем найти в сериализованных строках.
- TOKEN_TYPES
-
Типы токенов, доступные для индексации по значениям перечисления.
Открытые методы класса
# 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 Десериализует сохранённый результат запроса lex или lex_file.
Форматирование исходного кода этого метода специально подобрано, чтобы показать структуру сериализованных данных.
# 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 Десериализует сохранённый результат запроса parse или parse_file.
Форматирование исходного кода этого метода специально подобрано, чтобы показать структуру сериализованных данных.
# 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 Десериализует сохранённый результат запроса parse_comments или parse_file_comments.
Форматирование исходного кода этого метода специально подобрано, чтобы показать структуру сериализованных данных.
# 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 Десериализует сохранённый результат запроса parse_lex или parse_lex_file.
Форматирование исходного кода этого метода специально подобрано, чтобы показать структуру сериализованных данных.
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.