internal: simplify ExtensionInfo initialization
This CL:
* Make the meaning of impl/ExtensionInfo.goType consistent. Before,
it was sometimes a T and other times a []T depending on the current
state of initialization. Change it so that it is the constructor's
responsibility to pass in a []T if it is repeated.
* Make internal/filetype responsible for constructing a []T for
repeated extension fields.
* Makes filedesc/Extension.Cardinality one of the eagerly initialized
pieces of information since it is useful to internal/filetype.
* Unify ExtensionInfo.desc and ExtensionInfo.tdesc.ExtensionField,
which held the same information.
* Remove the internal implementation for impl.X.ExtensionDescFromType
since we are dropping support for this from v1.
Change-Id: Ie95c4de66cd674c1d886da4f63b133b7d763c7ef
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/195777
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/filedesc/desc.go b/internal/filedesc/desc.go
index 86f24f0..0ee518e 100644
--- a/internal/filedesc/desc.go
+++ b/internal/filedesc/desc.go
@@ -355,18 +355,18 @@
L2 *ExtensionL2 // protected by fileDesc.once
}
ExtensionL1 struct {
- Number pref.FieldNumber
- Extendee pref.MessageDescriptor
- Kind pref.Kind
+ Number pref.FieldNumber
+ Extendee pref.MessageDescriptor
+ Cardinality pref.Cardinality
+ Kind pref.Kind
}
ExtensionL2 struct {
- Options func() pref.ProtoMessage
- Cardinality pref.Cardinality
- JSONName jsonName
- IsPacked bool // promoted from google.protobuf.FieldOptions
- Default defaultValue
- Enum pref.EnumDescriptor
- Message pref.MessageDescriptor
+ Options func() pref.ProtoMessage
+ JSONName jsonName
+ IsPacked bool // promoted from google.protobuf.FieldOptions
+ Default defaultValue
+ Enum pref.EnumDescriptor
+ Message pref.MessageDescriptor
}
)
@@ -377,7 +377,7 @@
return descopts.Field
}
func (xd *Extension) Number() pref.FieldNumber { return xd.L1.Number }
-func (xd *Extension) Cardinality() pref.Cardinality { return xd.lazyInit().Cardinality }
+func (xd *Extension) Cardinality() pref.Cardinality { return xd.L1.Cardinality }
func (xd *Extension) Kind() pref.Kind { return xd.L1.Kind }
func (xd *Extension) HasJSONName() bool { return xd.lazyInit().JSONName.has }
func (xd *Extension) JSONName() string { return xd.lazyInit().JSONName.get(xd) }
diff --git a/internal/filedesc/desc_init.go b/internal/filedesc/desc_init.go
index 90357bc..1b6daf0 100644
--- a/internal/filedesc/desc_init.go
+++ b/internal/filedesc/desc_init.go
@@ -379,6 +379,8 @@
switch num {
case fieldnum.FieldDescriptorProto_Number:
xd.L1.Number = pref.FieldNumber(v)
+ case fieldnum.FieldDescriptorProto_Label:
+ xd.L1.Cardinality = pref.Cardinality(v)
case fieldnum.FieldDescriptorProto_Type:
xd.L1.Kind = pref.Kind(v)
}
diff --git a/internal/filedesc/desc_lazy.go b/internal/filedesc/desc_lazy.go
index a9f9002..b989092 100644
--- a/internal/filedesc/desc_lazy.go
+++ b/internal/filedesc/desc_lazy.go
@@ -537,13 +537,6 @@
num, typ, n := wire.ConsumeTag(b)
b = b[n:]
switch typ {
- case wire.VarintType:
- v, m := wire.ConsumeVarint(b)
- b = b[m:]
- switch num {
- case fieldnum.FieldDescriptorProto_Label:
- xd.L2.Cardinality = pref.Cardinality(v)
- }
case wire.BytesType:
v, m := wire.ConsumeBytes(b)
b = b[m:]