rbs-inline 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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