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 +4 -4
- data/.github/workflows/test.yml +6 -6
- data/.gitignore +1 -1
- data/.gitmodules +3 -0
- data/CHANGELOG.md +26 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +70 -0
- data/README.md +39 -16
- data/Rakefile +15 -2
- data/Steepfile +13 -0
- data/bin/setup +2 -0
- data/bin/steep +17 -0
- data/example/Steepfile +11 -5
- data/example/c.proto +12 -0
- data/exe/protoc-gen-rbs +15 -1
- data/lib/rbs_protobuf/name.rb +68 -0
- data/lib/rbs_protobuf/rbs_factory.rb +18 -14
- data/lib/rbs_protobuf/translator/base.rb +30 -5
- data/lib/rbs_protobuf/translator/protobuf_gem.rb +498 -217
- data/lib/rbs_protobuf/version.rb +1 -1
- data/lib/rbs_protobuf.rb +2 -1
- data/rbs_collection.lock.yaml +108 -0
- data/rbs_collection.yaml +19 -0
- data/rbs_protobuf.gemspec +2 -2
- data/sig/rbs_protobuf/name.rbs +45 -0
- data/sig/rbs_protobuf/rbs_factory.rbs +41 -0
- data/sig/rbs_protobuf/translator/base.rbs +35 -0
- data/sig/rbs_protobuf/translator/protobuf_gem.rbs +122 -0
- data/sig/rbs_protobuf/version.rbs +3 -0
- data/sig/rbs_protobuf.rbs +5 -0
- metadata +20 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 563169bcedcc8c4392d8ad6c428c8fd4f31b5ca3373705439fa94a0e3f05b138
|
4
|
+
data.tar.gz: a55dd8d55cc9b866b101e51bb90ba88aa5e138251c3083b010671b03346d9db8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0ea93fd55f7b9efb4a864156e428033da4116499c99ef8f222949ae301b16fe302cd00c022ce2ad91ac9216dca508a084a9c59fb5b296dbd5e41d4d8dd6b205
|
7
|
+
data.tar.gz: c143b93fce43ede0ff094a26f2e51d3d72e6b35853852cc11e1b571f74abbe68ec7f579af206bec8213c908bb34d1421986f57a6f14417d316d7b666491c04ce
|
data/.github/workflows/test.yml
CHANGED
@@ -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.
|
20
|
-
- 3.
|
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@
|
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
data/.gitmodules
CHANGED
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
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
|
-
|
90
|
-
|
91
|
-
|
89
|
+
```yaml
|
90
|
+
# Add the dependency in rbs_collection.yaml
|
91
|
+
gems:
|
92
|
+
- name: rbs_protobuf
|
93
|
+
```
|
92
94
|
|
93
|
-
|
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
|
-
|
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
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
|
-
|
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
|
-
|
8
|
-
|
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
|
-
|
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:
|
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
|
118
|
-
type
|
119
|
-
|
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.
|
132
|
-
|
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.
|
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,
|