import (
"bytes"
"fmt"
+ "go/token"
"internal/testenv"
"io/fs"
- "io/ioutil"
"os"
"path/filepath"
"runtime"
unicode/utf8, unicode/utf16, unicode,
unsafe;
+ # These packages depend only on unsafe.
+ unsafe
+ < internal/abi;
+
# RUNTIME is the core runtime group of packages, all of them very light-weight.
- internal/cpu, unsafe
+ internal/abi, internal/cpu, unsafe
< internal/bytealg
< internal/unsafeheader
< runtime/internal/sys
< os
< os/signal;
+ io/fs
+ < embed;
+
unicode, fmt !< os, os/signal;
os/signal, STR
reflect !< OS;
OS
- < golang.org/x/sys/cpu, internal/goroot;
+ < golang.org/x/sys/cpu;
# FMT is OS (which includes string routines) plus reflect and fmt.
# It does not include package log, which should be avoided in core packages.
log !< FMT;
+ OS, FMT
+ < internal/execabs;
+
+ OS, internal/execabs
+ < internal/goroot;
+
# Misc packages needing only FMT.
FMT
< flag,
math/big, go/token
< go/constant;
- container/heap, go/constant, go/parser
+ container/heap, go/constant, go/parser, regexp
< go/types;
+ FMT
+ < go/build/constraint;
+
go/doc, go/parser, internal/goroot, internal/goversion
< go/build;
var pkgs []string
src := filepath.Join(goroot, "src") + string(filepath.Separator)
- walkFn := func(path string, fi fs.FileInfo, err error) error {
- if err != nil || !fi.IsDir() || path == src {
+ walkFn := func(path string, d fs.DirEntry, err error) error {
+ if err != nil || !d.IsDir() || path == src {
return nil
}
pkgs = append(pkgs, strings.TrimPrefix(name, "vendor/"))
return nil
}
- if err := filepath.Walk(src, walkFn); err != nil {
+ if err := filepath.WalkDir(src, walkFn); err != nil {
return nil, err
}
return pkgs, nil
vpkg = "vendor/" + pkg
}
dir := filepath.Join(Default.GOROOT, "src", vpkg)
- files, err := ioutil.ReadDir(dir)
+ files, err := os.ReadDir(dir)
if err != nil {
return nil, err
}
var imports []string
var haveImport = map[string]bool{}
+ fset := token.NewFileSet()
for _, file := range files {
name := file.Name()
if name == "slice_go14.go" || name == "slice_go18.go" {
if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
continue
}
- var info fileInfo
- info.name = filepath.Join(dir, name)
+ info := fileInfo{
+ name: filepath.Join(dir, name),
+ fset: fset,
+ }
f, err := os.Open(info.name)
if err != nil {
return nil, err
}
}
}
+
+// TestFindImports tests that findImports works. See #43249.
+func TestFindImports(t *testing.T) {
+ imports, err := findImports("go/build")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Logf("go/build imports %q", imports)
+ want := []string{"bytes", "os", "path/filepath", "strings"}
+wantLoop:
+ for _, w := range want {
+ for _, imp := range imports {
+ if imp == w {
+ continue wantLoop
+ }
+ }
+ t.Errorf("expected to find %q in import list", w)
+ }
+}