lib/prism/serialize.rb in prism-0.16.0 vs lib/prism/serialize.rb in prism-0.17.0

- old
+ new

@@ -9,40 +9,53 @@ # Polyfill for String#unpack1 with the offset parameter. if String.instance_method(:unpack1).parameters.none? { |_, name| name == :offset } String.prepend( Module.new { - def unpack1(format, offset: 0) + def unpack1(format, offset: 0) # :nodoc: offset == 0 ? super(format) : self[offset..].unpack1(format) end } ) end module Prism + # A module responsible for deserializing parse results. module Serialize + # The major version of prism that we are expecting to find in the serialized + # strings. MAJOR_VERSION = 0 - MINOR_VERSION = 16 + + # The minor version of prism that we are expecting to find in the serialized + # strings. + MINOR_VERSION = 17 + + # The patch version of prism that we are expecting to find in the serialized + # strings. PATCH_VERSION = 0 + # Deserialize the AST represented by the given string into a parse result. def self.load(input, serialized) input = input.dup source = Source.new(input) loader = Loader.new(source, serialized) result = loader.load_result input.force_encoding(loader.encoding) result end + # Deserialize the tokens represented by the given string into a parse + # result. def self.load_tokens(source, serialized) Loader.new(source, serialized).load_tokens_result end - class Loader + class Loader # :nodoc: attr_reader :encoding, :input, :serialized, :io attr_reader :constant_pool_offset, :constant_pool, :source + attr_reader :start_line def initialize(source, serialized) @encoding = Encoding::UTF_8 @input = source.source.dup @@ -52,11 +65,11 @@ @constant_pool_offset = nil @constant_pool = nil @source = source - define_load_node_lambdas unless RUBY_ENGINE == 'ruby' + define_load_node_lambdas unless RUBY_ENGINE == "ruby" end def load_header raise "Invalid serialization" if io.read(5) != "PRISM" raise "Invalid serialization" if io.read(3).unpack("C3") != [MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION] @@ -73,12 +86,22 @@ def load_force_encoding @encoding = load_encoding @input = input.force_encoding(@encoding).freeze end + def load_start_line + source.start_line = load_varint + end + def load_comments - load_varint.times.map { Comment.new(Comment::TYPES.fetch(load_varint), load_location) } + load_varint.times.map do + case load_varint + when 0 then InlineComment.new(load_location) + when 1 then EmbDocComment.new(load_location) + when 2 then DATAComment.new(load_location) + end + end end def load_metadata comments = load_comments magic_comments = load_varint.times.map { MagicComment.new(load_location, load_location) } @@ -101,10 +124,11 @@ end def load_tokens_result tokens = load_tokens encoding = load_encoding + load_start_line comments, magic_comments, errors, warnings = load_metadata if encoding != @encoding tokens.each { |token,| token.value.force_encoding(encoding) } end @@ -114,10 +138,11 @@ end def load_nodes load_header load_force_encoding + load_start_line comments, magic_comments, errors, warnings = load_metadata @constant_pool_offset = io.read(4).unpack1("L") @constant_pool = Array.new(load_varint, nil) @@ -387,51 +412,51 @@ when 83 then InterpolatedXStringNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location) when 84 then KeywordHashNode.new(Array.new(load_varint) { load_node }, location) when 85 then - KeywordParameterNode.new(load_required_constant, load_location, load_optional_node, location) - when 86 then KeywordRestParameterNode.new(load_optional_constant, load_optional_location, load_location, location) - when 87 then + when 86 then LambdaNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_location, load_optional_node, load_optional_node, location) - when 88 then + when 87 then LocalVariableAndWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varint, location) - when 89 then + when 88 then LocalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_required_constant, load_required_constant, load_varint, location) - when 90 then + when 89 then LocalVariableOrWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varint, location) - when 91 then + when 90 then LocalVariableReadNode.new(load_required_constant, load_varint, location) - when 92 then + when 91 then LocalVariableTargetNode.new(load_required_constant, load_varint, location) - when 93 then + when 92 then LocalVariableWriteNode.new(load_required_constant, load_varint, load_location, load_node, load_location, location) - when 94 then + when 93 then MatchLastLineNode.new(load_location, load_location, load_location, load_string, load_varint, location) - when 95 then + when 94 then MatchPredicateNode.new(load_node, load_node, load_location, location) - when 96 then + when 95 then MatchRequiredNode.new(load_node, load_node, load_location, location) - when 97 then + when 96 then MatchWriteNode.new(load_node, Array.new(load_varint) { load_required_constant }, location) - when 98 then + when 97 then MissingNode.new(location) - when 99 then + when 98 then ModuleNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_node, load_optional_node, load_location, load_required_constant, location) - when 100 then + when 99 then MultiTargetNode.new(Array.new(load_varint) { load_node }, load_optional_node, Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, location) - when 101 then + when 100 then MultiWriteNode.new(Array.new(load_varint) { load_node }, load_optional_node, Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, load_location, load_node, location) - when 102 then + when 101 then NextNode.new(load_optional_node, load_location, location) - when 103 then + when 102 then NilNode.new(location) - when 104 then + when 103 then NoKeywordsParameterNode.new(load_location, load_location, location) - when 105 then + when 104 then NumberedReferenceReadNode.new(load_varint, location) + when 105 then + OptionalKeywordParameterNode.new(load_required_constant, load_location, load_node, location) when 106 then OptionalParameterNode.new(load_required_constant, load_location, load_location, load_node, location) when 107 then OrNode.new(load_node, load_node, load_location, location) when 108 then @@ -455,58 +480,60 @@ when 117 then RedoNode.new(location) when 118 then RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location) when 119 then - RequiredParameterNode.new(load_required_constant, location) + RequiredKeywordParameterNode.new(load_required_constant, load_location, location) when 120 then - RescueModifierNode.new(load_node, load_location, load_node, location) + RequiredParameterNode.new(load_required_constant, location) when 121 then - RescueNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, location) + RescueModifierNode.new(load_node, load_location, load_node, location) when 122 then - RestParameterNode.new(load_optional_constant, load_optional_location, load_location, location) + RescueNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, location) when 123 then - RetryNode.new(location) + RestParameterNode.new(load_optional_constant, load_optional_location, load_location, location) when 124 then - ReturnNode.new(load_location, load_optional_node, location) + RetryNode.new(location) when 125 then - SelfNode.new(location) + ReturnNode.new(load_location, load_optional_node, location) when 126 then - SingletonClassNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_node, load_optional_node, load_location, location) + SelfNode.new(location) when 127 then - SourceEncodingNode.new(location) + SingletonClassNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_node, load_optional_node, load_location, location) when 128 then - SourceFileNode.new(load_string, location) + SourceEncodingNode.new(location) when 129 then - SourceLineNode.new(location) + SourceFileNode.new(load_string, location) when 130 then - SplatNode.new(load_location, load_optional_node, location) + SourceLineNode.new(location) when 131 then - StatementsNode.new(Array.new(load_varint) { load_node }, location) + SplatNode.new(load_location, load_optional_node, location) when 132 then - StringConcatNode.new(load_node, load_node, location) + StatementsNode.new(Array.new(load_varint) { load_node }, location) when 133 then - StringNode.new(load_varint, load_optional_location, load_location, load_optional_location, load_string, location) + StringConcatNode.new(load_node, load_node, location) when 134 then - SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location) + StringNode.new(load_varint, load_optional_location, load_location, load_optional_location, load_string, location) when 135 then - SymbolNode.new(load_optional_location, load_optional_location, load_optional_location, load_string, location) + SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location) when 136 then - TrueNode.new(location) + SymbolNode.new(load_optional_location, load_optional_location, load_optional_location, load_string, location) when 137 then - UndefNode.new(Array.new(load_varint) { load_node }, load_location, location) + TrueNode.new(location) when 138 then - UnlessNode.new(load_location, load_node, load_optional_node, load_optional_node, load_optional_location, location) + UndefNode.new(Array.new(load_varint) { load_node }, load_location, location) when 139 then - UntilNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location) + UnlessNode.new(load_location, load_node, load_optional_node, load_optional_node, load_optional_location, location) when 140 then - WhenNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_node, location) + UntilNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location) when 141 then - WhileNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location) + WhenNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_node, location) when 142 then - XStringNode.new(load_location, load_location, load_location, load_string, location) + WhileNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location) when 143 then + XStringNode.new(load_location, load_location, load_location, load_string, location) + when 144 then YieldNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, location) end end else def load_node @@ -854,14 +881,10 @@ location = load_location KeywordHashNode.new(Array.new(load_varint) { load_node }, location) }, -> { location = load_location - KeywordParameterNode.new(load_required_constant, load_location, load_optional_node, location) - }, - -> { - location = load_location KeywordRestParameterNode.new(load_optional_constant, load_optional_location, load_location, location) }, -> { location = load_location LambdaNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_location, load_optional_node, load_optional_node, location) @@ -938,10 +961,14 @@ location = load_location NumberedReferenceReadNode.new(load_varint, location) }, -> { location = load_location + OptionalKeywordParameterNode.new(load_required_constant, load_location, load_node, location) + }, + -> { + location = load_location OptionalParameterNode.new(load_required_constant, load_location, load_location, load_node, location) }, -> { location = load_location OrNode.new(load_node, load_node, load_location, location) @@ -990,10 +1017,14 @@ location = load_location RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location) }, -> { location = load_location + RequiredKeywordParameterNode.new(load_required_constant, load_location, location) + }, + -> { + location = load_location RequiredParameterNode.new(load_required_constant, location) }, -> { location = load_location RescueModifierNode.new(load_node, load_location, load_node, location) @@ -1093,9 +1124,10 @@ ] end end end + # The token types that can be indexed by their enum values. TOKEN_TYPES = [ nil, :EOF, :MISSING, :NOT_PROVIDED,