+
+// DeclareParams creates Names for all of the parameters in fn's
+// signature and adds them to fn.Dcl.
+//
+// If setNname is true, then it also sets types.Field.Nname for each
+// parameter.
+func (fn *Func) DeclareParams(setNname bool) {
+ if fn.Dcl != nil {
+ base.FatalfAt(fn.Pos(), "%v already has Dcl", fn)
+ }
+
+ declareParams := func(params []*types.Field, ctxt Class, prefix string, offset int) {
+ for i, param := range params {
+ sym := param.Sym
+ if sym == nil || sym.IsBlank() {
+ sym = fn.Sym().Pkg.LookupNum(prefix, i)
+ }
+
+ name := NewNameAt(param.Pos, sym, param.Type)
+ name.Class = ctxt
+ name.Curfn = fn
+ fn.Dcl[offset+i] = name
+
+ if setNname {
+ param.Nname = name
+ }
+ }
+ }
+
+ sig := fn.Type()
+ params := sig.RecvParams()
+ results := sig.Results()
+
+ fn.Dcl = make([]*Name, len(params)+len(results))
+ declareParams(params, PPARAM, "~p", 0)
+ declareParams(results, PPARAMOUT, "~r", len(params))
+}