Skip to content

Commit 6055ccf

Browse files
committed
go/internal/gcimporter: simplify IExportData API
In gcexportdata.Write, we ultimately write output to an io.Writer, so we might as well do the same in IExportData. Also, omit the "i" prefix here (to match IImportData's expectations), and add it back in gcexportdata.Write instead. Change-Id: I42dc577477587cd4ad6e943822dcea90e01bc236 Reviewed-on: https://go-review.googlesource.com/c/tools/+/292349 gopls-CI: kokoro <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Rebecca Stambler <[email protected]> Trust: Matthew Dempsky <[email protected]> Run-TryBot: Matthew Dempsky <[email protected]>
1 parent 1e7abac commit 6055ccf

File tree

3 files changed

+20
-30
lines changed

3 files changed

+20
-30
lines changed

go/gcexportdata/gcexportdata.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,8 @@ func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package,
100100
// Write writes encoded type information for the specified package to out.
101101
// The FileSet provides file position information for named objects.
102102
func Write(out io.Writer, fset *token.FileSet, pkg *types.Package) error {
103-
b, err := gcimporter.IExportData(fset, pkg)
104-
if err != nil {
103+
if _, err := io.WriteString(out, "i"); err != nil {
105104
return err
106105
}
107-
_, err = out.Write(b)
108-
return err
106+
return gcimporter.IExportData(out, fset, pkg)
109107
}

go/internal/gcimporter/iexport.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ import (
2525
// 0: Go1.11 encoding
2626
const iexportVersion = 0
2727

28-
// IExportData returns the binary export data for pkg.
28+
// IExportData writes indexed export data for pkg to out.
2929
//
3030
// If no file set is provided, position info will be missing.
3131
// The package path of the top-level package will not be recorded,
3232
// so that calls to IImportData can override with a provided package path.
33-
func IExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error) {
33+
func IExportData(out io.Writer, fset *token.FileSet, pkg *types.Package) (err error) {
3434
defer func() {
3535
if e := recover(); e != nil {
3636
if ierr, ok := e.(internalError); ok {
@@ -43,7 +43,6 @@ func IExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error)
4343
}()
4444

4545
p := iexporter{
46-
out: bytes.NewBuffer(nil),
4746
fset: fset,
4847
allPkgs: map[*types.Package]bool{},
4948
stringIndex: map[string]uint64{},
@@ -80,17 +79,16 @@ func IExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error)
8079

8180
// Assemble header.
8281
var hdr intWriter
83-
hdr.WriteByte('i')
8482
hdr.uint64(iexportVersion)
8583
hdr.uint64(uint64(p.strings.Len()))
8684
hdr.uint64(dataLen)
8785

8886
// Flush output.
89-
io.Copy(p.out, &hdr)
90-
io.Copy(p.out, &p.strings)
91-
io.Copy(p.out, &p.data0)
87+
io.Copy(out, &hdr)
88+
io.Copy(out, &p.strings)
89+
io.Copy(out, &p.data0)
9290

93-
return p.out.Bytes(), nil
91+
return nil
9492
}
9593

9694
// writeIndex writes out an object index. mainIndex indicates whether

go/internal/gcimporter/iexport_test.go

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
package gcimporter_test
1010

1111
import (
12+
"bytes"
1213
"fmt"
1314
"go/ast"
1415
"go/build"
@@ -28,6 +29,14 @@ import (
2829
"golang.org/x/tools/go/loader"
2930
)
3031

32+
func iexport(fset *token.FileSet, pkg *types.Package) ([]byte, error) {
33+
var buf bytes.Buffer
34+
if err := gcimporter.IExportData(&buf, fset, pkg); err != nil {
35+
return nil, err
36+
}
37+
return buf.Bytes(), nil
38+
}
39+
3140
func TestIExportData_stdlib(t *testing.T) {
3241
if runtime.Compiler == "gccgo" {
3342
t.Skip("gccgo standard library is inaccessible")
@@ -84,15 +93,10 @@ type UnknownType undefined
8493
if info.Files == nil {
8594
continue // empty directory
8695
}
87-
exportdata, err := gcimporter.IExportData(conf.Fset, pkg)
96+
exportdata, err := iexport(conf.Fset, pkg)
8897
if err != nil {
8998
t.Fatal(err)
9099
}
91-
if exportdata[0] == 'i' {
92-
exportdata = exportdata[1:] // trim the 'i' in the header
93-
} else {
94-
t.Fatalf("unexpected first character of export data: %v", exportdata[0])
95-
}
96100

97101
imports := make(map[string]*types.Package)
98102
fset2 := token.NewFileSet()
@@ -151,15 +155,10 @@ func TestIExportData_long(t *testing.T) {
151155
}
152156

153157
// export
154-
exportdata, err := gcimporter.IExportData(fset1, pkg)
158+
exportdata, err := iexport(fset1, pkg)
155159
if err != nil {
156160
t.Fatal(err)
157161
}
158-
if exportdata[0] == 'i' {
159-
exportdata = exportdata[1:] // trim the 'i' in the header
160-
} else {
161-
t.Fatalf("unexpected first character of export data: %v", exportdata[0])
162-
}
163162

164163
// import
165164
imports := make(map[string]*types.Package)
@@ -199,15 +198,10 @@ func TestIExportData_typealiases(t *testing.T) {
199198

200199
// export
201200
// use a nil fileset here to confirm that it doesn't panic
202-
exportdata, err := gcimporter.IExportData(nil, pkg1)
201+
exportdata, err := iexport(nil, pkg1)
203202
if err != nil {
204203
t.Fatal(err)
205204
}
206-
if exportdata[0] == 'i' {
207-
exportdata = exportdata[1:] // trim the 'i' in the header
208-
} else {
209-
t.Fatalf("unexpected first character of export data: %v", exportdata[0])
210-
}
211205

212206
// import
213207
imports := make(map[string]*types.Package)

0 commit comments

Comments
 (0)