Skip to content

Commit

Permalink
Fix issue where enums with duplicate numbers via allow_alias break en…
Browse files Browse the repository at this point in the history
…um value comparison with breaking change detector
  • Loading branch information
bufdev committed Dec 30, 2019
1 parent 8ad4735 commit ad0f047
Show file tree
Hide file tree
Showing 17 changed files with 231 additions and 41 deletions.
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ require (
go.uber.org/atomic v1.5.1 // indirect
go.uber.org/multierr v1.4.0
go.uber.org/zap v1.13.0
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915 // indirect
golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876 // indirect
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f // indirect
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect
golang.org/x/sys v0.0.0-20191224085550-c709ea063b76 // indirect
golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40 // indirect
google.golang.org/genproto v0.0.0-20191223191004-3caeed10a8bf // indirect
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 // indirect
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 // indirect
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb // indirect
gopkg.in/src-d/go-billy.v4 v4.3.2
gopkg.in/src-d/go-git.v4 v4.13.1
gopkg.in/yaml.v2 v2.2.7 // indirect
Expand Down
16 changes: 8 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915 h1:aJ0ex187qoXrJHPo8ZasVTASQB7llQP6YeNzgDALPRk=
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876 h1:sKJQZMuxjOAR/Uo2LBfU90onWEf1dF4C+0hPJCc9Mpc=
golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
Expand Down Expand Up @@ -145,8 +145,8 @@ golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e h1:D5TXcfTk7xF7hvieo4QErS3qqCB4teTffacDWr7CI+0=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191224085550-c709ea063b76 h1:Dho5nD6R3PcW2SH1or8vS0dszDaXRxIw55lBX7XiE5g=
golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtfrKO1Fxrqe8KrkiLXKM=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
Expand All @@ -161,17 +161,17 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98 h1:tZwpOHmF1OEL9wJGSgBALnhFg/8VKjQTtctCX51GLNI=
golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40 h1:UyP2XDSgSc8ldYCxAK735zQxeH3Gd81sK7Iy7AoaVxk=
golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0 h1:ZvI3lsq5AIkr7axxmT3tfwFlJVRFLqe6Fp0W03+MJ38=
google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20191223191004-3caeed10a8bf h1:1x8rC5/IgdLMPbPTvlQTN28+rcy8XL9Q19UWUMDyqYs=
google.golang.org/genproto v0.0.0-20191223191004-3caeed10a8bf/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb h1:ADPHZzpzM4tk4V4S5cnCrr5SwzvlrPRmqqCuJDB8UTs=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
Expand Down
7 changes: 6 additions & 1 deletion internal/buf/bufcheck/bufbreaking/bufbreaking_ext_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ func TestRunBreakingEnumValueNoDelete(t *testing.T) {
analysistesting.NewAnnotation("1.proto", 5, 1, 8, 2, "ENUM_VALUE_NO_DELETE"),
analysistesting.NewAnnotation("1.proto", 12, 5, 15, 6, "ENUM_VALUE_NO_DELETE"),
analysistesting.NewAnnotation("1.proto", 22, 3, 25, 4, "ENUM_VALUE_NO_DELETE"),
analysistesting.NewAnnotation("2.proto", 48, 1, 51, 2, "ENUM_VALUE_NO_DELETE"),
analysistesting.NewAnnotation("1.proto", 40, 1, 43, 2, "ENUM_VALUE_NO_DELETE"),
analysistesting.NewAnnotation("2.proto", 48, 1, 52, 2, "ENUM_VALUE_NO_DELETE"),
)
}

