diff --git a/lib/exprotobuf/parser.ex b/lib/exprotobuf/parser.ex index 99d3b22..8d4c936 100644 --- a/lib/exprotobuf/parser.ex +++ b/lib/exprotobuf/parser.ex @@ -18,10 +18,16 @@ defmodule Protobuf.Parser do |> finalize!(options) end + ## filter information about reserved numbers/names, + ## as they are useless in this context + defp filter_reserved({{:reserved_names, _}, _}), do: false + defp filter_reserved({{:reserved_numbers, _}, _}), do: false + defp filter_reserved(_), do: true + defp finalize!(defs, options) do case :gpb_parse.post_process_all_files(defs, options) do {:ok, defs} -> - defs + defs |> Enum.filter(&filter_reserved/1) {:error, error} -> msg = diff --git a/test/protobuf_test.exs b/test/protobuf_test.exs index d2d4d09..c199f68 100644 --- a/test/protobuf_test.exs +++ b/test/protobuf_test.exs @@ -1,6 +1,34 @@ defmodule ProtobufTest do use Protobuf.Case + test "can handle reserved fields" do + defmodule ReservedProto3 do + use Protobuf, """ + syntax = "proto3"; + + message Foo { + reserved 2, 15, 9 to 11; + reserved "foo", "bar"; + string f1 = 1; + } + """ + end + + defmodule ReservedProto2 do + use Protobuf, """ + message Foo { + reserved 2, 15, 9 to 11; + reserved "foo", "bar"; + string f1 = 1; + } + """ + end + + # just the compilation pass should suffice as a test itself + _ = ReservedProto3.Foo.new(f1: "test") + _ = ReservedProto2.Foo.new(f1: "test") + end + test "can roundtrip encoding/decoding optional values in proto2" do defmodule RoundtripProto2 do use Protobuf, """