]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "reflect: support multiple keys in struct tags"
authorIan Lance Taylor <iant@golang.org>
Wed, 6 Jan 2021 22:32:03 +0000 (14:32 -0800)
committerIan Lance Taylor <iant@golang.org>
Thu, 7 Jan 2021 23:43:25 +0000 (23:43 +0000)
Proposal #40281 was initially accepted, but has now been declined.
This CL removes most of the work done to implement it.

Specifically this reverts CLs 248341, 274448, 274474, and 278392.

For #40281
For #43226

Change-Id: I5a9ebb4d9cb5fb0962434b64c59beb8343030be5
Reviewed-on: https://go-review.googlesource.com/c/go/+/281515
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
doc/go1.16.html
src/reflect/all_test.go
src/reflect/type.go

index 3e564f8af61445fb1bb65db107a1a06f91342051..3645e018b21618d416e0a06f3de60227ba34dacd 100644 (file)
@@ -845,17 +845,6 @@ func TestFoo(t *testing.T) {
   </dd>
 </dl><!-- path/filepath -->
 
-<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
-  <dd>
-    <p><!-- CL 248341, golang.org/issues/40281 -->
-      <a href="/pkg/reflect/#StructTag"><code>StructTag</code></a>
-      now allows multiple space-separated keys in key:value pairs,
-      as in <code>`json xml:"field1"`</code> (equivalent to
-      <code>`json:"field1" xml:"field1"`</code>).
-    </p>
-  </dd>
-</dl><!-- reflect -->
-
 <dl id="runtime/debug"><dt><a href="/pkg/runtime/debug/">runtime/debug</a></dt>
   <dd>
     <p><!-- CL 249677 -->
index b01158635f14167d414421bc4a0573512d74031d..1225d6177d4b4709ff9c4982887adfab9dc2fb33 100644 (file)
@@ -7168,176 +7168,6 @@ func TestMapIterDelete1(t *testing.T) {
        }
 }
 
