mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
[dev.typeparams] cmd/compile/internal/noder: refactor irgen import handling
Rather than re-parsing and re-resolving the import path string, use the PkgName object provided by types2 to determine what package path it refers to. Also, decompose importfile into smaller functions, so that we can directly pass the already-resolved package path to the importer. Finally, switch to simply using height as calculated by types2 rather than redoing the calculations. Change-Id: I3338f4e68387b2835b2e58d6df65d740d6a648cb Reviewed-on: https://go-review.googlesource.com/c/go/+/323309 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Dan Scales <danscales@google.com> Trust: Dan Scales <danscales@google.com> Trust: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
417955d151
commit
22f5ece3b1
|
@ -46,7 +46,12 @@ func (g *irgen) importDecl(p *noder, decl *syntax.ImportDecl) {
|
||||||
|
|
||||||
g.pragmaFlags(decl.Pragma, 0)
|
g.pragmaFlags(decl.Pragma, 0)
|
||||||
|
|
||||||
ipkg := importfile(decl)
|
// Get the imported package's path, as resolved already by types2
|
||||||
|
// and gcimporter. This is the same path as would be computed by
|
||||||
|
// parseImportPath.
|
||||||
|
path := pkgNameOf(g.info, decl).Imported().Path()
|
||||||
|
|
||||||
|
ipkg := readImportFile(g.target, path)
|
||||||
if ipkg == ir.Pkgs.Unsafe {
|
if ipkg == ir.Pkgs.Unsafe {
|
||||||
p.importedUnsafe = true
|
p.importedUnsafe = true
|
||||||
}
|
}
|
||||||
|
@ -55,6 +60,14 @@ func (g *irgen) importDecl(p *noder, decl *syntax.ImportDecl) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pkgNameOf returns the PkgName associated with the given ImportDecl.
|
||||||
|
func pkgNameOf(info *types2.Info, decl *syntax.ImportDecl) *types2.PkgName {
|
||||||
|
if name := decl.LocalPkgName; name != nil {
|
||||||
|
return info.Defs[name].(*types2.PkgName)
|
||||||
|
}
|
||||||
|
return info.Implicits[decl].(*types2.PkgName)
|
||||||
|
}
|
||||||
|
|
||||||
func (g *irgen) constDecl(out *ir.Nodes, decl *syntax.ConstDecl) {
|
func (g *irgen) constDecl(out *ir.Nodes, decl *syntax.ConstDecl) {
|
||||||
g.pragmaFlags(decl.Pragma, 0)
|
g.pragmaFlags(decl.Pragma, 0)
|
||||||
|
|
||||||
|
|
|
@ -175,36 +175,44 @@ func resolveImportPath(path string) (string, error) {
|
||||||
return path, nil
|
return path, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(mdempsky): Return an error instead.
|
|
||||||
func importfile(decl *syntax.ImportDecl) *types.Pkg {
|
func importfile(decl *syntax.ImportDecl) *types.Pkg {
|
||||||
if decl.Path.Kind != syntax.StringLit {
|
path, err := parseImportPath(decl.Path)
|
||||||
base.Errorf("import path must be a string")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
path, err := strconv.Unquote(decl.Path.Value)
|
|
||||||
if err != nil {
|
|
||||||
base.Errorf("import path must be a string")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := checkImportPath(path, false); err != nil {
|
|
||||||
base.Errorf("%s", err.Error())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
path, err = resolveImportPath(path)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
base.Errorf("%s", err)
|
base.Errorf("%s", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pkg := readImportFile(typecheck.Target, path)
|
||||||
|
if pkg != ir.Pkgs.Unsafe && pkg.Height >= myheight {
|
||||||
|
myheight = pkg.Height + 1
|
||||||
|
}
|
||||||
|
return pkg
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseImportPath(pathLit *syntax.BasicLit) (string, error) {
|
||||||
|
if pathLit.Kind != syntax.StringLit {
|
||||||
|
return "", errors.New("import path must be a string")
|
||||||
|
}
|
||||||
|
|
||||||
|
path, err := strconv.Unquote(pathLit.Value)
|
||||||
|
if err != nil {
|
||||||
|
return "", errors.New("import path must be a string")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := checkImportPath(path, false); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolveImportPath(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func readImportFile(target *ir.Package, path string) *types.Pkg {
|
||||||
importpkg := types.NewPkg(path, "")
|
importpkg := types.NewPkg(path, "")
|
||||||
if importpkg.Direct {
|
if importpkg.Direct {
|
||||||
return importpkg // already fully loaded
|
return importpkg // already fully loaded
|
||||||
}
|
}
|
||||||
importpkg.Direct = true
|
importpkg.Direct = true
|
||||||
typecheck.Target.Imports = append(typecheck.Target.Imports, importpkg)
|
target.Imports = append(target.Imports, importpkg)
|
||||||
|
|
||||||
if path == "unsafe" {
|
if path == "unsafe" {
|
||||||
return importpkg // initialized with universe
|
return importpkg // initialized with universe
|
||||||
|
@ -324,10 +332,6 @@ func importfile(decl *syntax.ImportDecl) *types.Pkg {
|
||||||
base.Ctxt.AddImport(file[len(file)-len(path)-len(".a"):], fingerprint)
|
base.Ctxt.AddImport(file[len(file)-len(path)-len(".a"):], fingerprint)
|
||||||
}
|
}
|
||||||
|
|
||||||
if importpkg.Height >= myheight {
|
|
||||||
myheight = importpkg.Height + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
return importpkg
|
return importpkg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,7 @@ type irgen struct {
|
||||||
|
|
||||||
func (g *irgen) generate(noders []*noder) {
|
func (g *irgen) generate(noders []*noder) {
|
||||||
types.LocalPkg.Name = g.self.Name()
|
types.LocalPkg.Name = g.self.Name()
|
||||||
|
types.LocalPkg.Height = g.self.Height()
|
||||||
typecheck.TypecheckAllowed = true
|
typecheck.TypecheckAllowed = true
|
||||||
|
|
||||||
// Prevent size calculations until we set the underlying type
|
// Prevent size calculations until we set the underlying type
|
||||||
|
@ -132,8 +133,6 @@ Outer:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(myheight == g.self.Height())
|
|
||||||
types.LocalPkg.Height = myheight
|
|
||||||
|
|
||||||
// 2. Process all package-block type declarations. As with imports,
|
// 2. Process all package-block type declarations. As with imports,
|
||||||
// we need to make sure all types are properly instantiated before
|
// we need to make sure all types are properly instantiated before
|
||||||
|
|
Loading…
Reference in a new issue