internal/godoc: store the set of module packages

In order to render links to packages in the same module,
we need the list of those packages. To keep things simple,
we store the complete set in each Package of the module.

This is wasteful for modules with many packages. Some alternatives:
- Store the list in a new DB column in modules.
- Always read a unit's subdirectories when reading the unit.

Change-Id: Ic2d51444c786b69fcba1717849db86d27d6c7a80
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/258421
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/fetch/load.go b/internal/fetch/load.go
index eb9ce91..287c7fe 100644
--- a/internal/fetch/load.go
+++ b/internal/fetch/load.go
@@ -112,7 +112,7 @@
 	if err != nil {
 		return nil, err
 	}
-	docPkg := godoc.NewPackage(fset)
+	docPkg := godoc.NewPackage(fset, modInfo.ModulePackages)
 	var allGoFiles []*ast.File
 	for _, pf := range goFiles {
 		if experiment.IsActive(ctx, internal.ExperimentRemoveUnusedAST) {
diff --git a/internal/godoc/encode.go b/internal/godoc/encode.go
index a055e4d..2bd4315 100644
--- a/internal/godoc/encode.go
+++ b/internal/godoc/encode.go
@@ -96,7 +96,7 @@
 		return nil, fmt.Errorf("want initial bytes to be %q but they aren't", encodingType)
 	}
 	dec := gob.NewDecoder(bytes.NewReader(data[le:]))
-	p := NewPackage(token.NewFileSet())
+	p := &Package{Fset: token.NewFileSet()}
 	if err := p.Fset.Read(dec.Decode); err != nil {
 		return nil, err
 	}
diff --git a/internal/godoc/encode_test.go b/internal/godoc/encode_test.go
index 1433cd9..5e10c60 100644
--- a/internal/godoc/encode_test.go
+++ b/internal/godoc/encode_test.go
@@ -63,7 +63,7 @@
 	}
 	compareObjs(f)
 
-	p := NewPackage(fset)
+	p := NewPackage(fset, nil)
 	p.AddFile(f, false)
 	data, err := p.Encode()
 	if err != nil {
@@ -82,7 +82,7 @@
 	if err != nil {
 		return nil, err
 	}
-	p := NewPackage(fset)
+	p := NewPackage(fset, nil)
 	for _, pkg := range pkgs {
 		for _, f := range pkg.Files {
 			p.AddFile(f, removeNodes)
diff --git a/internal/godoc/godoc.go b/internal/godoc/godoc.go
index 173cfa7..6b62d76 100644
--- a/internal/godoc/godoc.go
+++ b/internal/godoc/godoc.go
@@ -17,7 +17,8 @@
 }
 
 type gobPackage struct { // fields that can be directly gob-encoded
-	Files []*File
+	Files              []*File
+	ModulePackagePaths map[string]bool
 }
 
 // A File contains everything needed about a source file to render documentation.
@@ -26,9 +27,14 @@
 	AST  *ast.File
 }
 
-// NewPackage returns a new Package with the given fset.
-func NewPackage(fset *token.FileSet) *Package {
-	return &Package{Fset: fset}
+// NewPackage returns a new Package with the given fset and set of module package paths.
+func NewPackage(fset *token.FileSet, modPaths map[string]bool) *Package {
+	return &Package{
+		Fset: fset,
+		gobPackage: gobPackage{
+			ModulePackagePaths: modPaths,
+		},
+	}
 }
 
 // AddFile adds a file to the Package. After it returns, the contents of the ast.File