rbs-inline 0.1.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.
@@ -0,0 +1,210 @@
1
+ module RBS
2
+ module Inline
3
+ class Writer
4
+ attr_reader :output
5
+ attr_reader :writer
6
+
7
+ def initialize(buffer = +"")
8
+ @output = buffer
9
+ @writer = RBS::Writer.new(out: StringIO.new(buffer))
10
+ end
11
+
12
+ def self.write(uses, decls)
13
+ writer = Writer.new()
14
+ writer.write(uses, decls)
15
+ writer.output
16
+ end
17
+
18
+ def header(*lines)
19
+ lines.each do |line|
20
+ writer.out.puts("# " + line)
21
+ end
22
+ writer.out.puts
23
+ end
24
+
25
+ def write(uses, decls)
26
+ use_dirs = uses.map do |use|
27
+ RBS::AST::Directives::Use.new(
28
+ clauses: use.clauses,
29
+ location: nil
30
+ )
31
+ end
32
+
33
+ rbs = decls.filter_map do |decl|
34
+ translate_decl(decl)
35
+ end
36
+
37
+ writer.write(use_dirs + rbs)
38
+ end
39
+
40
+ def translate_decl(decl)
41
+ case decl
42
+ when AST::Declarations::ClassDecl
43
+ translate_class_decl(decl)
44
+ when AST::Declarations::ModuleDecl
45
+ translate_module_decl(decl)
46
+ when AST::Declarations::ConstantDecl
47
+ translate_constant_decl(decl)
48
+ end
49
+ end
50
+
51
+ def translate_class_decl(decl)
52
+ return unless decl.class_name
53
+
54
+ if decl.comments
55
+ comment = RBS::AST::Comment.new(string: decl.comments.content, location: nil)
56
+ end
57
+
58
+ members = [] #: Array[RBS::AST::Members::t | RBS::AST::Declarations::t]
59
+
60
+ decl.members.each do |member|
61
+ if member.is_a?(AST::Members::Base)
62
+ if rbs_member = translate_member(member)
63
+ members.concat rbs_member
64
+ end
65
+ end
66
+
67
+ if member.is_a?(AST::Declarations::Base)
68
+ if rbs = translate_decl(member)
69
+ members << rbs
70
+ end
71
+ end
72
+ end
73
+
74
+ RBS::AST::Declarations::Class.new(
75
+ name: decl.class_name,
76
+ type_params: decl.type_params,
77
+ members: members,
78
+ super_class: decl.super_class,
79
+ annotations: [],
80
+ location: nil,
81
+ comment: comment
82
+ )
83
+ end
84
+
85
+ def translate_module_decl(decl)
86
+ return unless decl.module_name
87
+
88
+ if decl.comments
89
+ comment = RBS::AST::Comment.new(string: decl.comments.content, location: nil)
90
+ end
91
+
92
+ members = [] #: Array[RBS::AST::Members::t | RBS::AST::Declarations::t]
93
+
94
+ decl.members.each do |member|
95
+ if member.is_a?(AST::Members::Base)
96
+ if rbs_member = translate_member(member)
97
+ members.concat rbs_member
98
+ end
99
+ end
100
+
101
+ if member.is_a?(AST::Declarations::Base)
102
+ if rbs = translate_decl(member)
103
+ members << rbs
104
+ end
105
+ end
106
+ end
107
+
108
+ self_types = decl.module_selfs.map { _1.constraint }.compact
109
+
110
+ RBS::AST::Declarations::Module.new(
111
+ name: decl.module_name,
112
+ type_params: decl.type_params,
113
+ members: members,
114
+ self_types: self_types,
115
+ annotations: [],
116
+ location: nil,
117
+ comment: comment
118
+ )
119
+ end
120
+
121
+ def translate_constant_decl(decl)
122
+ return unless decl.constant_name
123
+
124
+ if decl.comments
125
+ comment = RBS::AST::Comment.new(string: decl.comments.content, location: nil)
126
+ end
127
+
128
+ RBS::AST::Declarations::Constant.new(
129
+ name: decl.constant_name,
130
+ type: decl.type,
131
+ comment: comment,
132
+ location: nil
133
+ )
134
+ end
135
+
136
+ def translate_member(member)
137
+ case member
138
+ when AST::Members::RubyDef
139
+ if member.comments
140
+ comment = RBS::AST::Comment.new(string: member.comments.content, location: nil)
141
+ end
142
+
143
+ if member.override_annotation
144
+ return [
145
+ RBS::AST::Members::MethodDefinition.new(
146
+ name: member.method_name,
147
+ kind: member.method_kind,
148
+ overloads: [],
149
+ annotations: [],
150
+ location: nil,
151
+ comment: comment,
152
+ overloading: true,
153
+ visibility: member.visibility
154
+ )
155
+ ]
156
+ end
157
+
158
+ [
159
+ RBS::AST::Members::MethodDefinition.new(
160
+ name: member.method_name,
161
+ kind: member.method_kind,
162
+ overloads: member.method_overloads,
163
+ annotations: member.method_annotations,
164
+ location: nil,
165
+ comment: comment,
166
+ overloading: false,
167
+ visibility: member.visibility
168
+ )
169
+ ]
170
+ when AST::Members::RubyAlias
171
+ if member.comments
172
+ comment = RBS::AST::Comment.new(string: member.comments.content, location: nil)
173
+ end
174
+
175
+ [
176
+ RBS::AST::Members::Alias.new(
177
+ new_name: member.new_name,
178
+ old_name: member.old_name,
179
+ kind: :instance,
180
+ annotations: [],
181
+ location: nil,
182
+ comment: comment
183
+ )
184
+ ]
185
+ when AST::Members::RubyMixin
186
+ [member.rbs].compact
187
+ when AST::Members::RubyAttr
188
+ member.rbs
189
+ when AST::Members::RubyPrivate
190
+ [
191
+ RBS::AST::Members::Private.new(location: nil)
192
+ ]
193
+ when AST::Members::RubyPublic
194
+ [
195
+ RBS::AST::Members::Public.new(location: nil)
196
+ ]
197
+ when AST::Members::RBSIvar
198
+ [
199
+ member.rbs
200
+ ].compact
201
+ when AST::Members::RBSEmbedded
202
+ case members = member.members
203
+ when Array
204
+ members
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
data/lib/rbs/inline.rb ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "inline/version"
4
+
5
+ require "prism"
6
+ require "strscan"
7
+ require "rbs"
8
+
9
+ require "rbs/inline/node_utils"
10
+ require "rbs/inline/annotation_parser"
11
+ require "rbs/inline/ast/annotations"
12
+ require "rbs/inline/ast/comment_lines"
13
+ require "rbs/inline/ast/tree"
14
+ require "rbs/inline/ast/declarations"
15
+ require "rbs/inline/ast/members"
16
+ require "rbs/inline/parser"
17
+ require "rbs/inline/writer"
18
+
19
+ module RBS
20
+ module Inline
21
+ end
22
+ end
@@ -0,0 +1,68 @@
1
+ ---
2
+ path: ".gem_rbs_collection"
3
+ gems:
4
+ - name: abbrev
5
+ version: '0'
6
+ source:
7
+ type: stdlib
8
+ - name: fileutils
9
+ version: '0'
10
+ source:
11
+ type: stdlib
12
+ - name: json
13
+ version: '0'
14
+ source:
15
+ type: stdlib
16
+ - name: logger
17
+ version: '0'
18
+ source:
19
+ type: stdlib
20
+ - name: minitest
21
+ version: '0'
22
+ source:
23
+ type: stdlib
24
+ - name: monitor
25
+ version: '0'
26
+ source:
27
+ type: stdlib
28
+ - name: mutex_m
29
+ version: '0'
30
+ source:
31
+ type: stdlib
32
+ - name: optparse
33
+ version: '0'
34
+ source:
35
+ type: stdlib
36
+ - name: pathname
37
+ version: '0'
38
+ source:
39
+ type: stdlib
40
+ - name: prism
41
+ version: 0.24.0
42
+ source:
43
+ type: rubygems
44
+ - name: rake
45
+ version: '13.0'
46
+ source:
47
+ type: git
48
+ name: ruby/gem_rbs_collection
49
+ revision: d2e93d426c927fdab90ef12e30a9875aa05d60d6
50
+ remote: https://github.com/ruby/gem_rbs_collection.git
51
+ repo_dir: gems
52
+ - name: rbs
53
+ version: 3.5.0.pre.2
54
+ source:
55
+ type: rubygems
56
+ - name: rdoc
57
+ version: '0'
58
+ source:
59
+ type: stdlib
60
+ - name: strscan
61
+ version: '0'
62
+ source:
63
+ type: stdlib
64
+ - name: tsort
65
+ version: '0'
66
+ source:
67
+ type: stdlib
68
+ gemfile_lock_path: Gemfile.lock
@@ -0,0 +1,17 @@
1
+ # Download sources
2
+ sources:
3
+ - type: git
4
+ name: ruby/gem_rbs_collection
5
+ remote: https://github.com/ruby/gem_rbs_collection.git
6
+ revision: main
7
+ repo_dir: gems
8
+
9
+ # You can specify local directories as sources also.
10
+ # - type: local
11
+ # path: path/to/your/local/repository
12
+
13
+ # A directory to install the downloaded RBSs
14
+ path: .gem_rbs_collection
15
+
16
+ gems:
17
+ - name: optparse
@@ -0,0 +1,222 @@
1
+ # Generated from lib/rbs/inline/annotation_parser.rb with RBS::Inline
2
+
3
+ module RBS
4
+ module Inline
5
+ class AnnotationParser
6
+ class ParsingResult
7
+ attr_reader comments: Array[Prism::Comment]
8
+
9
+ attr_reader annotations: Array[AST::Annotations::t]
10
+
11
+ attr_reader first_comment_offset: Integer
12
+
13
+ # @rbs first_comment: Prism::Comment
14
+ def initialize: (Prism::Comment first_comment) -> untyped
15
+
16
+ # @rbs returns Range[Integer]
17
+ def line_range: () -> Range[Integer]
18
+
19
+ # @rbs returns Prism::Comment
20
+ def last_comment: () -> Prism::Comment
21
+
22
+ # @rbs comment: Prism::Comment
23
+ # @rbs returns self?
24
+ def add_comment: (Prism::Comment comment) -> self?
25
+
26
+ # @rbs returns Array[[String, Prism::Comment]]
27
+ def lines: () -> Array[[ String, Prism::Comment ]]
28
+
29
+ # @rbs returns String
30
+ def content: () -> String
31
+ end
32
+
33
+ attr_reader input: Array[Prism::Comment]
34
+
35
+ # @rbs input: Array[Prism::Comment]
36
+ def initialize: (Array[Prism::Comment] input) -> untyped
37
+
38
+ # @rbs input: Array[Prism::Comment]
39
+ # @rbs returns Array[ParsingResult]
40
+ def self.parse: (Array[Prism::Comment] input) -> Array[ParsingResult]
41
+
42
+ # @rbs returns Array[ParsingResult]
43
+ def parse: () -> Array[ParsingResult]
44
+
45
+ private
46
+
47
+ # @rbs result: ParsingResult
48
+ # @rbs block: ^(Array[Prism::Comment]) -> void
49
+ # @rbs returns void
50
+ def each_annotation_paragraph: (ParsingResult result) { (Array[Prism::Comment]) -> void } -> void
51
+
52
+ class Tokenizer
53
+ attr_reader scanner: StringScanner
54
+
55
+ attr_reader current_token: token?
56
+
57
+ KEYWORDS: Hash[String, Symbol]
58
+
59
+ KW_RE: ::Regexp
60
+
61
+ PUNCTS: Hash[String, Symbol]
62
+
63
+ PUNCTS_RE: Regexp
64
+
65
+ # @rbs scanner: StringScanner
66
+ # @rbs returns void
67
+ def initialize: (StringScanner scanner) -> void
68
+
69
+ # @rbs tree: AST::Tree
70
+ # @rbs returns token?
71
+ def advance: (AST::Tree tree) -> token?
72
+
73
+ # Consume given token type and inserts the token to the tree or `nil`
74
+ #
75
+ # @rbs type: Array[Symbol]
76
+ # @rbs tree: AST::Tree
77
+ # @rbs returns void
78
+ def consume_token: (*untyped types, tree: AST::Tree) -> void
79
+
80
+ # Consume given token type and inserts the token to the tree or raise
81
+ #
82
+ # @rbs type: Array[Symbol]
83
+ # @rbs tree: AST::Tree
84
+ # @rbs returns void
85
+ def consume_token!: (*untyped types, tree: AST::Tree) -> void
86
+
87
+ # Test if current token has specified `type`
88
+ #
89
+ # @rbs type: Array[Symbol]
90
+ # @rbs returns bool
91
+ def type?: (*Symbol type) -> bool
92
+
93
+ # Ensure current token is one of the specified in types
94
+ #
95
+ # @rbs types: Array[Symbol]
96
+ # @rbs returns void
97
+ def type!: (*Symbol types) -> void
98
+
99
+ # Reset the current_token to incoming comment `--`
100
+ #
101
+ # Reset to the end of the input if `--` token cannot be found.
102
+ #
103
+ # @rbs returns String -- String that is skipped
104
+ def skip_to_comment: () -> String
105
+ end
106
+
107
+ # @rbs comments: AST::CommentLines
108
+ # @rbs returns AST::Annotations::t?
109
+ def parse_annotation: (AST::CommentLines comments) -> AST::Annotations::t?
110
+
111
+ # @rbs tokenizer: Tokenizer
112
+ # @rbs returns AST::Tree
113
+ def parse_var_decl: (Tokenizer tokenizer) -> AST::Tree
114
+
115
+ # @rbs tokenizer: Tokenizer
116
+ # @rbs returns AST::Tree
117
+ def parse_return_type_decl: (Tokenizer tokenizer) -> AST::Tree
118
+
119
+ # @rbs tokenizer: Tokenizer
120
+ # @rbs returns AST::Tree
121
+ def parse_comment: (Tokenizer tokenizer) -> AST::Tree
122
+
123
+ # @rbs tokenizer: Tokenizer
124
+ # @rbs returns AST::Tree
125
+ def parse_type_app: (Tokenizer tokenizer) -> AST::Tree
126
+
127
+ # Parse a RBS method type or type and returns it
128
+ #
129
+ # It tries parsing a method type, and then parsing a type if failed.
130
+ #
131
+ # If both parsing failed, it returns a Tree(`:type_syntax_error), consuming all of the remaining input.
132
+ #
133
+ # Note that this doesn't recognize `--` comment unlike `parse_type`.
134
+ #
135
+ # @rbs tokenizer: Tokenizer
136
+ # @rbs parent_tree: AST::Tree
137
+ # @rbs returns MethodType | AST::Tree | Types::t | nil
138
+ def parse_type_method_type: (Tokenizer tokenizer, AST::Tree parent_tree) -> (MethodType | AST::Tree | Types::t | nil)
139
+
140
+ # Parse a RBS type and returns it
141
+ #
142
+ # If parsing failed, it returns a Tree(`:type_syntax_error), consuming
143
+ #
144
+ # 1. All of the input with `--` token if exists (for comments)
145
+ # 2. All of the input (for anything else)
146
+ #
147
+ # ```
148
+ # Integer -- Foo # => Returns `Integer`, tokenizer has `--` as its current token
149
+ # Integer[ -- Foo # => Returns a tree for `Integer[`, tokenizer has `--` as its curren token
150
+ # Integer[ Foo # => Returns a tree for `Integer[ Foo`, tokenizer is at the end of the input
151
+ # ```
152
+ #
153
+ # @rbs tokenizer: Tokenizer
154
+ # @rbs parent_tree: AST::Tree
155
+ # @rbs returns Types::t | AST::Tree | nil
156
+ def parse_type: (Tokenizer tokenizer, AST::Tree parent_tree) -> (Types::t | AST::Tree | nil)
157
+
158
+ # @rbs tokenizer: Tokenizer
159
+ # @rbs returns AST::Tree
160
+ def parse_rbs_annotation: (Tokenizer tokenizer) -> AST::Tree
161
+
162
+ # @rbs tokznier: Tokenizer
163
+ # @rbs returns AST::Tree
164
+ def parse_inherits: (untyped tokenizer) -> AST::Tree
165
+
166
+ # Parse `@rbs override` annotation
167
+ #
168
+ # @rbs tokenizer: Tokenizer
169
+ # @rbs returns AST::Tree
170
+ def parse_override: (Tokenizer tokenizer) -> AST::Tree
171
+
172
+ # Parse `@rbs use [CLAUSES]` annotation
173
+ #
174
+ # @rbs tokenizer: Tokenizer
175
+ # @rbs returns AST::Tree
176
+ def parse_use: (Tokenizer tokenizer) -> AST::Tree
177
+
178
+ # Parses use clause
179
+ #
180
+ # Returns one of the following form:
181
+ #
182
+ # * [`::`?, [UIDENT, `::`]*, LIDENT, [`as` LIDENT]?]
183
+ # * [`::`?, [UIDENT, `::`]*, UIDENT, [`as` UIDENT]?]
184
+ # * [`::`?, [UIDENT, `::`]*, IFIDENT, [`as`, IFIDENT]?]
185
+ # * [`::`?, [UIDENT) `::`]*, `*`]
186
+ #
187
+ # @rbs tokenizer: Tokenizer
188
+ # @rbs returns AST::Tree
189
+ def parse_use_clause: (Tokenizer tokenizer) -> AST::Tree
190
+
191
+ # @rbs tokenizer: Tokenizer
192
+ # @rbs returns AST::Tree
193
+ def parse_module_self: (Tokenizer tokenizer) -> AST::Tree
194
+
195
+ # Yield the block and return the resulting tree if tokenizer has current token of `types`
196
+ #
197
+ # ```rb
198
+ # # Test if tokenize has `--` token, then parse comment or insert `nil` to tree
199
+ #
200
+ # tree << parse_optional(tokenizer, :kMINUS2) do
201
+ # parse_comment(tokenizer)
202
+ # end
203
+ # ```
204
+ #
205
+ # @rbs tokenizer: Tokenizer
206
+ # @rbs types: Array[Symbol]
207
+ # @rbs block: ^() -> AST::Tree
208
+ # @rbs returns AST::Tree?
209
+ def parse_optional: (Tokenizer tokenizer, *Symbol types) { () -> AST::Tree } -> AST::Tree?
210
+
211
+ # @rbs tokenizer: Tokenizer
212
+ # @rbs returns AST::Tree
213
+ def parse_generic: (Tokenizer tokenizer) -> AST::Tree
214
+
215
+ # :: (Tokenizer) -> AST::Tree
216
+ def parse_ivar_type: (Tokenizer) -> AST::Tree
217
+
218
+ # :: (Tokenizer) -> AST::Tree
219
+ def parse_yields: (Tokenizer) -> AST::Tree
220
+ end
221
+ end
222
+ end