// 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
}