Expand All @@ -47,6 +48,7 @@ func TestRunBreakingEnumValueNoDeleteUnlessNameReserved(t *testing.T) {
analysistesting.NewAnnotation("1.proto", 5, 1, 9, 2, "ENUM_VALUE_NO_DELETE_UNLESS_NAME_RESERVED"),
analysistesting.NewAnnotation("1.proto", 13, 5, 17, 6, "ENUM_VALUE_NO_DELETE_UNLESS_NAME_RESERVED"),
analysistesting.NewAnnotation("1.proto", 24, 3, 28, 4, "ENUM_VALUE_NO_DELETE_UNLESS_NAME_RESERVED"),
analysistesting.NewAnnotation("1.proto", 43, 1, 46, 2, "ENUM_VALUE_NO_DELETE_UNLESS_NAME_RESERVED"),
analysistesting.NewAnnotation("2.proto", 48, 1, 52, 2, "ENUM_VALUE_NO_DELETE_UNLESS_NAME_RESERVED"),
)
}
Expand All @@ -58,6 +60,7 @@ func TestRunBreakingEnumValueNoDeleteUnlessNumberReserved(t *testing.T) {
analysistesting.NewAnnotation("1.proto", 5, 1, 9, 2, "ENUM_VALUE_NO_DELETE_UNLESS_NUMBER_RESERVED"),
analysistesting.NewAnnotation("1.proto", 13, 5, 17, 6, "ENUM_VALUE_NO_DELETE_UNLESS_NUMBER_RESERVED"),
analysistesting.NewAnnotation("1.proto", 24, 3, 28, 4, "ENUM_VALUE_NO_DELETE_UNLESS_NUMBER_RESERVED"),
analysistesting.NewAnnotation("1.proto", 43, 1, 46, 2, "ENUM_VALUE_NO_DELETE_UNLESS_NUMBER_RESERVED"),
analysistesting.NewAnnotation("2.proto", 48, 1, 52, 2, "ENUM_VALUE_NO_DELETE_UNLESS_NUMBER_RESERVED"),
)
}
Expand All @@ -69,6 +72,8 @@ func TestRunBreakingEnumValueSameName(t *testing.T) {
analysistesting.NewAnnotation("1.proto", 8, 15, 8, 16, "ENUM_VALUE_SAME_NAME"),
analysistesting.NewAnnotation("1.proto", 16, 20, 16, 21, "ENUM_VALUE_SAME_NAME"),
analysistesting.NewAnnotation("1.proto", 27, 19, 27, 20, "ENUM_VALUE_SAME_NAME"),
analysistesting.NewAnnotation("1.proto", 46, 16, 46, 17, "ENUM_VALUE_SAME_NAME"),
analysistesting.NewAnnotation("1.proto", 47, 18, 47, 19, "ENUM_VALUE_SAME_NAME"),
analysistesting.NewAnnotation("2.proto", 51, 16, 51, 17, "ENUM_VALUE_SAME_NAME"),
)
}
Expand Down
52 changes: 39 additions & 13 deletions internal/buf/bufcheck/bufbreaking/internal/internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/bufbuild/buf/internal/buf/buferrs"
"github.com/bufbuild/buf/internal/pkg/protodesc"
"github.com/bufbuild/buf/internal/pkg/stringutil"
)

// CheckEnumNoDelete is a check function.
Expand Down Expand Up @@ -56,26 +57,30 @@ func checkEnumValueNoDeleteUnlessNameReserved(add addFunc, previousEnum protodes
}

