diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2023-08-20 10:05:29 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-08-22 01:53:41 +0000 |
| commit | 14f5eb7f31305c682c9734d682e7baa54a1cf63b (patch) | |
| tree | 5a2cbb986db78875f35218ac4c4c65b8b8d86129 /src/cmd/compile/internal/noder | |
| parent | fecf51717f0911e5e6c8ede773656da79c0ade9f (diff) | |
| download | go-14f5eb7f31305c682c9734d682e7baa54a1cf63b.tar.xz | |
cmd/compile/internal/types: overhaul and simplify API
This CL removes a lot of the redundant methods for accessing struct
fields and signature parameters. In particular, users never have to
write ".Slice()" or ".FieldSlice()" anymore; the exported APIs just do
what you want.
Further internal refactorings to follow.
Change-Id: I45212f6772fe16aad39d0e68b82d71b0796e5639
Reviewed-on: https://go-review.googlesource.com/c/go/+/521295
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Auto-Submit: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder')
| -rw-r--r-- | src/cmd/compile/internal/noder/linker.go | 6 | ||||
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 46 |
2 files changed, 26 insertions, 26 deletions
diff --git a/src/cmd/compile/internal/noder/linker.go b/src/cmd/compile/internal/noder/linker.go index 0efe6b630b..71e57741a0 100644 --- a/src/cmd/compile/internal/noder/linker.go +++ b/src/cmd/compile/internal/noder/linker.go @@ -201,7 +201,7 @@ func (l *linker) relocObj(pr *pkgReader, idx pkgbits.Index) pkgbits.Index { if obj.Op() == ir.OTYPE && !obj.Alias() { if typ := obj.Type(); !typ.IsInterface() { - for _, method := range typ.Methods().Slice() { + for _, method := range typ.Methods() { l.exportBody(method.Nname.(*ir.Name), local) } } @@ -290,7 +290,7 @@ func (l *linker) relocFuncExt(w *pkgbits.Encoder, name *ir.Name) { // Escape analysis. for _, fs := range &types.RecvsParams { - for _, f := range fs(name.Type()).FieldSlice() { + for _, f := range fs(name.Type()) { w.String(f.Note) } } @@ -315,7 +315,7 @@ func (l *linker) relocTypeExt(w *pkgbits.Encoder, name *ir.Name) { l.lsymIdx(w, "", reflectdata.TypeLinksym(typ.PtrTo())) if typ.Kind() != types.TINTER { - for _, method := range typ.Methods().Slice() { + for _, method := range typ.Methods() { l.relocFuncExt(w, method.Nname.(*ir.Name)) } } diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index 008d7d5598..6ab7b272a6 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go @@ -809,7 +809,7 @@ func (pr *pkgReader) objIdx(idx pkgbits.Index, implicits, explicits []*types.Typ methods[i] = r.method(rext) } if len(methods) != 0 { - typ.Methods().Set(methods) + typ.SetMethods(methods) } if !r.dict.shaped { @@ -1110,7 +1110,7 @@ func (r *reader) funcExt(name *ir.Name, method *types.Sym) { // Escape analysis. for _, fs := range &types.RecvsParams { - for _, f := range fs(name.Type()).FieldSlice() { + for _, f := range fs(name.Type()) { f.Note = r.String() } } @@ -1355,8 +1355,8 @@ func (r *reader) syntheticArgs(pos src.XPos) (recvs, params ir.Nodes) { } } - addParams(&recvs, sig.Recvs().FieldSlice()) - addParams(¶ms, sig.Params().FieldSlice()) + addParams(&recvs, sig.Recvs()) + addParams(¶ms, sig.Params()) return } @@ -1500,11 +1500,11 @@ func (r *reader) funcargs(fn *ir.Func) { if recv := sig.Recv(); recv != nil { r.funcarg(recv, recv.Sym, ir.PPARAM) } - for _, param := range sig.Params().FieldSlice() { + for _, param := range sig.Params() { r.funcarg(param, param.Sym, ir.PPARAM) } - for i, param := range sig.Results().FieldSlice() { + for i, param := range sig.Results() { sym := types.OrigSym(param.Sym) if sym == nil || sym.IsBlank() { @@ -2201,7 +2201,7 @@ func (r *reader) expr() (res ir.Node) { // interface method values). // if recv.Type().HasShape() { - typ := wrapperFn.Type().Params().Field(0).Type + typ := wrapperFn.Type().Param(0).Type if !types.Identical(typ, recv.Type()) { base.FatalfAt(wrapperFn.Pos(), "receiver %L does not match %L", recv, wrapperFn) } @@ -2263,7 +2263,7 @@ func (r *reader) expr() (res ir.Node) { // rather than types.Identical, because the latter can be confused // by tricky promoted methods (e.g., typeparam/mdempsky/21.go). if wrapperFn != nil && len(implicits) == 0 && !deref && !addr { - if !types.Identical(recv, wrapperFn.Type().Params().Field(0).Type) { + if !types.Identical(recv, wrapperFn.Type().Param(0).Type) { base.FatalfAt(pos, "want receiver type %v, but have method %L", recv, wrapperFn) } return wrapperFn @@ -2563,7 +2563,7 @@ func (r *reader) funcInst(pos src.XPos) (wrapperFn, baseFn, dictPtr ir.Node) { // TODO(mdempsky): Is there a more robust way to get the // dictionary pointer type here? - dictPtrType := baseFn.Type().Params().Field(0).Type + dictPtrType := baseFn.Type().Param(0).Type dictPtr = typecheck.Expr(ir.NewConvExpr(pos, ir.OCONVNOP, dictPtrType, r.dictWord(pos, r.dict.subdictsOffset()+idx))) return @@ -2788,7 +2788,7 @@ func syntheticSig(sig *types.Type) (params, results []*types.Field) { return res } - return clone(sig.Params().FieldSlice()), clone(sig.Results().FieldSlice()) + return clone(sig.Params()), clone(sig.Results()) } func (r *reader) optExpr() ir.Node { @@ -2866,7 +2866,7 @@ func (r *reader) methodExpr() (wrapperFn, baseFn, dictPtr ir.Node) { // TODO(mdempsky): Is there a more robust way to get the // dictionary pointer type here? - dictPtrType := shapedFn.Type().Params().Field(1).Type + dictPtrType := shapedFn.Type().Param(1).Type dictPtr := typecheck.Expr(ir.NewConvExpr(pos, ir.OCONVNOP, dictPtrType, r.dictWord(pos, r.dict.subdictsOffset()+idx))) return nil, shapedFn, dictPtr @@ -2883,7 +2883,7 @@ func (r *reader) methodExpr() (wrapperFn, baseFn, dictPtr ir.Node) { dictPtr := typecheck.Expr(ir.NewAddrExpr(pos, dict)) // Check that dictPtr matches shapedFn's dictionary parameter. - if !types.Identical(dictPtr.Type(), shapedFn.Type().Params().Field(1).Type) { + if !types.Identical(dictPtr.Type(), shapedFn.Type().Param(1).Type) { base.FatalfAt(pos, "dict %L, but shaped method %L", dict, shapedFn) } @@ -2911,7 +2911,7 @@ func shapedMethodExpr(pos src.XPos, obj *ir.Name, sym *types.Sym) *ir.SelectorEx assert(typ.HasShape()) method := func() *types.Field { - for _, method := range typ.Methods().Slice() { + for _, method := range typ.Methods() { if method.Sym == sym { return method } @@ -3770,7 +3770,7 @@ func wrapType(typ *types.Type, target *ir.Package, seen map[string]*types.Type, if !typ.IsInterface() { typecheck.CalcMethods(typ) } - for _, meth := range typ.AllMethods().Slice() { + for _, meth := range typ.AllMethods() { if meth.Sym.IsBlank() || !meth.IsMethod() { base.FatalfAt(meth.Pos, "invalid method: %v", meth) } @@ -3865,8 +3865,8 @@ func newWrapperFunc(pos src.XPos, sym *types.Sym, wrapper *types.Type, method *t fn.SetDupok(true) // TODO(mdempsky): Leave unset for local, non-generic wrappers? // TODO(mdempsky): De-duplicate with similar logic in funcargs. - defParams := func(class ir.Class, params *types.Type) { - for _, param := range params.FieldSlice() { + defParams := func(class ir.Class, params []*types.Field) { + for _, param := range params { param.Nname = fn.NewLocal(param.Pos, param.Sym, class, param.Type) } } @@ -3929,8 +3929,8 @@ func newWrapperType(recvType *types.Type, method *types.Field) *types.Type { if recvType != nil { recv = types.NewField(sig.Recv().Pos, typecheck.Lookup(".this"), recvType) } - params := clone(sig.Params().FieldSlice()) - results := clone(sig.Results().FieldSlice()) + params := clone(sig.Params()) + results := clone(sig.Results()) return types.NewSignature(recv, params, results) } @@ -3938,7 +3938,7 @@ func newWrapperType(recvType *types.Type, method *types.Field) *types.Type { func addTailCall(pos src.XPos, fn *ir.Func, recv ir.Node, method *types.Field) { sig := fn.Nname.Type() args := make([]ir.Node, sig.NumParams()) - for i, param := range sig.Params().FieldSlice() { + for i, param := range sig.Params() { args[i] = param.Nname.(*ir.Name) } @@ -3987,16 +3987,16 @@ func shapeSig(fn *ir.Func, dict *readerDict) *types.Type { recv = types.NewField(oldRecv.Pos, oldRecv.Sym, oldRecv.Type) } - params := make([]*types.Field, 1+sig.Params().Fields().Len()) + params := make([]*types.Field, 1+sig.NumParams()) params[0] = types.NewField(fn.Pos(), fn.Sym().Pkg.Lookup(dictParamName), types.NewPtr(dict.varType())) - for i, param := range sig.Params().Fields().Slice() { + for i, param := range sig.Params() { d := types.NewField(param.Pos, param.Sym, param.Type) d.SetIsDDD(param.IsDDD()) params[1+i] = d } - results := make([]*types.Field, sig.Results().Fields().Len()) - for i, result := range sig.Results().Fields().Slice() { + results := make([]*types.Field, sig.NumResults()) + for i, result := range sig.Results() { results[i] = types.NewField(result.Pos, result.Sym, result.Type) } |
