# frozen_string_literal: true# ) frozen_string_literal: truerequire_relative"parser"classGem::RequestSet::Lockfile::TokenizerToken=Struct.new:type,:value,:column,:lineEOF=Token.new:EOFdefself.from_file(file)newFile.read(file),fileenddefinitialize(input,filename=nil,line=0,pos=0)@line=line@line_pos=pos@tokens=[]@filename=filenametokenizeinputenddefmake_parser(set,platforms)Gem::RequestSet::Lockfile::Parser.newself,set,platforms,@filenameenddefto_a@tokens.map{|token|[token.type,token.value,token.column,token.line]}enddefskip(type)@tokens.shiftwhile!@tokens.empty?&&peek.type==typeend### Calculates the column (by byte) and the line of the current token based on# +byte_offset+.deftoken_pos(byte_offset)# :nodoc:[byte_offset-@line_pos,@line]enddefempty?@tokens.empty?enddefunshift(token)@tokens.unshifttokenenddefnext_token@tokens.shiftendalias_method:shift,:next_tokendefpeek@tokens.first||EOFendprivatedeftokenize(input)require"strscan"s=StringScanner.newinputuntils.eos?dopos=s.pospos=s.posifleading_whitespace=s.scan(/ +/)ifs.scan(/[<|=>]{7}/)message="your #{@filename} contains merge conflict markers"column,line=token_posposraiseGem::RequestSet::Lockfile::ParseError.newmessage,column,line,@filenameend@tokens<<ifs.scan(/\r?\n/)token=Token.new(:newline,nil,*token_pos(pos))@line_pos=s.pos@line+=1tokenelsifs.scan(/[A-Z]+/)ifleading_whitespacetext=s.matchedtext+=s.scan(/[^\s)]*/).to_s# in case of no matchToken.new(:text,text,*token_pos(pos))elseToken.new(:section,s.matched,*token_pos(pos))endelsifs.scan(/([a-z]+):\s/)s.pos-=1# rewind for possible newlineToken.new(:entry,s[1],*token_pos(pos))elsifs.scan(/\(/)Token.new(:l_paren,nil,*token_pos(pos))elsifs.scan(/\)/)Token.new(:r_paren,nil,*token_pos(pos))elsifs.scan(/<=|>=|=|~>|<|>|!=/)Token.new(:requirement,s.matched,*token_pos(pos))elsifs.scan(/,/)Token.new(:comma,nil,*token_pos(pos))elsifs.scan(/!/)Token.new(:bang,nil,*token_pos(pos))elsifs.scan(/[^\s),!]*/)Token.new(:text,s.matched,*token_pos(pos))elseraise"BUG: can't create token for: #{s.string[s.pos..-1].inspect}"endend@tokensendend