package cache import ( "context" "go/ast" "golang.org/x/tools/go/packages" "golang.org/x/tools/internal/lsp/source" "golang.org/x/tools/internal/span" ) type builtinPkg struct { pkg *ast.Package files []source.ParseGoHandle } func (b *builtinPkg) Lookup(name string) *ast.Object { if b == nil || b.pkg == nil || b.pkg.Scope == nil { return nil } return b.pkg.Scope.Lookup(name) } // buildBuiltinPkg builds the view's builtin package. // It assumes that the view is not active yet, // i.e. it has not been added to the session's list of views. func (view *view) buildBuiltinPackage(ctx context.Context) error { cfg := view.Config(ctx) pkgs, err := packages.Load(cfg, "builtin") if err != nil { return err } if len(pkgs) != 1 { return err } pkg := pkgs[0] files := make(map[string]*ast.File) for _, filename := range pkg.GoFiles { fh := view.session.GetFile(span.FileURI(filename)) ph := view.session.cache.ParseGoHandle(fh, source.ParseFull) view.builtin.files = append(view.builtin.files, ph) file, _, err := ph.Parse(ctx) if file == nil { return err } files[filename] = file view.ignoredURIsMu.Lock() view.ignoredURIs[span.NewURI(filename)] = struct{}{} view.ignoredURIsMu.Unlock() } view.builtin.pkg, err = ast.NewPackage(cfg.Fset, files, nil, nil) return err }