Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ end
use Protobuf, syntax: :proto3

@type t :: %__MODULE__{
name: String.t
name: String.t()
}
defstruct [:name]

Expand All @@ -84,7 +84,7 @@ end
use Protobuf, syntax: :proto3

@type t :: %__MODULE__{
message: String.t
message: String.t()
}
defstruct [:message]

Expand Down
2 changes: 1 addition & 1 deletion lib/google/compiler/plugin.pb.ex
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ defmodule Google.Protobuf.Compiler.CodeGeneratorRequest do
use Protobuf, syntax: :proto2

@type t :: %__MODULE__{
file_to_generate: String.t(),
file_to_generate: [String.t()],
parameter: String.t(),
proto_file: [Google.Protobuf.FileDescriptorProto.t()],
compiler_version: Google.Protobuf.Compiler.Version.t() | nil
Expand Down
18 changes: 9 additions & 9 deletions lib/google/descriptor.pb.ex
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ defmodule Google.Protobuf.FileDescriptorProto do
@type t :: %__MODULE__{
name: String.t(),
package: String.t(),
dependency: String.t(),
public_dependency: integer,
weak_dependency: integer,
dependency: [String.t()],
public_dependency: [integer],
weak_dependency: [integer],
message_type: [Google.Protobuf.DescriptorProto.t()],
enum_type: [Google.Protobuf.EnumDescriptorProto.t()],
service: [Google.Protobuf.ServiceDescriptorProto.t()],
Expand Down Expand Up @@ -208,7 +208,7 @@ defmodule Google.Protobuf.DescriptorProto do
oneof_decl: [Google.Protobuf.OneofDescriptorProto.t()],
options: Google.Protobuf.MessageOptions.t() | nil,
reserved_range: [Google.Protobuf.DescriptorProto.ReservedRange.t()],
reserved_name: String.t()
reserved_name: [String.t()]
}

defstruct [
Expand Down Expand Up @@ -346,7 +346,7 @@ defmodule Google.Protobuf.EnumDescriptorProto do
value: [Google.Protobuf.EnumValueDescriptorProto.t()],
options: Google.Protobuf.EnumOptions.t() | nil,
reserved_range: [Google.Protobuf.EnumDescriptorProto.EnumReservedRange.t()],
reserved_name: String.t()
reserved_name: [String.t()]
}

defstruct [:name, :value, :options, :reserved_range, :reserved_name]
Expand Down Expand Up @@ -762,11 +762,11 @@ defmodule Google.Protobuf.SourceCodeInfo.Location do
use Protobuf, syntax: :proto2

@type t :: %__MODULE__{
path: integer,
span: integer,
path: [integer],
span: [integer],
leading_comments: String.t(),
trailing_comments: String.t(),
leading_detached_comments: String.t()
leading_detached_comments: [String.t()]
}

defstruct [:path, :span, :leading_comments, :trailing_comments, :leading_detached_comments]
Expand Down Expand Up @@ -800,7 +800,7 @@ defmodule Google.Protobuf.GeneratedCodeInfo.Annotation do
use Protobuf, syntax: :proto2

@type t :: %__MODULE__{
path: integer,
path: [integer],
source_file: String.t(),
begin: integer,
end: integer
Expand Down
37 changes: 20 additions & 17 deletions lib/protobuf/protoc/generator/message.ex
Original file line number Diff line number Diff line change
Expand Up @@ -159,29 +159,32 @@ defmodule Protobuf.Protoc.Generator.Message do
String.pad_trailing("#{name}:", len + 1)
end

defp fmt_type(%{opts: %{map: true}, map: {{k_type, k_name}, {v_type, v_name}}}) do
k_type = type_to_spec(k_type, k_name)
v_type = type_to_spec(v_type, v_name)
"%{#{k_type} => #{v_type}}"
defp fmt_type(%{opts: %{map: true}, map: {{k_type_enum, _k_type}, {v_type_enum, v_type}}}) do
# Keys are guaranteed to be scalars. Values can be anything except another map. Map fields
# cannot be `repeated`.
k_spec = TypeUtil.enum_to_spec(k_type_enum)
v_spec = type_to_spec(v_type_enum, v_type)
v_spec = optional_if_message(v_type_enum, v_spec)

"%{#{k_spec} => #{v_spec}}"
end

defp fmt_type(%{label: "repeated", type_enum: type_enum, type: type}) do
type_to_spec(type_enum, type, true)
end
defp fmt_type(%{label: label, type_enum: type_enum, type: type}) do
spec = type_to_spec(type_enum, type)

defp fmt_type(%{type_enum: type_enum, type: type}) do
"#{type_to_spec(type_enum, type)}"
if label == "repeated" do
"[#{spec}]"
else
optional_if_message(type_enum, spec)
end
end

defp type_to_spec(enum, type, repeated \\ false)

defp type_to_spec(:TYPE_MESSAGE, type, repeated),
do: TypeUtil.enum_to_spec(:TYPE_MESSAGE, type, repeated)

defp type_to_spec(:TYPE_ENUM, type, repeated),
do: TypeUtil.enum_to_spec(:TYPE_ENUM, type, repeated)
defp type_to_spec(:TYPE_MESSAGE, type), do: "#{type}.t()"
defp type_to_spec(:TYPE_ENUM, type), do: "#{type}.t()"
defp type_to_spec(type_scalar, _type), do: TypeUtil.enum_to_spec(type_scalar)

defp type_to_spec(enum, _, _), do: TypeUtil.enum_to_spec(enum)
defp optional_if_message(:TYPE_MESSAGE, spec), do: "#{spec} | nil"
defp optional_if_message(_type_others, spec), do: spec

def get_fields(ctx, desc) do
oneofs = Enum.map(desc.oneof_decl, & &1.name)
Expand Down
9 changes: 3 additions & 6 deletions lib/protobuf/type_util.ex
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,14 @@ defmodule Protobuf.TypeUtil do
def enum_to_spec(:TYPE_FIXED64), do: "non_neg_integer"
def enum_to_spec(:TYPE_FIXED32), do: "non_neg_integer"
def enum_to_spec(:TYPE_BOOL), do: "boolean"
def enum_to_spec(:TYPE_STRING), do: "String.t"
def enum_to_spec(:TYPE_STRING), do: "String.t()"
def enum_to_spec(:TYPE_GROUP), do: "any"
def enum_to_spec(:TYPE_MESSAGE), do: "binary"
def enum_to_spec(:TYPE_BYTES), do: "binary"
def enum_to_spec(:TYPE_UINT32), do: "non_neg_integer"
def enum_to_spec(:TYPE_ENUM), do: "integer"
def enum_to_spec(:TYPE_SFIXED32), do: "integer"
def enum_to_spec(:TYPE_SFIXED64), do: "integer"
def enum_to_spec(:TYPE_SINT32), do: "integer"
def enum_to_spec(:TYPE_SINT64), do: "integer"
def enum_to_spec(_), do: "any"
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TYPE_GROUP was the only one missing, added above ☝️. Removing this catch-all clause will make the library more strict (and brittle) in regards to the unknown future. As an alternative, we could add it back but raise a warning instead.

def enum_to_spec(:TYPE_MESSAGE, type, true = _repeated), do: "[#{type}.t]"
def enum_to_spec(:TYPE_MESSAGE, type, false = _repeated), do: "#{type}.t | nil"
def enum_to_spec(:TYPE_ENUM, type, true = _repeated), do: "[#{type}.t]"
def enum_to_spec(:TYPE_ENUM, type, false = _repeated), do: "#{type}.t"
Comment on lines -39 to -42
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The label (optional, required or repeated) logic didn't seem to fit well in here, so I moved it up to the caller.

end
16 changes: 8 additions & 8 deletions test/protobuf/protoc/generator/message_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
{[], [msg]} = Generator.generate(ctx, desc)
assert msg =~ "defstruct [:a, :b]\n"
assert msg =~ "a: integer"
assert msg =~ "b: String.t"
assert msg =~ "b: String.t()"
assert msg =~ "field :a, 1, optional: true, type: :int32\n"
assert msg =~ "field :b, 2, required: true, type: :string\n"
end
Expand Down Expand Up @@ -120,7 +120,7 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
{[], [msg]} = Generator.generate(ctx, desc)
assert msg =~ "defstruct [:a, :b, :c]\n"
assert msg =~ "a: integer"
assert msg =~ "b: String.t"
assert msg =~ "b: String.t()"
assert msg =~ "field :a, 1, type: :int32\n"
assert msg =~ "field :b, 2, type: :string\n"
assert msg =~ "field :c, 3, repeated: true, type: :int32\n"
Expand Down Expand Up @@ -226,8 +226,8 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
)

{[], [msg]} = Generator.generate(ctx, desc)
assert msg =~ "bar: Bar.t | nil"
assert msg =~ "baz: [Baz.t]"
assert msg =~ "bar: Bar.t() | nil"
assert msg =~ "baz: [Baz.t()]"
end

test "generate/2 supports map field" do
Expand Down Expand Up @@ -279,7 +279,7 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
)

