mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-03-12 04:14:21 +00:00
In the upcoming 3.12.x release of protoc, the proto3 language will be amended to support true presence for scalars. This CL adds support to both the generator and runtime to support these semantics. Newly added public API: protogen.Plugin.SupportedFeatures protoreflect.FieldDescriptor.HasPresence protoreflect.FieldDescriptor.HasOptionalKeyword protoreflect.OneofDescriptor.IsSynthetic Change-Id: I7c86bf66d0ae56642109beb5f2132184593747ad Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/230698 Reviewed-by: Damien Neil <dneil@google.com>
41 lines
1.1 KiB
Go
41 lines
1.1 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package fieldsort defines an ordering of fields.
|
|
//
|
|
// The ordering defined by this package matches the historic behavior of the proto
|
|
// package, placing extensions first and oneofs last.
|
|
//
|
|
// There is no guarantee about stability of the wire encoding, and users should not
|
|
// depend on the order defined in this package as it is subject to change without
|
|
// notice.
|
|
package fieldsort
|
|
|
|
import (
|
|
"google.golang.org/protobuf/reflect/protoreflect"
|
|
)
|
|
|
|
// Less returns true if field a comes before field j in ordered wire marshal output.
|
|
func Less(a, b protoreflect.FieldDescriptor) bool {
|
|
ea := a.IsExtension()
|
|
eb := b.IsExtension()
|
|
oa := a.ContainingOneof()
|
|
ob := b.ContainingOneof()
|
|
switch {
|
|
case ea != eb:
|
|
return ea
|
|
case oa != nil && ob != nil:
|
|
if oa == ob {
|
|
return a.Number() < b.Number()
|
|
}
|
|
return oa.Index() < ob.Index()
|
|
case oa != nil && !oa.IsSynthetic():
|
|
return false
|
|
case ob != nil && !ob.IsSynthetic():
|
|
return true
|
|
default:
|
|
return a.Number() < b.Number()
|
|
}
|
|
}
|