main
Raw Download raw file
 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
 5package token
 6
 7type serializedFile struct {
 8	// fields correspond 1:1 to fields with same (lower-case) name in File
 9	Name  string
10	Base  int
11	Size  int
12	Lines []int
13	Infos []lineInfo
14}
15
16type serializedFileSet struct {
17	Base  int
18	Files []serializedFile
19}
20
21// Read calls decode to deserialize a file set into s; s must not be nil.
22func (s *FileSet) Read(decode func(interface{}) error) error {
23	var ss serializedFileSet
24	if err := decode(&ss); err != nil {
25		return err
26	}
27
28	s.mutex.Lock()
29	s.base = ss.Base
30	files := make([]*File, len(ss.Files))
31	for i := 0; i < len(ss.Files); i++ {
32		f := &ss.Files[i]
33		files[i] = &File{s, f.Name, f.Base, f.Size, f.Lines, f.Infos}
34	}
35	s.files = files
36	s.last = nil
37	s.mutex.Unlock()
38
39	return nil
40}
41
42// Write calls encode to serialize the file set s.
43func (s *FileSet) Write(encode func(interface{}) error) error {
44	var ss serializedFileSet
45
46	s.mutex.Lock()
47	ss.Base = s.base
48	files := make([]serializedFile, len(s.files))
49	for i, f := range s.files {
50		files[i] = serializedFile{f.name, f.base, f.size, f.lines, f.infos}
51	}
52	ss.Files = files
53	s.mutex.Unlock()
54
55	return encode(ss)
56}