// Copyright 2019 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. 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) } func (b *builtinPkg) CompiledGoFiles() []source.ParseGoHandle { return b.files } // 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 (v *view) buildBuiltinPackage(ctx context.Context) error { cfg := v.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 := v.session.GetFile(span.FileURI(filename), source.Go) ph := v.session.cache.ParseGoHandle(fh, source.ParseFull) v.builtin.files = append(v.builtin.files, ph) file, _, _, err := ph.Parse(ctx) if err != nil { return err } files[filename] = file v.ignoredURIsMu.Lock() v.ignoredURIs[span.NewURI(filename)] = struct{}{} v.ignoredURIsMu.Unlock() } v.builtin.pkg, err = ast.NewPackage(cfg.Fset, files, nil, nil) return err }