From c8a104b40eea4470c707bfa33dcbda074ff1493c Mon Sep 17 00:00:00 2001 From: Alexandre Hamez Date: Tue, 16 Jun 2020 21:58:24 +0200 Subject: [PATCH] Fix parse of packed repeated enums in proto3 files --- lib/protox/parse.ex | 9 +++++---- test/protox_test.exs | 6 ++++-- test/samples/file_descriptor_set.bin | Bin 2330 -> 2408 bytes test/samples/proto3.proto | 2 ++ 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/protox/parse.ex b/lib/protox/parse.ex index 1a6bbe04..0765d8e4 100644 --- a/lib/protox/parse.ex +++ b/lib/protox/parse.ex @@ -209,7 +209,7 @@ defmodule Protox.Parse do case map_entry(upper, msg_name, descriptor) do nil -> type = get_type(descriptor) - kind = get_kind(syntax, upper, descriptor, type) + kind = get_kind(syntax, upper, descriptor) {descriptor.label, kind, type} map_type -> @@ -270,7 +270,7 @@ defmodule Protox.Parse do |> Enum.map(&Macro.camelize(&1)) end - defp get_kind(syntax, upper, descriptor, type) do + defp get_kind(syntax, upper, descriptor) do import Protox.Guards case descriptor do @@ -284,8 +284,9 @@ defmodule Protox.Parse do %FieldDescriptorProto{label: :repeated, options: %FieldOptions{packed: false}} -> :unpacked - %FieldDescriptorProto{label: :repeated} -> - case {syntax, type} do + %FieldDescriptorProto{label: :repeated, type: field_type} -> + case {syntax, field_type} do + {:proto3, :enum} -> :packed {:proto3, ty} when is_primitive(ty) -> :packed _ -> :unpacked end diff --git a/test/protox_test.exs b/test/protox_test.exs index ee687d75..8508722d 100644 --- a/test/protox_test.exs +++ b/test/protox_test.exs @@ -170,7 +170,8 @@ defmodule ProtoxTest do {:oneof_2_nested_enum, {:oneof, :oneof_2}, {:enum, Abc.Def.Proto3.NestedEnum}}, 9999 => {:nested_enum, {:default, :FOO}, {:enum, Abc.Def.Proto3.NestedEnum}}, 200 => {:repeated_int32_packed, :packed, :int32}, - 201 => {:repeated_int32_unpacked, :unpacked, :int32} + 201 => {:repeated_int32_unpacked, :unpacked, :int32}, + 51 => {:repeated_nested_enum, :packed, {:enum, Abc.Def.Proto3.NestedEnum}} } end @@ -225,7 +226,8 @@ defmodule ProtoxTest do 9999 => {:nested_enum, {:default, :FOO}, {:enum, Namespace.Abc.Def.Proto3.NestedEnum}}, 200 => {:repeated_int32_packed, :packed, :int32}, - 201 => {:repeated_int32_unpacked, :unpacked, :int32} + 201 => {:repeated_int32_unpacked, :unpacked, :int32}, + 51 => {:repeated_nested_enum, :packed, {:enum, Namespace.Abc.Def.Proto3.NestedEnum}} } end diff --git a/test/samples/file_descriptor_set.bin b/test/samples/file_descriptor_set.bin index 6b0a35596500a06c2cc65a85d896fe484f69b7c9..27bd55e81f1964e0948c5bc8a0d2e32b5bdfc272 100644 GIT binary patch delta 43 zcmbOw^g?I@6AR;$$;>S3jJGyxv&1no3HeOCFV1YNz&!aSoBU)!M&Zq!>=PLQAGHjR delta 25 hcmaDMG)rg$6ARS3j6IvRS>l*CUuU1l2mocb2dDr5 diff --git a/test/samples/proto3.proto b/test/samples/proto3.proto index 6231c33a..70feb5b3 100644 --- a/test/samples/proto3.proto +++ b/test/samples/proto3.proto @@ -42,6 +42,8 @@ message Proto3 { repeated int32 repeated_int32_packed = 200 [packed = true]; repeated int32 repeated_int32_unpacked = 201 [packed = false]; + + repeated NestedEnum repeated_nested_enum = 51; } message EmptyProto3 {