rbs 0.5.0 → 0.9.1
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/CHANGELOG.md +33 -0
- data/Gemfile +2 -0
- data/Rakefile +2 -3
- data/docs/stdlib.md +0 -2
- data/docs/syntax.md +6 -3
- data/goodcheck.yml +65 -0
- data/lib/rbs.rb +1 -0
- data/lib/rbs/ast/comment.rb +6 -0
- data/lib/rbs/ast/declarations.rb +44 -6
- data/lib/rbs/cli.rb +21 -3
- data/lib/rbs/constant_table.rb +1 -1
- data/lib/rbs/definition_builder.rb +290 -124
- data/lib/rbs/environment.rb +50 -37
- data/lib/rbs/errors.rb +68 -25
- data/lib/rbs/factory.rb +14 -0
- data/lib/rbs/location.rb +15 -0
- data/lib/rbs/parser.y +89 -28
- data/lib/rbs/prototype/rb.rb +2 -2
- data/lib/rbs/prototype/rbi.rb +1 -1
- data/lib/rbs/prototype/runtime.rb +1 -1
- data/lib/rbs/substitution.rb +6 -2
- data/lib/rbs/test.rb +82 -3
- data/lib/rbs/test/errors.rb +5 -1
- data/lib/rbs/test/hook.rb +133 -259
- data/lib/rbs/test/observer.rb +17 -0
- data/lib/rbs/test/setup.rb +37 -20
- data/lib/rbs/test/setup_helper.rb +29 -0
- data/lib/rbs/test/spy.rb +0 -321
- data/lib/rbs/test/tester.rb +118 -0
- data/lib/rbs/test/type_check.rb +42 -5
- data/lib/rbs/validator.rb +4 -0
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +2 -2
- data/schema/decls.json +21 -10
- data/stdlib/builtin/enumerable.rbs +2 -2
- data/stdlib/builtin/proc.rbs +1 -2
- data/stdlib/json/json.rbs +6 -0
- 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/pty/pty.rbs +159 -0
- metadata +13 -3
- data/lib/rbs/test/test_helper.rb +0 -180
data/lib/rbs/environment.rb
CHANGED
@@ -34,56 +34,49 @@ module RBS
|
|
34
34
|
|
35
35
|
def insert(decl:, outer:)
|
36
36
|
decls << D.new(decl: decl, outer: outer)
|
37
|
+
@primary = nil
|
37
38
|
end
|
38
39
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
def validate_type_params
|
41
|
+
unless decls.empty?
|
42
|
+
hd_decl, *tl_decls = decls
|
43
|
+
hd_params = hd_decl.decl.type_params
|
44
|
+
hd_names = hd_params.params.map(&:name)
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
-
unless decl.is_a?(AST::Declarations::Module)
|
47
|
-
raise MixedClassModuleDeclarationError.new(name: name, decl: decl)
|
48
|
-
end
|
46
|
+
tl_decls.each do |tl_decl|
|
47
|
+
tl_params = tl_decl.decl.type_params
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
raise GenericParameterMismatchError.new(name: name, decl: decl)
|
49
|
+
unless hd_params.size == tl_params.size && hd_params == tl_params.rename_to(hd_names)
|
50
|
+
raise GenericParameterMismatchError.new(name: name, decl: tl_decl.decl)
|
51
|
+
end
|
54
52
|
end
|
55
53
|
end
|
54
|
+
end
|
56
55
|
|
57
|
-
|
56
|
+
def type_params
|
57
|
+
primary.decl.type_params
|
58
58
|
end
|
59
|
+
end
|
59
60
|
|
60
|
-
|
61
|
-
|
61
|
+
class ModuleEntry < MultiEntry
|
62
|
+
def self_types
|
63
|
+
decls.flat_map do |d|
|
64
|
+
d.decl.self_types
|
65
|
+
end.uniq
|
62
66
|
end
|
63
67
|
|
64
|
-
def
|
65
|
-
primary
|
68
|
+
def primary
|
69
|
+
@primary ||= begin
|
70
|
+
validate_type_params
|
71
|
+
decls.first
|
72
|
+
end
|
66
73
|
end
|
67
74
|
end
|
68
75
|
|
69
76
|
class ClassEntry < MultiEntry
|
70
|
-
def insert(decl:, outer:)
|
71
|
-
unless decl.is_a?(AST::Declarations::Class)
|
72
|
-
raise MixedClassModuleDeclarationError.new(name: name, decl: decl)
|
73
|
-
end
|
74
|
-
|
75
|
-
unless decls.empty?
|
76
|
-
names = decls[0].decl.type_params.each.map(&:name)
|
77
|
-
unless names.size == decl.type_params.each.size && decls[0].decl.type_params == decl.type_params.rename_to(names)
|
78
|
-
raise GenericParameterMismatchError.new(name: name, decl: decl)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
super(decl: decl, outer: outer)
|
83
|
-
end
|
84
|
-
|
85
77
|
def primary
|
86
78
|
@primary ||= begin
|
79
|
+
validate_type_params
|
87
80
|
decls.find {|d| d.decl.super_class } || decls.first
|
88
81
|
end
|
89
82
|
end
|
@@ -133,7 +126,7 @@ module RBS
|
|
133
126
|
|
134
127
|
def cache_name(cache, name:, decl:, outer:)
|
135
128
|
if cache.key?(name)
|
136
|
-
raise DuplicatedDeclarationError.new(name, decl, cache[name])
|
129
|
+
raise DuplicatedDeclarationError.new(name, decl, cache[name].decl)
|
137
130
|
end
|
138
131
|
|
139
132
|
cache[name] = SingleEntry.new(name: name, decl: decl, outer: outer)
|
@@ -157,7 +150,18 @@ module RBS
|
|
157
150
|
end
|
158
151
|
end
|
159
152
|
|
160
|
-
class_decls[name]
|
153
|
+
existing_entry = class_decls[name]
|
154
|
+
|
155
|
+
case
|
156
|
+
when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
|
157
|
+
# OK
|
158
|
+
when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
|
159
|
+
# OK
|
160
|
+
else
|
161
|
+
raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary.decl)
|
162
|
+
end
|
163
|
+
|
164
|
+
existing_entry.insert(decl: decl, outer: outer)
|
161
165
|
|
162
166
|
prefix = outer + [decl]
|
163
167
|
ns = name.to_namespace
|
@@ -255,8 +259,12 @@ module RBS
|
|
255
259
|
AST::Declarations::Module.new(
|
256
260
|
name: decl.name.with_prefix(prefix),
|
257
261
|
type_params: decl.type_params,
|
258
|
-
|
259
|
-
|
262
|
+
self_types: decl.self_types.map do |module_self|
|
263
|
+
AST::Declarations::Module::Self.new(
|
264
|
+
name: absolute_type_name(resolver, module_self.name, context: context),
|
265
|
+
args: module_self.args.map {|type| absolute_type(resolver, type, context: context) },
|
266
|
+
location: module_self.location
|
267
|
+
)
|
260
268
|
end,
|
261
269
|
members: decl.members.map do |member|
|
262
270
|
case member
|
@@ -406,5 +414,10 @@ module RBS
|
|
406
414
|
absolute_type_name(resolver, name, context: context)
|
407
415
|
end
|
408
416
|
end
|
417
|
+
|
418
|
+
def inspect
|
419
|
+
ivars = %i[@buffers @declarations @class_decls @interface_decls @alias_decls @constant_decls @global_decls]
|
420
|
+
"\#<RBS::Environment #{ivars.map { |iv| "#{iv}=(#{instance_variable_get(iv).size} items)"}.join(' ')}>"
|
421
|
+
end
|
409
422
|
end
|
410
423
|
end
|
data/lib/rbs/errors.rb
CHANGED
@@ -125,6 +125,74 @@ module RBS
|
|
125
125
|
end
|
126
126
|
end
|
127
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 NoSelfTypeFoundError < StandardError
|
145
|
+
attr_reader :type_name
|
146
|
+
attr_reader :location
|
147
|
+
|
148
|
+
def initialize(type_name:, location:)
|
149
|
+
@type_name = type_name
|
150
|
+
@location = location
|
151
|
+
|
152
|
+
super "#{Location.to_string location}: Could not find self type: #{type_name}"
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.check!(self_type, env:)
|
156
|
+
type_name = self_type.name
|
157
|
+
|
158
|
+
dic = case
|
159
|
+
when type_name.class?
|
160
|
+
env.class_decls
|
161
|
+
when type_name.interface?
|
162
|
+
env.interface_decls
|
163
|
+
end
|
164
|
+
|
165
|
+
dic.key?(type_name) or raise new(type_name: type_name, location: self_type.location)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
class NoMixinFoundError < StandardError
|
170
|
+
attr_reader :type_name
|
171
|
+
attr_reader :member
|
172
|
+
|
173
|
+
def initialize(type_name:, member:)
|
174
|
+
@type_name = type_name
|
175
|
+
@member = member
|
176
|
+
|
177
|
+
super "#{Location.to_string location}: Could not find mixin: #{type_name}"
|
178
|
+
end
|
179
|
+
|
180
|
+
def location
|
181
|
+
member.location
|
182
|
+
end
|
183
|
+
|
184
|
+
def self.check!(type_name, env:, member:)
|
185
|
+
dic = case
|
186
|
+
when type_name.class?
|
187
|
+
env.class_decls
|
188
|
+
when type_name.interface?
|
189
|
+
env.interface_decls
|
190
|
+
end
|
191
|
+
|
192
|
+
dic.key?(type_name) or raise new(type_name: type_name, member: member)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
128
196
|
class DuplicatedMethodDefinitionError < StandardError
|
129
197
|
attr_reader :decl
|
130
198
|
attr_reader :location
|
@@ -187,17 +255,6 @@ module RBS
|
|
187
255
|
end
|
188
256
|
end
|
189
257
|
|
190
|
-
class MixedClassModuleDeclarationError < StandardError
|
191
|
-
attr_reader :name
|
192
|
-
attr_reader :decl
|
193
|
-
|
194
|
-
def initialize(name:, decl:)
|
195
|
-
@name = name
|
196
|
-
@decl = decl
|
197
|
-
super "#{Location.to_string decl.location}: Both class and module declarations: #{name}"
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
258
|
class SuperclassMismatchError < StandardError
|
202
259
|
attr_reader :name
|
203
260
|
attr_reader :entry
|
@@ -209,20 +266,6 @@ module RBS
|
|
209
266
|
end
|
210
267
|
end
|
211
268
|
|
212
|
-
class ModuleSelfTypeMismatchError < StandardError
|
213
|
-
attr_reader :name
|
214
|
-
attr_reader :entry
|
215
|
-
attr_reader :location
|
216
|
-
|
217
|
-
def initialize(name:, entry:, location:)
|
218
|
-
@name = name
|
219
|
-
@entry = entry
|
220
|
-
@location = location
|
221
|
-
|
222
|
-
super "#{Location.to_string location}: Module self type mismatch: #{name}"
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
269
|
class InconsistentMethodVisibilityError < StandardError
|
227
270
|
attr_reader :type_name
|
228
271
|
attr_reader :method_name
|
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/location.rb
CHANGED
@@ -77,6 +77,21 @@ module RBS
|
|
77
77
|
locations.inject {|l1, l2| l1 + l2 }
|
78
78
|
end
|
79
79
|
|
80
|
+
def concat(*others)
|
81
|
+
others.each { |other| self << other }
|
82
|
+
self
|
83
|
+
end
|
84
|
+
|
85
|
+
def <<(other)
|
86
|
+
if other
|
87
|
+
raise "Invalid concat: buffer=#{buffer.name}, other.buffer=#{other.buffer.name}" unless other.buffer == buffer
|
88
|
+
@end_pos = other.end_pos
|
89
|
+
@source = nil
|
90
|
+
@end_loc = nil
|
91
|
+
end
|
92
|
+
self
|
93
|
+
end
|
94
|
+
|
80
95
|
def pred?(loc)
|
81
96
|
loc.is_a?(Location) &&
|
82
97
|
loc.name == name &&
|
data/lib/rbs/parser.y
CHANGED
@@ -4,9 +4,9 @@ class RBS::Parser
|
|
4
4
|
tANNOTATION
|
5
5
|
tSTRING tSYMBOL tINTEGER tWRITE_ATTR
|
6
6
|
kLPAREN kRPAREN kLBRACKET kRBRACKET kLBRACE kRBRACE
|
7
|
-
kVOID kNIL kTRUE kFALSE kANY kUNTYPED kTOP kBOT kSELF kSELFQ kINSTANCE kCLASS kBOOL kSINGLETON kTYPE kDEF kMODULE
|
7
|
+
kVOID kNIL kTRUE kFALSE kANY kUNTYPED kTOP kBOT kSELF kSELFQ kINSTANCE kCLASS kBOOL kSINGLETON kTYPE kDEF kMODULE
|
8
8
|
kPRIVATE kPUBLIC kALIAS
|
9
|
-
kCOLON kCOLON2 kCOMMA kBAR kAMP kHAT kARROW kQUESTION kEXCLAMATION kSTAR kSTAR2 kFATARROW kEQ kDOT kLT
|
9
|
+
kCOLON kCOLON2 kCOMMA kBAR kAMP kHAT kARROW kQUESTION kEXCLAMATION kSTAR kSTAR2 kFATARROW kEQ kDOT kDOT3 kLT
|
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
|
@@ -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 {
|
@@ -387,7 +425,12 @@ rule
|
|
387
425
|
comment: leading_comment(val[0].first&.location || location))
|
388
426
|
}
|
389
427
|
|
390
|
-
overload:
|
428
|
+
overload:
|
429
|
+
{ result = nil }
|
430
|
+
| kOVERLOAD {
|
431
|
+
RBS.logger.warn "`overload def` syntax is deprecated. Use `...` syntax instead."
|
432
|
+
result = val[0]
|
433
|
+
}
|
391
434
|
|
392
435
|
method_member:
|
393
436
|
annotations attributes overload kDEF method_kind def_name method_types {
|
@@ -400,15 +443,24 @@ rule
|
|
400
443
|
type
|
401
444
|
end
|
402
445
|
end
|
446
|
+
|
447
|
+
last_type = val[6].last
|
448
|
+
if last_type.is_a?(LocatedValue) && last_type.value == :dot3
|
449
|
+
overload = true
|
450
|
+
val[6].pop
|
451
|
+
else
|
452
|
+
overload = false
|
453
|
+
end
|
454
|
+
|
403
455
|
result = Members::MethodDefinition.new(
|
404
456
|
name: val[5].value,
|
405
457
|
kind: val[4],
|
406
|
-
types:
|
458
|
+
types: val[6],
|
407
459
|
annotations: val[0],
|
408
460
|
location: location,
|
409
461
|
comment: leading_comment(val[0].first&.location || val[1].first&.location || val[2]&.location || val[3].location),
|
410
462
|
attributes: val[1].map(&:value),
|
411
|
-
overload: !!val[2]
|
463
|
+
overload: overload || !!val[2]
|
412
464
|
)
|
413
465
|
}
|
414
466
|
|
@@ -425,7 +477,7 @@ rule
|
|
425
477
|
|
426
478
|
method_types:
|
427
479
|
method_type { result = [val[0]] }
|
428
|
-
|
|
480
|
+
| kDOT3 { result = [LocatedValue.new(value: :dot3, location: val[0].location)] }
|
429
481
|
| method_type kBAR method_types {
|
430
482
|
result = val[2].unshift(val[0])
|
431
483
|
}
|
@@ -482,7 +534,7 @@ rule
|
|
482
534
|
|
483
535
|
method_name:
|
484
536
|
tOPERATOR
|
485
|
-
| kAMP | kHAT | kSTAR | kLT | kEXCLAMATION | kSTAR2 | kBAR
|
537
|
+
| kAMP | kHAT | kSTAR | kLT | kEXCLAMATION | kSTAR2 | kBAR
|
486
538
|
| method_name0
|
487
539
|
| method_name0 kQUESTION {
|
488
540
|
unless val[0].location.pred?(val[1].location)
|
@@ -510,7 +562,7 @@ rule
|
|
510
562
|
kCLASS | kVOID | kNIL | kTRUE | kFALSE | kANY | kUNTYPED | kTOP | kBOT | kINSTANCE | kBOOL | kSINGLETON
|
511
563
|
| kTYPE | kMODULE | kPRIVATE | kPUBLIC | kEND | kINCLUDE | kEXTEND | kPREPEND
|
512
564
|
| kATTRREADER | kATTRACCESSOR | kATTRWRITER | kDEF | kEXTENSION | kSELF | kINCOMPATIBLE
|
513
|
-
| kUNCHECKED | kINTERFACE |
|
565
|
+
| kUNCHECKED | kINTERFACE | kALIAS | kOUT | kIN | kOVERLOAD
|
514
566
|
|
515
567
|
module_type_params:
|
516
568
|
{ result = nil }
|
@@ -1030,6 +1082,7 @@ def initialize(type, buffer:, eof_re:)
|
|
1030
1082
|
@eof = false
|
1031
1083
|
@bound_variables_stack = []
|
1032
1084
|
@comments = {}
|
1085
|
+
@ascii_only = buffer.content.ascii_only?
|
1033
1086
|
end
|
1034
1087
|
|
1035
1088
|
def start_merged_variables_scope
|
@@ -1111,20 +1164,19 @@ def leading_comment(location)
|
|
1111
1164
|
end
|
1112
1165
|
|
1113
1166
|
def push_comment(string, location)
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
new_comment = AST::Comment.new(string:
|
1119
|
-
|
1167
|
+
if (comment = leading_comment(location)) && comment.location.start_column == location.start_column
|
1168
|
+
comment.concat(string: "#{string}\n", location: location)
|
1169
|
+
@comments[comment.location.end_line] = comment
|
1170
|
+
else
|
1171
|
+
new_comment = AST::Comment.new(string: "#{string}\n", location: location)
|
1172
|
+
@comments[new_comment.location.end_line] = new_comment
|
1120
1173
|
end
|
1121
|
-
|
1122
|
-
@comments[new_comment.location.end_line] = new_comment
|
1123
1174
|
end
|
1124
1175
|
|
1125
1176
|
def new_token(type, value = input.matched)
|
1126
|
-
|
1127
|
-
|
1177
|
+
charpos = charpos(input)
|
1178
|
+
start_index = charpos - input.matched.size
|
1179
|
+
end_index = charpos
|
1128
1180
|
|
1129
1181
|
location = RBS::Location.new(buffer: buffer,
|
1130
1182
|
start_pos: start_index,
|
@@ -1133,6 +1185,14 @@ def new_token(type, value = input.matched)
|
|
1133
1185
|
[type, LocatedValue.new(location: location, value: value)]
|
1134
1186
|
end
|
1135
1187
|
|
1188
|
+
def charpos(scanner)
|
1189
|
+
if @ascii_only
|
1190
|
+
scanner.pos
|
1191
|
+
else
|
1192
|
+
scanner.charpos
|
1193
|
+
end
|
1194
|
+
end
|
1195
|
+
|
1136
1196
|
def empty_params_result
|
1137
1197
|
[
|
1138
1198
|
[],
|
@@ -1170,7 +1230,6 @@ KEYWORDS = {
|
|
1170
1230
|
"attr_reader" => :kATTRREADER,
|
1171
1231
|
"attr_writer" => :kATTRWRITER,
|
1172
1232
|
"attr_accessor" => :kATTRACCESSOR,
|
1173
|
-
"super" => :kSUPER,
|
1174
1233
|
"public" => :kPUBLIC,
|
1175
1234
|
"private" => :kPRIVATE,
|
1176
1235
|
"alias" => :kALIAS,
|
@@ -1219,6 +1278,7 @@ PUNCTS = {
|
|
1219
1278
|
"!" => :kEXCLAMATION,
|
1220
1279
|
"**" => :kSTAR2,
|
1221
1280
|
"*" => :kSTAR,
|
1281
|
+
"..." => :kDOT3,
|
1222
1282
|
"." => :kDOT,
|
1223
1283
|
"<" => :kLT,
|
1224
1284
|
"-@" => :tOPERATOR,
|
@@ -1250,8 +1310,9 @@ def next_token
|
|
1250
1310
|
when input.scan(/\s+/)
|
1251
1311
|
# skip
|
1252
1312
|
when input.scan(/#(( *)|( ?(?<string>.*)))\n/)
|
1253
|
-
|
1254
|
-
|
1313
|
+
charpos = charpos(input)
|
1314
|
+
start_index = charpos - input.matched.size
|
1315
|
+
end_index = charpos-1
|
1255
1316
|
|
1256
1317
|
location = RBS::Location.new(buffer: buffer,
|
1257
1318
|
start_pos: start_index,
|