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