Skip to content

Commit dbba09c

Browse files
committed
save extensions from field options in message props
1 parent 242be79 commit dbba09c

File tree

12 files changed

+79
-9
lines changed

12 files changed

+79
-9
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ gen-protos: protoc-gen-elixir
1616
protoc -I src -I test/protobuf/protoc/proto --elixir_out=test/protobuf/protoc/proto_gen --plugin=./protoc-gen-elixir test/protobuf/protoc/proto/*.proto
1717
protoc -I src --elixir_out=lib --plugin=./protoc-gen-elixir elixirpb.proto
1818

19-
.PHONY: clean gen_google_proto gen_test_protos
19+
.PHONY: clean protoc-gen-elixir gen-google-protos gen-protos

lib/protobuf/dsl.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ defmodule Protobuf.DSL do
258258
|> cal_encoded_fnum()
259259
end
260260

261+
defp parse_field_opts([{:extensions, map} | t], acc) do
262+
parse_field_opts(t, Map.put(acc, :extensions, map))
263+
end
264+
261265
defp parse_field_opts([{:optional, true} | t], acc) do
262266
parse_field_opts(t, Map.put(acc, :optional?, true))
263267
end

lib/protobuf/field_props.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ defmodule Protobuf.FieldProps do
1717
packed?: boolean,
1818
map?: boolean,
1919
deprecated?: boolean,
20-
encoded_fnum: iodata
20+
encoded_fnum: iodata,
21+
extensions: map
2122
}
2223
defstruct fnum: nil,
2324
name: nil,
@@ -34,5 +35,6 @@ defmodule Protobuf.FieldProps do
3435
packed?: nil,
3536
map?: false,
3637
deprecated?: false,
37-
encoded_fnum: nil
38+
encoded_fnum: nil,
39+
extensions: %{}
3840
end

lib/protobuf/protoc/generator/message.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,13 @@ defmodule Protobuf.Protoc.Generator.Message do
288288
end
289289

290290
defp merge_field_options(opts, f) do
291+
opts =
292+
if map_size(f.options.__pb_extensions__) > 0 do
293+
Map.put(opts, :extensions, inspect(f.options.__pb_extensions__))
294+
else
295+
opts
296+
end
297+
291298
opts
292299
|> Map.put(:packed, f.options.packed)
293300
|> Map.put(:deprecated, f.options.deprecated)

test/protobuf/protoc/generator/message_test.exs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,20 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
143143
number: 1,
144144
type: :TYPE_INT32,
145145
label: :LABEL_OPTIONAL,
146-
options: Google.Protobuf.FieldOptions.new(packed: true)
146+
options:
147+
Google.Protobuf.FieldOptions.new(
148+
packed: true,
149+
__pb_extensions__: %{{Mypkg.PbExtension, :myopt_bool} => true}
150+
)
147151
)
148152
]
149153
)
150154

151155
{[], [msg]} = Generator.generate(ctx, desc)
152-
assert msg =~ "field :a, 1, optional: true, type: :int32, packed: true\n"
156+
157+
assert msg =~
158+
"field :a, 1, optional: true, type: :int32, " <>
159+
"extensions: %{{Mypkg.PbExtension, :myopt_bool} => true}, packed: true\n"
153160
end
154161

155162
test "generate/2 supports option :deprecated" do

test/protobuf/protoc/integration_test.exs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ defmodule Protobuf.Protoc.IntegrationTest do
5050

5151
test "options" do
5252
assert %{deprecated?: true} = My.Test.Options.__message_props__().field_props[1]
53+
54+
assert %{
55+
extensions: %{{Mypkg.PbExtension, :myopt_bool} => true}
56+
} = My.Test.Options.__message_props__().field_props[2]
5357
end
5458

5559
test "extensions" do

test/protobuf/protoc/proto/extension.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ package ext;
44

55
// -I src is needed, see Makefile
66
import "elixirpb.proto";
7+
import "mypkg.proto";
78

89
option (elixirpb.file).module_prefix = "Protobuf.Protoc.ExtTest";
910

1011
message Foo {
1112
optional string a = 1;
13+
optional string b = 2 [(mypkg.myopt_bool)=true];
14+
optional string c = 3 [(mypkg.myopt_string)="test"];
1215
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
syntax = "proto2";
2+
3+
package mypkg;
4+
5+
import "google/protobuf/descriptor.proto";
6+
7+
extend google.protobuf.FieldOptions {
8+
optional bool myopt_bool = 100000;
9+
optional string myopt_string = 100001 [default="test"];
10+
}

test/protobuf/protoc/proto/test.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ package my.test; // dotted package name
66
//import "imp.proto";
77
import "multi/multi1.proto"; // unused import
88

9+
// extensions
10+
import "mypkg.proto";
11+
912
enum HatType {
1013
// deliberately skipping 0
1114
FEDORA = 1;
@@ -125,4 +128,5 @@ message Communique {
125128

126129
message Options {
127130
optional string opt1 = 1 [deprecated=true];
131+
optional string opt2 = 2 [(mypkg.myopt_bool)=true];
128132
}

test/protobuf/protoc/proto_gen/extension.pb.ex

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,21 @@ defmodule Protobuf.Protoc.ExtTest.Foo do
33
use Protobuf, syntax: :proto2
44

55
@type t :: %__MODULE__{
6-
a: String.t()
6+
a: String.t(),
7+
b: String.t(),
8+
c: String.t()
79
}
8-
defstruct [:a]
10+
defstruct [:a, :b, :c]
911

1012
field :a, 1, optional: true, type: :string
13+
14+
field :b, 2,
15+
optional: true,
16+
type: :string,
17+
extensions: %{{Mypkg.PbExtension, :myopt_bool} => true}
18+
19+
field :c, 3,
20+
optional: true,
21+
type: :string,
22+
extensions: %{{Mypkg.PbExtension, :myopt_string} => "test"}
1123
end

0 commit comments

Comments
 (0)