-func TestStructTagLookup(t *testing.T) {
-       var tests = []struct {
-               tag           StructTag
-               key           string
-               expectedValue string
-               expectedOK    bool
-       }{
-               {
-                       tag:           `json:"json_value_1"`,
-                       key:           "json",
-                       expectedValue: "json_value_1",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `json:"json_value_2" xml:"xml_value_2"`,
-                       key:           "json",
-                       expectedValue: "json_value_2",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `json:"json_value_3" xml:"xml_value_3"`,
-                       key:           "xml",
-                       expectedValue: "xml_value_3",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `bson json:"shared_value_4"`,
-                       key:           "json",
-                       expectedValue: "shared_value_4",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `bson json:"shared_value_5"`,
-                       key:           "bson",
-                       expectedValue: "shared_value_5",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `json bson xml form:"field_1,omitempty" other:"value_1"`,
-                       key:           "xml",
-                       expectedValue: "field_1,omitempty",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `json bson xml form:"field_2,omitempty" other:"value_2"`,
-                       key:           "form",
-                       expectedValue: "field_2,omitempty",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `json bson xml form:"field_3,omitempty" other:"value_3"`,
-                       key:           "other",
-                       expectedValue: "value_3",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `json    bson    xml    form:"field_4" other:"value_4"`,
-                       key:           "json",
-                       expectedValue: "field_4",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `json    bson    xml    form:"field_5" other:"value_5"`,
-                       key:           "non_existing",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           `json "json_6"`,
-                       key:           "json",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           `json:"json_7" bson "bson_7"`,
-                       key:           "json",
-                       expectedValue: "json_7",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `json:"json_8" xml "xml_8"`,
-                       key:           "xml",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           `json    bson    xml    form "form_9" other:"value_9"`,
-                       key:           "bson",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           `json bson xml form "form_10" other:"value_10"`,
-                       key:           "other",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           `json bson xml form:"form_11" other "value_11"`,
-                       key:           "json",
-                       expectedValue: "form_11",
-                       expectedOK:    true,
-               },
-               {
-                       tag:           `tag1`,
-                       key:           "tag1",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           `tag2 :"hello_2"`,
-                       key:           "tag2",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           `tag3: "hello_3"`,
-                       key:           "tag3",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           "json\x7fbson: \"hello_4\"",
-                       key:           "json",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           "json\x7fbson: \"hello_5\"",
-                       key:           "bson",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           "json bson:\x7f\"hello_6\"",
-                       key:           "json",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           "json bson:\x7f\"hello_7\"",
-                       key:           "bson",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           "json\x09bson:\"hello_8\"",
-                       key:           "json",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-               {
-                       tag:           "a\x7fb json:\"val\"",
-                       key:           "json",
-                       expectedValue: "",
-                       expectedOK:    false,
-               },
-       }
-
-       for _, test := range tests {
-               v, ok := test.tag.Lookup(test.key)
-               if v != test.expectedValue {
-                       t.Errorf("struct tag lookup failed, got %s, want %s", v, test.expectedValue)
-               }
-               if ok != test.expectedOK {
-                       t.Errorf("struct tag lookup failed, got %t, want %t", ok, test.expectedOK)
-               }
-       }
-}
-
 // iterateToString returns the set of elements
 // returned by an iterator in readable form.
 func iterateToString(it *MapIter) string {
index 1f1e70d485c840ed0d7b1e1d3087251ac5259e4c..a1cdf45e151ada784164fd4ff3a93a8411be12cc 100644 (file)
@@ -1104,16 +1104,12 @@ type StructField struct {
 
 // A StructTag is the tag string in a struct field.
 //
-// By convention, tag strings are a mapping of keys to values.
-// The format is key:"value". Each key is a non-empty string consisting
-// of non-control characters other than space (U+0020 ' '),
-// quote (U+0022 '"'), and colon (U+003A ':'). Each value is quoted
-// using U+0022 '"' characters and Go string literal syntax.
-// Multiple key-value mappings are separated by zero or more spaces, as in
-//   key1:"value1" key2:"value2"
-// Multiple keys may map to a single shared value by separating the keys
-// with spaces, as in
-//   key1 key2:"value"
+// By convention, tag strings are a concatenation of
+// optionally space-separated key:"value" pairs.
+// Each key is a non-empty string consisting of non-control
+// characters other than space (U+0020 ' '), quote (U+0022 '"'),
+// and colon (U+003A ':').  Each value is quoted using U+0022 '"'
+// characters and Go string literal syntax.
 type StructTag string
 
 // Get returns the value associated with key in the tag string.
@@ -1136,9 +1132,6 @@ func (tag StructTag) Lookup(key string) (value string, ok bool) {
        // When modifying this code, also update the validateStructTag code
        // in cmd/vet/structtag.go.
 
-       // keyFound indicates that such key on the left side has already been found.
-       var keyFound bool
-
        for tag != "" {
                // Skip leading space.
                i := 0
@@ -1158,29 +1151,11 @@ func (tag StructTag) Lookup(key string) (value string, ok bool) {
                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] == 0x7f {
+               if i == 0 || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' {
                        break
                }
                name := string(tag[:i])
-               tag = tag[i:]
-
-               // If we found a space char here - assume that we have a tag with
-               // multiple keys.
-               if tag[0] == ' ' {
-                       if name == key {
-                               keyFound = true
-                       }
-                       continue
-               }
-
-               // Spaces were filtered above so we assume that here we have
-               // only valid tag value started with `:"`.
-               if tag[0] != ':' || tag[1] != '"' {
-                       break
-               }
-
-               // Remove the colon leaving tag at the start of the quoted string.
-               tag = tag[1:]
+               tag = tag[i+1:]
 
                // Scan quoted string to find value.
                i = 1
@@ -1196,7 +1171,7 @@ func (tag StructTag) Lookup(key string) (value string, ok bool) {
                qvalue := string(tag[:i+1])
                tag = tag[i+1:]
 
-               if key == name || keyFound {
+               if key == name {
                        value, err := strconv.Unquote(qvalue)
                        if err != nil {
                                break