rbs 0.2.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +7 -1
- data/.gitignore +1 -1
- data/CHANGELOG.md +35 -0
- data/COPYING +1 -1
- data/Gemfile +16 -2
- data/README.md +87 -48
- data/Rakefile +54 -22
- data/bin/rbs-prof +9 -0
- data/bin/run_in_md.rb +49 -0
- data/bin/test_runner.rb +0 -2
- data/docs/sigs.md +6 -6
- data/docs/stdlib.md +3 -5
- data/docs/syntax.md +6 -3
- data/goodcheck.yml +65 -0
- data/lib/rbs.rb +3 -0
- data/lib/rbs/ast/declarations.rb +115 -14
- data/lib/rbs/ast/members.rb +41 -17
- data/lib/rbs/cli.rb +301 -123
- data/lib/rbs/constant.rb +4 -4
- data/lib/rbs/constant_table.rb +64 -53
- data/lib/rbs/definition.rb +175 -59
- data/lib/rbs/definition_builder.rb +646 -603
- data/lib/rbs/environment.rb +352 -210
- data/lib/rbs/environment_walker.rb +14 -23
- data/lib/rbs/errors.rb +159 -3
- data/lib/rbs/factory.rb +14 -0
- data/lib/rbs/namespace.rb +18 -0
- data/lib/rbs/parser.y +75 -21
- data/lib/rbs/prototype/rb.rb +119 -117
- data/lib/rbs/prototype/rbi.rb +5 -3
- data/lib/rbs/prototype/runtime.rb +34 -7
- data/lib/rbs/substitution.rb +8 -1
- data/lib/rbs/test.rb +81 -3
- data/lib/rbs/test/errors.rb +1 -1
- data/lib/rbs/test/hook.rb +133 -259
- data/lib/rbs/test/observer.rb +17 -0
- data/lib/rbs/test/setup.rb +13 -14
- data/lib/rbs/test/spy.rb +0 -321
- data/lib/rbs/test/tester.rb +116 -0
- data/lib/rbs/test/type_check.rb +44 -7
- data/lib/rbs/type_name_resolver.rb +58 -0
- data/lib/rbs/types.rb +94 -2
- data/lib/rbs/validator.rb +51 -0
- data/lib/rbs/variance_calculator.rb +12 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +127 -91
- data/rbs.gemspec +0 -9
- data/schema/annotation.json +14 -0
- data/schema/comment.json +26 -0
- data/schema/decls.json +353 -0
- data/schema/function.json +87 -0
- data/schema/location.json +56 -0
- data/schema/members.json +248 -0
- data/schema/methodType.json +44 -0
- data/schema/types.json +299 -0
- data/stdlib/benchmark/benchmark.rbs +151 -151
- data/stdlib/builtin/encoding.rbs +2 -0
- data/stdlib/builtin/enumerable.rbs +2 -2
- data/stdlib/builtin/enumerator.rbs +3 -1
- data/stdlib/builtin/fiber.rbs +5 -1
- data/stdlib/builtin/file.rbs +0 -3
- data/stdlib/builtin/io.rbs +4 -4
- data/stdlib/builtin/proc.rbs +1 -2
- data/stdlib/builtin/symbol.rbs +1 -1
- data/stdlib/builtin/thread.rbs +2 -2
- data/stdlib/csv/csv.rbs +4 -6
- data/stdlib/fiber/fiber.rbs +117 -0
- data/stdlib/json/json.rbs +1 -1
- data/stdlib/logger/formatter.rbs +23 -0
- data/stdlib/logger/log_device.rbs +39 -0
- data/stdlib/logger/logger.rbs +507 -0
- data/stdlib/logger/period.rbs +7 -0
- data/stdlib/logger/severity.rbs +8 -0
- data/stdlib/mutex_m/mutex_m.rbs +77 -0
- data/stdlib/pathname/pathname.rbs +6 -6
- data/stdlib/prime/integer-extension.rbs +1 -1
- data/stdlib/prime/prime.rbs +44 -44
- data/stdlib/tmpdir/tmpdir.rbs +1 -1
- metadata +26 -116
- data/lib/rbs/test/test_helper.rb +0 -183
@@ -23,13 +23,9 @@ module RBS
|
|
23
23
|
include TSort
|
24
24
|
|
25
25
|
def tsort_each_node(&block)
|
26
|
-
env.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
env.each_alias do |name, _|
|
31
|
-
yield name.absolute!
|
32
|
-
end
|
26
|
+
env.class_decls.each_key(&block)
|
27
|
+
env.interface_decls.each_key(&block)
|
28
|
+
env.alias_decls.each_key(&block)
|
33
29
|
end
|
34
30
|
|
35
31
|
def tsort_each_child(name, &block)
|
@@ -46,31 +42,26 @@ module RBS
|
|
46
42
|
definitions << builder.build_instance(name)
|
47
43
|
definitions << builder.build_singleton(name)
|
48
44
|
when name.interface?
|
49
|
-
definitions << builder.build_interface(name
|
45
|
+
definitions << builder.build_interface(name)
|
50
46
|
end
|
51
47
|
|
52
48
|
definitions.each do |definition|
|
53
|
-
definition.ancestors
|
54
|
-
|
49
|
+
if ancestors = definition.ancestors
|
50
|
+
ancestors.ancestors.each do |ancestor|
|
51
|
+
yield ancestor.name
|
55
52
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
53
|
+
case ancestor
|
54
|
+
when Definition::Ancestor::Instance
|
55
|
+
ancestor.args.each do |type|
|
56
|
+
each_type_name type, &block
|
57
|
+
end
|
60
58
|
end
|
61
59
|
end
|
62
60
|
end
|
63
61
|
|
64
62
|
unless only_ancestors?
|
65
|
-
definition.
|
66
|
-
|
67
|
-
method_type.type.each_type do |type|
|
68
|
-
each_type_name type, &block
|
69
|
-
end
|
70
|
-
method_type.block&.type&.each_type do |type|
|
71
|
-
each_type_name type, &block
|
72
|
-
end
|
73
|
-
end
|
63
|
+
definition.each_type do |type|
|
64
|
+
each_type_name type, &block
|
74
65
|
end
|
75
66
|
end
|
76
67
|
end
|
data/lib/rbs/errors.rb
CHANGED
@@ -1,4 +1,19 @@
|
|
1
1
|
module RBS
|
2
|
+
module MethodNameHelper
|
3
|
+
def method_name_string()
|
4
|
+
separator = case kind
|
5
|
+
when :instance
|
6
|
+
"#"
|
7
|
+
when :singleton
|
8
|
+
"."
|
9
|
+
else
|
10
|
+
raise
|
11
|
+
end
|
12
|
+
|
13
|
+
"#{type_name}#{separator}#{method_name}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
2
17
|
class InvalidTypeApplicationError < StandardError
|
3
18
|
attr_reader :type_name
|
4
19
|
attr_reader :args
|
@@ -10,7 +25,7 @@ module RBS
|
|
10
25
|
@args = args
|
11
26
|
@params = params
|
12
27
|
@location = location
|
13
|
-
super "#{Location.to_string location}: #{type_name} expects parameters [#{params.
|
28
|
+
super "#{Location.to_string location}: #{type_name} expects parameters [#{params.join(", ")}], but given args [#{args.join(", ")}]"
|
14
29
|
end
|
15
30
|
|
16
31
|
def self.check!(type_name:, args:, params:, location:)
|
@@ -93,13 +108,66 @@ module RBS
|
|
93
108
|
end
|
94
109
|
|
95
110
|
def self.check!(type_name, env:, location:)
|
96
|
-
|
97
|
-
|
111
|
+
dic = case
|
112
|
+
when type_name.class?
|
113
|
+
env.class_decls
|
114
|
+
when type_name.alias?
|
115
|
+
env.alias_decls
|
116
|
+
when type_name.interface?
|
117
|
+
env.interface_decls
|
118
|
+
else
|
119
|
+
raise
|
120
|
+
end
|
121
|
+
|
122
|
+
dic.key?(type_name) or raise new(type_name: type_name, location: location)
|
98
123
|
|
99
124
|
type_name
|
100
125
|
end
|
101
126
|
end
|
102
127
|
|
128
|
+
class NoSuperclassFoundError < StandardError
|
129
|
+
attr_reader :type_name
|
130
|
+
attr_reader :location
|
131
|
+
|
132
|
+
def initialize(type_name:, location:)
|
133
|
+
@type_name = type_name
|
134
|
+
@location = location
|
135
|
+
|
136
|
+
super "#{Location.to_string location}: Could not find super class: #{type_name}"
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.check!(type_name, env:, location:)
|
140
|
+
env.class_decls.key?(type_name) or raise new(type_name: type_name, location: location)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
class NoMixinFoundError < StandardError
|
145
|
+
attr_reader :type_name
|
146
|
+
attr_reader :member
|
147
|
+
|
148
|
+
def initialize(type_name:, member:)
|
149
|
+
@type_name = type_name
|
150
|
+
@member = member
|
151
|
+
|
152
|
+
super "#{Location.to_string location}: Could not find mixin: #{type_name}"
|
153
|
+
end
|
154
|
+
|
155
|
+
def location
|
156
|
+
member.location
|
157
|
+
end
|
158
|
+
|
159
|
+
def self.check!(type_name, env:, member:)
|
160
|
+
dic = case
|
161
|
+
when type_name.class?
|
162
|
+
env.class_decls
|
163
|
+
when type_name.interface?
|
164
|
+
env.interface_decls
|
165
|
+
end
|
166
|
+
|
167
|
+
dic.key?(type_name) or raise new(type_name: type_name, member: member)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
103
171
|
class DuplicatedMethodDefinitionError < StandardError
|
104
172
|
attr_reader :decl
|
105
173
|
attr_reader :location
|
@@ -122,6 +190,26 @@ module RBS
|
|
122
190
|
end
|
123
191
|
end
|
124
192
|
|
193
|
+
class MethodDefinitionConflictWithInterfaceMixinError < StandardError
|
194
|
+
include MethodNameHelper
|
195
|
+
|
196
|
+
attr_reader :type_name
|
197
|
+
attr_reader :method_name
|
198
|
+
attr_reader :kind
|
199
|
+
attr_reader :mixin_member
|
200
|
+
attr_reader :entries
|
201
|
+
|
202
|
+
def initialize(type_name:, method_name:, kind:, mixin_member:, entries:)
|
203
|
+
@type_name = type_name
|
204
|
+
@method_name = method_name
|
205
|
+
@kind = kind
|
206
|
+
@mixin_member = mixin_member
|
207
|
+
@entries = entries
|
208
|
+
|
209
|
+
super "#{entries[0].decl.location}: Duplicated method with interface mixin: #{method_name_string}"
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
125
213
|
class UnknownMethodAliasError < StandardError
|
126
214
|
attr_reader :original_name
|
127
215
|
attr_reader :aliased_name
|
@@ -142,6 +230,74 @@ module RBS
|
|
142
230
|
end
|
143
231
|
end
|
144
232
|
|
233
|
+
class SuperclassMismatchError < StandardError
|
234
|
+
attr_reader :name
|
235
|
+
attr_reader :entry
|
236
|
+
|
237
|
+
def initialize(name:, super_classes:, entry:)
|
238
|
+
@name = name
|
239
|
+
@entry = entry
|
240
|
+
super "#{Location.to_string entry.primary.decl.location}: Superclass mismatch: #{name}"
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
class InconsistentMethodVisibilityError < StandardError
|
245
|
+
attr_reader :type_name
|
246
|
+
attr_reader :method_name
|
247
|
+
attr_reader :kind
|
248
|
+
attr_reader :member_pairs
|
249
|
+
|
250
|
+
def initialize(type_name:, method_name:, kind:, member_pairs:)
|
251
|
+
@type_name = type_name
|
252
|
+
@method_name = method_name
|
253
|
+
@kind = kind
|
254
|
+
@member_pairs = member_pairs
|
255
|
+
|
256
|
+
delimiter = case kind
|
257
|
+
when :instance
|
258
|
+
"#"
|
259
|
+
when :singleton
|
260
|
+
"."
|
261
|
+
end
|
262
|
+
|
263
|
+
super "#{Location.to_string member_pairs[0][0].location}: Inconsistent method visibility: #{type_name}#{delimiter}#{method_name}"
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
class InvalidOverloadMethodError < StandardError
|
268
|
+
attr_reader :type_name
|
269
|
+
attr_reader :method_name
|
270
|
+
attr_reader :kind
|
271
|
+
attr_reader :members
|
272
|
+
|
273
|
+
def initialize(type_name:, method_name:, kind:, members:)
|
274
|
+
@type_name = type_name
|
275
|
+
@method_name = method_name
|
276
|
+
@kind = kind
|
277
|
+
@members = members
|
278
|
+
|
279
|
+
delimiter = case kind
|
280
|
+
when :instance
|
281
|
+
"#"
|
282
|
+
when :singleton
|
283
|
+
"."
|
284
|
+
end
|
285
|
+
|
286
|
+
super "#{Location.to_string members[0].location}: Invalid method overloading: #{type_name}#{delimiter}#{method_name}"
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
class GenericParameterMismatchError < StandardError
|
291
|
+
attr_reader :name
|
292
|
+
attr_reader :decl
|
293
|
+
|
294
|
+
def initialize(name:, decl:)
|
295
|
+
@name = name
|
296
|
+
@decl = decl
|
297
|
+
super "#{Location.to_string decl.location}: Generic parameters mismatch: #{name}"
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
145
301
|
class DuplicatedDeclarationError < StandardError
|
146
302
|
attr_reader :name
|
147
303
|
attr_reader :decls
|
data/lib/rbs/factory.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module RBS
|
2
|
+
class Factory
|
3
|
+
def type_name(string)
|
4
|
+
absolute = string.start_with?("::")
|
5
|
+
|
6
|
+
*path, name = string.delete_prefix("::").split("::").map(&:to_sym)
|
7
|
+
|
8
|
+
TypeName.new(
|
9
|
+
name: name,
|
10
|
+
namespace: Namespace.new(path: path, absolute: absolute)
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/rbs/namespace.rb
CHANGED
@@ -87,5 +87,23 @@ module RBS
|
|
87
87
|
new(path: string.split("::").map(&:to_sym), absolute: false)
|
88
88
|
end
|
89
89
|
end
|
90
|
+
|
91
|
+
|
92
|
+
def ascend
|
93
|
+
if block_given?
|
94
|
+
current = self
|
95
|
+
|
96
|
+
until current.empty?
|
97
|
+
yield current
|
98
|
+
current = current.parent
|
99
|
+
end
|
100
|
+
|
101
|
+
yield current
|
102
|
+
|
103
|
+
self
|
104
|
+
else
|
105
|
+
enum_for(:ascend)
|
106
|
+
end
|
107
|
+
end
|
90
108
|
end
|
91
109
|
end
|
data/lib/rbs/parser.y
CHANGED
@@ -10,7 +10,7 @@ class RBS::Parser
|
|
10
10
|
kINTERFACE kEND kINCLUDE kEXTEND kATTRREADER kATTRWRITER kATTRACCESSOR tOPERATOR tQUOTEDMETHOD tQUOTEDIDENT
|
11
11
|
kPREPEND kEXTENSION kINCOMPATIBLE
|
12
12
|
type_TYPE type_SIGNATURE type_METHODTYPE tEOF
|
13
|
-
kOUT kIN kUNCHECKED
|
13
|
+
kOUT kIN kUNCHECKED kOVERLOAD
|
14
14
|
|
15
15
|
prechigh
|
16
16
|
nonassoc kQUESTION
|
@@ -106,28 +106,28 @@ rule
|
|
106
106
|
}
|
107
107
|
|
108
108
|
module_decl:
|
109
|
-
annotations kMODULE start_new_scope class_name module_type_params
|
109
|
+
annotations kMODULE start_new_scope class_name module_type_params colon_module_self_types class_members kEND {
|
110
110
|
reset_variable_scope
|
111
111
|
|
112
112
|
location = val[1].location + val[7].location
|
113
113
|
result = Declarations::Module.new(
|
114
114
|
name: val[3].value,
|
115
115
|
type_params: val[4]&.value || Declarations::ModuleTypeParams.empty,
|
116
|
-
|
116
|
+
self_types: val[5],
|
117
117
|
members: val[6],
|
118
118
|
annotations: val[0],
|
119
119
|
location: location,
|
120
120
|
comment: leading_comment(val[0].first&.location || location)
|
121
121
|
)
|
122
122
|
}
|
123
|
-
| annotations kMODULE start_new_scope tUKEYWORD
|
123
|
+
| annotations kMODULE start_new_scope tUKEYWORD module_self_types class_members kEND {
|
124
124
|
reset_variable_scope
|
125
125
|
|
126
126
|
location = val[1].location + val[6].location
|
127
127
|
result = Declarations::Module.new(
|
128
128
|
name: val[3].value,
|
129
129
|
type_params: Declarations::ModuleTypeParams.empty,
|
130
|
-
|
130
|
+
self_types: val[4],
|
131
131
|
members: val[5],
|
132
132
|
annotations: val[0],
|
133
133
|
location: location,
|
@@ -135,12 +135,50 @@ rule
|
|
135
135
|
)
|
136
136
|
}
|
137
137
|
|
138
|
-
|
139
|
-
{ result =
|
140
|
-
| kCOLON
|
138
|
+
colon_module_self_types:
|
139
|
+
{ result = [] }
|
140
|
+
| kCOLON module_self_types {
|
141
141
|
result = val[1]
|
142
142
|
}
|
143
143
|
|
144
|
+
module_self_types:
|
145
|
+
module_self_type {
|
146
|
+
result = [val[0]]
|
147
|
+
}
|
148
|
+
| module_self_types kCOMMA module_self_type {
|
149
|
+
result = val[0].push(val[2])
|
150
|
+
}
|
151
|
+
|
152
|
+
module_self_type:
|
153
|
+
qualified_name kLBRACKET type_list kRBRACKET {
|
154
|
+
name = val[0].value
|
155
|
+
args = val[2]
|
156
|
+
location = val[0].location + val[3].location
|
157
|
+
|
158
|
+
case
|
159
|
+
when name.class?
|
160
|
+
result = Declarations::Module::Self.new(name: name, args: args, location: location)
|
161
|
+
when name.interface?
|
162
|
+
result = Declarations::Module::Self.new(name: name, args: args, location: location)
|
163
|
+
else
|
164
|
+
raise SemanticsError.new("Module self type should be instance or interface", subject: val[0], location: val[0].location)
|
165
|
+
end
|
166
|
+
}
|
167
|
+
| qualified_name {
|
168
|
+
name = val[0].value
|
169
|
+
args = []
|
170
|
+
location = val[0].location
|
171
|
+
|
172
|
+
case
|
173
|
+
when name.class?
|
174
|
+
result = Declarations::Module::Self.new(name: name, args: args, location: location)
|
175
|
+
when name.interface?
|
176
|
+
result = Declarations::Module::Self.new(name: name, args: args, location: location)
|
177
|
+
else
|
178
|
+
raise SemanticsError.new("Module self type should be instance or interface", subject: val[0], location: val[0].location)
|
179
|
+
end
|
180
|
+
}
|
181
|
+
|
144
182
|
class_members:
|
145
183
|
{ result = [] }
|
146
184
|
| class_members class_member {
|
@@ -161,6 +199,7 @@ rule
|
|
161
199
|
result = Members::Private.new(location: val[0].location)
|
162
200
|
}
|
163
201
|
| alias_member
|
202
|
+
| signature
|
164
203
|
|
165
204
|
attribute_member:
|
166
205
|
annotations kATTRREADER keyword type {
|
@@ -386,10 +425,12 @@ rule
|
|
386
425
|
comment: leading_comment(val[0].first&.location || location))
|
387
426
|
}
|
388
427
|
|
428
|
+
overload: { result = nil } | kOVERLOAD
|
429
|
+
|
389
430
|
method_member:
|
390
|
-
annotations attributes kDEF method_kind def_name method_types {
|
391
|
-
location = val[
|
392
|
-
types = val[
|
431
|
+
annotations attributes overload kDEF method_kind def_name method_types {
|
432
|
+
location = val[3].location + val[6].last.location
|
433
|
+
types = val[6].map do |type|
|
393
434
|
case type
|
394
435
|
when LocatedValue
|
395
436
|
type.value
|
@@ -398,13 +439,14 @@ rule
|
|
398
439
|
end
|
399
440
|
end
|
400
441
|
result = Members::MethodDefinition.new(
|
401
|
-
name: val[
|
402
|
-
kind: val[
|
442
|
+
name: val[5].value,
|
443
|
+
kind: val[4],
|
403
444
|
types: types,
|
404
445
|
annotations: val[0],
|
405
446
|
location: location,
|
406
|
-
comment: leading_comment(val[0].first&.location || val[1].first&.location || val[2].location),
|
407
|
-
attributes: val[1].map(&:value)
|
447
|
+
comment: leading_comment(val[0].first&.location || val[1].first&.location || val[2]&.location || val[3].location),
|
448
|
+
attributes: val[1].map(&:value),
|
449
|
+
overload: !!val[2]
|
408
450
|
)
|
409
451
|
}
|
410
452
|
|
@@ -500,13 +542,13 @@ rule
|
|
500
542
|
| tQUOTEDIDENT
|
501
543
|
| tWRITE_ATTR
|
502
544
|
|
503
|
-
method_name0: tUIDENT | tLIDENT | identifier_keywords
|
545
|
+
method_name0: tUIDENT | tLIDENT | tINTERFACEIDENT | identifier_keywords
|
504
546
|
|
505
547
|
identifier_keywords:
|
506
548
|
kCLASS | kVOID | kNIL | kTRUE | kFALSE | kANY | kUNTYPED | kTOP | kBOT | kINSTANCE | kBOOL | kSINGLETON
|
507
549
|
| kTYPE | kMODULE | kPRIVATE | kPUBLIC | kEND | kINCLUDE | kEXTEND | kPREPEND
|
508
550
|
| kATTRREADER | kATTRACCESSOR | kATTRWRITER | kDEF | kEXTENSION | kSELF | kINCOMPATIBLE
|
509
|
-
| kUNCHECKED
|
551
|
+
| kUNCHECKED | kINTERFACE | kSUPER | kALIAS | kOUT | kIN | kOVERLOAD
|
510
552
|
|
511
553
|
module_type_params:
|
512
554
|
{ result = nil }
|
@@ -1026,6 +1068,7 @@ def initialize(type, buffer:, eof_re:)
|
|
1026
1068
|
@eof = false
|
1027
1069
|
@bound_variables_stack = []
|
1028
1070
|
@comments = {}
|
1071
|
+
@ascii_only = buffer.content.ascii_only?
|
1029
1072
|
end
|
1030
1073
|
|
1031
1074
|
def start_merged_variables_scope
|
@@ -1119,8 +1162,9 @@ def push_comment(string, location)
|
|
1119
1162
|
end
|
1120
1163
|
|
1121
1164
|
def new_token(type, value = input.matched)
|
1122
|
-
|
1123
|
-
|
1165
|
+
charpos = charpos(input)
|
1166
|
+
start_index = charpos - input.matched.size
|
1167
|
+
end_index = charpos
|
1124
1168
|
|
1125
1169
|
location = RBS::Location.new(buffer: buffer,
|
1126
1170
|
start_pos: start_index,
|
@@ -1129,6 +1173,14 @@ def new_token(type, value = input.matched)
|
|
1129
1173
|
[type, LocatedValue.new(location: location, value: value)]
|
1130
1174
|
end
|
1131
1175
|
|
1176
|
+
def charpos(scanner)
|
1177
|
+
if @ascii_only
|
1178
|
+
scanner.pos
|
1179
|
+
else
|
1180
|
+
scanner.charpos
|
1181
|
+
end
|
1182
|
+
end
|
1183
|
+
|
1132
1184
|
def empty_params_result
|
1133
1185
|
[
|
1134
1186
|
[],
|
@@ -1173,6 +1225,7 @@ KEYWORDS = {
|
|
1173
1225
|
"extension" => :kEXTENSION,
|
1174
1226
|
"incompatible" => :kINCOMPATIBLE,
|
1175
1227
|
"unchecked" => :kUNCHECKED,
|
1228
|
+
"overload" => :kOVERLOAD,
|
1176
1229
|
"out" => :kOUT,
|
1177
1230
|
"in" => :kIN,
|
1178
1231
|
}
|
@@ -1245,8 +1298,9 @@ def next_token
|
|
1245
1298
|
when input.scan(/\s+/)
|
1246
1299
|
# skip
|
1247
1300
|
when input.scan(/#(( *)|( ?(?<string>.*)))\n/)
|
1248
|
-
|
1249
|
-
|
1301
|
+
charpos = charpos(input)
|
1302
|
+
start_index = charpos - input.matched.size
|
1303
|
+
end_index = charpos-1
|
1250
1304
|
|
1251
1305
|
location = RBS::Location.new(buffer: buffer,
|
1252
1306
|
start_pos: start_index,
|