internal/order: fix sorting of synthetic oneofs to be deterministic
Before this change, synthetic oneofs were ignored in the inOneof() helper
function, but not in the remainder of the LegacyFieldOrder function.
Change-Id: Ia60e5244ae1000e98bbba9dd26f1d1583337fab4
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/497935
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Lasse Folger <lassefolger@google.com>
Reviewed-by: Cassondra Foesch <cfoesch@gmail.com>
diff --git a/internal/order/order.go b/internal/order/order.go
index 33745ed..dea522e 100644
--- a/internal/order/order.go
+++ b/internal/order/order.go
@@ -33,7 +33,7 @@
return !inOneof(ox) && inOneof(oy)
}
// Fields in disjoint oneof sets are sorted by declaration index.
- if ox != nil && oy != nil && ox != oy {
+ if inOneof(ox) && inOneof(oy) && ox != oy {
return ox.Index() < oy.Index()
}
// Fields sorted by field number.
diff --git a/internal/order/order_test.go b/internal/order/order_test.go
index 2560c23..94de421 100644
--- a/internal/order/order_test.go
+++ b/internal/order/order_test.go
@@ -65,9 +65,9 @@
// Non-extension fields that are not within a oneof
// sorted next by field number.
{number: 1},
- {number: 5, oneofIndex: -9}, // synthetic oneof
+ {number: 5, oneofIndex: -10}, // synthetic oneof
{number: 10},
- {number: 11, oneofIndex: -10}, // synthetic oneof
+ {number: 11, oneofIndex: -9}, // synthetic oneof
{number: 12},
// Non-synthetic oneofs sorted last by index.