module Prism::Serialize
负责反序列化解析结果的模块。
Constants
- MAJOR_VERSION
-
我们期望在序列化字符串中找到的 prism 的主版本号。
- MINOR_VERSION
-
我们期望在序列化字符串中找到的 prism 的次版本号。
- PATCH_VERSION
-
我们期望在序列化字符串中找到的 prism 的补丁版本号。
- TOKEN_TYPES
-
可以通过枚举值索引的 token 类型。
Public Class Methods
Source
# 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 请求的转储输出。
此方法的源代码格式是为了说明序列化数据的结构而故意设计的。
Source
# 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 请求的转储输出。
此方法的源代码格式是为了说明序列化数据的结构而故意设计的。
Source
# 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 请求的转储输出。
此方法的源代码格式是为了说明序列化数据的结构而故意设计的。
Source
# 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 请求的转储输出。
此方法的源代码格式是为了说明序列化数据的结构而故意设计的。