{[[]], [_, msg]} = Generator.generate(ctx, desc)
assert msg =~ "a: %{integer => FooBar.AbCd.Bar.t | nil}"
assert msg =~ "a: %{integer => FooBar.AbCd.Bar.t() | nil}"
assert msg =~ "field :a, 1, repeated: true, type: FooBar.AbCd.Foo.ProjectsEntry, map: true\n"
end

Expand Down Expand Up @@ -307,7 +307,7 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
)

{[], [msg]} = Generator.generate(ctx, desc)
assert msg =~ "a: FooBar.AbCd.EnumFoo.t"
assert msg =~ "a: FooBar.AbCd.EnumFoo.t()"
assert msg =~ "field :a, 1, optional: true, type: FooBar.AbCd.EnumFoo, enum: true\n"
end

Expand Down Expand Up @@ -358,7 +358,7 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
)

{[], [msg]} = Generator.generate(ctx, desc)
assert msg =~ "a: OtherPkg.MsgFoo.t"
assert msg =~ "a: OtherPkg.MsgFoo.t()"
assert msg =~ "field :a, 1, optional: true, type: OtherPkg.MsgFoo\n"
end

Expand Down Expand Up @@ -552,6 +552,6 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
)

{[], [msg]} = Generator.generate(ctx, desc)
assert msg =~ "a: [FooBar.AbCd.EnumFoo.t]"
assert msg =~ "a: [FooBar.AbCd.EnumFoo.t()]"
end
end
4 changes: 2 additions & 2 deletions test/protobuf/protoc/proto_gen/test.pb.ex
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ defmodule My.Test.Request do
use Protobuf, syntax: :proto2

@type t :: %__MODULE__{
key: integer,
key: [integer],
hue: My.Test.Request.Color.t(),
hat: My.Test.HatType.t(),
deadline: float | :infinity | :negative_infinity | :nan,
Expand Down Expand Up @@ -151,7 +151,7 @@ defmodule My.Test.Reply do

@type t :: %__MODULE__{
found: [My.Test.Reply.Entry.t()],
compact_keys: integer,
compact_keys: [integer],
__pb_extensions__: map
}

Expand Down