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.
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.
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.
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.
ErrFromNode returns the given error, with additional information attaching it to the given AST node. It will automatically map over error lists.
MaybeErrList constructs an ErrList if the given list of errors has any errors, otherwise returning nil.
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.
ParseAstTag parses the given raw tag literal into a reflect.StructTag.
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.
ErrList is a list of errors aggregated together into a single error.
NodeFilter filters nodes, accepting them for reference collection when true is returned and rejecting them when false is returned.
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.
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.
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.
AddError adds an error to the errors associated with the given package.
Imports returns the imports for the given package, indexed by package path (*not* name in any particular file).
NeedSyntax indicates that a parsed AST is needed for this package. Actual ASTs can be accessed via the Syntax field.
NeedTypesInfo indicates that type-checking information is needed for this package. Actual type-checking information can be accessed via the Types and TypesInfo fields.
PositionedError represents some error with an associated position. The position is tied to some external token.FileSet.
TypeCallback is a callback called for each raw AST (gendecl, typespec) combo.
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.
Check type-checks the given package and all packages referenced by types that pass through (have true returned by) filterNodes.
|testutils||Package testutils defines utilities for using loader.Packages in tests.|