A Decoder decodes the facts from the direct imports of the package provided to NewEncoder. A single decoder may be used to decode multiple fact sets (e.g. each for a different set of fact types) for the same package. Each call to Decode returns an independent fact set.
type Decoder struct {
// contains filtered or unexported fields
}
func NewDecoder(pkg *types.Package) *Decoder
NewDecoder returns a fact decoder for the specified package.
It uses a brute-force recursive approach to enumerate all objects defined by dependencies of pkg, so that it can learn the set of package paths that may be mentioned in the fact encoding. This does not scale well; use NewDecoderFunc where possible.
func NewDecoderFunc(pkg *types.Package, getPackage GetPackageFunc) *Decoder
NewDecoderFunc returns a fact decoder for the specified package.
It calls the getPackage function for the package path string of each dependency (perhaps indirect) that it encounters in the encoding. If the function returns nil, the fact is discarded.
This function is preferred over NewDecoder when the client is capable of efficient look-up of packages by package path.
func (d *Decoder) Decode(read func(pkgPath string) ([]byte, error)) (*Set, error)
Decode decodes all the facts relevant to the analysis of package pkgPath. The read function reads serialized fact data from an external source for one of pkg's direct imports, identified by package path. The empty file is a valid encoding of an empty fact set.
It is the caller's responsibility to call gob.Register on all necessary fact types.
Concurrent calls to Decode are safe, so long as the GetPackageFunc (if any) is also concurrency-safe.
A GetPackageFunc function returns the package denoted by a package path.
type GetPackageFunc = func(pkgPath string) *types.Package
A Set is a set of analysis.Facts.
Decode creates a Set of facts by reading from the imports of a given package, and Encode writes out the set. Between these operation, the Import and Export methods will query and update the set.
All of Set's methods except String are safe to call concurrently.
type Set struct {
// contains filtered or unexported fields
}
func (s *Set) AllObjectFacts(filter map[reflect.Type]bool) []analysis.ObjectFact
func (s *Set) AllPackageFacts(filter map[reflect.Type]bool) []analysis.PackageFact
func (s *Set) Encode() []byte
Encode encodes a set of facts to a memory buffer.
It may fail if one of the Facts could not be gob-encoded, but this is a sign of a bug in an Analyzer.
func (s *Set) ExportObjectFact(obj types.Object, fact analysis.Fact)
ExportObjectFact implements analysis.Pass.ExportObjectFact.
func (s *Set) ExportPackageFact(fact analysis.Fact)
ExportPackageFact implements analysis.Pass.ExportPackageFact.
func (s *Set) ImportObjectFact(obj types.Object, ptr analysis.Fact) bool
ImportObjectFact implements analysis.Pass.ImportObjectFact.
func (s *Set) ImportPackageFact(pkg *types.Package, ptr analysis.Fact) bool
ImportPackageFact implements analysis.Pass.ImportPackageFact.
func (s *Set) String() string
String is provided only for debugging, and must not be called concurrent with any Import/Export method.