internal/godoc: reorganize for easier encoding

Put all fields except the fset (which requires special handling) into
a single struct, so we can hand the whole struct to gob.

Change-Id: If126280a803520d7e0f513ec35f19f0e651d64bb
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/258420
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
diff --git a/internal/godoc/encode.go b/internal/godoc/encode.go
index 4efdd74..a055e4d 100644
--- a/internal/godoc/encode.go
+++ b/internal/godoc/encode.go
@@ -81,7 +81,7 @@
 	if err := p.Fset.Write(enc.Encode); err != nil {
 		return nil, err
 	}
-	if err := enc.Encode(p.Files); err != nil {
+	if err := enc.Encode(p.gobPackage); err != nil {
 		return nil, err
 	}
 	return buf.Bytes(), nil
@@ -96,12 +96,11 @@
 		return nil, fmt.Errorf("want initial bytes to be %q but they aren't", encodingType)
 	}
 	dec := gob.NewDecoder(bytes.NewReader(data[le:]))
-	p := &Package{}
-	p.Fset = token.NewFileSet()
+	p := NewPackage(token.NewFileSet())
 	if err := p.Fset.Read(dec.Decode); err != nil {
 		return nil, err
 	}
-	if err := dec.Decode(&p.Files); err != nil {
+	if err := dec.Decode(&p.gobPackage); err != nil {
 		return nil, err
 	}
 	for _, f := range p.Files {
diff --git a/internal/godoc/godoc.go b/internal/godoc/godoc.go
index 78c7ac6..173cfa7 100644
--- a/internal/godoc/godoc.go
+++ b/internal/godoc/godoc.go
@@ -12,7 +12,11 @@
 
 // A package contains everything needed to render Go documentation for a package.
 type Package struct {
-	Fset  *token.FileSet
+	Fset *token.FileSet
+	gobPackage
+}
+
+type gobPackage struct { // fields that can be directly gob-encoded
 	Files []*File
 }