controller-tools: Index | Files | Directories

package loader

import ""

Package loader defines helpers for loading packages from sources. It wraps go/packages, allow incremental loading of source code and manual control over which packages get type-checked. This allows for faster loading in cases where you don't actually care about certain imports.

Because it uses go/packages, it's modules-aware, and works in both modules- and non-modules environments.


The main entrypoint for loading is LoadRoots, which traverse the package graph starting at the given patterns (file, package, path, or ...-wildcard, as one might pass to go list). Packages beyond the roots can be accessed via the Imports() method. Packages are initially loaded with export data paths, filenames, and imports.

Packages are suitable for comparison, as each unique package only ever has one *Package object returned.

Syntax and TypeChecking

ASTs and type-checking information can be loaded with NeedSyntax and NeedTypesInfo, respectively. Both are idempotent -- repeated calls will simply re-use the cached contents. Note that NeedTypesInfo will *only* type check the current package -- if you want to type-check imports as well, you'll need to type-check them first.

Reference Pruning and Recursive Checking

In order to type-check using only the packages you care about, you can use a TypeChecker. TypeChecker will visit each top-level type declaration, collect (optionally filtered) references, and type-check references packages.


Errors can be added to each package. Use ErrFromNode to create an error from an AST node. Errors can then be printed (complete with file and position information) using PrintErrors, optionally filtered by error type. It's generally a good idea to filter out TypeErrors when doing incomplete type-checking with TypeChecker. You can use MaybeErrList to return multiple errors if you need to return an error instead of adding it to a package. AddError will later unroll it into individual errors.


Package Files

doc.go errors.go loader.go paths.go refs.go visit.go

func EachType Uses

func EachType(pkg *Package, cb TypeCallback)

EachType calls the given callback for each (gendecl, typespec) combo in the given package. Generally, using markers.EachType is better when working with marker data, and has a more convinient representation.

func ErrFromNode Uses

func ErrFromNode(err error, node ast.Node) error

ErrFromNode returns the given error, with additional information attaching it to the given AST node. It will automatically map over error lists.

func MaybeErrList Uses

func MaybeErrList(errs []error) error

MaybeErrList constructs an ErrList if the given list of errors has any errors, otherwise returning nil.

func NonVendorPath Uses

func NonVendorPath(rawPath string) string

NonVendorPath returns a package path that does not include anything before the last vendor directory. This is useful for when using vendor directories, and using go/types.Package.Path(), which returns the full path including vendor.

If you're using this, make sure you really need it -- it's better to index by the actual Package object when you can.

func ParseAstTag Uses

func ParseAstTag(tag *ast.BasicLit) reflect.StructTag

ParseAstTag parses the given raw tag literal into a reflect.StructTag.

func PrintErrors Uses

func PrintErrors(pkgs []*Package, filterKinds ...packages.ErrorKind) bool

PrintErrors print errors associated with all packages in the given package graph, starting at the given root packages and traversing through all imports. It will skip any errors of the kinds specified in filterKinds. It will return true if any errors were printed.

type ErrList Uses

type ErrList []error

ErrList is a list of errors aggregated together into a single error.

func (ErrList) Error Uses

func (l ErrList) Error() string

type NodeFilter Uses

type NodeFilter func(ast.Node) bool

NodeFilter filters nodes, accepting them for reference collection when true is returned and rejecting them when false is returned.

type Package Uses

type Package struct {

    // contains filtered or unexported fields

Package is a single, unique Go package that can be lazily parsed and type-checked. Packages should not be constructed directly -- instead, use LoadRoots. For a given call to LoadRoots, only a single instance of each package exists, and thus they may be used as keys and for comparison.

func LoadRoots Uses

func LoadRoots(roots ...string) ([]*Package, error)

LoadRoots loads the given "root" packages by path, transitively loading and all imports as well.

Loaded packages will have type size, imports, and exports file information populated. Additional information, like ASTs and type-checking information, can be accessed via methods on individual packages.

func LoadRootsWithConfig Uses

func LoadRootsWithConfig(cfg *packages.Config, roots ...string) ([]*Package, error)

LoadRootsWithConfig functions like LoadRoots, except that it allows passing a custom loading config. The config will be modified to suit the needs of the loader.

This is generally only useful for use in testing when you need to modify loading settings to load from a fake location.

func (*Package) AddError Uses

func (p *Package) AddError(err error)

AddError adds an error to the errors associated with the given package.

func (*Package) Imports Uses

func (p *Package) Imports() map[string]*Package

Imports returns the imports for the given package, indexed by package path (*not* name in any particular file).

func (*Package) NeedSyntax Uses

func (p *Package) NeedSyntax()

NeedSyntax indicates that a parsed AST is needed for this package. Actual ASTs can be accessed via the Syntax field.

func (*Package) NeedTypesInfo Uses

func (p *Package) NeedTypesInfo()

NeedTypesInfo indicates that type-checking information is needed for this package. Actual type-checking information can be accessed via the Types and TypesInfo fields.

type PositionedError Uses

type PositionedError struct {
    Pos token.Pos
    // contains filtered or unexported fields

PositionedError represents some error with an associated position. The position is tied to some external token.FileSet.

type TypeCallback Uses

type TypeCallback func(file *ast.File, decl *ast.GenDecl, spec *ast.TypeSpec)

TypeCallback is a callback called for each raw AST (gendecl, typespec) combo.

type TypeChecker Uses

type TypeChecker struct {
    // contains filtered or unexported fields

TypeChecker performs type-checking on a limitted subset of packages by checking each package's types' externally-referenced types, and only type-checking those packages.

func (*TypeChecker) Check Uses

func (c *TypeChecker) Check(root *Package, filterNodes NodeFilter)

Check type-checks the given package and all packages referenced by types that pass through (have true returned by) filterNodes.


testutilsPackage testutils defines utilities for using loader.Packages in tests.

Package loader imports 13 packages (graph) and is imported by 17 packages. Updated 2019-12-12. Refresh now. Tools for package owners.