// 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) }