rbs-inline 0.3.0 → 0.5.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/README.md +10 -7
- data/Rakefile +12 -0
- data/lib/rbs/inline/annotation_parser/tokenizer.rb +361 -0
- data/lib/rbs/inline/annotation_parser.rb +548 -326
- data/lib/rbs/inline/ast/annotations.rb +446 -136
- data/lib/rbs/inline/ast/comment_lines.rb +32 -18
- data/lib/rbs/inline/ast/declarations.rb +67 -28
- data/lib/rbs/inline/ast/members.rb +137 -140
- data/lib/rbs/inline/ast/tree.rb +104 -5
- data/lib/rbs/inline/cli.rb +12 -12
- data/lib/rbs/inline/node_utils.rb +4 -0
- data/lib/rbs/inline/parser.rb +140 -59
- data/lib/rbs/inline/version.rb +1 -1
- data/lib/rbs/inline/writer.rb +243 -94
- data/lib/rbs/inline.rb +4 -0
- data/rbs_collection.lock.yaml +3 -7
- data/rbs_collection.yaml +2 -0
- data/sig/generated/rbs/inline/annotation_parser/tokenizer.rbs +221 -0
- data/sig/generated/rbs/inline/annotation_parser.rbs +148 -92
- data/sig/generated/rbs/inline/ast/annotations.rbs +142 -36
- data/sig/generated/rbs/inline/ast/comment_lines.rbs +35 -0
- data/sig/generated/rbs/inline/ast/declarations.rbs +29 -10
- data/sig/generated/rbs/inline/ast/members.rbs +33 -24
- data/sig/generated/rbs/inline/ast/tree.rbs +132 -0
- data/sig/generated/rbs/inline/cli.rbs +3 -3
- data/sig/generated/rbs/inline/node_utils.rbs +11 -0
- data/sig/generated/rbs/inline/parser.rbs +38 -18
- data/sig/generated/rbs/inline/version.rbs +7 -0
- data/sig/generated/rbs/inline/writer.rbs +104 -0
- data/sig/generated/rbs/inline.rbs +7 -0
- metadata +14 -14
- data/sig/rbs/inline/annotation_parser.rbs +0 -0
- data/sig/rbs/inline/ast/comment_lines.rbs +0 -27
- data/sig/rbs/inline/ast/tree.rbs +0 -98
- data/sig/rbs/inline/node_utils.rbs +0 -7
- data/sig/rbs/inline/writer.rbs +0 -27
- data/sig/rbs/inline.rbs +0 -41
- data/yard-samples/hello.rb +0 -6
- data/yard-samples/sample1.rb +0 -26
data/lib/rbs/inline/ast/tree.rb
CHANGED
@@ -1,17 +1,29 @@
|
|
1
|
+
# rbs_inline: enabled
|
2
|
+
|
1
3
|
module RBS
|
2
4
|
module Inline
|
3
5
|
module AST
|
6
|
+
# @rbs!
|
7
|
+
# type token = [Symbol, String]
|
8
|
+
#
|
9
|
+
# type tree = token | Tree | Types::t | MethodType | nil
|
10
|
+
|
4
11
|
class Tree
|
5
|
-
attr_reader :trees
|
6
|
-
attr_reader :type
|
7
|
-
|
12
|
+
attr_reader :trees #: Array[tree]
|
13
|
+
attr_reader :type #: Symbol
|
14
|
+
|
15
|
+
# Children but without `tWHITESPACE` tokens
|
16
|
+
attr_reader :non_trivia_trees #: Array[tree]
|
8
17
|
|
9
|
-
|
18
|
+
# @rbs type: Symbol
|
19
|
+
def initialize(type) #: void
|
10
20
|
@type = type
|
11
21
|
@trees = []
|
12
22
|
@non_trivia_trees = []
|
13
23
|
end
|
14
24
|
|
25
|
+
# @rbs tok: tree
|
26
|
+
# @rbs return: self
|
15
27
|
def <<(tok)
|
16
28
|
trees << tok
|
17
29
|
unless tok.is_a?(Array) && tok[0] == :tWHITESPACE
|
@@ -20,7 +32,8 @@ module RBS
|
|
20
32
|
self
|
21
33
|
end
|
22
34
|
|
23
|
-
|
35
|
+
# Returns the source code associated to the tree
|
36
|
+
def to_s #: String
|
24
37
|
buf = +""
|
25
38
|
|
26
39
|
trees.each do |tree|
|
@@ -39,6 +52,26 @@ module RBS
|
|
39
52
|
buf
|
40
53
|
end
|
41
54
|
|
55
|
+
# Returns `true` if token at the given index is of the given type
|
56
|
+
def token?(type, at:)
|
57
|
+
if tok = nth_token?(at)
|
58
|
+
tok[0] == type
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns `true` if tree at the given index is of the given type
|
63
|
+
def tree?(type, at:)
|
64
|
+
if tree = nth_tree?(at)
|
65
|
+
tree.type == type
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns n-th token from the children
|
70
|
+
#
|
71
|
+
# Raises if the value is not a token or nil.
|
72
|
+
#
|
73
|
+
# @rbs index: Integer
|
74
|
+
# @rbs return: token?
|
42
75
|
def nth_token(index)
|
43
76
|
tok = non_trivia_trees[index]
|
44
77
|
case tok
|
@@ -49,6 +82,12 @@ module RBS
|
|
49
82
|
end
|
50
83
|
end
|
51
84
|
|
85
|
+
# Returns n-th token from the children
|
86
|
+
#
|
87
|
+
# Returns `nil` if the value is not a token.
|
88
|
+
#
|
89
|
+
# @rbs index: Integer
|
90
|
+
# @rbs return: token?
|
52
91
|
def nth_token?(index)
|
53
92
|
tok = non_trivia_trees[index]
|
54
93
|
case tok
|
@@ -59,10 +98,22 @@ module RBS
|
|
59
98
|
end
|
60
99
|
end
|
61
100
|
|
101
|
+
# Returns n-th token from the children
|
102
|
+
#
|
103
|
+
# Raises if the value is not token.
|
104
|
+
#
|
105
|
+
# @rbs index: Integer
|
106
|
+
# @rbs return: token
|
62
107
|
def nth_token!(index)
|
63
108
|
nth_token(index) || raise
|
64
109
|
end
|
65
110
|
|
111
|
+
# Returns n-th tree from the children
|
112
|
+
#
|
113
|
+
# Raises if the value is not a tree or nil.
|
114
|
+
#
|
115
|
+
# @rbs index: Integer
|
116
|
+
# @rbs return: Tree?
|
66
117
|
def nth_tree(index)
|
67
118
|
tok = non_trivia_trees[index]
|
68
119
|
case tok
|
@@ -73,6 +124,12 @@ module RBS
|
|
73
124
|
end
|
74
125
|
end
|
75
126
|
|
127
|
+
# Returns n-th tree from the children
|
128
|
+
#
|
129
|
+
# Returns `nil` if the value is not a tree or nil.
|
130
|
+
#
|
131
|
+
# @rbs index: Integer
|
132
|
+
# @rbs return: Tree?
|
76
133
|
def nth_tree?(index)
|
77
134
|
tok = non_trivia_trees[index]
|
78
135
|
case tok
|
@@ -83,11 +140,23 @@ module RBS
|
|
83
140
|
end
|
84
141
|
end
|
85
142
|
|
143
|
+
# Returns n-th tree from the children
|
144
|
+
#
|
145
|
+
# Raises if the value is not a tree.
|
146
|
+
#
|
147
|
+
# @rbs index: Integer
|
148
|
+
# @rbs return: Tree
|
86
149
|
def nth_tree!(index)
|
87
150
|
nth_tree(index) || raise
|
88
151
|
end
|
89
152
|
|
90
153
|
|
154
|
+
# Returns n-th type from the children
|
155
|
+
#
|
156
|
+
# Raises if the value is not a type or nil.
|
157
|
+
#
|
158
|
+
# @rbs index: Integer
|
159
|
+
# @rbs return: Types::t?
|
91
160
|
def nth_type(index)
|
92
161
|
tok = non_trivia_trees[index]
|
93
162
|
case tok
|
@@ -98,6 +167,12 @@ module RBS
|
|
98
167
|
end
|
99
168
|
end
|
100
169
|
|
170
|
+
# Returns n-th type from the children
|
171
|
+
#
|
172
|
+
# Returns `nil` if the value is not a type.
|
173
|
+
#
|
174
|
+
# @rbs index: Integer
|
175
|
+
# @rbs return: Types::t?
|
101
176
|
def nth_type?(index)
|
102
177
|
tok = non_trivia_trees[index]
|
103
178
|
case tok
|
@@ -108,10 +183,22 @@ module RBS
|
|
108
183
|
end
|
109
184
|
end
|
110
185
|
|
186
|
+
# Returns n-th type from the children
|
187
|
+
#
|
188
|
+
# Raises if the value is not a type.
|
189
|
+
#
|
190
|
+
# @rbs index: Integer
|
191
|
+
# @rbs return: Types::t
|
111
192
|
def nth_type!(index)
|
112
193
|
nth_type(index) || raise
|
113
194
|
end
|
114
195
|
|
196
|
+
# Returns n-th method type from the children
|
197
|
+
#
|
198
|
+
# Raises if the value is not a method type or `nil`.
|
199
|
+
#
|
200
|
+
# @rbs index: Integer
|
201
|
+
# @rbs return: MethodType?
|
115
202
|
def nth_method_type(index)
|
116
203
|
tok = non_trivia_trees[index]
|
117
204
|
case tok
|
@@ -122,6 +209,12 @@ module RBS
|
|
122
209
|
end
|
123
210
|
end
|
124
211
|
|
212
|
+
# Returns n-th method type from the children
|
213
|
+
#
|
214
|
+
# Returns `nil` if the value is not a method type.
|
215
|
+
#
|
216
|
+
# @rbs index: Integer
|
217
|
+
# @rbs return: MethodType?
|
125
218
|
def nth_method_type?(index)
|
126
219
|
tok = non_trivia_trees[index]
|
127
220
|
case tok
|
@@ -132,6 +225,12 @@ module RBS
|
|
132
225
|
end
|
133
226
|
end
|
134
227
|
|
228
|
+
# Returns n-th method tree from the children
|
229
|
+
#
|
230
|
+
# Raises if the value is not a method tree.
|
231
|
+
#
|
232
|
+
# @rbs index: Integer
|
233
|
+
# @rbs return: MethodType
|
135
234
|
def nth_method_type!(index)
|
136
235
|
nth_method_type(index) || raise
|
137
236
|
end
|
data/lib/rbs/inline/cli.rb
CHANGED
@@ -17,22 +17,22 @@ module RBS
|
|
17
17
|
#
|
18
18
|
#
|
19
19
|
class PathCalculator
|
20
|
-
attr_reader :pwd
|
20
|
+
attr_reader :pwd #: Pathname
|
21
21
|
|
22
|
-
attr_reader :base_paths
|
22
|
+
attr_reader :base_paths #: Array[Pathname]
|
23
23
|
|
24
|
-
attr_reader :output_path
|
24
|
+
attr_reader :output_path #: Pathname
|
25
25
|
|
26
26
|
# @rbs pwd: Pathname
|
27
27
|
# @rbs base_paths: Array[Pathname]
|
28
28
|
# @rbs output_path: Pathname
|
29
|
-
def initialize(pwd, base_paths, output_path)
|
29
|
+
def initialize(pwd, base_paths, output_path) #: void
|
30
30
|
@pwd = pwd
|
31
31
|
@base_paths = base_paths
|
32
32
|
@output_path = output_path
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
#: (Pathname) -> Pathname?
|
36
36
|
def calculate(path)
|
37
37
|
path = pwd + path if path.relative?
|
38
38
|
path = path.cleanpath
|
@@ -49,18 +49,18 @@ module RBS
|
|
49
49
|
|
50
50
|
# @rbs path: Pathname
|
51
51
|
# @rbs prefix: Pathname
|
52
|
-
# @rbs
|
52
|
+
# @rbs return: bool
|
53
53
|
def has_prefix?(path, prefix:)
|
54
54
|
path.descend.include?(prefix)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
attr_reader :stdout, :stderr
|
59
|
-
attr_reader :logger
|
58
|
+
attr_reader :stdout, :stderr #: IO
|
59
|
+
attr_reader :logger #: Logger
|
60
60
|
|
61
61
|
# @rbs stdout: IO
|
62
62
|
# @rbs stderr: IO
|
63
|
-
def initialize(stdout: STDOUT, stderr: STDERR)
|
63
|
+
def initialize(stdout: STDOUT, stderr: STDERR) #: void
|
64
64
|
@stdout = stdout
|
65
65
|
@stderr = stderr
|
66
66
|
@logger = Logger.new(stderr)
|
@@ -68,7 +68,7 @@ module RBS
|
|
68
68
|
end
|
69
69
|
|
70
70
|
# @rbs args: Array[String]
|
71
|
-
# @rbs
|
71
|
+
# @rbs return: Integer
|
72
72
|
def run(args)
|
73
73
|
base_paths = [Pathname("lib"), Pathname("app")]
|
74
74
|
output_path = nil #: Pathname?
|
@@ -139,10 +139,10 @@ module RBS
|
|
139
139
|
|
140
140
|
logger.debug { "Parsing ruby file #{target}..." }
|
141
141
|
|
142
|
-
if (uses, decls = Parser.parse(Prism.parse_file(target.to_s), opt_in: opt_in))
|
142
|
+
if (uses, decls, rbs_decls = Parser.parse(Prism.parse_file(target.to_s), opt_in: opt_in))
|
143
143
|
writer = Writer.new()
|
144
144
|
writer.header("Generated from #{target.relative? ? target : target.relative_path_from(Pathname.pwd)} with RBS::Inline")
|
145
|
-
writer.write(uses, decls)
|
145
|
+
writer.write(uses, decls, rbs_decls)
|
146
146
|
|
147
147
|
if output
|
148
148
|
unless output.parent.directory?
|
data/lib/rbs/inline/parser.rb
CHANGED
@@ -5,13 +5,18 @@
|
|
5
5
|
module RBS
|
6
6
|
module Inline
|
7
7
|
class Parser < Prism::Visitor
|
8
|
+
# @rbs! type with_members = AST::Declarations::ModuleDecl
|
9
|
+
# | AST::Declarations::ClassDecl
|
10
|
+
# | AST::Declarations::SingletonClassDecl
|
11
|
+
# | AST::Declarations::BlockDecl
|
12
|
+
|
8
13
|
# The top level declarations
|
9
14
|
#
|
10
|
-
attr_reader :decls
|
15
|
+
attr_reader :decls #: Array[AST::Declarations::t]
|
11
16
|
|
12
17
|
# The surrounding declarations
|
13
18
|
#
|
14
|
-
attr_reader :surrounding_decls
|
19
|
+
attr_reader :surrounding_decls #: Array[with_members]
|
15
20
|
|
16
21
|
# ParsingResult associated with the line number at the end
|
17
22
|
#
|
@@ -23,24 +28,35 @@ module RBS
|
|
23
28
|
# > [!IMPORTANT]
|
24
29
|
# > The values will be removed during parsing.
|
25
30
|
#
|
26
|
-
attr_reader :comments
|
31
|
+
attr_reader :comments #: Hash[Integer, AnnotationParser::ParsingResult]
|
27
32
|
|
28
33
|
# The current visibility applied to single `def` node
|
29
34
|
#
|
30
35
|
# Assuming it's directly inside `private` or `public` calls.
|
31
36
|
# `nil` when the `def` node is not inside `private` or `public` calls.
|
32
37
|
#
|
33
|
-
attr_reader :current_visibility
|
38
|
+
attr_reader :current_visibility #: RBS::AST::Members::visibility?
|
34
39
|
|
35
|
-
def initialize()
|
40
|
+
def initialize() #: void
|
36
41
|
@decls = []
|
37
42
|
@surrounding_decls = []
|
38
43
|
@comments = {}
|
39
44
|
end
|
40
45
|
|
46
|
+
# Parses the given Prism result to a three tuple
|
47
|
+
#
|
48
|
+
# Returns a three tuple of:
|
49
|
+
#
|
50
|
+
# 1. An array of `use` directives
|
51
|
+
# 2. An array of declarations
|
52
|
+
# 3. An array of RBS declarations given as `@rbs!` annotation at top-level
|
53
|
+
#
|
54
|
+
# Note that only RBS declarations are allowed in the top-level `@rbs!` annotations.
|
55
|
+
# RBS *members* are ignored in the array.
|
56
|
+
#
|
41
57
|
# @rbs result: ParseResult
|
42
58
|
# @rbs opt_in: bool -- `true` for *opt-out* mode, `false` for *opt-in* mode.
|
43
|
-
# @rbs
|
59
|
+
# @rbs return: [Array[AST::Annotations::Use], Array[AST::Declarations::t], Array[RBS::AST::Declarations::t]]?
|
44
60
|
def self.parse(result, opt_in:)
|
45
61
|
instance = Parser.new()
|
46
62
|
|
@@ -61,7 +77,7 @@ module RBS
|
|
61
77
|
|
62
78
|
uses = [] #: Array[AST::Annotations::Use]
|
63
79
|
annots.each do |annot|
|
64
|
-
annot.
|
80
|
+
annot.each_annotation do |annotation|
|
65
81
|
if annotation.is_a?(AST::Annotations::Use)
|
66
82
|
uses << annotation
|
67
83
|
end
|
@@ -70,24 +86,44 @@ module RBS
|
|
70
86
|
|
71
87
|
instance.visit(result.value)
|
72
88
|
|
89
|
+
rbs_embeddeds = [] #: Array[AST::Members::RBSEmbedded]
|
90
|
+
|
91
|
+
instance.comments.each_value do |comment|
|
92
|
+
comment.each_annotation do |annotation|
|
93
|
+
if annotation.is_a?(AST::Annotations::Embedded)
|
94
|
+
rbs_embeddeds << AST::Members::RBSEmbedded.new(comment, annotation)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
rbs_decls = rbs_embeddeds.flat_map do |embedded|
|
100
|
+
if (members = embedded.members).is_a?(Array)
|
101
|
+
members.select do |member|
|
102
|
+
member.is_a?(RBS::AST::Declarations::Base)
|
103
|
+
end
|
104
|
+
else
|
105
|
+
[]
|
106
|
+
end #: Array[RBS::AST::Declarations::t]
|
107
|
+
end
|
108
|
+
|
73
109
|
[
|
74
110
|
uses,
|
75
|
-
instance.decls
|
111
|
+
instance.decls,
|
112
|
+
rbs_decls
|
76
113
|
]
|
77
114
|
end
|
78
115
|
|
79
|
-
# @rbs
|
116
|
+
# @rbs return: with_members?
|
80
117
|
def current_class_module_decl
|
81
118
|
surrounding_decls.last
|
82
119
|
end
|
83
120
|
|
84
|
-
# @rbs
|
121
|
+
# @rbs return: with_members
|
85
122
|
def current_class_module_decl!
|
86
123
|
current_class_module_decl or raise
|
87
124
|
end
|
88
125
|
|
89
|
-
|
90
|
-
#:: (AST::Declarations::ConstantDecl) -> void
|
126
|
+
#: (with_members) { () -> void } -> void
|
91
127
|
def push_class_module_decl(decl)
|
92
128
|
if current = current_class_module_decl
|
93
129
|
current.members << decl
|
@@ -96,7 +132,7 @@ module RBS
|
|
96
132
|
end
|
97
133
|
|
98
134
|
if block_given?
|
99
|
-
surrounding_decls.push(
|
135
|
+
surrounding_decls.push(decl)
|
100
136
|
begin
|
101
137
|
yield
|
102
138
|
ensure
|
@@ -114,11 +150,11 @@ module RBS
|
|
114
150
|
# @rbs members: Array[AST::Members::t | AST::Declarations::t] --
|
115
151
|
# The destination.
|
116
152
|
# The method doesn't insert declarations, but have it to please type checker.
|
117
|
-
def load_inner_annotations(start_line, end_line, members)
|
153
|
+
def load_inner_annotations(start_line, end_line, members) #: void
|
118
154
|
comments = inner_annotations(start_line, end_line)
|
119
155
|
|
120
156
|
comments.each do |comment|
|
121
|
-
comment.
|
157
|
+
comment.each_annotation do |annotation|
|
122
158
|
case annotation
|
123
159
|
when AST::Annotations::IvarType
|
124
160
|
members << AST::Members::RBSIvar.new(comment, annotation)
|
@@ -133,39 +169,53 @@ module RBS
|
|
133
169
|
|
134
170
|
# @rbs override
|
135
171
|
def visit_class_node(node)
|
136
|
-
|
172
|
+
process_nesting_node(node) do
|
173
|
+
visit node.constant_path
|
174
|
+
visit node.superclass
|
137
175
|
|
138
|
-
|
139
|
-
|
176
|
+
associated_comment = comments.delete(node.location.start_line - 1)
|
177
|
+
if node.superclass
|
178
|
+
app_comment = application_annotation(node.superclass)
|
179
|
+
end
|
140
180
|
|
141
|
-
|
142
|
-
if node.superclass
|
143
|
-
app_comment = application_annotation(node.superclass)
|
144
|
-
end
|
181
|
+
class_decl = AST::Declarations::ClassDecl.new(node, associated_comment, app_comment)
|
145
182
|
|
146
|
-
|
183
|
+
push_class_module_decl(class_decl) do
|
184
|
+
visit node.body
|
185
|
+
end
|
147
186
|
|
148
|
-
|
149
|
-
visit node.body
|
187
|
+
load_inner_annotations(node.location.start_line, node.location.end_line, class_decl.members)
|
150
188
|
end
|
189
|
+
end
|
151
190
|
|
152
|
-
|
191
|
+
# @rbs override
|
192
|
+
def visit_singleton_class_node(node)
|
193
|
+
process_nesting_node(node) do
|
194
|
+
associated_comment = comments.delete(node.location.start_line - 1)
|
195
|
+
singleton_decl = AST::Declarations::SingletonClassDecl.new(node, associated_comment)
|
196
|
+
|
197
|
+
push_class_module_decl(singleton_decl) do
|
198
|
+
visit node.body
|
199
|
+
end
|
200
|
+
|
201
|
+
load_inner_annotations(node.location.start_line, node.location.end_line, singleton_decl.members)
|
202
|
+
end
|
153
203
|
end
|
154
204
|
|
155
205
|
# @rbs override
|
156
206
|
def visit_module_node(node)
|
157
|
-
|
207
|
+
process_nesting_node(node) do
|
208
|
+
visit node.constant_path
|
158
209
|
|
159
|
-
|
210
|
+
associated_comment = comments.delete(node.location.start_line - 1)
|
160
211
|
|
161
|
-
|
212
|
+
module_decl = AST::Declarations::ModuleDecl.new(node, associated_comment)
|
213
|
+
push_class_module_decl(module_decl) do
|
214
|
+
visit node.body
|
215
|
+
end
|
162
216
|
|
163
|
-
|
164
|
-
push_class_module_decl(module_decl) do
|
165
|
-
visit node.body
|
217
|
+
load_inner_annotations(node.location.start_line, node.location.end_line, module_decl.members)
|
166
218
|
end
|
167
|
-
|
168
|
-
load_inner_annotations(node.location.start_line, node.location.end_line, module_decl.members)
|
169
219
|
end
|
170
220
|
|
171
221
|
# Returns an array of annotations from comments that is located between start_line and end_line
|
@@ -179,7 +229,7 @@ module RBS
|
|
179
229
|
#
|
180
230
|
# @rbs start_line: Integer
|
181
231
|
# @rbs end_line: Integer
|
182
|
-
def inner_annotations(start_line, end_line)
|
232
|
+
def inner_annotations(start_line, end_line) #: Array[AnnotationParser::ParsingResult]
|
183
233
|
annotations = comments.each_value.select do |annotation|
|
184
234
|
range = annotation.line_range
|
185
235
|
start_line < range.begin && range.end < end_line
|
@@ -192,25 +242,27 @@ module RBS
|
|
192
242
|
|
193
243
|
# @rbs override
|
194
244
|
def visit_def_node(node)
|
195
|
-
|
196
|
-
|
245
|
+
process_nesting_node(node) do
|
246
|
+
return unless current_class_module_decl
|
197
247
|
|
198
|
-
|
248
|
+
current_decl = current_class_module_decl!
|
199
249
|
|
200
|
-
|
201
|
-
|
202
|
-
|
250
|
+
if node.location
|
251
|
+
associated_comment = comments.delete(node.location.start_line - 1)
|
252
|
+
end
|
203
253
|
|
204
|
-
|
254
|
+
assertion = assertion_annotation(node.rparen_loc || node&.parameters&.location || node.name_loc)
|
205
255
|
|
206
|
-
|
256
|
+
current_decl.members << AST::Members::RubyDef.new(node, associated_comment, current_visibility, assertion)
|
207
257
|
|
208
|
-
|
258
|
+
super
|
259
|
+
end
|
209
260
|
end
|
210
261
|
|
211
262
|
# @rbs override
|
212
263
|
def visit_alias_method_node(node)
|
213
264
|
return if ignored_node?(node)
|
265
|
+
return unless current_class_module_decl
|
214
266
|
|
215
267
|
if node.location
|
216
268
|
comment = comments.delete(node.location.start_line - 1)
|
@@ -244,9 +296,9 @@ module RBS
|
|
244
296
|
end
|
245
297
|
if assertion_comment && comment_line
|
246
298
|
comments.delete(comment_line)
|
247
|
-
assertion = assertion_comment.
|
248
|
-
annotation.is_a?(AST::Annotations::
|
249
|
-
end #: AST::Annotations::
|
299
|
+
assertion = assertion_comment.each_annotation.find do |annotation|
|
300
|
+
annotation.is_a?(AST::Annotations::TypeAssertion)
|
301
|
+
end #: AST::Annotations::TypeAssertion?
|
250
302
|
end
|
251
303
|
|
252
304
|
current_class_module_decl!.members << AST::Members::RubyAttr.new(node, comment, assertion)
|
@@ -284,8 +336,8 @@ module RBS
|
|
284
336
|
end
|
285
337
|
|
286
338
|
# @rbs new_visibility: RBS::AST::Members::visibility?
|
287
|
-
# @rbs block:
|
288
|
-
# @rbs
|
339
|
+
# @rbs &block: () -> void
|
340
|
+
# @rbs return: void
|
289
341
|
def push_visibility(new_visibility, &block)
|
290
342
|
old_visibility = current_visibility
|
291
343
|
|
@@ -297,11 +349,21 @@ module RBS
|
|
297
349
|
end
|
298
350
|
end
|
299
351
|
|
352
|
+
# @rbs [A] (Node) { () -> A } -> A?
|
353
|
+
def process_nesting_node(node)
|
354
|
+
yield unless ignored_node?(node)
|
355
|
+
ensure
|
356
|
+
# Delete all inner annotations
|
357
|
+
inner_annotations(node.location.start_line, node.location.end_line)
|
358
|
+
comments.delete(node.location.start_line)
|
359
|
+
comments.delete(node.location.end_line)
|
360
|
+
end
|
361
|
+
|
300
362
|
# @rbs node: Node
|
301
|
-
# @rbs
|
363
|
+
# @rbs return: bool
|
302
364
|
def ignored_node?(node)
|
303
365
|
if comment = comments.fetch(node.location.start_line - 1, nil)
|
304
|
-
comment.
|
366
|
+
comment.each_annotation.any? { _1.is_a?(AST::Annotations::Skip) }
|
305
367
|
else
|
306
368
|
false
|
307
369
|
end
|
@@ -312,7 +374,7 @@ module RBS
|
|
312
374
|
# The application annotation is removed from `comments`.
|
313
375
|
#
|
314
376
|
# @rbs node: Node
|
315
|
-
# @rbs
|
377
|
+
# @rbs return: AST::Annotations::Application?
|
316
378
|
def application_annotation(node)
|
317
379
|
comment_line, app_comment = comments.find do |_, comment|
|
318
380
|
comment.line_range.begin == node.location.end_line
|
@@ -320,18 +382,18 @@ module RBS
|
|
320
382
|
|
321
383
|
if app_comment && comment_line
|
322
384
|
comments.delete(comment_line)
|
323
|
-
app_comment.
|
385
|
+
app_comment.each_annotation.find do |annotation|
|
324
386
|
annotation.is_a?(AST::Annotations::Application)
|
325
387
|
end #: AST::Annotations::Application?
|
326
388
|
end
|
327
389
|
end
|
328
390
|
|
329
|
-
# Fetch
|
391
|
+
# Fetch TypeAssertion annotation which is associated to `node`
|
330
392
|
#
|
331
393
|
# The assertion annotation is removed from `comments`.
|
332
394
|
#
|
333
395
|
# @rbs node: Node | Location
|
334
|
-
# @rbs
|
396
|
+
# @rbs return: AST::Annotations::TypeAssertion?
|
335
397
|
def assertion_annotation(node)
|
336
398
|
if node.is_a?(Prism::Location)
|
337
399
|
location = node
|
@@ -344,9 +406,9 @@ module RBS
|
|
344
406
|
|
345
407
|
if app_comment && comment_line
|
346
408
|
comments.delete(comment_line)
|
347
|
-
app_comment.
|
348
|
-
annotation.is_a?(AST::Annotations::
|
349
|
-
end #: AST::Annotations::
|
409
|
+
app_comment.each_annotation.find do |annotation|
|
410
|
+
annotation.is_a?(AST::Annotations::TypeAssertion)
|
411
|
+
end #: AST::Annotations::TypeAssertion?
|
350
412
|
end
|
351
413
|
end
|
352
414
|
|
@@ -358,7 +420,26 @@ module RBS
|
|
358
420
|
assertion = assertion_annotation(node)
|
359
421
|
|
360
422
|
decl = AST::Declarations::ConstantDecl.new(node, comment, assertion)
|
361
|
-
|
423
|
+
|
424
|
+
if current = current_class_module_decl
|
425
|
+
current.members << decl
|
426
|
+
else
|
427
|
+
decls << decl
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
# @rbs override
|
432
|
+
def visit_block_node(node)
|
433
|
+
process_nesting_node(node) do
|
434
|
+
comment = comments.delete(node.location.start_line - 1)
|
435
|
+
block = AST::Declarations::BlockDecl.new(node, comment)
|
436
|
+
|
437
|
+
push_class_module_decl(block) do
|
438
|
+
super
|
439
|
+
end
|
440
|
+
|
441
|
+
load_inner_annotations(node.location.start_line, node.location.end_line, block.members)
|
442
|
+
end
|
362
443
|
end
|
363
444
|
end
|
364
445
|
end
|