| // Copyright 2026 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package specgen | |
| // indexKey identifies an API function or method by receiver type name and | |
| // method name. For package-level functions, recv is empty. | |
| type indexKey struct { | |
| recv string | |
| name string | |
| } | |
| // Index provides lookup of concrete spec functions by (receiver, name). | |
| type Index struct { | |
| m map[indexKey]*Func | |
| funcs []*Func | |
| } | |
| // NewIndex builds an Index over the given slice of spec functions. | |
| func NewIndex(funcs []*Func) *Index { | |
| m := make(map[indexKey]*Func, len(funcs)) | |
| for _, fn := range funcs { | |
| var recv string | |
| if fn.Recv.Type != nil { | |
| recv = fn.Recv.Type.String() | |
| } | |
| m[indexKey{recv: recv, name: fn.Name}] = fn | |
| } | |
| return &Index{ | |
| m: m, | |
| funcs: funcs, | |
| } | |
| } | |
| // Lookup finds the spec function for the given receiver and function/method name. | |
| // For package-level functions, recv should be "". | |
| func (idx *Index) Lookup(recv, name string) *Func { | |
| if idx == nil { | |
| return nil | |
| } | |
| return idx.m[indexKey{recv: recv, name: name}] | |
| } | |
| // Funcs returns all functions in the index. | |
| func (idx *Index) Funcs() []*Func { | |
| if idx == nil { | |
| return nil | |
| } | |
| return idx.funcs | |
| } | |
| // Len returns the number of functions in the index. | |
| func (idx *Index) Len() int { | |
| if idx == nil { | |
| return 0 | |
| } | |
| return len(idx.m) | |
| } |