x/tools: go fix The command was run twice, the second time to clean up after the first e.g. by removing x := x. No problems observed. Most fixes are from typefor, stditerators, buildtag, which do not have known issues. (Several bugs in other analyzers have been fixed since we last vendored x/tools into go fix.) Also, use (*types.Func).Signature throughout. For golang/go#71859 Change-Id: Icb9ba713315c469a2e307243b2d11bcd809d134f Reviewed-on: https://go-review.googlesource.com/c/tools/+/718504 Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
diff --git a/go/analysis/checker/checker.go b/go/analysis/checker/checker.go index 455be3f..14f5225 100644 --- a/go/analysis/checker/checker.go +++ b/go/analysis/checker/checker.go
@@ -490,7 +490,7 @@ switch obj := obj.(type) { case *types.Func: return obj.Exported() && obj.Pkg() == pkg || - obj.Type().(*types.Signature).Recv() != nil + obj.Signature().Recv() != nil case *types.Var: if obj.IsField() { return true
diff --git a/go/analysis/passes/cgocall/cgocall.go b/go/analysis/passes/cgocall/cgocall.go index bf1202b..54b8062 100644 --- a/go/analysis/passes/cgocall/cgocall.go +++ b/go/analysis/passes/cgocall/cgocall.go
@@ -350,8 +350,8 @@ case *types.Array: return typeOKForCgoCall(t.Elem(), m) case *types.Struct: - for i := 0; i < t.NumFields(); i++ { - if !typeOKForCgoCall(t.Field(i).Type(), m) { + for field := range t.Fields() { + if !typeOKForCgoCall(field.Type(), m) { return false } }
diff --git a/go/analysis/passes/copylock/copylock.go b/go/analysis/passes/copylock/copylock.go index 4190cc5..208602f 100644 --- a/go/analysis/passes/copylock/copylock.go +++ b/go/analysis/passes/copylock/copylock.go
@@ -328,8 +328,8 @@ ttyp, ok := typ.Underlying().(*types.Tuple) if ok { - for i := 0; i < ttyp.Len(); i++ { - subpath := lockPath(tpkg, ttyp.At(i).Type(), seen) + for v := range ttyp.Variables() { + subpath := lockPath(tpkg, v.Type(), seen) if subpath != nil { return append(subpath, typ.String()) }
diff --git a/go/analysis/passes/deepequalerrors/deepequalerrors.go b/go/analysis/passes/deepequalerrors/deepequalerrors.go index 5e3d1a3..32087cd 100644 --- a/go/analysis/passes/deepequalerrors/deepequalerrors.go +++ b/go/analysis/passes/deepequalerrors/deepequalerrors.go
@@ -96,8 +96,8 @@ case *types.Map: return check(t.Key()) || check(t.Elem()) case *types.Struct: - for i := 0; i < t.NumFields(); i++ { - if check(t.Field(i).Type()) { + for field := range t.Fields() { + if check(field.Type()) { return true } }
diff --git a/go/analysis/passes/httpmux/httpmux.go b/go/analysis/passes/httpmux/httpmux.go index a4f00e2..7c8008a 100644 --- a/go/analysis/passes/httpmux/httpmux.go +++ b/go/analysis/passes/httpmux/httpmux.go
@@ -84,7 +84,7 @@ if !isMethodNamed(fn, "net/http", "Handle", "HandleFunc") { return false } - recv := fn.Type().(*types.Signature).Recv() // isMethodNamed() -> non-nil + recv := fn.Signature().Recv() // isMethodNamed() -> non-nil isPtr, named := typesinternal.ReceiverNamed(recv) return isPtr && typesinternal.IsTypeNamed(named, "net/http", "ServeMux") } @@ -100,7 +100,7 @@ if f.Pkg() == nil || f.Pkg().Path() != pkgPath { return false // not at pkgPath } - if f.Type().(*types.Signature).Recv() == nil { + if f.Signature().Recv() == nil { return false // not a method } return slices.Contains(names, f.Name())
diff --git a/go/analysis/passes/inline/inline.go b/go/analysis/passes/inline/inline.go index 0ba9a09..2fe1ead 100644 --- a/go/analysis/passes/inline/inline.go +++ b/go/analysis/passes/inline/inline.go
@@ -416,8 +416,8 @@ visit(t.Key()) visit(t.Elem()) case *types.Struct: - for i := range t.NumFields() { - visit(t.Field(i).Type()) + for field := range t.Fields() { + visit(field.Type()) } case *types.Signature: // Ignore the receiver: although it may be present, it has no meaning @@ -430,11 +430,11 @@ visit(t.Params()) visit(t.Results()) case *types.Interface: - for i := range t.NumEmbeddeds() { - visit(t.EmbeddedType(i)) + for etyp := range t.EmbeddedTypes() { + visit(etyp) } - for i := range t.NumExplicitMethods() { - visit(t.ExplicitMethod(i).Type()) + for method := range t.ExplicitMethods() { + visit(method.Type()) } case *types.Tuple: for v := range t.Variables() {
diff --git a/go/analysis/passes/inspect/inspect.go b/go/analysis/passes/inspect/inspect.go index ee1972f..aae5d25 100644 --- a/go/analysis/passes/inspect/inspect.go +++ b/go/analysis/passes/inspect/inspect.go
@@ -41,7 +41,7 @@ URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/inspect", Run: run, RunDespiteErrors: true, - ResultType: reflect.TypeOf(new(inspector.Inspector)), + ResultType: reflect.TypeFor[*inspector.Inspector](), } func run(pass *analysis.Pass) (any, error) {
diff --git a/go/analysis/passes/loopclosure/loopclosure.go b/go/analysis/passes/loopclosure/loopclosure.go index fa764e7..8aeaeee 100644 --- a/go/analysis/passes/loopclosure/loopclosure.go +++ b/go/analysis/passes/loopclosure/loopclosure.go
@@ -363,7 +363,7 @@ if f == nil || f.Name() != method { return false } - recv := f.Type().(*types.Signature).Recv() + recv := f.Signature().Recv() if recv == nil { return false }
diff --git a/go/analysis/passes/lostcancel/lostcancel.go b/go/analysis/passes/lostcancel/lostcancel.go index dfaecf5..72248be 100644 --- a/go/analysis/passes/lostcancel/lostcancel.go +++ b/go/analysis/passes/lostcancel/lostcancel.go
@@ -316,8 +316,8 @@ } func tupleContains(tuple *types.Tuple, v *types.Var) bool { - for i := 0; i < tuple.Len(); i++ { - if tuple.At(i) == v { + for v0 := range tuple.Variables() { + if v0 == v { return true } }
diff --git a/go/analysis/passes/printf/types.go b/go/analysis/passes/printf/types.go index f7e50f9..8aa3962 100644 --- a/go/analysis/passes/printf/types.go +++ b/go/analysis/passes/printf/types.go
@@ -204,8 +204,7 @@ case *types.Struct: // report whether all the elements of the struct match the expected type. For // instance, with "%d" all the elements must be printable with the "%d" format. - for i := 0; i < typ.NumFields(); i++ { - typf := typ.Field(i) + for typf := range typ.Fields() { if !m.match(typf.Type(), false) { return false }
diff --git a/go/analysis/passes/slog/slog.go b/go/analysis/passes/slog/slog.go index 2cb91c7..985be27 100644 --- a/go/analysis/passes/slog/slog.go +++ b/go/analysis/passes/slog/slog.go
@@ -168,7 +168,7 @@ // "slog.Logger.With" (instead of "(*log/slog.Logger).With") func shortName(fn *types.Func) string { var r string - if recv := fn.Type().(*types.Signature).Recv(); recv != nil { + if recv := fn.Signature().Recv(); recv != nil { if _, named := typesinternal.ReceiverNamed(recv); named != nil { r = named.Obj().Name() } else { @@ -188,7 +188,7 @@ return 0, false } var recvName string // by default a slog package function - if recv := fn.Type().(*types.Signature).Recv(); recv != nil { + if recv := fn.Signature().Recv(); recv != nil { _, named := typesinternal.ReceiverNamed(recv) if named == nil { return 0, false // anon struct/interface
diff --git a/go/analysis/passes/testinggoroutine/util.go b/go/analysis/passes/testinggoroutine/util.go index db2e5f7..b56191b 100644 --- a/go/analysis/passes/testinggoroutine/util.go +++ b/go/analysis/passes/testinggoroutine/util.go
@@ -44,7 +44,7 @@ if f.Pkg() == nil || f.Pkg().Path() != pkgPath { return false } - if f.Type().(*types.Signature).Recv() == nil { + if f.Signature().Recv() == nil { return false } return slices.Contains(names, f.Name())
diff --git a/go/analysis/passes/unmarshal/unmarshal.go b/go/analysis/passes/unmarshal/unmarshal.go index 4de48c8..d2d9b37 100644 --- a/go/analysis/passes/unmarshal/unmarshal.go +++ b/go/analysis/passes/unmarshal/unmarshal.go
@@ -57,7 +57,7 @@ // Classify the callee (without allocating memory). argidx := -1 - recv := fn.Type().(*types.Signature).Recv() + recv := fn.Signature().Recv() if fn.Name() == "Unmarshal" && recv == nil { // "encoding/json".Unmarshal // "encoding/xml".Unmarshal
diff --git a/go/analysis/passes/unusedresult/unusedresult.go b/go/analysis/passes/unusedresult/unusedresult.go index 74cc83b..d1fa81c 100644 --- a/go/analysis/passes/unusedresult/unusedresult.go +++ b/go/analysis/passes/unusedresult/unusedresult.go
@@ -150,7 +150,7 @@ if !ok { return // e.g. var or builtin } - if sig := fn.Type().(*types.Signature); sig.Recv() != nil { + if sig := fn.Signature(); sig.Recv() != nil { // method (e.g. foo.String()) if types.Identical(sig, sigNoArgsStringResult) { if stringMethods[fn.Name()] {
diff --git a/go/callgraph/rta/rta.go b/go/callgraph/rta/rta.go index 224c0b9..442a226 100644 --- a/go/callgraph/rta/rta.go +++ b/go/callgraph/rta/rta.go
@@ -469,9 +469,9 @@ } // Recursion over signatures of each exported method. - for i := 0; i < mset.Len(); i++ { - if mset.At(i).Obj().Exported() { - sig := mset.At(i).Type().(*types.Signature) + for method := range mset.Methods() { + if method.Obj().Exported() { + sig := method.Type().(*types.Signature) r.addRuntimeType(sig.Params(), true) // skip the Tuple itself r.addRuntimeType(sig.Results(), true) // skip the Tuple itself } @@ -541,8 +541,8 @@ func fingerprint(mset *types.MethodSet) uint64 { var space [64]byte var mask uint64 - for i := 0; i < mset.Len(); i++ { - method := mset.At(i).Obj() + for method := range mset.Methods() { + method := method.Obj() sig := method.Type().(*types.Signature) sum := crc32.ChecksumIEEE(fmt.Appendf(space[:], "%s/%d/%d", method.Id(),
diff --git a/go/callgraph/static/static.go b/go/callgraph/static/static.go index 948ce9a..84a95ac 100644 --- a/go/callgraph/static/static.go +++ b/go/callgraph/static/static.go
@@ -72,8 +72,8 @@ methodsOf := func(T types.Type) { if !types.IsInterface(T) { mset := prog.MethodSets.MethodSet(T) - for i := 0; i < mset.Len(); i++ { - visit(cg.CreateNode(prog.MethodValue(mset.At(i)))) + for method := range mset.Methods() { + visit(cg.CreateNode(prog.MethodValue(method))) } } }
diff --git a/go/ssa/builder.go b/go/ssa/builder.go index 162f3ec..a75257c 100644 --- a/go/ssa/builder.go +++ b/go/ssa/builder.go
@@ -2994,8 +2994,8 @@ fn.source = fn.parent.source fn.startBody() params := fn.Signature.Params() - for i := 0; i < params.Len(); i++ { - fn.addParamVar(params.At(i)) + for v := range params.Variables() { + fn.addParamVar(v) } // Initial targets
diff --git a/go/ssa/instantiate_test.go b/go/ssa/instantiate_test.go index 32c3a9a..c82196f 100644 --- a/go/ssa/instantiate_test.go +++ b/go/ssa/instantiate_test.go
@@ -207,8 +207,8 @@ func tparams(f *ssa.Function) string { tplist := f.TypeParams() var tps []string - for i := 0; i < tplist.Len(); i++ { - tps = append(tps, tplist.At(i).String()) + for tparam := range tplist.TypeParams() { + tps = append(tps, tparam.String()) } return fmt.Sprint(tps) }
diff --git a/go/ssa/interp/reflect.go b/go/ssa/interp/reflect.go index da9938e..7c549ab 100644 --- a/go/ssa/interp/reflect.go +++ b/go/ssa/interp/reflect.go
@@ -542,8 +542,8 @@ // delete bodies of the old methods mset := i.prog.MethodSets.MethodSet(rV) - for j := 0; j < mset.Len(); j++ { - i.prog.MethodValue(mset.At(j)).Blocks = nil + for method := range mset.Methods() { + i.prog.MethodValue(method).Blocks = nil } tEface := types.NewInterface(nil, nil).Complete()
diff --git a/go/ssa/ssautil/visit.go b/go/ssa/ssautil/visit.go index b4feb42..7300d2b 100644 --- a/go/ssa/ssautil/visit.go +++ b/go/ssa/ssautil/visit.go
@@ -74,8 +74,8 @@ methodsOf := func(T types.Type) { if !types.IsInterface(T) { mset := prog.MethodSets.MethodSet(T) - for i := 0; i < mset.Len(); i++ { - function(prog.MethodValue(mset.At(i))) + for method := range mset.Methods() { + function(prog.MethodValue(method)) } } }
diff --git a/go/ssa/subst.go b/go/ssa/subst.go index a4b1026..5799a07 100644 --- a/go/ssa/subst.go +++ b/go/ssa/subst.go
@@ -352,8 +352,7 @@ // Copy and substitute type params. var newTParams []*types.TypeParam - for i := 0; i < tparams.Len(); i++ { - cur := tparams.At(i) + for cur := range tparams.TypeParams() { cobj := cur.Obj() cname := types.NewTypeName(cobj.Pos(), cobj.Pkg(), cobj.Name(), nil) ntp := types.NewTypeParam(cname, nil) @@ -488,8 +487,7 @@ obj := types.NewTypeName(tname.Pos(), tname.Pkg(), tname.Name(), nil) fresh := types.NewNamed(obj, nil, nil) var newTParams []*types.TypeParam - for i := 0; i < tparams.Len(); i++ { - cur := tparams.At(i) + for cur := range tparams.TypeParams() { cobj := cur.Obj() cname := types.NewTypeName(cobj.Pos(), cobj.Pkg(), cobj.Name(), nil) ntp := types.NewTypeParam(cname, nil)
diff --git a/go/ssa/util.go b/go/ssa/util.go index 932eb6c..42f9621 100644 --- a/go/ssa/util.go +++ b/go/ssa/util.go
@@ -121,7 +121,7 @@ // recvType returns the receiver type of method obj. func recvType(obj *types.Func) types.Type { - return obj.Type().(*types.Signature).Recv().Type() + return obj.Signature().Recv().Type() } // fieldOf returns the index'th field of the (core type of) a struct type; @@ -200,7 +200,7 @@ // receiverTypeArgs returns the type arguments to a method's receiver. // Returns an empty list if the receiver does not have type arguments. func receiverTypeArgs(method *types.Func) []types.Type { - recv := method.Type().(*types.Signature).Recv() + recv := method.Signature().Recv() _, named := typesinternal.ReceiverNamed(recv) if named == nil { return nil // recv is anonymous struct/interface @@ -221,8 +221,8 @@ func recvAsFirstArg(sig *types.Signature) *types.Signature { params := make([]*types.Var, 0, 1+sig.Params().Len()) params = append(params, sig.Recv()) - for i := 0; i < sig.Params().Len(); i++ { - params = append(params, sig.Params().At(i)) + for v := range sig.Params().Variables() { + params = append(params, v) } return types.NewSignatureType(nil, nil, nil, types.NewTuple(params...), sig.Results(), sig.Variadic()) }
diff --git a/go/types/internal/play/play.go b/go/types/internal/play/play.go index 3d00922..89ed975 100644 --- a/go/types/internal/play/play.go +++ b/go/types/internal/play/play.go
@@ -304,7 +304,7 @@ origin = obj.Origin() case *types.Func: - if recv := obj.Type().(*types.Signature).Recv(); recv != nil { + if recv := obj.Signature().Recv(); recv != nil { kind = fmt.Sprintf("method (with recv %v)", recv.Type()) } origin = obj.Origin()
diff --git a/go/types/objectpath/objectpath.go b/go/types/objectpath/objectpath.go index 6c0c749..6646bf5 100644 --- a/go/types/objectpath/objectpath.go +++ b/go/types/objectpath/objectpath.go
@@ -249,7 +249,7 @@ case *types.Func: // A func, if not package-level, must be a method. - if recv := obj.Type().(*types.Signature).Recv(); recv == nil { + if recv := obj.Signature().Recv(); recv == nil { return "", fmt.Errorf("func is not a method: %v", obj) } @@ -405,7 +405,7 @@ return "", false } - _, named := typesinternal.ReceiverNamed(meth.Type().(*types.Signature).Recv()) + _, named := typesinternal.ReceiverNamed(meth.Signature().Recv()) if named == nil { return "", false }
diff --git a/go/types/typeutil/map.go b/go/types/typeutil/map.go index f035a0b..3662457 100644 --- a/go/types/typeutil/map.go +++ b/go/types/typeutil/map.go
@@ -304,8 +304,7 @@ case *types.Named: hash := h.hashTypeName(t.Obj()) targs := t.TypeArgs() - for i := 0; i < targs.Len(); i++ { - targ := targs.At(i) + for targ := range targs.Types() { hash += 2 * h.hash(targ) } return hash
diff --git a/gopls/internal/analysis/simplifycompositelit/simplifycompositelit.go b/gopls/internal/analysis/simplifycompositelit/simplifycompositelit.go index 3e54dc2..a883922 100644 --- a/gopls/internal/analysis/simplifycompositelit/simplifycompositelit.go +++ b/gopls/internal/analysis/simplifycompositelit/simplifycompositelit.go
@@ -198,8 +198,8 @@ // Values/types for special cases. var ( - identType = reflect.TypeOf((*ast.Ident)(nil)) - objectPtrType = reflect.TypeOf((*ast.Object)(nil)) - positionType = reflect.TypeOf(token.NoPos) - callExprType = reflect.TypeOf((*ast.CallExpr)(nil)) + identType = reflect.TypeFor[*ast.Ident]() + objectPtrType = reflect.TypeFor[*ast.Object]() + positionType = reflect.TypeFor[token.Pos]() + callExprType = reflect.TypeFor[*ast.CallExpr]() )
diff --git a/gopls/internal/analysis/unusedparams/unusedparams.go b/gopls/internal/analysis/unusedparams/unusedparams.go index bcbbfda..663c36f 100644 --- a/gopls/internal/analysis/unusedparams/unusedparams.go +++ b/gopls/internal/analysis/unusedparams/unusedparams.go
@@ -96,8 +96,7 @@ // generics makes it tricky, and this conservative // heuristic is close enough.) t := pass.TypesInfo.TypeOf(n).(*types.Interface) - for i := 0; i < t.NumExplicitMethods(); i++ { - m := t.ExplicitMethod(i) + for m := range t.ExplicitMethods() { if !m.Exported() && m.Name() != "_" { unexportedIMethodNames[m.Name()] = true }
diff --git a/gopls/internal/cache/constraints_test.go b/gopls/internal/cache/constraints_test.go index 23c9f39..6936d6c 100644 --- a/gopls/internal/cache/constraints_test.go +++ b/gopls/internal/cache/constraints_test.go
@@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.16 -// +build go1.16 - package cache import (
diff --git a/gopls/internal/cache/parsego/parse.go b/gopls/internal/cache/parsego/parse.go index d832c88..1a00967 100644 --- a/gopls/internal/cache/parsego/parse.go +++ b/gopls/internal/cache/parsego/parse.go
@@ -840,7 +840,7 @@ return exprStmt.X, nil } -var tokenPosType = reflect.TypeOf(token.NoPos) +var tokenPosType = reflect.TypeFor[token.Pos]() // offsetPositions applies an offset to the positions in an ast.Node. func offsetPositions(tok *token.File, n ast.Node, offset token.Pos) {
diff --git a/gopls/internal/doc/generate/generate.go b/gopls/internal/doc/generate/generate.go index 5bf8e71..5b31ce9 100644 --- a/gopls/internal/doc/generate/generate.go +++ b/gopls/internal/doc/generate/generate.go
@@ -200,13 +200,12 @@ var opts []*doc.Option optsStruct := optsType.Type().Underlying().(*types.Struct) - for i := 0; i < optsStruct.NumFields(); i++ { + for typesField := range optsStruct.Fields() { // The types field gives us the type. - typesField := optsStruct.Field(i) // If the field name ends with "Options", assume it is a struct with // additional options and process it recursively. - if h := strings.TrimSuffix(typesField.Name(), "Options"); h != typesField.Name() { + if h, ok := strings.CutSuffix(typesField.Name(), "Options"); ok { // Keep track of the parent structs. if hierarchy != "" { h = hierarchy + "." + h
diff --git a/gopls/internal/golang/completion/completion.go b/gopls/internal/golang/completion/completion.go index 6c28122..f6d2277 100644 --- a/gopls/internal/golang/completion/completion.go +++ b/gopls/internal/golang/completion/completion.go
@@ -1119,8 +1119,7 @@ _, named := typesinternal.ReceiverNamed(recv) if named != nil { if recvStruct, ok := named.Underlying().(*types.Struct); ok { - for i := range recvStruct.NumFields() { - field := recvStruct.Field(i) + for field := range recvStruct.Fields() { c.deepState.enqueue(candidate{obj: field, score: lowScore}) } } @@ -1619,14 +1618,14 @@ c.methodSetCache[methodSetKey{typ, addressable}] = mset } - for i := range mset.Len() { - obj := mset.At(i).Obj() + for method := range mset.Methods() { + obj := method.Obj() // to the other side of the cb() queue? if c.tooNew(obj) { continue // std method too new for file's Go version } cb(candidate{ - obj: mset.At(i).Obj(), + obj: method.Obj(), score: stdScore, imp: imp, addressable: addressable || isPointer(typ), @@ -2175,8 +2174,8 @@ // value side. The expected type of the value will be determined from the key. if clInfo.kv != nil { if key, ok := clInfo.kv.Key.(*ast.Ident); ok { - for i := range t.NumFields() { - if field := t.Field(i); field.Name() == key.Name { + for field := range t.Fields() { + if field.Name() == key.Name { return field.Type() } } @@ -2842,8 +2841,8 @@ // call. Record the assignees so we can favor function // calls that return matching values. if len(node.Args) <= 1 && exprIdx == 0 { - for i := range sig.Params().Len() { - inf.assignees = append(inf.assignees, sig.Params().At(i).Type()) + for v := range sig.Params().Variables() { + inf.assignees = append(inf.assignees, v.Type()) } // Record that we may be completing into variadic parameters.
diff --git a/gopls/internal/golang/completion/format.go b/gopls/internal/golang/completion/format.go index 5c9d81c..9f5d277 100644 --- a/gopls/internal/golang/completion/format.go +++ b/gopls/internal/golang/completion/format.go
@@ -398,33 +398,33 @@ case *types.Slice: visit(t.Elem()) case *types.Interface: - for i := range t.NumExplicitMethods() { - visit(t.ExplicitMethod(i).Type()) + for method := range t.ExplicitMethods() { + visit(method.Type()) } - for i := range t.NumEmbeddeds() { - visit(t.EmbeddedType(i)) + for etyp := range t.EmbeddedTypes() { + visit(etyp) } case *types.Union: - for i := range t.Len() { - visit(t.Term(i).Type()) + for term := range t.Terms() { + visit(term.Type()) } case *types.Signature: if tp := t.TypeParams(); tp != nil { // Generic signatures only appear as the type of generic // function declarations, so this isn't really reachable. - for i := range tp.Len() { - visit(tp.At(i).Constraint()) + for tparam := range tp.TypeParams() { + visit(tparam.Constraint()) } } visit(t.Params()) visit(t.Results()) case *types.Tuple: - for i := range t.Len() { - visit(t.At(i).Type()) + for v := range t.Variables() { + visit(v.Type()) } case *types.Struct: - for i := range t.NumFields() { - visit(t.Field(i).Type()) + for field := range t.Fields() { + visit(field.Type()) } case *types.TypeParam: free[t] = true @@ -432,8 +432,8 @@ visit(types.Unalias(t)) case *types.Named: targs := t.TypeArgs() - for i := range targs.Len() { - visit(targs.At(i)) + for t0 := range targs.Types() { + visit(t0) } case *types.Basic: // nop @@ -446,8 +446,7 @@ // Perform induction through constraints. restart: - for i := range sig.TypeParams().Len() { - tp := sig.TypeParams().At(i) + for tp := range sig.TypeParams().TypeParams() { if free[tp] { n := len(free) visit(tp.Constraint())
diff --git a/gopls/internal/golang/completion/fuzz.go b/gopls/internal/golang/completion/fuzz.go index 9e3bb7b..34c6d50 100644 --- a/gopls/internal/golang/completion/fuzz.go +++ b/gopls/internal/golang/completion/fuzz.go
@@ -50,8 +50,8 @@ } } if inside { - for i := range mset.Len() { - o := mset.At(i).Obj() + for method := range mset.Methods() { + o := method.Obj() if o.Name() == "Failed" || o.Name() == "Name" { cb(candidate{ obj: o, @@ -125,8 +125,8 @@ isSlice: false, } c.items = append(c.items, xx) - for i := range mset.Len() { - o := mset.At(i).Obj() + for method := range mset.Methods() { + o := method.Obj() if o.Name() != "Fuzz" { cb(candidate{ obj: o,
diff --git a/gopls/internal/golang/completion/literal.go b/gopls/internal/golang/completion/literal.go index 572a7c4..d227e45 100644 --- a/gopls/internal/golang/completion/literal.go +++ b/gopls/internal/golang/completion/literal.go
@@ -331,8 +331,8 @@ results.Len() == 1 && results.At(0).Name() != "" var resultHasTypeParams bool - for i := range results.Len() { - if tp, ok := types.Unalias(results.At(i).Type()).(*types.TypeParam); ok && !c.typeParamInScope(tp) { + for v := range results.Variables() { + if tp, ok := types.Unalias(v.Type()).(*types.TypeParam); ok && !c.typeParamInScope(tp) { resultHasTypeParams = true } } @@ -570,8 +570,7 @@ return false } - for i := range targs.Len() { - targ := targs.At(i) + for targ := range targs.Types() { // The expansion of an alias can have free type parameters, // whether or not the alias itself has type parameters:
diff --git a/gopls/internal/golang/completion/postfix_snippets.go b/gopls/internal/golang/completion/postfix_snippets.go index e81fb67..084eafe 100644 --- a/gopls/internal/golang/completion/postfix_snippets.go +++ b/gopls/internal/golang/completion/postfix_snippets.go
@@ -431,13 +431,9 @@ // Tuple returns the tuple result vars if the type of X is tuple. func (a *postfixTmplArgs) Tuple() []*types.Var { tuple, _ := a.Type.(*types.Tuple) - if tuple == nil { - return nil - } - - typs := make([]*types.Var, 0, tuple.Len()) - for i := range tuple.Len() { - typs = append(typs, tuple.At(i)) + typs := make([]*types.Var, tuple.Len()) + for i := range typs { + typs[i] = tuple.At(i) } return typs } @@ -445,9 +441,6 @@ // TupleLast returns the last tuple result vars if the type of X is tuple. func (a *postfixTmplArgs) TupleLast() *types.Var { tuple, _ := a.Type.(*types.Tuple) - if tuple == nil { - return nil - } if tuple.Len() == 0 { return nil }
diff --git a/gopls/internal/golang/completion/statements.go b/gopls/internal/golang/completion/statements.go index e8b35a4..620d41a 100644 --- a/gopls/internal/golang/completion/statements.go +++ b/gopls/internal/golang/completion/statements.go
@@ -351,8 +351,7 @@ } sig := enclosingFunc.sig - for i := range sig.Params().Len() { - param := sig.Params().At(i) + for param := range sig.Params().Variables() { if param.Name() == "_" { continue }
diff --git a/gopls/internal/golang/completion/util.go b/gopls/internal/golang/completion/util.go index c907fa4..10d6325 100644 --- a/gopls/internal/golang/completion/util.go +++ b/gopls/internal/golang/completion/util.go
@@ -47,8 +47,7 @@ return } - for i := range T.NumFields() { - f := T.Field(i) + for f := range T.Fields() { fn(f) if f.Anonymous() { seen.Set(T, true) @@ -84,8 +83,8 @@ case *types.Signature: return typeIsValid(typ.Params()) && typeIsValid(typ.Results()) case *types.Tuple: - for i := range typ.Len() { - if !typeIsValid(typ.At(i).Type()) { + for v := range typ.Variables() { + if !typeIsValid(v.Type()) { return false } } @@ -241,8 +240,7 @@ // fieldsAccessible returns whether s has at least one field accessible by p. func fieldsAccessible(s *types.Struct, p *types.Package) bool { - for i := range s.NumFields() { - f := s.Field(i) + for f := range s.Fields() { if f.Exported() || f.Pkg() == p { return true }
diff --git a/gopls/internal/golang/hover.go b/gopls/internal/golang/hover.go index b5a1620..a9e9b0c 100644 --- a/gopls/internal/golang/hover.go +++ b/gopls/internal/golang/hover.go
@@ -19,6 +19,7 @@ "go/version" "io/fs" "path/filepath" + "slices" "sort" "strconv" "strings" @@ -719,8 +720,8 @@ scopeObj, _ := obj.Pkg().Scope().Lookup(typeName.Name).(*types.TypeName) if scopeObj != nil { if st, _ := scopeObj.Type().Underlying().(*types.Struct); st != nil { - for i := 0; i < st.NumFields(); i++ { - if obj == st.Field(i) { + for field := range st.Fields() { + if obj == field { recv = scopeObj } } @@ -1806,8 +1807,7 @@ return } fieldloop: - for i := 0; i < tStruct.NumFields(); i++ { - f := tStruct.Field(i) + for f := range tStruct.Fields() { // Handle recursion through anonymous fields. if f.Anonymous() { @@ -1868,10 +1868,7 @@ // wasted space (struct types) if tStruct, ok := obj.Type().Underlying().(*types.Struct); ok && is[*types.TypeName](obj) && size > 0 { - var fields []*types.Var - for i := 0; i < tStruct.NumFields(); i++ { - fields = append(fields, tStruct.Field(i)) - } + fields := slices.Collect(tStruct.Fields()) if len(fields) > 0 { // Sort into descending (most compact) order // and recompute size of entire struct.
diff --git a/gopls/internal/golang/implementation.go b/gopls/internal/golang/implementation.go index 1dd05ee..d1fd590 100644 --- a/gopls/internal/golang/implementation.go +++ b/gopls/internal/golang/implementation.go
@@ -434,8 +434,8 @@ // the methodID's types.Package, which we don't know. // We could recursively search pkg.Imports for it, // but it's easier to walk the method set. - for i := 0; i < mset.Len(); i++ { - m := mset.At(i).Obj() + for method := range mset.Methods() { + m := method.Obj() if m.Pos() == id.Pos() { continue // avoid self-comparison of query method } @@ -505,8 +505,8 @@ // would lead to divergence with the global (fingerprint-based) // algorithm, which operates only on methodsets. ymset := msets.MethodSet(y) - for i := range ymset.Len() { - ym := ymset.At(i).Obj().(*types.Func) + for method := range ymset.Methods() { + ym := method.Obj().(*types.Func) xobj, _, _ := types.LookupFieldOrMethod(x, false, ym.Pkg(), ym.Name()) xm, ok := xobj.(*types.Func)
diff --git a/gopls/internal/golang/inlay_hint.go b/gopls/internal/golang/inlay_hint.go index a596550..dee0b68 100644 --- a/gopls/internal/golang/inlay_hint.go +++ b/gopls/internal/golang/inlay_hint.go
@@ -212,8 +212,8 @@ continue } var args []string - for i := 0; i < inst.TypeArgs.Len(); i++ { - args = append(args, inst.TypeArgs.At(i).String()) + for t := range inst.TypeArgs.Types() { + args = append(args, t.String()) } if len(args) == 0 { continue
diff --git a/gopls/internal/golang/pkgdoc.go b/gopls/internal/golang/pkgdoc.go index 663f3ff..0adb7d3 100644 --- a/gopls/internal/golang/pkgdoc.go +++ b/gopls/internal/golang/pkgdoc.go
@@ -78,7 +78,7 @@ // External test packages don't have /pkg doc pages, // so instead show the doc for the package under test. // (This named-based heuristic is imperfect.) - if forTest := strings.TrimSuffix(pkg.Path(), "_test"); forTest != pkg.Path() { + if forTest, ok := strings.CutSuffix(pkg.Path(), "_test"); ok { return PackagePath(forTest), "", makeTitle("package", nil, filepath.Base(forTest)) }
diff --git a/gopls/internal/golang/rename_check.go b/gopls/internal/golang/rename_check.go index ac2f8d1..6d2e521 100644 --- a/gopls/internal/golang/rename_check.go +++ b/gopls/internal/golang/rename_check.go
@@ -460,8 +460,8 @@ // This struct is not a named type. // We need only check for direct (non-promoted) field/field conflicts. T := r.pkg.TypesInfo().Types[tStruct].Type.Underlying().(*types.Struct) - for i := 0; i < T.NumFields(); i++ { - if prev := T.Field(i); prev.Name() == r.to { + for prev := range T.Fields() { + if prev.Name() == r.to { r.errorf(from.Pos(), "renaming this field %q to %q", from.Name(), r.to) r.errorf(prev.Pos(), "\twould conflict with this field")
diff --git a/gopls/internal/golang/stubmethods/stubcalledfunc.go b/gopls/internal/golang/stubmethods/stubcalledfunc.go index 3b935db..677a57d 100644 --- a/gopls/internal/golang/stubmethods/stubcalledfunc.go +++ b/gopls/internal/golang/stubmethods/stubcalledfunc.go
@@ -106,8 +106,8 @@ // Otherwise, use lowercase for the first letter of the object. recvName := strings.ToLower(fmt.Sprintf("%.1s", recv.Name())) if named, ok := types.Unalias(si.Receiver).(*types.Named); ok { - for i := 0; i < named.NumMethods(); i++ { - if recv := named.Method(i).Type().(*types.Signature).Recv(); recv.Name() != "" { + for method := range named.Methods() { + if recv := method.Signature().Recv(); recv.Name() != "" { recvName = recv.Name() break } @@ -185,8 +185,8 @@ // This is the case where another function call returning multiple // results is used as an argument. case *types.Tuple: - for ti := 0; ti < t.Len(); ti++ { - appendParam(arg, t.At(ti).Type()) + for v := range t.Variables() { + appendParam(arg, v.Type()) } default: appendParam(arg, t)
diff --git a/gopls/internal/golang/stubmethods/stubmethods.go b/gopls/internal/golang/stubmethods/stubmethods.go index f9e2c7a..e37473c 100644 --- a/gopls/internal/golang/stubmethods/stubmethods.go +++ b/gopls/internal/golang/stubmethods/stubmethods.go
@@ -89,8 +89,8 @@ // Record all direct methods of the current object concreteFuncs := make(map[string]struct{}) if named, ok := types.Unalias(si.Concrete).(*types.Named); ok { - for i := 0; i < named.NumMethods(); i++ { - concreteFuncs[named.Method(i).Name()] = struct{}{} + for method := range named.Methods() { + concreteFuncs[method.Name()] = struct{}{} } } @@ -107,8 +107,7 @@ concreteStruct, isStruct = typesinternal.Origin(si.Concrete).Underlying().(*types.Struct) ) - for i := 0; i < ifaceType.NumMethods(); i++ { - imethod := ifaceType.Method(i) + for imethod := range ifaceType.Methods() { cmethod, index, _ := types.LookupFieldOrMethod(si.Concrete, si.pointer, imethod.Pkg(), imethod.Name()) if cmethod == nil { missing = append(missing, missingFn{fn: imethod}) @@ -163,8 +162,8 @@ // Otherwise, use lowercase for the first letter of the object. rn := strings.ToLower(si.Concrete.Obj().Name()[0:1]) if named, ok := types.Unalias(si.Concrete).(*types.Named); ok { - for i := 0; i < named.NumMethods(); i++ { - if recv := named.Method(i).Type().(*types.Signature).Recv(); recv.Name() != "" { + for method := range named.Methods() { + if recv := method.Signature().Recv(); recv.Name() != "" { rn = recv.Name() break } @@ -173,8 +172,8 @@ // Check for receiver name conflicts checkRecvName := func(tuple *types.Tuple) bool { - for i := 0; i < tuple.Len(); i++ { - if rn == tuple.At(i).Name() { + for v := range tuple.Variables() { + if rn == v.Name() { return true } }
diff --git a/gopls/internal/golang/types_format.go b/gopls/internal/golang/types_format.go index 472b576..f97dac0 100644 --- a/gopls/internal/golang/types_format.go +++ b/gopls/internal/golang/types_format.go
@@ -181,8 +181,7 @@ func NewSignature(ctx context.Context, s *cache.Snapshot, pkg *cache.Package, sig *types.Signature, comment *ast.CommentGroup, qual types.Qualifier, mq MetadataQualifier) (*signature, error) { var tparams []string tpList := sig.TypeParams() - for i := 0; i < tpList.Len(); i++ { - tparam := tpList.At(i) + for tparam := range tpList.TypeParams() { // TODO: is it possible to reuse the logic from FormatVarType here? s := tparam.Obj().Name() + " " + tparam.Constraint().String() tparams = append(tparams, s)
diff --git a/gopls/internal/lsprpc/autostart_posix.go b/gopls/internal/lsprpc/autostart_posix.go index 6aeac3e..fc22f96 100644 --- a/gopls/internal/lsprpc/autostart_posix.go +++ b/gopls/internal/lsprpc/autostart_posix.go
@@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build darwin dragonfly freebsd linux netbsd openbsd solaris package lsprpc
diff --git a/gopls/internal/protocol/command/commandmeta/meta.go b/gopls/internal/protocol/command/commandmeta/meta.go index 7c3a3ac..50db7a2 100644 --- a/gopls/internal/protocol/command/commandmeta/meta.go +++ b/gopls/internal/protocol/command/commandmeta/meta.go
@@ -68,8 +68,7 @@ // Load command metadata corresponding to each interface method. var commands []*Command loader := fieldLoader{make(map[types.Object]*Field)} - for i := 0; i < obj.NumMethods(); i++ { - m := obj.Method(i) + for m := range obj.Methods() { c, err := loader.loadMethod(pkg, m) if err != nil { return nil, fmt.Errorf("loading %s: %v", m.Name(), err)
diff --git a/gopls/internal/protocol/command/gen/gen.go b/gopls/internal/protocol/command/gen/gen.go index 779e6d8..0f72ef7 100644 --- a/gopls/internal/protocol/command/gen/gen.go +++ b/gopls/internal/protocol/command/gen/gen.go
@@ -130,8 +130,8 @@ case *types.Slice: return fallible(t.Elem()) case *types.Struct: - for i := 0; i < t.NumFields(); i++ { - if fallible(t.Field(i).Type()) { + for field := range t.Fields() { + if fallible(field.Type()) { return true } }
diff --git a/gopls/internal/protocol/command/generate.go b/gopls/internal/protocol/command/generate.go index 324bc51..445a784 100644 --- a/gopls/internal/protocol/command/generate.go +++ b/gopls/internal/protocol/command/generate.go
@@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build ignore -// +build ignore // The generate command generates command_gen.go from a combination of // static and dynamic analysis of the command package.
diff --git a/gopls/internal/protocol/uri_test.go b/gopls/internal/protocol/uri_test.go index cad71dd..076c145 100644 --- a/gopls/internal/protocol/uri_test.go +++ b/gopls/internal/protocol/uri_test.go
@@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !windows -// +build !windows package protocol_test
diff --git a/gopls/internal/protocol/uri_windows_test.go b/gopls/internal/protocol/uri_windows_test.go index 0847116..bf19c48 100644 --- a/gopls/internal/protocol/uri_windows_test.go +++ b/gopls/internal/protocol/uri_windows_test.go
@@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build windows -// +build windows package protocol_test
diff --git a/gopls/internal/telemetry/telemetry_test.go b/gopls/internal/telemetry/telemetry_test.go index f41769f..63a809c 100644 --- a/gopls/internal/telemetry/telemetry_test.go +++ b/gopls/internal/telemetry/telemetry_test.go
@@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build go1.21 && !openbsd && !js && !wasip1 && !solaris && !android && !386 -// +build go1.21,!openbsd,!js,!wasip1,!solaris,!android,!386 package telemetry_test
diff --git a/gopls/internal/test/integration/misc/generate_test.go b/gopls/internal/test/integration/misc/generate_test.go index daa6599..cb325d8 100644 --- a/gopls/internal/test/integration/misc/generate_test.go +++ b/gopls/internal/test/integration/misc/generate_test.go
@@ -5,7 +5,6 @@ // TODO(rfindley): figure out why go generate fails on android builders. //go:build !android -// +build !android package misc
diff --git a/gopls/internal/test/integration/workspace/quickfix_test.go b/gopls/internal/test/integration/workspace/quickfix_test.go index 9410984..916fbf0 100644 --- a/gopls/internal/test/integration/workspace/quickfix_test.go +++ b/gopls/internal/test/integration/workspace/quickfix_test.go
@@ -488,7 +488,7 @@ t.Fatalf("got %v, want 2 quick fixes", fixes) } good := 0 - failures := "" + var failures strings.Builder for _, f := range fixes { ti := f.Title // these may be overly white-space sensitive @@ -496,11 +496,11 @@ ti == "Add import: \"failure.com/baz\"" { good++ } else { - failures += ti + failures.WriteString(ti) } } if good != 2 { - t.Errorf("failed to find\n%q, got\n%q\n%q", failures, fixes[0].Title, + t.Errorf("failed to find\n%q, got\n%q\n%q", failures.String(), fixes[0].Title, fixes[1].Title) }
diff --git a/gopls/internal/test/marker/marker_test.go b/gopls/internal/test/marker/marker_test.go index fe8277b..e850148 100644 --- a/gopls/internal/test/marker/marker_test.go +++ b/gopls/internal/test/marker/marker_test.go
@@ -1201,9 +1201,9 @@ // Types with special handling. var ( - goldenType = reflect.TypeOf(&Golden{}) - markerType = reflect.TypeOf(marker{}) - stringMatcherType = reflect.TypeOf(stringMatcher{}) + goldenType = reflect.TypeFor[*Golden]() + markerType = reflect.TypeFor[marker]() + stringMatcherType = reflect.TypeFor[stringMatcher]() ) // Custom conversions. @@ -1213,8 +1213,8 @@ // // Converters should return an error rather than calling marker.errorf(). var customConverters = map[reflect.Type]func(marker, any) (any, error){ - reflect.TypeOf(protocol.Location{}): converter(convertLocation), - reflect.TypeOf(completionLabel("")): converter(convertCompletionLabel), + reflect.TypeFor[protocol.Location](): converter(convertLocation), + reflect.TypeFor[completionLabel](): converter(convertCompletionLabel), } // converter transforms a typed argument conversion function to an untyped
diff --git a/gopls/internal/util/fingerprint/fingerprint.go b/gopls/internal/util/fingerprint/fingerprint.go index b279003..20517f1 100644 --- a/gopls/internal/util/fingerprint/fingerprint.go +++ b/gopls/internal/util/fingerprint/fingerprint.go
@@ -113,9 +113,9 @@ buf.WriteString(tname.Name()) } if targs != nil { - for i := range targs.Len() { + for t0 := range targs.Types() { buf.WriteByte(' ') - print(targs.At(i)) + print(t0) } buf.WriteString(")") } @@ -149,9 +149,9 @@ case *types.Tuple: buf.WriteString("(tuple") - for i := range t.Len() { + for v := range t.Variables() { buf.WriteByte(' ') - print(t.At(i).Type()) + print(v.Type()) } buf.WriteByte(')')
diff --git a/gopls/internal/util/frob/frob.go b/gopls/internal/util/frob/frob.go index e5670a2..6ef157b 100644 --- a/gopls/internal/util/frob/frob.go +++ b/gopls/internal/util/frob/frob.go
@@ -45,7 +45,7 @@ func CodecFor[T any]() Codec[T] { frobsMu.Lock() defer frobsMu.Unlock() - return Codec[T]{frobFor(reflect.TypeOf((*T)(nil)).Elem())} + return Codec[T]{frobFor(reflect.TypeFor[T]())} } func (codec Codec[T]) Encode(v T) []byte { return codec.frob.Encode(v) }
diff --git a/gopls/internal/util/typesutil/typesutil.go b/gopls/internal/util/typesutil/typesutil.go index b6046dc..5558c67 100644 --- a/gopls/internal/util/typesutil/typesutil.go +++ b/gopls/internal/util/typesutil/typesutil.go
@@ -110,8 +110,8 @@ retsig := sig.Results() // Append all return declarations' type if len(returnstmt.Results) == 1 { - for i := 0; i < retsig.Len(); i++ { - t := retsig.At(i).Type() + for v := range retsig.Variables() { + t := v.Type() typs = append(typs, validType(t)) } break
diff --git a/gopls/internal/vulncheck/copier.go b/gopls/internal/vulncheck/copier.go index ade5a5f..6ef6ac7 100644 --- a/gopls/internal/vulncheck/copier.go +++ b/gopls/internal/vulncheck/copier.go
@@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build ignore -// +build ignore //go:generate go run ./copier.go
diff --git a/internal/analysisinternal/typeindex/typeindex.go b/internal/analysisinternal/typeindex/typeindex.go index bba21c6..776d186 100644 --- a/internal/analysisinternal/typeindex/typeindex.go +++ b/internal/analysisinternal/typeindex/typeindex.go
@@ -29,5 +29,5 @@ }, RunDespiteErrors: true, Requires: []*analysis.Analyzer{inspect.Analyzer}, - ResultType: reflect.TypeOf(new(typeindex.Index)), + ResultType: reflect.TypeFor[*typeindex.Index](), }
diff --git a/internal/facts/imports.go b/internal/facts/imports.go index cc9383e..324010b 100644 --- a/internal/facts/imports.go +++ b/internal/facts/imports.go
@@ -53,8 +53,8 @@ case typesinternal.NamedOrAlias: // *types.{Named,Alias} // Add the type arguments if this is an instance. if targs := T.TypeArgs(); targs.Len() > 0 { - for i := 0; i < targs.Len(); i++ { - addType(targs.At(i)) + for t := range targs.Types() { + addType(t) } } @@ -70,8 +70,8 @@ // common aspects addObj(T.Obj()) if tparams := T.TypeParams(); tparams.Len() > 0 { - for i := 0; i < tparams.Len(); i++ { - addType(tparams.At(i)) + for tparam := range tparams.TypeParams() { + addType(tparam) } } @@ -81,8 +81,8 @@ addType(aliases.Rhs(T)) case *types.Named: addType(T.Underlying()) - for i := 0; i < T.NumMethods(); i++ { - addObj(T.Method(i)) + for method := range T.Methods() { + addObj(method) } } } @@ -101,28 +101,28 @@ addType(T.Params()) addType(T.Results()) if tparams := T.TypeParams(); tparams != nil { - for i := 0; i < tparams.Len(); i++ { - addType(tparams.At(i)) + for tparam := range tparams.TypeParams() { + addType(tparam) } } case *types.Struct: - for i := 0; i < T.NumFields(); i++ { - addObj(T.Field(i)) + for field := range T.Fields() { + addObj(field) } case *types.Tuple: - for i := 0; i < T.Len(); i++ { - addObj(T.At(i)) + for v := range T.Variables() { + addObj(v) } case *types.Interface: - for i := 0; i < T.NumMethods(); i++ { - addObj(T.Method(i)) + for method := range T.Methods() { + addObj(method) } - for i := 0; i < T.NumEmbeddeds(); i++ { - addType(T.EmbeddedType(i)) // walk Embedded for implicits + for etyp := range T.EmbeddedTypes() { + addType(etyp) // walk Embedded for implicits } case *types.Union: - for i := 0; i < T.Len(); i++ { - addType(T.Term(i).Type()) + for term := range T.Terms() { + addType(term.Type()) } case *types.TypeParam: if !typs[T] {
diff --git a/internal/gcimporter/bexport_test.go b/internal/gcimporter/bexport_test.go index fb18a55..7967240 100644 --- a/internal/gcimporter/bexport_test.go +++ b/internal/gcimporter/bexport_test.go
@@ -259,8 +259,8 @@ methods = append(methods, iface.Method(i)) } var embeddeds []types.Type - for i := 0; i < iface.NumEmbeddeds(); i++ { - embeddeds = append(embeddeds, iface.EmbeddedType(i)) + for etyp := range iface.EmbeddedTypes() { + embeddeds = append(embeddeds, etyp) } return types.NewInterfaceType(methods, embeddeds) }
diff --git a/internal/gcimporter/gcimporter_test.go b/internal/gcimporter/gcimporter_test.go index 9dc65fa..749253b 100644 --- a/internal/gcimporter/gcimporter_test.go +++ b/internal/gcimporter/gcimporter_test.go
@@ -502,8 +502,7 @@ } // check explicitly declared methods - for i := 0; i < iface.NumExplicitMethods(); i++ { - m := iface.ExplicitMethod(i) + for m := range iface.ExplicitMethods() { recv := m.Type().(*types.Signature).Recv() if recv == nil { t.Errorf("%s: missing receiver type", m) @@ -515,9 +514,9 @@ } // check embedded interfaces (if they are named, too) - for i := 0; i < iface.NumEmbeddeds(); i++ { + for etyp := range iface.EmbeddedTypes() { // embedding of interfaces cannot have cycles; recursion will terminate - if etype, _ := types.Unalias(iface.EmbeddedType(i)).(*types.Named); etype != nil { + if etype, _ := types.Unalias(etyp).(*types.Named); etype != nil { verifyInterfaceMethodRecvs(t, etype, level+1) } } @@ -538,8 +537,7 @@ } if tname, _ := obj.(*types.TypeName); tname != nil { named := types.Unalias(tname.Type()).(*types.Named) - for i := 0; i < named.NumMethods(); i++ { - m := named.Method(i) + for m := range named.Methods() { if m.Pkg() == nil { t.Errorf("no pkg for %s", m) }
diff --git a/internal/gcimporter/iexport.go b/internal/gcimporter/iexport.go index 4a4357d..8299efb 100644 --- a/internal/gcimporter/iexport.go +++ b/internal/gcimporter/iexport.go
@@ -829,8 +829,7 @@ // their name must be qualified before exporting recv. if rparams := sig.RecvTypeParams(); rparams.Len() > 0 { prefix := obj.Name() + "." + m.Name() - for i := 0; i < rparams.Len(); i++ { - rparam := rparams.At(i) + for rparam := range rparams.TypeParams() { name := tparamExportName(prefix, rparam) w.p.tparamNames[rparam.Obj()] = name } @@ -1223,20 +1222,19 @@ func (w *exportWriter) typeList(ts *types.TypeList, pkg *types.Package) { w.uint64(uint64(ts.Len())) - for i := 0; i < ts.Len(); i++ { - w.typ(ts.At(i), pkg) + for t := range ts.Types() { + w.typ(t, pkg) } } func (w *exportWriter) tparamList(prefix string, list *types.TypeParamList, pkg *types.Package) { ll := uint64(list.Len()) w.uint64(ll) - for i := 0; i < list.Len(); i++ { - tparam := list.At(i) + for tparam := range list.TypeParams() { // Set the type parameter exportName before exporting its type. exportName := tparamExportName(prefix, tparam) w.p.tparamNames[tparam.Obj()] = exportName - w.typ(list.At(i), pkg) + w.typ(tparam, pkg) } }
diff --git a/internal/refactor/inline/callee.go b/internal/refactor/inline/callee.go index ab2979d..ce5beb2 100644 --- a/internal/refactor/inline/callee.go +++ b/internal/refactor/inline/callee.go
@@ -441,11 +441,11 @@ if sig.Recv() != nil { params = append(params, newParamInfo(sig.Recv(), false)) } - for i := 0; i < sig.Params().Len(); i++ { - params = append(params, newParamInfo(sig.Params().At(i), false)) + for v := range sig.Params().Variables() { + params = append(params, newParamInfo(v, false)) } - for i := 0; i < sig.Results().Len(); i++ { - results = append(results, newParamInfo(sig.Results().At(i), true)) + for v := range sig.Results().Variables() { + results = append(results, newParamInfo(v, true)) } } @@ -517,8 +517,8 @@ paramInfos := make(map[*types.TypeName]*paramInfo) var params []*paramInfo collect := func(tpl *types.TypeParamList) { - for i := range tpl.Len() { - typeName := tpl.At(i).Obj() + for tparam := range tpl.TypeParams() { + typeName := tparam.Obj() info := ¶mInfo{Name: typeName.Name()} params = append(params, info) paramInfos[typeName] = info @@ -659,8 +659,7 @@ return true, types.IsInterface(under.Elem()), false case *types.Struct: // Struct{k: expr} if id, _ := kv.Key.(*ast.Ident); id != nil { - for fi := range under.NumFields() { - field := under.Field(fi) + for field := range under.Fields() { if info.Uses[id] == field { return true, types.IsInterface(field.Type()), false }
diff --git a/internal/typeparams/common_test.go b/internal/typeparams/common_test.go index 3cbd741..be67859 100644 --- a/internal/typeparams/common_test.go +++ b/internal/typeparams/common_test.go
@@ -185,8 +185,7 @@ if mset.Len() == 0 { t.Errorf("NewMethodSet(*T) is empty") } - for i := 0; i < mset.Len(); i++ { - sel := mset.At(i) + for sel := range mset.Methods() { m := sel.Obj().(*types.Func) // TODO(adonovan): check the consistency property required to fix #60634.
diff --git a/internal/typeparams/normalize.go b/internal/typeparams/normalize.go index f49802b..8d13f12 100644 --- a/internal/typeparams/normalize.go +++ b/internal/typeparams/normalize.go
@@ -160,8 +160,7 @@ // The term set of an interface is the intersection of the term sets of its // embedded types. tset.terms = allTermlist - for i := 0; i < u.NumEmbeddeds(); i++ { - embedded := u.EmbeddedType(i) + for embedded := range u.EmbeddedTypes() { if _, ok := embedded.Underlying().(*types.TypeParam); ok { return nil, fmt.Errorf("invalid embedded type %T", embedded) } @@ -174,8 +173,7 @@ case *types.Union: // The term set of a union is the union of term sets of its terms. tset.terms = nil - for i := 0; i < u.Len(); i++ { - t := u.Term(i) + for t := range u.Terms() { var terms termlist switch t.Type().Underlying().(type) { case *types.Interface:
diff --git a/internal/typesinternal/element.go b/internal/typesinternal/element.go index 4957f02..5fe4d8a 100644 --- a/internal/typesinternal/element.go +++ b/internal/typesinternal/element.go
@@ -35,8 +35,8 @@ // Recursion over signatures of each method. tmset := msets.MethodSet(T) - for i := 0; i < tmset.Len(); i++ { - sig := tmset.At(i).Type().(*types.Signature) + for method := range tmset.Methods() { + sig := method.Type().(*types.Signature) // It is tempting to call visit(sig, false) // but, as noted in golang.org/cl/65450043, // the Signature.Recv field is ignored by
diff --git a/internal/typesinternal/isnamed.go b/internal/typesinternal/isnamed.go index f2affec..e0d63c4 100644 --- a/internal/typesinternal/isnamed.go +++ b/internal/typesinternal/isnamed.go
@@ -48,7 +48,7 @@ return ok && IsPackageLevel(obj) && f.Pkg().Path() == pkgPath && - f.Type().(*types.Signature).Recv() == nil && + f.Signature().Recv() == nil && slices.Contains(names, f.Name()) } @@ -60,7 +60,7 @@ // which is important for the performance of syntax matching. func IsMethodNamed(obj types.Object, pkgPath string, typeName string, names ...string) bool { if fn, ok := obj.(*types.Func); ok { - if recv := fn.Type().(*types.Signature).Recv(); recv != nil { + if recv := fn.Signature().Recv(); recv != nil { _, T := ReceiverNamed(recv) return T != nil && IsTypeNamed(T, pkgPath, typeName) &&
diff --git a/internal/typesinternal/zerovalue.go b/internal/typesinternal/zerovalue.go index 453bba2..d612a71 100644 --- a/internal/typesinternal/zerovalue.go +++ b/internal/typesinternal/zerovalue.go
@@ -258,12 +258,12 @@ case *types.Signature: var params []*ast.Field - for i := 0; i < t.Params().Len(); i++ { + for v := range t.Params().Variables() { params = append(params, &ast.Field{ - Type: TypeExpr(t.Params().At(i).Type(), qual), + Type: TypeExpr(v.Type(), qual), Names: []*ast.Ident{ { - Name: t.Params().At(i).Name(), + Name: v.Name(), }, }, }) @@ -273,9 +273,9 @@ last.Type = &ast.Ellipsis{Elt: last.Type.(*ast.ArrayType).Elt} } var returns []*ast.Field - for i := 0; i < t.Results().Len(); i++ { + for v := range t.Results().Variables() { returns = append(returns, &ast.Field{ - Type: TypeExpr(t.Results().At(i).Type(), qual), + Type: TypeExpr(v.Type(), qual), }) } return &ast.FuncType{ @@ -315,8 +315,8 @@ if hasTypeArgs, ok := t.(interface{ TypeArgs() *types.TypeList }); ok { if typeArgs := hasTypeArgs.TypeArgs(); typeArgs != nil && typeArgs.Len() > 0 { var indices []ast.Expr - for i := range typeArgs.Len() { - indices = append(indices, TypeExpr(typeArgs.At(i), qual)) + for t0 := range typeArgs.Types() { + indices = append(indices, TypeExpr(t0, qual)) } expr = &ast.IndexListExpr{ X: expr,
diff --git a/refactor/eg/eg.go b/refactor/eg/eg.go index 8de1fd7..6defdeb 100644 --- a/refactor/eg/eg.go +++ b/refactor/eg/eg.go
@@ -210,8 +210,8 @@ } wildcards := make(map[*types.Var]bool) - for i := 0; i < beforeSig.Params().Len(); i++ { - wildcards[beforeSig.Params().At(i)] = true + for v := range beforeSig.Params().Variables() { + wildcards[v] = true } // checkExprTypes returns an error if Tb (type of before()) is not
diff --git a/refactor/rename/check.go b/refactor/rename/check.go index f41213a..6400123 100644 --- a/refactor/rename/check.go +++ b/refactor/rename/check.go
@@ -445,8 +445,8 @@ // This struct is not a defined type. (It may be an alias.) // We need only check for direct (non-promoted) field/field conflicts. T := info.Types[tStruct].Type.Underlying().(*types.Struct) - for i := 0; i < T.NumFields(); i++ { - if prev := T.Field(i); prev.Name() == r.to { + for field := range T.Fields() { + if prev := field; prev.Name() == r.to { r.errorf(from.Pos(), "renaming this field %q to %q", from.Name(), r.to) r.errorf(prev.Pos(), "\twould conflict with this field") @@ -828,7 +828,7 @@ // recv returns the method's receiver. func recv(meth *types.Func) *types.Var { - return meth.Type().(*types.Signature).Recv() + return meth.Signature().Recv() } // someUse returns an arbitrary use of obj within info.
diff --git a/refactor/rename/rename.go b/refactor/rename/rename.go index 6e6dcbf..a2c2241 100644 --- a/refactor/rename/rename.go +++ b/refactor/rename/rename.go
@@ -325,7 +325,7 @@ // to preserve assignability. for _, obj := range fromObjects { if obj, ok := obj.(*types.Func); ok { - recv := obj.Type().(*types.Signature).Recv() + recv := obj.Signature().Recv() if recv != nil && types.IsInterface(recv.Type()) { r.changeMethods = true break
diff --git a/refactor/rename/util.go b/refactor/rename/util.go index cb7cea3..ce1809d 100644 --- a/refactor/rename/util.go +++ b/refactor/rename/util.go
@@ -26,7 +26,7 @@ return "field" } case *types.Func: - if obj.Type().(*types.Signature).Recv() != nil { + if obj.Signature().Recv() != nil { return "method" } }
diff --git a/refactor/satisfy/find.go b/refactor/satisfy/find.go index 93d0483..6d23aa6 100644 --- a/refactor/satisfy/find.go +++ b/refactor/satisfy/find.go
@@ -172,8 +172,8 @@ // f(g()) call where g has multiple results? f.expr(args[0]) // unpack the tuple - for i := 0; i < tuple.Len(); i++ { - argtypes = append(argtypes, tuple.At(i).Type()) + for v := range tuple.Variables() { + argtypes = append(argtypes, v.Type()) } } else { for _, arg := range args {