Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / go / ssa / mode.go
1 // Copyright 2015 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 ssa
6
7 // This file defines the BuilderMode type and its command-line flag.
8
9 import (
10         "bytes"
11         "fmt"
12 )
13
14 // BuilderMode is a bitmask of options for diagnostics and checking.
15 //
16 // *BuilderMode satisfies the flag.Value interface.  Example:
17 //
18 //      var mode = ssa.BuilderMode(0)
19 //      func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) }
20 //
21 type BuilderMode uint
22
23 const (
24         PrintPackages        BuilderMode = 1 << iota // Print package inventory to stdout
25         PrintFunctions                               // Print function SSA code to stdout
26         LogSource                                    // Log source locations as SSA builder progresses
27         SanityCheckFunctions                         // Perform sanity checking of function bodies
28         NaiveForm                                    // Build naïve SSA form: don't replace local loads/stores with registers
29         BuildSerially                                // Build packages serially, not in parallel.
30         GlobalDebug                                  // Enable debug info for all packages
31         BareInits                                    // Build init functions without guards or calls to dependent inits
32 )
33
34 const BuilderModeDoc = `Options controlling the SSA builder.
35 The value is a sequence of zero or more of these letters:
36 C       perform sanity [C]hecking of the SSA form.
37 D       include [D]ebug info for every function.
38 P       print [P]ackage inventory.
39 F       print [F]unction SSA code.
40 S       log [S]ource locations as SSA builder progresses.
41 L       build distinct packages seria[L]ly instead of in parallel.
42 N       build [N]aive SSA form: don't replace local loads/stores with registers.
43 I       build bare [I]nit functions: no init guards or calls to dependent inits.
44 `
45
46 func (m BuilderMode) String() string {
47         var buf bytes.Buffer
48         if m&GlobalDebug != 0 {
49                 buf.WriteByte('D')
50         }
51         if m&PrintPackages != 0 {
52                 buf.WriteByte('P')
53         }
54         if m&PrintFunctions != 0 {
55                 buf.WriteByte('F')
56         }
57         if m&LogSource != 0 {
58                 buf.WriteByte('S')
59         }
60         if m&SanityCheckFunctions != 0 {
61                 buf.WriteByte('C')
62         }
63         if m&NaiveForm != 0 {
64                 buf.WriteByte('N')
65         }
66         if m&BuildSerially != 0 {
67                 buf.WriteByte('L')
68         }
69         return buf.String()
70 }
71
72 // Set parses the flag characters in s and updates *m.
73 func (m *BuilderMode) Set(s string) error {
74         var mode BuilderMode
75         for _, c := range s {
76                 switch c {
77                 case 'D':
78                         mode |= GlobalDebug
79                 case 'P':
80                         mode |= PrintPackages
81                 case 'F':
82                         mode |= PrintFunctions
83                 case 'S':
84                         mode |= LogSource | BuildSerially
85                 case 'C':
86                         mode |= SanityCheckFunctions
87                 case 'N':
88                         mode |= NaiveForm
89                 case 'L':
90                         mode |= BuildSerially
91                 default:
92                         return fmt.Errorf("unknown BuilderMode option: %q", c)
93                 }
94         }
95         *m = mode
96         return nil
97 }
98
99 // Get returns m.
100 func (m BuilderMode) Get() interface{} { return m }