]> Cypherpunks.ru repositories - gostls13.git/commitdiff
go/types: use file start position as key for Info.FileVersions
authorRobert Griesemer <gri@golang.org>
Thu, 3 Aug 2023 19:55:16 +0000 (12:55 -0700)
committerGopher Robot <gobot@golang.org>
Mon, 7 Aug 2023 15:58:24 +0000 (15:58 +0000)
Per discussion on CL 515135.

While at it, also use the file start position as key for the
internal map Checker.posVers.

Change-Id: I14e9b1ff9e8ee5e3ba5de181fc9c7ffc39f28261
Reviewed-on: https://go-review.googlesource.com/c/go/+/515656
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/go/types/api.go
src/go/types/check.go
src/go/types/version.go

index 2dd5a3e3c08933dbdb43af183866a6bfe3e718bb..4583b4f7b59356937c2ecd8514ddd06fc3f469ee 100644 (file)
@@ -286,10 +286,10 @@ type Info struct {
        // appear in this list.
        InitOrder []*Initializer
 
-       // _FileVersions maps a file to the file's Go version.
+       // _FileVersions maps a file's start position to the file's Go version.
        // If the file doesn't specify a version and Config.GoVersion is not
        // given, the reported version is the zero version (Major, Minor = 0, 0).
-       _FileVersions map[*token.File]_Version
+       _FileVersions map[token.Pos]_Version
 }
 
 func (info *Info) recordTypes() bool {
index f3ad85dff913d6510a9a773ff32c4e2d056d2478..6aaab064c53bdc818524c2e2d07a6e9e45a62983 100644 (file)
@@ -99,12 +99,12 @@ type Checker struct {
        fset *token.FileSet
        pkg  *Package
        *Info
-       version version                 // accepted language version
-       posVers map[*token.File]version // maps files to versions (may be nil)
-       nextID  uint64                  // unique Id for type parameters (first valid Id is 1)
-       objMap  map[Object]*declInfo    // maps package-level objects and (non-interface) methods to declaration info
-       impMap  map[importKey]*Package  // maps (import path, source directory) to (complete or fake) package
-       valids  instanceLookup          // valid *Named (incl. instantiated) types per the validType check
+       version version                // accepted language version
+       posVers map[token.Pos]version  // maps file start positions to versions (may be nil)
+       nextID  uint64                 // unique Id for type parameters (first valid Id is 1)
+       objMap  map[Object]*declInfo   // maps package-level objects and (non-interface) methods to declaration info
+       impMap  map[importKey]*Package // maps (import path, source directory) to (complete or fake) package
+       valids  instanceLookup         // valid *Named (incl. instantiated) types per the validType check
 
        // pkgPathMap maps package names to the set of distinct import paths we've
        // seen for that name, anywhere in the import graph. It is used for
@@ -288,8 +288,8 @@ func (check *Checker) initFiles(files []*ast.File) {
        }
 
        for _, file := range check.files {
-               tfile := check.fset.File(file.FileStart)
-               check.recordFileVersion(tfile, check.version) // record package version (possibly zero version)
+               fbase := file.FileStart
+               check.recordFileVersion(fbase, check.version) // record package version (possibly zero version)
                v, _ := parseGoVersion(file.GoVersion)
                if v.major > 0 {
                        if v.equal(check.version) {
@@ -312,10 +312,10 @@ func (check *Checker) initFiles(files []*ast.File) {
                                continue
                        }
                        if check.posVers == nil {
-                               check.posVers = make(map[*token.File]version)
+                               check.posVers = make(map[token.Pos]version)
                        }
-                       check.posVers[tfile] = v
-                       check.recordFileVersion(tfile, v) // overwrite package version
+                       check.posVers[fbase] = v
+                       check.recordFileVersion(fbase, v) // overwrite package version
                }
        }
 }
@@ -640,8 +640,8 @@ func (check *Checker) recordScope(node ast.Node, scope *Scope) {
        }
 }
 
-func (check *Checker) recordFileVersion(tfile *token.File, v version) {
+func (check *Checker) recordFileVersion(pos token.Pos, v version) {
        if m := check._FileVersions; m != nil {
-               m[tfile] = _Version{v.major, v.minor}
+               m[pos] = _Version{v.major, v.minor}
        }
 }
index 108d9b34a062aefcfb5774556aaf760bde7ad175..2f21e98ad8fff546c46f64653695f3349cf30555 100644 (file)
@@ -133,7 +133,8 @@ func (check *Checker) allowVersion(pkg *Package, at positioner, v version) bool
 
        // If the source file declares its Go version, use that to decide.
        if check.posVers != nil {
-               if src, ok := check.posVers[check.fset.File(at.Pos())]; ok && src.major >= 1 {
+               fileStart := check.fset.File(at.Pos()).Pos(0)
+               if src, ok := check.posVers[fileStart]; ok && src.major >= 1 {
                        return !src.before(v)
                }
        }