serialize.mx raw

   1  // Copyright 2011 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package token
   6  
   7  import "slices"
   8  
   9  type serializedFile struct {
  10  	// fields correspond 1:1 to fields with same (lower-case) name in File
  11  	Name  []byte
  12  	Base  int
  13  	Size  int
  14  	Lines []int
  15  	Infos []lineInfo
  16  }
  17  
  18  type serializedFileSet struct {
  19  	Base  int
  20  	Files []serializedFile
  21  }
  22  
  23  // Read calls decode to deserialize a file set into s; s must not be nil.
  24  func (s *FileSet) Read(decode func(any) error) error {
  25  	var ss serializedFileSet
  26  	if err := decode(&ss); err != nil {
  27  		return err
  28  	}
  29  
  30  	s.mutex.Lock()
  31  	s.base = ss.Base
  32  	for _, f := range ss.Files {
  33  		s.tree.add(&File{
  34  			name:  f.Name,
  35  			base:  f.Base,
  36  			size:  f.Size,
  37  			lines: f.Lines,
  38  			infos: f.Infos,
  39  		})
  40  	}
  41  	s.last.Store(nil)
  42  	s.mutex.Unlock()
  43  
  44  	return nil
  45  }
  46  
  47  // Write calls encode to serialize the file set s.
  48  func (s *FileSet) Write(encode func(any) error) error {
  49  	var ss serializedFileSet
  50  
  51  	s.mutex.Lock()
  52  	ss.Base = s.base
  53  	var files []serializedFile
  54  	for f := range s.tree.all() {
  55  		f.mutex.Lock()
  56  		files = append(files, serializedFile{
  57  			Name:  f.name,
  58  			Base:  f.base,
  59  			Size:  f.size,
  60  			Lines: slices.Clone(f.lines),
  61  			Infos: slices.Clone(f.infos),
  62  		})
  63  		f.mutex.Unlock()
  64  	}
  65  	ss.Files = files
  66  	s.mutex.Unlock()
  67  
  68  	return encode(ss)
  69  }
  70