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