loadmode_string.go raw

   1  // Copyright 2019 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package packages
   6  
   7  import (
   8  	"fmt"
   9  	"strings"
  10  )
  11  
  12  var modes = [...]struct {
  13  	mode LoadMode
  14  	name string
  15  }{
  16  	{NeedName, "NeedName"},
  17  	{NeedFiles, "NeedFiles"},
  18  	{NeedCompiledGoFiles, "NeedCompiledGoFiles"},
  19  	{NeedImports, "NeedImports"},
  20  	{NeedDeps, "NeedDeps"},
  21  	{NeedExportFile, "NeedExportFile"},
  22  	{NeedTypes, "NeedTypes"},
  23  	{NeedSyntax, "NeedSyntax"},
  24  	{NeedTypesInfo, "NeedTypesInfo"},
  25  	{NeedTypesSizes, "NeedTypesSizes"},
  26  	{NeedForTest, "NeedForTest"},
  27  	{NeedModule, "NeedModule"},
  28  	{NeedEmbedFiles, "NeedEmbedFiles"},
  29  	{NeedEmbedPatterns, "NeedEmbedPatterns"},
  30  	{NeedTarget, "NeedTarget"},
  31  }
  32  
  33  func (mode LoadMode) String() string {
  34  	if mode == 0 {
  35  		return "LoadMode(0)"
  36  	}
  37  	var out []string
  38  	// named bits
  39  	for _, item := range modes {
  40  		if (mode & item.mode) != 0 {
  41  			mode ^= item.mode
  42  			out = append(out, item.name)
  43  		}
  44  	}
  45  	// unnamed residue
  46  	if mode != 0 {
  47  		if out == nil {
  48  			return fmt.Sprintf("LoadMode(%#x)", int(mode))
  49  		}
  50  		out = append(out, fmt.Sprintf("%#x", int(mode)))
  51  	}
  52  	if len(out) == 1 {
  53  		return out[0]
  54  	}
  55  	return "(" + strings.Join(out, "|") + ")"
  56  }
  57