rbs_protobuf 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d8369a09563679a8a6c334efe056f6ef462bc1fc9bbd14af108fea7d4996cdb
4
- data.tar.gz: 7f0e46181747c4f0ee8209496c16a29a81264ccbca39faf1803de6e2a6e3b535
3
+ metadata.gz: 563169bcedcc8c4392d8ad6c428c8fd4f31b5ca3373705439fa94a0e3f05b138
4
+ data.tar.gz: a55dd8d55cc9b866b101e51bb90ba88aa5e138251c3083b010671b03346d9db8
5
5
  SHA512:
6
- metadata.gz: e70f6e59b9f9d3de0676dc1d6d6bf2ed7715649fe428e5edb8740247df0b6e12e21b26e2e9361443c80343563160da00841d1e90c35ae906db786aca676645d9
7
- data.tar.gz: 901ca653bdd3c03f9f09086c194c2f60180b693d2b43830335a2d34f39053dfd1e9b974d7f598377493e8121d27cadecdc9ef959b26ca14a186633a6b4dd05b4
6
+ metadata.gz: d0ea93fd55f7b9efb4a864156e428033da4116499c99ef8f222949ae301b16fe302cd00c022ce2ad91ac9216dca508a084a9c59fb5b296dbd5e41d4d8dd6b205
7
+ data.tar.gz: c143b93fce43ede0ff094a26f2e51d3d72e6b35853852cc11e1b571f74abbe68ec7f579af206bec8213c908bb34d1421986f57a6f14417d316d7b666491c04ce
@@ -12,12 +12,12 @@ jobs:
12
12
  strategy:
13
13
  matrix:
14
14
  container_tag:
15
- - 2.6-bionic
16
15
  - 2.7-bionic
17
16
  - 3.0-focal
17
+ - 3.1-focal
18
18
  protoc_version:
19
- - 3.13.0
20
- - 3.14.0
19
+ - 3.18.2
20
+ - 3.19.4
21
21
  container:
22
22
  image: rubylang/ruby:${{ matrix.container_tag }}
23
23
  steps:
@@ -30,7 +30,9 @@ jobs:
30
30
  unzip protoc-${{ matrix.protoc_version }}-linux-x86_64.zip
31
31
  mv bin/protoc /usr/local/bin/protoc
32
32
  protoc --version
33
- - uses: actions/checkout@v1
33
+ - uses: actions/checkout@v3
34
+ with:
35
+ submodules: true
34
36
  - name: Run test
35
37
  run: |
36
38
  ruby -v
@@ -38,5 +40,3 @@ jobs:
38
40
  bin/setup
39
41
  bundle exec rake
40
42
  bundle exec rake install
