// MethodValue returns the Function implementing method sel, building // wrapper methods on demand. It returns nil if sel denotes an // interface or generic method. // // Precondition: sel.Kind() == MethodVal. // // Thread-safe. // // Acquires prog.methodsMu. func (prog *Program) MethodValue(sel *types.Selection) *Function { … } // objectMethod returns the Function for a given method symbol. // The symbol may be an instance of a generic function. It need not // belong to an existing SSA package created by a call to // prog.CreatePackage. // // objectMethod panics if the function is not a method. // // Acquires prog.objectMethodsMu. func (prog *Program) objectMethod(obj *types.Func, b *builder) *Function { … } // LookupMethod returns the implementation of the method of type T // identified by (pkg, name). It returns nil if the method exists but // is an interface method or generic method, and panics if T has no such method. func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function { … } type methodSet … // RuntimeTypes returns a new unordered slice containing all types in // the program for which a runtime type is required. // // A runtime type is required for any non-parameterized, non-interface // type that is converted to an interface, or for any type (including // interface types) derivable from one through reflection. // // The methods of such types may be reachable through reflection or // interface calls even if they are never called directly. // // Thread-safe. // // Acquires prog.makeInterfaceTypesMu. func (prog *Program) RuntimeTypes() []types.Type { … }