code: func WritePackage(buf *bytes.Buffer, p *Package) {
  	fmt.Fprintf(buf, "%s:\n", p)
  
  	var names []string
  	maxname := 0
  	for name := range p.Members {
  		if l := len(name); l > maxname {
  			maxname = l
  		}
  		names = append(names, name)
  	}
  
  	from := p.Pkg
  	sort.Strings(names)
  	for _, name := range names {
  		switch mem := p.Members[name].(type) {
  		case *NamedConst:
  			fmt.Fprintf(buf, "  const %-*s %s = %s\n",
  				maxname, name, mem.Name(), mem.Value.RelString(from))
  
  		case *Function:
  			fmt.Fprintf(buf, "  func  %-*s %s\n",
  				maxname, name, relType(mem.Type(), from))
  
  		case *Type:
  			fmt.Fprintf(buf, "  type  %-*s %s\n",
  				maxname, name, relType(mem.Type().Underlying(), from))
  			for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
  				fmt.Fprintf(buf, "    %s\n", types.SelectionString(meth, types.RelativeTo(from)))
  			}
  
  		case *Global:
  			fmt.Fprintf(buf, "  var   %-*s %s\n",
  				maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
  		}
  	}
  
  	fmt.Fprintf(buf, "\n")
  }
docs: // WritePackage writes to buf a human-readable summary of p.