// 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.

// This file is a reduced copy of $GOROOT/src/go/internal/gcimporter/gcimporter.go.

// Package gcimporter provides various functions for reading // gc-generated object files that can be used to implement the // Importer interface defined by the Go 1.5 standard library package. // // The encoding is deterministic: if the encoder is applied twice to // the same types.Package data structure, both encodings are equal. // This property may be important to avoid spurious changes in // applications such as build systems. // // However, the encoder is not necessarily idempotent. Importing an // exported package may yield a types.Package that, while it // represents the same set of Go types as the original, may differ in // the details of its internal representation. Because of these // differences, re-encoding the imported package may yield a // different, but equally valid, encoding of the package.
package gcimporter // import "golang.org/x/tools/internal/gcimporter" import ( ) const ( // Enable debug during development: it adds some additional checks, and // prevents errors from being recovered. debug = false // If trace is set, debugging output is printed to std out. trace = false ) // Import imports a gc-generated package given its import path and srcDir, adds // the corresponding package object to the packages map, and returns the object. // The packages map must contain all packages already imported. // // Import is only used in tests. func ( *token.FileSet, map[string]*types.Package, , string, func( string) (io.ReadCloser, error)) ( *types.Package, error) { var io.ReadCloser var string if != nil { // With custom lookup specified, assume that caller has // converted path to a canonical import path for use in the map. if == "unsafe" { return types.Unsafe, nil } = // No need to re-import if the package was imported completely before. if = []; != nil && .Complete() { return } , := () if != nil { return nil, } = } else { var string , , = FindPkg(, ) if == "" { if == "unsafe" { return types.Unsafe, nil } return nil, } // no need to re-import if the package was imported completely before if = []; != nil && .Complete() { return } // open file , := os.Open() if != nil { return nil, } defer func() { if != nil { // add file name to error = fmt.Errorf("%s: %v", , ) } }() = } defer .Close() := bufio.NewReader() , := ReadUnified() if != nil { = fmt.Errorf("import %q: %v", , ) return } // unified: emitted by cmd/compile since go1.20. _, , = UImportData(, , , ) return }