func checkEnumValueNoDeleteWithRules(add addFunc, previousEnum protodesc.Enum, enum protodesc.Enum, allowIfNumberReserved bool, allowIfNameReserved bool) error {
previousNumberToEnumValue, err := protodesc.NumberToEnumValue(previousEnum)
previousNumberToNameToEnumValue, err := protodesc.NumberToNameToEnumValue(previousEnum)
if err != nil {
return err
}
numberToEnumValue, err := protodesc.NumberToEnumValue(enum)
numberToNameToEnumValue, err := protodesc.NumberToNameToEnumValue(enum)
if err != nil {
return err
}
for previousNumber, previousEnumValue := range previousNumberToEnumValue {
if _, ok := numberToEnumValue[previousNumber]; !ok {
if !isDeletedEnumValueAllowedWithRules(previousEnumValue, enum, allowIfNumberReserved, allowIfNameReserved) {
for previousNumber, previousNameToEnumValue := range previousNumberToNameToEnumValue {
if _, ok := numberToNameToEnumValue[previousNumber]; !ok {
if !isDeletedEnumValueAllowedWithRules(previousNumber, previousNameToEnumValue, enum, allowIfNumberReserved, allowIfNameReserved) {
suffix := ""
if allowIfNumberReserved && allowIfNameReserved {
return buferrs.NewSystemError("both allowIfNumberReserved and allowIfNameReserved set")
}
if allowIfNumberReserved {
suffix = fmt.Sprintf(` without reserving the number "%d"`, previousEnumValue.Number())
suffix = fmt.Sprintf(` without reserving the number "%d"`, previousNumber)
}
if allowIfNameReserved {
suffix = fmt.Sprintf(` without reserving the name %q`, previousEnumValue.Name())
nameSuffix := ""
if len(previousNameToEnumValue) > 1 {
nameSuffix = "s"
}
suffix = fmt.Sprintf(` without reserving the name%s %s`, nameSuffix, stringutil.JoinSliceQuoted(getSortedEnumValueNames(previousNameToEnumValue), ", "))
}
add(enum, enum.Location(), `Previously present enum value "%d" on enum %q was deleted%s.`, previousNumber, enum.Name(), suffix)
}
Expand All @@ -84,17 +89,38 @@ func checkEnumValueNoDeleteWithRules(add addFunc, previousEnum protodesc.Enum, e
return nil
}

func isDeletedEnumValueAllowedWithRules(previousEnumValue protodesc.EnumValue, enum protodesc.Enum, allowIfNumberReserved bool, allowIfNameReserved bool) bool {
return (allowIfNumberReserved && protodesc.NumberInReservedRanges(previousEnumValue.Number(), enum.ReservedRanges()...)) ||
(allowIfNameReserved && protodesc.NameInReservedNames(previousEnumValue.Name(), enum.ReservedNames()...))
func isDeletedEnumValueAllowedWithRules(previousNumber int, previousNameToEnumValue map[string]protodesc.EnumValue, enum protodesc.Enum, allowIfNumberReserved bool, allowIfNameReserved bool) bool {
if allowIfNumberReserved {
return protodesc.NumberInReservedRanges(previousNumber, enum.ReservedRanges()...)
}
if allowIfNameReserved {
// if true for all names, then ok
for previousName := range previousNameToEnumValue {
if !protodesc.NameInReservedNames(previousName, enum.ReservedNames()...) {
return false
}
}
return true
}
return false
}

// CheckEnumValueSameName is a check function.
var CheckEnumValueSameName = newEnumValuePairCheckFunc(checkEnumValueSameName)

func checkEnumValueSameName(add addFunc, previousEnumValue protodesc.EnumValue, enumValue protodesc.EnumValue) error {
if previousEnumValue.Name() != enumValue.Name() {
add(enumValue, enumValue.NumberLocation(), `Enum value "%d" on enum %q changed name from %q to %q.`, enumValue.Number(), enumValue.Enum().Name(), previousEnumValue.Name(), enumValue.Name())
func checkEnumValueSameName(add addFunc, previousNameToEnumValue map[string]protodesc.EnumValue, nameToEnumValue map[string]protodesc.EnumValue) error {
previousNames := getSortedEnumValueNames(previousNameToEnumValue)
names := getSortedEnumValueNames(nameToEnumValue)
if !stringutil.SliceElementsEqual(previousNames, names) {
previousNamesString := stringutil.JoinSliceQuoted(previousNames, ", ")
namesString := stringutil.JoinSliceQuoted(names, ", ")
nameSuffix := ""
if len(previousNames) > 1 && len(names) > 1 {
nameSuffix = "s"
}
for _, enumValue := range nameToEnumValue {
add(enumValue, enumValue.NumberLocation(), `Enum value "%d" on enum %q changed name%s from %s to %s.`, enumValue.Number(), enumValue.Enum().Name(), nameSuffix, previousNamesString, namesString)
}
}
return nil
}
Expand Down
24 changes: 18 additions & 6 deletions internal/buf/bufcheck/bufbreaking/internal/util.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package internal

import (
"sort"
"strings"

"github.com/bufbuild/buf/internal/buf/bufcheck/internal"
Expand Down Expand Up @@ -75,22 +76,24 @@ func newEnumPairCheckFunc(
)
}

// compares all the enums that are of the same number
// map is from name to EnumValue for the given number
func newEnumValuePairCheckFunc(
f func(addFunc, protodesc.EnumValue, protodesc.EnumValue) error,
f func(addFunc, map[string]protodesc.EnumValue, map[string]protodesc.EnumValue) error,
) func(string, []protodesc.File, []protodesc.File) ([]*analysis.Annotation, error) {
return newEnumPairCheckFunc(
func(add addFunc, previousEnum protodesc.Enum, enum protodesc.Enum) error {
previousNumberToEnumValue, err := protodesc.NumberToEnumValue(previousEnum)
previousNumberToNameToEnumValue, err := protodesc.NumberToNameToEnumValue(previousEnum)
if err != nil {
return err
}
numberToEnumValue, err := protodesc.NumberToEnumValue(enum)
numberToNameToEnumValue, err := protodesc.NumberToNameToEnumValue(enum)
if err != nil {
return err
}
for previousNumber, previousEnumValue := range previousNumberToEnumValue {
if enumValue, ok := numberToEnumValue[previousNumber]; ok {
if err := f(add, previousEnumValue, enumValue); err != nil {
for previousNumber, previousNameToEnumValue := range previousNumberToNameToEnumValue {
if nameToEnumValue, ok := numberToNameToEnumValue[previousNumber]; ok {
if err := f(add, previousNameToEnumValue, nameToEnumValue); err != nil {
return err
}
}
Expand Down Expand Up @@ -228,6 +231,15 @@ func getDescriptorAndLocationForDeletedMessage(file protodesc.File, nestedNameTo
return file, nil
}

func getSortedEnumValueNames(nameToEnumValue map[string]protodesc.EnumValue) []string {
names := make([]string, 0, len(nameToEnumValue))
for name := range nameToEnumValue {
names = append(names, name)
}
sort.Strings(names)
return names
}

func withBackupLocation(primary protodesc.Location, secondary protodesc.Location) protodesc.Location {
if primary != nil {
return primary
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,15 @@ message Three {
EIGHT_TWO = 2;
}
}

enum Ten {
option allow_alias = true;
TEN_UNSPECIFIED = 0;
TEN_ONE = 1;
TEN_TWO = 1;
}

enum Eleven {
option allow_alias = true;
ELEVEN_UNSPECIFIED = 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,5 @@ message Three2 {
enum Nine {
NINE_UNSPECIFIED = 0;
NINE_ONE = 1;
NINE_TWO = 3;
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,15 @@ message Three {
EIGHT_TWO = 2;
}
}

enum Ten {
option allow_alias = true;
TEN_UNSPECIFIED = 0;
TEN_ONE = 1;
TEN_TWO = 1;
}

enum Eleven {
option allow_alias = true;
ELEVEN_UNSPECIFIED = 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,15 @@ message Three {
EIGHT_TWO = 2;
}
}

enum Ten {
option allow_alias = true;
TEN_UNSPECIFIED = 0;
TEN_ONE = 1;
TEN_TWO = 1;
}

enum Eleven {
option allow_alias = true;
ELEVEN_UNSPECIFIED = 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,17 @@ message Three {
EIGHT_TWO = 2;
}
}

enum Ten {
option allow_alias = true;
TEN_UNSPECIFIED = 0;
TEN_ONE = 1;
TEN_TWO = 1;
}

enum Eleven {
option allow_alias = true;
ELEVEN_UNSPECIFIED = 0;
ELEVEN_ONE = 1;
ELEVEN_THREE = 1;
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,17 @@ enum Nine {
NINE_ONE = 1;
NINE_TWO = 2;
}

enum Ten {
option allow_alias = true;
TEN_UNSPECIFIED = 0;
TEN_ONE = 1;
TEN_TWO = 1;
}

enum Eleven {
option allow_alias = true;
ELEVEN_UNSPECIFIED = 0;
ELEVEN_ONE = 1;
ELEVEN_TWO = 1;
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,17 @@ enum Nine {
NINE_ONE = 1;
NINE_TWO = 2;
}

enum Ten {
option allow_alias = true;
TEN_UNSPECIFIED = 0;
TEN_ONE = 1;
TEN_TWO = 1;
}

enum Eleven {
option allow_alias = true;
ELEVEN_UNSPECIFIED = 0;
ELEVEN_ONE = 1;
ELEVEN_TWO = 1;
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,17 @@ enum Nine {
NINE_ONE = 1;
NINE_TWO = 2;
}

enum Ten {
option allow_alias = true;
TEN_UNSPECIFIED = 0;
TEN_ONE = 1;
TEN_TWO = 1;
}

enum Eleven {
option allow_alias = true;
ELEVEN_UNSPECIFIED = 0;
ELEVEN_ONE = 1;
ELEVEN_TWO = 1;
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,17 @@ enum Nine {
NINE_ONE = 1;
NINE_TWO = 2;
}

enum Ten {
option allow_alias = true;
TEN_UNSPECIFIED = 0;
TEN_ONE = 1;
TEN_TWO = 1;
}

enum Eleven {
option allow_alias = true;
ELEVEN_UNSPECIFIED = 0;
ELEVEN_ONE = 1;
ELEVEN_TWO = 1;
}
Loading

0 comments on commit ad0f047

Please sign in to comment.