Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / honnef.co / go / tools@v0.0.1-2020.1.5 / staticcheck / structtag.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/honnef.co/go/tools@v0.0.1-2020.1.5/staticcheck/structtag.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/honnef.co/go/tools@v0.0.1-2020.1.5/staticcheck/structtag.go
new file mode 100644 (file)
index 0000000..38830a2
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Copyright 2019 Dominik Honnef. All rights reserved.
+
+package staticcheck
+
+import "strconv"
+
+func parseStructTag(tag string) (map[string][]string, error) {
+       // FIXME(dh): detect missing closing quote
+       out := map[string][]string{}
+
+       for tag != "" {
+               // Skip leading space.
+               i := 0
+               for i < len(tag) && tag[i] == ' ' {
+                       i++
+               }
+               tag = tag[i:]
+               if tag == "" {
+                       break
+               }
+
+               // Scan to colon. A space, a quote or a control character is a syntax error.
+               // Strictly speaking, control chars include the range [0x7f, 0x9f], not just
+               // [0x00, 0x1f], but in practice, we ignore the multi-byte control characters
+               // as it is simpler to inspect the tag's bytes than the tag's runes.
+               i = 0
+               for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f {
+                       i++
+               }
+               if i == 0 || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' {
+                       break
+               }
+               name := string(tag[:i])
+               tag = tag[i+1:]
+
+               // Scan quoted string to find value.
+               i = 1
+               for i < len(tag) && tag[i] != '"' {
+                       if tag[i] == '\\' {
+                               i++
+                       }
+                       i++
+               }
+               if i >= len(tag) {
+                       break
+               }
+               qvalue := string(tag[:i+1])
+               tag = tag[i+1:]
+
+               value, err := strconv.Unquote(qvalue)
+               if err != nil {
+                       return nil, err
+               }
+               out[name] = append(out[name], value)
+       }
+       return out, nil
+}