diff options
Diffstat (limited to 'vendor/golang.org/x/tools/go/buildutil/tags.go')
-rw-r--r-- | vendor/golang.org/x/tools/go/buildutil/tags.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/vendor/golang.org/x/tools/go/buildutil/tags.go b/vendor/golang.org/x/tools/go/buildutil/tags.go new file mode 100644 index 0000000..486606f --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/tags.go | |||
@@ -0,0 +1,75 @@ | |||
1 | package buildutil | ||
2 | |||
3 | // This logic was copied from stringsFlag from $GOROOT/src/cmd/go/build.go. | ||
4 | |||
5 | import "fmt" | ||
6 | |||
7 | const TagsFlagDoc = "a list of `build tags` to consider satisfied during the build. " + | ||
8 | "For more information about build tags, see the description of " + | ||
9 | "build constraints in the documentation for the go/build package" | ||
10 | |||
11 | // TagsFlag is an implementation of the flag.Value and flag.Getter interfaces that parses | ||
12 | // a flag value in the same manner as go build's -tags flag and | ||
13 | // populates a []string slice. | ||
14 | // | ||
15 | // See $GOROOT/src/go/build/doc.go for description of build tags. | ||
16 | // See $GOROOT/src/cmd/go/doc.go for description of 'go build -tags' flag. | ||
17 | // | ||
18 | // Example: | ||
19 | // flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) | ||
20 | type TagsFlag []string | ||
21 | |||
22 | func (v *TagsFlag) Set(s string) error { | ||
23 | var err error | ||
24 | *v, err = splitQuotedFields(s) | ||
25 | if *v == nil { | ||
26 | *v = []string{} | ||
27 | } | ||
28 | return err | ||
29 | } | ||
30 | |||
31 | func (v *TagsFlag) Get() interface{} { return *v } | ||
32 | |||
33 | func splitQuotedFields(s string) ([]string, error) { | ||
34 | // Split fields allowing '' or "" around elements. | ||
35 | // Quotes further inside the string do not count. | ||
36 | var f []string | ||
37 | for len(s) > 0 { | ||
38 | for len(s) > 0 && isSpaceByte(s[0]) { | ||
39 | s = s[1:] | ||
40 | } | ||
41 | if len(s) == 0 { | ||
42 | break | ||
43 | } | ||
44 | // Accepted quoted string. No unescaping inside. | ||
45 | if s[0] == '"' || s[0] == '\'' { | ||
46 | quote := s[0] | ||
47 | s = s[1:] | ||
48 | i := 0 | ||
49 | for i < len(s) && s[i] != quote { | ||
50 | i++ | ||
51 | } | ||
52 | if i >= len(s) { | ||
53 | return nil, fmt.Errorf("unterminated %c string", quote) | ||
54 | } | ||
55 | f = append(f, s[:i]) | ||
56 | s = s[i+1:] | ||
57 | continue | ||
58 | } | ||
59 | i := 0 | ||
60 | for i < len(s) && !isSpaceByte(s[i]) { | ||
61 | i++ | ||
62 | } | ||
63 | f = append(f, s[:i]) | ||
64 | s = s[i:] | ||
65 | } | ||
66 | return f, nil | ||
67 | } | ||
68 | |||
69 | func (v *TagsFlag) String() string { | ||
70 | return "<tagsFlag>" | ||
71 | } | ||
72 | |||
73 | func isSpaceByte(c byte) bool { | ||
74 | return c == ' ' || c == '\t' || c == '\n' || c == '\r' | ||
75 | } | ||