// 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"
	"strings"

	"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 the error is related to a go.mod parse error, we want to continue loading.
	if err != nil && strings.Contains(err.Error(), ".mod:") {
		return nil
	}
	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))
		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
}
