]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types2: pull up package-level object sort to a separate phase
authorMark Freeman <mark@golang.org>
Mon, 27 Oct 2025 20:37:16 +0000 (16:37 -0400)
committerGopher Robot <gobot@golang.org>
Tue, 28 Oct 2025 15:29:09 +0000 (08:29 -0700)
This step allows future additional phases to reuse the sorted object
list. Preparation for upcoming CLs.

Change-Id: I22eaffd5bbe39c7cc101c6d860011dc3cb98ce37
Reviewed-on: https://go-review.googlesource.com/c/go/+/715480
Reviewed-by: Robert Griesemer <gri@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Mark Freeman <markfreeman@google.com>

src/cmd/compile/internal/types2/check.go
src/cmd/compile/internal/types2/resolver.go
src/go/types/check.go
src/go/types/resolver.go

index 411a1719ce4bb528d9b00f6eae8f70e48ebbb96a..8b27d9d3c10b2255920327f32f3cc27a1c01e349 100644 (file)
@@ -141,9 +141,10 @@ type Checker struct {
        ctxt *Context // context for de-duplicating instances
        pkg  *Package
        *Info
-       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
+       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
+       objList []Object               // source-ordered keys of objMap
+       impMap  map[importKey]*Package // maps (import path, source directory) to (complete or fake) package
        // see TODO in validtype.go
        // valids  instanceLookup      // valid *Named (incl. instantiated) types per the validType check
 
@@ -493,6 +494,9 @@ func (check *Checker) checkFiles(files []*syntax.File) {
        print("== collectObjects ==")
        check.collectObjects()
 
+       print("== sortObjects ==")
+       check.sortObjects()
+
        print("== packageObjects ==")
        check.packageObjects()
 
index 9d8769b96f7c1defad785b52a4dc084ec7f6bd11..4c9eeb329c8d585b61970c6a0c0fd10ec6eda502 100644 (file)
@@ -508,6 +508,19 @@ func (check *Checker) collectObjects() {
        }
 }
 
+// sortObjects sorts package-level objects by source-order for reproducible processing
+func (check *Checker) sortObjects() {
+       check.objList = make([]Object, len(check.objMap))
+       i := 0
+       for obj := range check.objMap {
+               check.objList[i] = obj
+               i++
+       }
+       slices.SortFunc(check.objList, func(a, b Object) int {
+               return cmp.Compare(a.order(), b.order())
+       })
+}
+
 // unpackRecv unpacks a receiver type expression and returns its components: ptr indicates
 // whether rtyp is a pointer receiver, base is the receiver base type expression stripped
 // of its type parameters (if any), and tparams are its type parameter names, if any. The
@@ -626,19 +639,8 @@ func (check *Checker) resolveBaseTypeName(ptr bool, name *syntax.Name) (ptr_ boo
 
 // packageObjects typechecks all package objects, but not function bodies.
 func (check *Checker) packageObjects() {
-       // process package objects in source order for reproducible results
-       objList := make([]Object, len(check.objMap))
-       i := 0
-       for obj := range check.objMap {
-               objList[i] = obj
-               i++
-       }
-       slices.SortFunc(objList, func(a, b Object) int {
-               return cmp.Compare(a.order(), b.order())
-       })
-
        // add new methods to already type-checked types (from a prior Checker.Files call)
-       for _, obj := range objList {
+       for _, obj := range check.objList {
                if obj, _ := obj.(*TypeName); obj != nil && obj.typ != nil {
                        check.collectMethods(obj)
                }
@@ -661,7 +663,7 @@ func (check *Checker) packageObjects() {
                // its Type is Invalid.
                //
                // Investigate and reenable this branch.
-               for _, obj := range objList {
+               for _, obj := range check.objList {
                        check.objDecl(obj, nil)
                }
        } else {
@@ -673,7 +675,7 @@ func (check *Checker) packageObjects() {
                var aliasList []*TypeName
                var othersList []Object // everything that's not a type
                // phase 1: non-alias type declarations
-               for _, obj := range objList {
+               for _, obj := range check.objList {
                        if tname, _ := obj.(*TypeName); tname != nil {
                                if check.objMap[tname].tdecl.Alias {
                                        aliasList = append(aliasList, tname)
index c9753280bf8685447033c0cb2cf972f750330975..d163012f1ef206c4aab6398dbf61f1b0f74ea636 100644 (file)
@@ -161,9 +161,10 @@ type Checker struct {
        fset *token.FileSet
        pkg  *Package
        *Info
-       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
+       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
+       objList []Object               // source-ordered keys of objMap
+       impMap  map[importKey]*Package // maps (import path, source directory) to (complete or fake) package
        // see TODO in validtype.go
        // valids instanceLookup // valid *Named (incl. instantiated) types per the validType check
 
@@ -518,6 +519,9 @@ func (check *Checker) checkFiles(files []*ast.File) {
        print("== collectObjects ==")
        check.collectObjects()
 
+       print("== sortObjects ==")
+       check.sortObjects()
+
        print("== packageObjects ==")
        check.packageObjects()
 
index dcf863b029feb22bb4a2fd1790b6774993daca46..a8d11c2aa52b9da382425e66b44409d35a266bff 100644 (file)
@@ -499,6 +499,19 @@ func (check *Checker) collectObjects() {
        }
 }
 
+// sortObjects sorts package-level objects by source-order for reproducible processing
+func (check *Checker) sortObjects() {
+       check.objList = make([]Object, len(check.objMap))
+       i := 0
+       for obj := range check.objMap {
+               check.objList[i] = obj
+               i++
+       }
+       slices.SortFunc(check.objList, func(a, b Object) int {
+               return cmp.Compare(a.order(), b.order())
+       })
+}
+
 // unpackRecv unpacks a receiver type expression and returns its components: ptr indicates
 // whether rtyp is a pointer receiver, base is the receiver base type expression stripped
 // of its type parameters (if any), and tparams are its type parameter names, if any. The
@@ -621,19 +634,8 @@ func (check *Checker) resolveBaseTypeName(ptr bool, name *ast.Ident) (ptr_ bool,
 
 // packageObjects typechecks all package objects, but not function bodies.
 func (check *Checker) packageObjects() {
-       // process package objects in source order for reproducible results
-       objList := make([]Object, len(check.objMap))
-       i := 0
-       for obj := range check.objMap {
-               objList[i] = obj
-               i++
-       }
-       slices.SortFunc(objList, func(a, b Object) int {
-               return cmp.Compare(a.order(), b.order())
-       })
-
        // add new methods to already type-checked types (from a prior Checker.Files call)
-       for _, obj := range objList {
+       for _, obj := range check.objList {
                if obj, _ := obj.(*TypeName); obj != nil && obj.typ != nil {
                        check.collectMethods(obj)
                }
@@ -656,7 +658,7 @@ func (check *Checker) packageObjects() {
                // its Type is Invalid.
                //
                // Investigate and reenable this branch.
-               for _, obj := range objList {
+               for _, obj := range check.objList {
                        check.objDecl(obj, nil)
                }
        } else {
@@ -668,7 +670,7 @@ func (check *Checker) packageObjects() {
                var aliasList []*TypeName
                var othersList []Object // everything that's not a type
                // phase 1: non-alias type declarations
-               for _, obj := range objList {
+               for _, obj := range check.objList {
                        if tname, _ := obj.(*TypeName); tname != nil {
                                if check.objMap[tname].tdecl.Assign.IsValid() {
                                        aliasList = append(aliasList, tname)