41
- mkdir -p tmp/out
42
- RBS_PROTOBUF_BACKEND=protobuf protoc --rbs_out=tmp/out -Iexample example/*.proto
data/.gitignore CHANGED
@@ -7,4 +7,4 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  /example/protobuf-gem/
10
- /Gemfile.lock
10
+ .gem_rbs_collection
data/.gitmodules CHANGED
@@ -0,0 +1,3 @@
1
+ [submodule "vendor/gem_rbs_collection"]
2
+ path = vendor/gem_rbs_collection
3
+ url = git@github.com:ruby/gem_rbs_collection.git
data/CHANGELOG.md ADDED
@@ -0,0 +1,26 @@
1
+ # CHANGELOG
2
+
3
+ ## 1.0.0 (2022-04-25)
4
+
5
+ This is version 1.0.0. 🎉
6
+
7
+ It includes changes on `nil` handling on required fields. Passing `nil` to required fields is prohibited by default, but there is an option to allow it, define `$RBS_PROTOBUF_ACCEPT_NIL_ATTR_WRITER` env var.
8
+
9
+ * Stop accepting `nil` to required fields ([\#16](https://github.com/square/rbs_protobuf/pull/16))
10
+ * Add an option to let required fields accept `nil` ([\#27](https://github.com/square/rbs_protobuf/pull/27))
11
+ * Fix extension generator ([\#21](https://github.com/square/rbs_protobuf/pull/21))
12
+ * Use overload for field write types ([\#22](https://github.com/square/rbs_protobuf/pull/22))
13
+ * Generate helper types and use them ([\#24](https://github.com/square/rbs_protobuf/pull/24))
14
+
15
+ ## 0.3.0 (2022-04-05)
16
+
17
+ * Put protobuf _options_ in RBS comment ([\#15](https://github.com/square/rbs_protobuf/pull/15))
18
+ * Add `!` methods type definitions ([\#14](https://github.com/square/rbs_protobuf/pull/14))
19
+
20
+ ## 0.2.0 (2022-03-18)
21
+
22
+ This is a maintenance release to support the latest version of RBS.
23
+
24
+ * Update to the latest RBS ([#11](https://github.com/square/rbs_protobuf/pull/11))
25
+ * Type check with Steep ([#11](https://github.com/square/rbs_protobuf/pull/11))
26
+ * Drop Ruby 2.6 support ([#11](https://github.com/square/rbs_protobuf/pull/11))
data/Gemfile CHANGED
@@ -6,5 +6,6 @@ gemspec
6
6
  gem "rake", "~> 12.0"
7
7
  gem "minitest", "~> 5.0"
8
8
  gem "steep"
9
+ gem "rbs"
9
10
 
10
11
  gem "protobuf", "~> 3.10"
data/Gemfile.lock ADDED
@@ -0,0 +1,70 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rbs_protobuf (1.0.0)
5
+ activesupport (>= 4.0)
6
+ rbs (>= 2.2.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (7.0.2.3)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 1.6, < 2)
14
+ minitest (>= 5.1)
15
+ tzinfo (~> 2.0)
16
+ ast (2.4.2)
17
+ concurrent-ruby (1.1.10)
18
+ ffi (1.15.5)
19
+ i18n (1.10.0)
20
+ concurrent-ruby (~> 1.0)
21
+ language_server-protocol (3.16.0.3)
22
+ listen (3.7.1)
23
+ rb-fsevent (~> 0.10, >= 0.10.3)
24
+ rb-inotify (~> 0.9, >= 0.9.10)
25
+ middleware (0.1.0)
26
+ minitest (5.15.0)
27
+ parallel (1.22.1)
28
+ parser (3.1.2.0)
29
+ ast (~> 2.4.1)
30
+ protobuf (3.10.5)
31
+ activesupport (>= 3.2)
32
+ middleware
33
+ thor
34
+ thread_safe
35
+ rainbow (3.1.1)
36
+ rake (12.3.3)
37
+ rb-fsevent (0.11.1)
38
+ rb-inotify (0.10.1)
39
+ ffi (~> 1.0)
40
+ rbs (2.3.2)
41
+ steep (0.52.1)
42
+ activesupport (>= 5.1)
43
+ language_server-protocol (>= 3.15, < 4.0)
44
+ listen (~> 3.0)
45
+ parallel (>= 1.0.0)
46
+ parser (>= 3.0)
47
+ rainbow (>= 2.2.2, < 4.0)
48
+ rbs (>= 2.3.2)
49
+ terminal-table (>= 2, < 4)
50
+ terminal-table (3.0.2)
51
+ unicode-display_width (>= 1.1.1, < 3)
52
+ thor (1.2.1)
53
+ thread_safe (0.3.6)
54
+ tzinfo (2.0.4)
55
+ concurrent-ruby (~> 1.0)
56
+ unicode-display_width (2.1.0)
57
+
58
+ PLATFORMS
59
+ ruby
60
+
61
+ DEPENDENCIES
62
+ minitest (~> 5.0)
63
+ protobuf (~> 3.10)
64
+ rake (~> 12.0)
65
+ rbs
66
+ rbs_protobuf!
67
+ steep
68
+
69
+ BUNDLED WITH
70
+ 2.3.11
data/README.md CHANGED
@@ -20,7 +20,7 @@ message SearchRequest {
20
20
  }
21
21
  ```
22
22
 
23
- rbs_protobuf will generate the following RBS file including method definitions for each attribute with correct types.
23
+ rbs_protobuf will generate the following RBS file including method definitions for each attribute with correct types.
24
24
 
25
25
  ```rbs
26
26
  module Protobuf
@@ -84,28 +84,26 @@ You may need `bundle exec protoc ...` to let bundler set up PATH.
84
84
 
85
85
  ## Type checking
86
86
 
87
- To type check the output, you need to configure your tools to import [gem_rbs_collection](https://github.com/ruby/gem_rbs_collection).
87
+ To type check the output, you need to configure your tools to import [gem_rbs_collection](https://github.com/ruby/gem_rbs_collection) with `rbs collection` command.
88
88
 
89
- $ git submodule add https://github.com/ruby/gem_rbs_collection.git vendor/rbs/gem_rbs_collection
90
-
91
- If you want to validate your RBS files with `rbs validate`, specify `--repo` option.
89
+ ```yaml
90
+ # Add the dependency in rbs_collection.yaml
91
+ gems:
92
+ - name: rbs_protobuf
93
+ ```
92
94
 
93
- $ rbs --repo=vendor/rbs/gem_rbs_collection/gems -rprotobuf validate
95
+ We assume that you don't type check the generated `.pb.rb` code.
96
+ If you want to type check them, you need the definition of `Google::Protobuf`, which can be generated from [`descriptor.proto`](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto).
94
97
 
95
- If you want to type check your Ruby program using Steep, add `repo_path` and `library` calls in your `Steepfile`.
96
-
97
- ```ruby
98
- target :app do
99
- repo_path "vendor/rbs/gem_rbs_collection/gems"
100
- library "protobuf"
101
- end
102
- ```
98
+ Note: `rbs_protobuf` generates RBS files assuming some types added in [this PR](https://github.com/ruby/gem_rbs_collection/pull/145). Make sure you are using one of the newer versions of `rbs_gem_collection` definitions.
103
99
 
104
100
  ### Options
105
101
 
106
102
  * `RBS_PROTOBUF_BACKEND` specifies the Ruby code generator gem. Supported value is `protobuf`. (We will add `google-protobuf` for `google-protobuf` gem.)
107
103
  * `PB_UPCASE_ENUMS` is for `protobuf` gem support. Specify the environment variable to make enum value constants upper case.
108
104
  * `RBS_PROTOBUF_NO_NESTED_NAMESPACE` is to make the RBS declarations flat.
105
+ * `RBS_PROTOBUF_EXTENSION` specifies what to do for extensions.
106
+ * `RBS_PROTOBUF_ACCEPT_NIL_ATTR_WRITER` is to allow passing `nil` to required fields.
109
107
 
110
108
  ## Supported features
111
109
 
@@ -116,10 +114,36 @@ end
116
114
  | Packages | ✓ |
117
115
  | Nested messages | ✓ |
118
116
  | Maps | ✓ |
119
- | Extensions | |
117
+ | Extensions | Read next section |
120
118
  | Services | Only generates classes |
121
119
  | Oneof | No support in `protobuf` gem |
122
120
 
121
+ ### Extensions
122
+
123
+ Adding extensions may cause problems if the name of new attribute conflicts.
124
+
125
+ ```proto
126
+ extend SearchRequest {
127
+ // This extension defines an attribute.
128
+ optional string option = 100;
129
+ }
130
+
131
+ extend SearchRequest {
132
+ // Another extension defines another attribute with same name.
133
+ optional string option = 101;
134
+ }
135
+ ```
136
+
137
+ In this case, defining two `option` attributes in RBS causes an error.
138
+ So, rbs_protobuf allows ignoring extensions for this case.
139
+
140
+ You can control the behavior with `RBS_PROTOBUF_EXTENSION` environment variable.
141
+
142
+ * `false`: Ignores extensions.
143
+ * `print`: Prints RBS for extensions instead of writing them to files. You can copy or modify the printed RBS, and put them in some RBS files.
144
+ * Any value else: Generates RBS for extensions.
145
+ * undefined: Ignores extensions but print messages to ask you to specify a value.
146
+
123
147
  ## Development
124
148
 
125
149
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test example:typecheck` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -132,7 +156,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
132
156
 
133
157
  Bug reports and pull requests are welcome on GitHub at https://github.com/square/rbs_protobuf.
134
158
 
135
-
136
159
  ## License
137
160
 
138
161
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -13,6 +13,9 @@ task :default => [:test, "example:typecheck"]
13
13
  namespace :example do
14
14
  desc "Generate Ruby code with protobuf-gem"
15
15
  task :protobufgem do
16
+ spec = Gem::Specification.find_by_name("protobuf")
17
+ proto_path = File.join(spec.gem_dir, "proto")
18
+
16
19
  sh("rm -rf example/protobuf-gem")
17
20
  sh("mkdir", "-p", "example/protobuf-gem")
18
21
  sh(
@@ -21,17 +24,27 @@ namespace :example do
21
24
  "--plugin=protoc-gen-ruby-protobuf=#{__dir__}/bin/protoc-gen-ruby",
22
25
  "--ruby-protobuf_out=example/protobuf-gem",
23
26
  "-Iexample",
27
+ "-I#{proto_path}",
24
28
  "example/a.proto",
25
- "example/b.proto"
29
+ "example/b.proto",
30
+ "example/c.proto"
26
31
  )
27
32
  sh(
28
- { "RBS_PROTOBUF_BACKEND" => "protobuf" },
33
+ { "RBS_PROTOBUF_BACKEND" => "protobuf", "RBS_PROTOBUF_EXTENSION" => "true" },
29
34
  "protoc",
30
35
  "--rbs_out=example/protobuf-gem",
31
36
  "-Iexample",
32
37
  "example/a.proto",
33
38
  "example/b.proto"
34
39
  )
40
+ sh(
41
+ { "RBS_PROTOBUF_BACKEND" => "protobuf", "RBS_PROTOBUF_EXTENSION" => "true", "RUBYOPT" => "-rbundler/setup -Iexample/protobuf-gem -rc.pb" },
42
+ "protoc",
43
+ "--rbs_out=example/protobuf-gem",
44
+ "-Iexample",
45
+ "-I#{proto_path}",
46
+ "example/c.proto"
47
+ )
35
48
  end
36
49
 
37
50
  desc "Type check generated code"
data/Steepfile ADDED
@@ -0,0 +1,13 @@
1
+ D = Steep::Diagnostic
2
+
3
+ target :lib do
4
+ signature "sig"
5
+ signature "vendor/gem_rbs_collection/gems/protobuf"
6
+ check "lib"
7
+
8
+ configure_code_diagnostics do |hash|
9
+ hash[D::Ruby::FallbackAny] = :hint
10
+ hash[D::Ruby::MethodDefinitionMissing] = :hint
11
+ hash[D::Ruby::UnknownConstant] = :information
12
+ end
13
+ end
data/bin/setup CHANGED
@@ -17,3 +17,5 @@ else
17
17
  mkdir -p $REPODIR/..
18
18
  git clone https://github.com/ruby/gem_rbs_collection.git ${REPODIR}
19
19
  fi
20
+
21
+ bundle exec rbs collection install
data/bin/steep ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env bash
2
+
3
+ BINSTUB_DIR=$(cd $(dirname $0); pwd)
4
+ GEMFILE=$(readlink -f ${BINSTUB_DIR}/../Gemfile)
5
+ ROOT_DIR=$(readlink -f ${BINSTUB_DIR}/..)
6
+
7
+ STEEP="bundle exec --gemfile=${GEMFILE} steep"
8
+
9
+ if type "rbenv" > /dev/null 2>&1; then
10
+ STEEP="rbenv exec ${STEEP}"
11
+ else
12
+ if type "rvm" > /dev/null 2>&1; then
13
+ STEEP="rvm ${ROOT_DIR} do ${STEEP}"
14
+ fi
15
+ fi
16
+
17
+ exec $STEEP $@
data/example/Steepfile CHANGED
@@ -1,9 +1,15 @@
1
- repo = (Pathname(__dir__) + "../tmp/rbs/gem_rbs_collection/gems").to_s
1
+ D = Steep::Diagnostic
2
+
3
+ target :lib do
4
+ collection_config "../rbs_collection.yaml"
2
5
 
3
- target :protobuf_gem do
4
- check "protobuf_gem_example.rb", "protobuf-gem"
5
6
  signature "protobuf-gem"
7
+ signature "../vendor/gem_rbs_collection/gems/protobuf"
8
+ check "protobuf_gem_example.rb"
6
9
 
7
- repo_path repo
8
- library "protobuf"
10
+ configure_code_diagnostics do |hash|
11
+ hash[D::Ruby::FallbackAny] = :hint
12
+ hash[D::Ruby::MethodDefinitionMissing] = :hint
13
+ hash[D::Ruby::UnknownConstant] = :information
14
+ end
9
15
  end
data/example/c.proto ADDED
@@ -0,0 +1,12 @@
1
+ syntax = "proto2";
2
+
3
+ import "google/protobuf/descriptor.proto";
4
+
5
+ extend google.protobuf.FieldOptions {
6
+ optional bool super_custom_option = 22300;
7
+ }
8
+
9
+ message Message {
10
+ option deprecated = true;
11
+ optional string name = 1 [(super_custom_option) = true];
12
+ }
data/exe/protoc-gen-rbs CHANGED
@@ -19,11 +19,25 @@ translator = case backend
19
19
  when "protobuf"
20
20
  upcase_enum = ENV.key?("PB_UPCASE_ENUMS")
21
21
  no_nested_namespace = ENV.key?("RBS_PROTOBUF_NO_NESTED_NAMESPACE")
22
+ extension = case ENV["RBS_PROTOBUF_EXTENSION"]
23
+ when "false"
24
+ false
25
+ when nil
26
+ nil
27
+ when "print"
28
+ :print
29
+ else
30
+ true
31
+ end
32
+
33
+ accept_nil_writer = ENV.key?("RBS_PROTOBUF_ACCEPT_NIL_ATTR_WRITER")
22
34
 
23
35
  RBSProtobuf::Translator::ProtobufGem.new(
24
36
  input,
25
37
  upcase_enum: upcase_enum,
26
- nested_namespace: !no_nested_namespace
38
+ nested_namespace: !no_nested_namespace,
39
+ extension: extension,
40
+ accept_nil_writer: accept_nil_writer
27
41
  )
28
42
  when "google-protobuf"
29
43
  raise NotImplementedError
@@ -0,0 +1,68 @@
1
+ module RBSProtobuf
2
+ module Name
3
+ class Class
4
+ attr_reader :name
5
+
6
+ def initialize(name)
7
+ raise unless name.class?
8
+ @name = name
9
+ end
10
+
11
+ def instance_type(*args)
12
+ RBS::Types::ClassInstance.new(name: name, args: args, location: nil)
13
+ end
14
+
15
+ alias [] instance_type
16
+
17
+ def singleton_type
18
+ RBS::Types::ClassSingleton.new(name: name, location: nil)
19
+ end
20
+
21
+ def instance_type?(t)
22
+ t.is_a?(RBS::Types::ClassInstance) && t.name == name
23
+ end
24
+
25
+ def singleton_type?(t)
26
+ t.is_a?(RBS::Types::ClassSingleton) && t.name == name
27
+ end
28
+
29
+ def super_class(*args)
30
+ RBS::AST::Declarations::Class::Super.new(name: name, args: args, location: nil)
31
+ end
32
+ end
33
+
34
+ class Alias
35
+ attr_reader :name
36
+
37
+ def initialize(name)
38
+ raise unless name.alias?
39
+ @name = name
40
+ end
41
+
42
+ def [](*args)
43
+ RBS::Types::Alias.new(name: name, args: args, location: nil)
44
+ end
45
+
46
+ def type?(t)
47
+ t.is_a?(RBS::Types::Alias) && t.name == name
48
+ end
49
+ end
50
+
51
+ class Interface
52
+ attr_reader :name
53
+
54
+ def initialize(name)
55
+ raise unless name.interface?
56
+ @name = name
57
+ end
58
+
59
+ def [](*args)
60
+ RBS::Types::Interface.new(name: name, args: args, location: nil)
61
+ end
62
+
63
+ def type?(t)
64
+ t.is_a?(RBS::Types::Interface) && t.name == name
65
+ end
66
+ end
67
+ end
68
+ end
@@ -8,7 +8,7 @@ module RBSProtobuf
8
8
  *path, name = string.delete_prefix("::").split("::").map(&:to_sym)
9
9
 
10
10
  TypeName.new(
11
- name: name,
11
+ name: name || raise,
12
12
  namespace: Namespace.new(path: path, absolute: absolute)
13
13
  )
14
14
  end
@@ -72,7 +72,7 @@ module RBSProtobuf
72
72
  type_name(name)
73
73
  end
74
74
 
75
- Types::Alias.new(name: type_name, location: nil)
75
+ Types::Alias.new(name: type_name, args: [], location: nil)
76
76
  end
77
77
 
78
78
  def function(return_type = Types::Bases::Void.new(location: nil))
@@ -87,7 +87,7 @@ module RBSProtobuf
87
87
  end
88
88
 
89
89
  def block(function, required: true)
90
- MethodType::Block.new(
90
+ Types::Block.new(
91
91
  type: function,
92
92
  required: required
93
93
  )
@@ -98,8 +98,12 @@ module RBSProtobuf
98
98
  end
99
99
 
100
100
  def method_type(params: [], type:, block: nil, location: nil)
101
+ type_params = params.map do |name|
102
+ AST::TypeParam.new(name: name, variance: :invariant, upper_bound: nil, location: nil)
103
+ end
104
+
101
105
  MethodType.new(
102
- type_params: params,
106
+ type_params: type_params,
103
107
  type: type,
104
108
  block: block,
105
109
  location: location
@@ -114,10 +118,14 @@ module RBSProtobuf
114
118
  end
115
119
 
116
120
  def optional_type(type, location: nil)
117
- Types::Optional.new(
118
- type: type,
119
- location: location
120
- )
121
+ if type.is_a?(Types::Optional)
122
+ type
123
+ else
124
+ Types::Optional.new(
125
+ type: type,
126
+ location: location
127
+ )
128
+ end
121
129
  end
122
130
 
123
131
  def type_var(name, location: nil)
@@ -128,12 +136,8 @@ module RBSProtobuf
128
136
  end
129
137
 
130
138
  def module_type_params(*params)
131
- params.each.with_object(AST::Declarations::ModuleTypeParams.empty) do |param, type_params|
132
- type_params.add(AST::Declarations::ModuleTypeParams::TypeParam.new(
133
- name: param,
134
- variance: :invariant,
135
- skip_validation: false
136
- ))
139
+ params.map do |name|
140
+ AST::TypeParam.new(name: name, variance: :invariant, upper_bound: nil, location: nil)
137
141
  end
138
142
  end
139
143
 
@@ -42,10 +42,12 @@ module RBSProtobuf
42
42
  raise NotImplementedError
43
43
  end
44
44
 
45
- def comment_for_path(source_code_info, path)
45
+ def comment_for_path(source_code_info, path, options:)
46
46
  loc = source_code_info.location.find {|loc| loc.path == path }
47
+
48
+ comments = []
49
+
47
50
  if loc
48
- comments = []
49
51
  if loc.leading_comments.length > 0
50
52
  comments << loc.leading_comments.strip
51
53
  end
@@ -55,9 +57,31 @@ module RBSProtobuf
55
57
  if comments.empty? && !loc.leading_detached_comments.empty?
56
58
  comments << loc.leading_detached_comments.join("\n\n").strip
57
59
  end
60
+ end
61
+
62
+ if options
63
+ # @type var opts: Array[[Symbol, untyped]]
64
+ opts = []
65
+ options.each_field do |key, value|
66
+ if options.field?(key.fully_qualified_name)
67
+ opts << [key.fully_qualified_name, value]
68
+ end
69
+ end
70
+
71
+ unless opts.empty?
72
+ unless comments.empty?
73
+ comments << "----"
74
+ end
75
+ comments << "Protobuf options:"
76
+ list = opts.map {|key, value| "- `#{key} = #{value.inspect}`" }
77
+ comments << list.join("\n")
78
+ end
79
+ end
80
+
81
+ unless comments.empty?
58
82
  RBS::AST::Comment.new(
59
83
  location: nil,
60
- string: comments.join("\n\n")
84
+ string: comments.join("\n\n") + "\n\n"
61
85
  )
62
86
  end
63
87
  end
@@ -76,8 +100,7 @@ module RBSProtobuf
76
100
  when FieldDescriptorProto::Type::TYPE_DOUBLE, FieldDescriptorProto::Type::TYPE_FLOAT
77
101
  RBS::BuiltinNames::Float.instance_type
78
102
  when FieldDescriptorProto::Type::TYPE_BOOL
79
- factory.union_type(factory.literal_type(true),
80
- factory.literal_type(false))
103
+ factory.bool_type()
81
104
  else
82
105
  raise "Unknown base type: #{type}"
83
106
  end
@@ -88,6 +111,8 @@ module RBSProtobuf
88
111
 
89
112
  *path, name = string.delete_prefix(".").split(".").map {|s| ActiveSupport::Inflector.upcase_first(s).to_sym }
90
113
 
114
+ name or raise
115
+
91
116
  factory.instance_type(
92
117
  RBS::TypeName.new(
93
118
  name: name,