rbs 1.6.1 → 1.7.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +18 -3
  3. data/.gitignore +10 -1
  4. data/CHANGELOG.md +25 -0
  5. data/Gemfile +1 -0
  6. data/Rakefile +22 -22
  7. data/core/enumerator.rbs +1 -0
  8. data/core/io.rbs +1 -1
  9. data/core/kernel.rbs +4 -4
  10. data/core/trace_point.rbs +1 -1
  11. data/ext/rbs_extension/constants.c +139 -0
  12. data/ext/rbs_extension/constants.h +72 -0
  13. data/ext/rbs_extension/extconf.rb +3 -0
  14. data/ext/rbs_extension/lexer.c +2533 -0
  15. data/ext/rbs_extension/lexer.h +161 -0
  16. data/ext/rbs_extension/lexer.re +140 -0
  17. data/ext/rbs_extension/lexstate.c +139 -0
  18. data/ext/rbs_extension/location.c +295 -0
  19. data/ext/rbs_extension/location.h +59 -0
  20. data/ext/rbs_extension/main.c +9 -0
  21. data/ext/rbs_extension/parser.c +2390 -0
  22. data/ext/rbs_extension/parser.h +18 -0
  23. data/ext/rbs_extension/parserstate.c +313 -0
  24. data/ext/rbs_extension/parserstate.h +141 -0
  25. data/ext/rbs_extension/rbs_extension.h +40 -0
  26. data/ext/rbs_extension/ruby_objs.c +521 -0
  27. data/ext/rbs_extension/ruby_objs.h +46 -0
  28. data/ext/rbs_extension/unescape.c +65 -0
  29. data/goodcheck.yml +1 -1
  30. data/lib/rbs/ast/comment.rb +0 -12
  31. data/lib/rbs/buffer.rb +4 -0
  32. data/lib/rbs/cli.rb +5 -8
  33. data/lib/rbs/collection/installer.rb +1 -0
  34. data/lib/rbs/collection/sources/git.rb +18 -3
  35. data/lib/rbs/errors.rb +28 -1
  36. data/lib/rbs/location.rb +221 -217
  37. data/lib/rbs/location_aux.rb +121 -0
  38. data/lib/rbs/locator.rb +10 -7
  39. data/lib/rbs/parser_aux.rb +63 -0
  40. data/lib/rbs/parser_compat/lexer_error.rb +4 -0
  41. data/lib/rbs/parser_compat/located_value.rb +5 -0
  42. data/lib/rbs/parser_compat/semantics_error.rb +4 -0
  43. data/lib/rbs/parser_compat/syntax_error.rb +4 -0
  44. data/lib/rbs/types.rb +2 -3
  45. data/lib/rbs/version.rb +1 -1
  46. data/lib/rbs/writer.rb +4 -2
  47. data/lib/rbs.rb +14 -7
  48. data/rbs.gemspec +2 -1
  49. data/sig/ancestor_builder.rbs +2 -2
  50. data/sig/annotation.rbs +2 -2
  51. data/sig/comment.rbs +7 -7
  52. data/sig/constant_table.rbs +1 -1
  53. data/sig/declarations.rbs +9 -9
  54. data/sig/definition.rbs +1 -1
  55. data/sig/definition_builder.rbs +2 -2
  56. data/sig/errors.rbs +40 -25
  57. data/sig/location.rbs +46 -78
  58. data/sig/locator.rbs +2 -2
  59. data/sig/members.rbs +7 -7
  60. data/sig/method_types.rbs +3 -3
  61. data/sig/parser.rbs +15 -20
  62. data/sig/rbs.rbs +4 -0
  63. data/sig/types.rbs +45 -27
  64. data/sig/writer.rbs +1 -1
  65. data/stdlib/io-console/0/io-console.rbs +137 -0
  66. data/stdlib/json/0/json.rbs +3 -3
  67. data/stdlib/net-http/0/net-http.rbs +2 -1
  68. data/stdlib/tempfile/0/tempfile.rbs +4 -6
  69. metadata +32 -7
  70. data/lib/rbs/parser.rb +0 -3614
@@ -1,5 +1,6 @@
1
1
  require 'digest/sha2'
2
2
  require 'open3'
3
+ require 'find'
3
4
 
4
5
  module RBS
5
6
  module Collection
@@ -52,12 +53,26 @@ module RBS
52
53
  private def _install(dest:, config_entry:)
53
54
  gem_name = config_entry['name']
54
55
  version = config_entry['version'] or raise
55
- dest = dest.join(gem_name)
56
+ dest = dest.join(gem_name, version)
56
57
  dest.mkpath
57
58
  src = gem_repo_dir.join(gem_name, version)
58
59
 
59
- FileUtils.cp_r(src, dest)
60
- dest.join(version, METADATA_FILENAME).write(YAML.dump(config_entry))
60
+ cp_r(src, dest)
61
+ dest.join(METADATA_FILENAME).write(YAML.dump(config_entry))
62
+ end
63
+
64
+ private def cp_r(src, dest)
65
+ Find.find(src) do |file_src|
66
+ file_src = Pathname(file_src)
67
+
68
+ # Skip file if it starts with _, such as _test/
69
+ Find.prune if file_src.basename.to_s.start_with?('_')
70
+
71
+ file_src_relative = file_src.relative_path_from(src)
72
+ file_dest = dest.join(file_src_relative)
73
+ file_dest.dirname.mkpath
74
+ FileUtils.copy_entry(file_src, file_dest, false, true) unless file_src.directory?
75
+ end
61
76
  end
62
77
 
63
78
  def to_lockfile
data/lib/rbs/errors.rb CHANGED
@@ -15,10 +15,37 @@ module RBS
15
15
  end
16
16
 
17
17
  class ErrorBase < StandardError; end
18
- class ParsingError < ErrorBase; end
19
18
  class LoadingError < ErrorBase; end
20
19
  class DefinitionError < ErrorBase; end
21
20
 
21
+ class ParsingError < ErrorBase
22
+ attr_reader :location
23
+ attr_reader :error_message
24
+ attr_reader :token_type
25
+
26
+ def initialize(location, error_message, token_type)
27
+ @location = location
28
+ @error_message = error_message
29
+ @token_type = token_type
30
+
31
+ super "#{Location.to_string location}: Syntax error: #{error_message}, token=`#{location.source}` (#{token_type})"
32
+ end
33
+
34
+ def error_value
35
+ RBS.print_warning {
36
+ "#{self.class.name}#error_value is deprecated and will be deleted in RBS 2.0. Consider using `location.source` instead."
37
+ }
38
+ location.source
39
+ end
40
+
41
+ def token_str
42
+ RBS.print_warning {
43
+ "#{self.class.name}#token_str is deprecated and will be deleted in RBS 2.0. Consider using `token_type` instead."
44
+ }
45
+ token_type
46
+ end
47
+ end
48
+
22
49
  class InvalidTypeApplicationError < DefinitionError
23
50
  attr_reader :type_name
24
51
  attr_reader :args
data/lib/rbs/location.rb CHANGED
@@ -1,217 +1,221 @@
1
- module RBS
2
- class Location
3
- attr_reader :buffer
4
- attr_reader :start_pos
5
- attr_reader :end_pos
6
-
7
- def initialize(buffer:, start_pos:, end_pos:)
8
- @buffer = buffer
9
- @start_pos = start_pos
10
- @end_pos = end_pos
11
- end
12
-
13
- def inspect
14
- "#<#{self.class}:#{self.__id__} @buffer=#{buffer.name}, @pos=#{start_pos}...#{end_pos}, source='#{source.lines.first}', start_line=#{start_line}, start_column=#{start_column}>"
15
- end
16
-
17
- def name
18
- buffer.name
19
- end
20
-
21
- def start_line
22
- start_loc[0]
23
- end
24
-
25
- def start_column
26
- start_loc[1]
27
- end
28
-
29
- def end_line
30
- end_loc[0]
31
- end
32
-
33
- def end_column
34
- end_loc[1]
35
- end
36
-
37
- def start_loc
38
- @start_loc ||= buffer.pos_to_loc(start_pos)
39
- end
40
-
41
- def end_loc
42
- @end_loc ||= buffer.pos_to_loc(end_pos)
43
- end
44
-
45
- def range
46
- start_pos...end_pos
47
- end
48
-
49
- def source
50
- @source ||= buffer.content[start_pos...end_pos] or raise
51
- end
52
-
53
- def to_s
54
- "#{name || "-"}:#{start_line}:#{start_column}...#{end_line}:#{end_column}"
55
- end
56
-
57
- def self.to_string(location, default: "*:*:*...*:*")
58
- location&.to_s || default
59
- end
60
-
61
- def ==(other)
62
- other.is_a?(Location) &&
63
- other.buffer == buffer &&
64
- other.start_pos == start_pos &&
65
- other.end_pos == end_pos
66
- end
67
-
68
- def +(other)
69
- if other
70
- raise "Invalid concat: buffer=#{buffer.name}, other.buffer=#{other.buffer.name}" unless other.buffer == buffer
71
-
72
- self.class.new(buffer: buffer,
73
- start_pos: start_pos,
74
- end_pos: other.end_pos)
75
- else
76
- self
77
- end
78
- end
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
-
95
- def pred?(loc)
96
- loc.is_a?(Location) &&
97
- loc.name == name &&
98
- loc.start_pos == end_pos
99
- end
100
-
101
- def to_json(state = _ = nil)
102
- {
103
- start: {
104
- line: start_line,
105
- column: start_column
106
- },
107
- end: {
108
- line: end_line,
109
- column: end_column
110
- },
111
- buffer: {
112
- name: name&.to_s
113
- }
114
- }.to_json(state)
115
- end
116
-
117
- def with_children(required: {}, optional: {})
118
- # @type var required: Hash[Symbol, Range[Integer] | Location]
119
- # @type var optional: Hash[Symbol, Range[Integer] | Location | nil]
120
-
121
- this = WithChildren.new(buffer: buffer, start_pos: start_pos, end_pos: end_pos)
122
-
123
- req = required.transform_values do |value|
124
- case value
125
- when Location
126
- value.range
127
- else
128
- value
129
- end
130
- end
131
-
132
- opt = optional.transform_values do |value|
133
- case value
134
- when Location
135
- value.range
136
- else
137
- value
138
- end
139
- end
140
-
141
- this.required_children.merge!(req)
142
- this.optional_children.merge!(opt)
143
-
144
- this
145
- end
146
-
147
- class WithChildren < Location
148
- attr_reader :required_children, :optional_children
149
-
150
- def initialize(buffer:, start_pos:, end_pos:)
151
- super(buffer: buffer, start_pos: start_pos, end_pos: end_pos)
152
-
153
- @optional_children = {}
154
- @required_children = {}
155
- end
156
-
157
- def initialize_copy(from)
158
- required_children.merge!(from.required_children)
159
- optional_children.merge!(from.optional_children)
160
- self
161
- end
162
-
163
- def [](key)
164
- case
165
- when required_children.key?(_ = key)
166
- range = required_children[_ = key]
167
- Location.new(buffer: buffer, start_pos: range.begin, end_pos: range.end)
168
- when optional_children.key?(_ = key)
169
- range = required_children[_ = key] || optional_children[_ = key]
170
- if range
171
- Location.new(buffer: buffer, start_pos: range.begin, end_pos: range.end)
172
- end
173
- else
174
- raise "Unknown key given: `#{key}`"
175
- end
176
- end
177
-
178
- def merge_required(hash)
179
- this = dup
180
-
181
- h = hash.transform_values do |value|
182
- case value
183
- when Range
184
- value
185
- when Location
186
- value.range
187
- else
188
- raise
189
- end
190
- end
191
-
192
- this.required_children.merge!(h)
193
-
194
- this
195
- end
196
-
197
- def merge_optional(hash)
198
- this = dup
199
-
200
- h = hash.transform_values do |value|
201
- case value
202
- when Range
203
- value
204
- when Location
205
- value.range
206
- else
207
- nil
208
- end
209
- end
210
-
211
- this.optional_children.merge!(h)
212
-
213
- this
214
- end
215
- end
216
- end
217
- end
1
+ # module RBS
2
+ # class Location
3
+ # attr_reader :buffer
4
+ # attr_reader :start_pos
5
+ # attr_reader :end_pos
6
+
7
+ # def initialize(buffer, start_pos, end_pos)
8
+ # @buffer = buffer
9
+ # @start_pos = start_pos
10
+ # @end_pos = end_pos
11
+ # end
12
+
13
+ # # def self.new(buffer_ = nil, start_pos_ = nil, end_pos_ = nil)
14
+ # # __skip__ = super(buffer_, start_pos_, end_pos_)
15
+ # # end
16
+
17
+ # # def inspect
18
+ # # "#<#{self.class}:#{self.__id__} @buffer=#{buffer.name}, @pos=#{start_pos}...#{end_pos}, source='#{source.lines.first}', start_line=#{start_line}, start_column=#{start_column}>"
19
+ # # end
20
+
21
+ # def name
22
+ # buffer.name
23
+ # end
24
+
25
+ # def start_line
26
+ # start_loc[0]
27
+ # end
28
+
29
+ # def start_column
30
+ # start_loc[1]
31
+ # end
32
+
33
+ # def end_line
34
+ # end_loc[0]
35
+ # end
36
+
37
+ # def end_column
38
+ # end_loc[1]
39
+ # end
40
+
41
+ # def start_loc
42
+ # @start_loc ||= buffer.pos_to_loc(start_pos)
43
+ # end
44
+
45
+ # def end_loc
46
+ # @end_loc ||= buffer.pos_to_loc(end_pos)
47
+ # end
48
+
49
+ # def range
50
+ # start_pos...end_pos
51
+ # end
52
+
53
+ # def source
54
+ # @source ||= buffer.content[start_pos...end_pos] or raise
55
+ # end
56
+
57
+ # def to_s
58
+ # "#{name || "-"}:#{start_line}:#{start_column}...#{end_line}:#{end_column}"
59
+ # end
60
+
61
+ # def self.to_string(location, default: "*:*:*...*:*")
62
+ # location&.to_s || default
63
+ # end
64
+
65
+ # def ==(other)
66
+ # other.is_a?(Location) &&
67
+ # other.buffer == buffer &&
68
+ # other.start_pos == start_pos &&
69
+ # other.end_pos == end_pos
70
+ # end
71
+
72
+ # def +(other)
73
+ # if other
74
+ # raise "Invalid concat: buffer=#{buffer.name}, other.buffer=#{other.buffer.name}" unless other.buffer == buffer
75
+
76
+ # self.class.new(buffer: buffer,
77
+ # start_pos: start_pos,
78
+ # end_pos: other.end_pos)
79
+ # else
80
+ # self
81
+ # end
82
+ # end
83
+
84
+ # def concat(*others)
85
+ # others.each { |other| self << other }
86
+ # self
87
+ # end
88
+
89
+ # def <<(other)
90
+ # if other
91
+ # raise "Invalid concat: buffer=#{buffer.name}, other.buffer=#{other.buffer.name}" unless other.buffer == buffer
92
+ # @end_pos = other.end_pos
93
+ # @source = nil
94
+ # @end_loc = nil
95
+ # end
96
+ # self
97
+ # end
98
+
99
+ # def pred?(loc)
100
+ # loc.is_a?(Location) &&
101
+ # loc.name == name &&
102
+ # loc.start_pos == end_pos
103
+ # end
104
+
105
+ # def to_json(state = _ = nil)
106
+ # {
107
+ # start: {
108
+ # line: start_line,
109
+ # column: start_column
110
+ # },
111
+ # end: {
112
+ # line: end_line,
113
+ # column: end_column
114
+ # },
115
+ # buffer: {
116
+ # name: name&.to_s
117
+ # }
118
+ # }.to_json(state)
119
+ # end
120
+
121
+ # def with_children(required: {}, optional: {})
122
+ # # @type var required: Hash[Symbol, Range[Integer] | Location]
123
+ # # @type var optional: Hash[Symbol, Range[Integer] | Location | nil]
124
+
125
+ # this = WithChildren.new(buffer: buffer, start_pos: start_pos, end_pos: end_pos)
126
+
127
+ # req = required.transform_values do |value|
128
+ # case value
129
+ # when Location
130
+ # value.range
131
+ # else
132
+ # value
133
+ # end
134
+ # end
135
+
136
+ # opt = optional.transform_values do |value|
137
+ # case value
138
+ # when Location
139
+ # value.range
140
+ # else
141
+ # value
142
+ # end
143
+ # end
144
+
145
+ # this.required_children.merge!(req)
146
+ # this.optional_children.merge!(opt)
147
+
148
+ # this
149
+ # end
150
+
151
+ # class WithChildren < Location
152
+ # attr_reader :required_children, :optional_children
153
+
154
+ # def initialize(buffer, start_pos, end_pos)
155
+ # super(buffer, start_pos, end_pos)
156
+
157
+ # @optional_children = {}
158
+ # @required_children = {}
159
+ # end
160
+
161
+ # def initialize_copy(from)
162
+ # required_children.merge!(from.required_children)
163
+ # optional_children.merge!(from.optional_children)
164
+ # self
165
+ # end
166
+
167
+ # def [](key)
168
+ # case
169
+ # when required_children.key?(_ = key)
170
+ # range = required_children[_ = key]
171
+ # Location.new(buffer: buffer, start_pos: range.begin, end_pos: range.end)
172
+ # when optional_children.key?(_ = key)
173
+ # range = required_children[_ = key] || optional_children[_ = key]
174
+ # if range
175
+ # Location.new(buffer: buffer, start_pos: range.begin, end_pos: range.end)
176
+ # end
177
+ # else
178
+ # raise "Unknown key given: `#{key}`"
179
+ # end
180
+ # end
181
+
182
+ # def merge_required(hash)
183
+ # this = dup
184
+
185
+ # h = hash.transform_values do |value|
186
+ # case value
187
+ # when Range
188
+ # value
189
+ # when Location
190
+ # value.range
191
+ # else
192
+ # raise
193
+ # end
194
+ # end
195
+
196
+ # this.required_children.merge!(h)
197
+
198
+ # this
199
+ # end
200
+
201
+ # def merge_optional(hash)
202
+ # this = dup
203
+
204
+ # h = hash.transform_values do |value|
205
+ # case value
206
+ # when Range
207
+ # value
208
+ # when Location
209
+ # value.range
210
+ # else
211
+ # nil
212
+ # end
213
+ # end
214
+
215
+ # this.optional_children.merge!(h)
216
+
217
+ # this
218
+ # end
219
+ # end
220
+ # end
221
+ # end
@@ -0,0 +1,121 @@
1
+ module RBS
2
+ class Location
3
+ def inspect
4
+ rks = each_required_key.to_a
5
+ ops = each_optional_key.to_a.map {|x| "?#{x}" }
6
+ "#<#{self.class}:#{self.__id__} buffer=#{buffer.name}, start=#{start_line}:#{start_column}, pos=#{start_pos}...#{end_pos}, children=#{(rks + ops).join(",")} source='#{source.lines.first&.chomp}'>"
7
+ end
8
+
9
+ def self.new(buffer_ = nil, start_pos_ = nil, end_pos_ = nil, buffer: nil, start_pos: nil, end_pos: nil)
10
+ __skip__ =
11
+ begin
12
+ if buffer && start_pos && end_pos
13
+ super(buffer, start_pos, end_pos)
14
+ else
15
+ super(buffer_, start_pos_, end_pos_)
16
+ end
17
+ end
18
+ end
19
+
20
+ WithChildren = self
21
+
22
+ def name
23
+ buffer.name
24
+ end
25
+
26
+ def start_line
27
+ start_loc[0]
28
+ end
29
+
30
+ def start_column
31
+ start_loc[1]
32
+ end
33
+
34
+ def end_line
35
+ end_loc[0]
36
+ end
37
+
38
+ def end_column
39
+ end_loc[1]
40
+ end
41
+
42
+ def start_loc
43
+ @start_loc ||= begin
44
+ _start_loc || buffer.pos_to_loc(start_pos)
45
+ end
46
+ end
47
+
48
+ def end_loc
49
+ @end_loc ||= begin
50
+ _end_loc || buffer.pos_to_loc(end_pos)
51
+ end
52
+ end
53
+
54
+ def range
55
+ @range ||= start_pos...end_pos
56
+ end
57
+
58
+ def source
59
+ @source ||= buffer.content[range] or raise
60
+ end
61
+
62
+ def to_s
63
+ "#{name || "-"}:#{start_line}:#{start_column}...#{end_line}:#{end_column}"
64
+ end
65
+
66
+ def ==(other)
67
+ other.is_a?(Location) &&
68
+ other.buffer == buffer &&
69
+ other.start_pos == start_pos &&
70
+ other.end_pos == end_pos
71
+ end
72
+
73
+ def to_json(state = _ = nil)
74
+ {
75
+ start: {
76
+ line: start_line,
77
+ column: start_column
78
+ },
79
+ end: {
80
+ line: end_line,
81
+ column: end_column
82
+ },
83
+ buffer: {
84
+ name: name&.to_s
85
+ }
86
+ }.to_json(state)
87
+ end
88
+
89
+ def self.to_string(location, default: "*:*:*...*:*")
90
+ location&.to_s || default
91
+ end
92
+
93
+ def add_required_child(name, range)
94
+ _add_required_child(name, range.begin, range.end)
95
+ end
96
+
97
+ def add_optional_child(name, range)
98
+ if range
99
+ _add_optional_child(name, range.begin, range.end)
100
+ else
101
+ _add_optional_no_child(name);
102
+ end
103
+ end
104
+
105
+ def each_optional_key(&block)
106
+ if block
107
+ _optional_keys.uniq.each(&block)
108
+ else
109
+ enum_for(:each_optional_key)
110
+ end
111
+ end
112
+
113
+ def each_required_key(&block)
114
+ if block
115
+ _required_keys.uniq.each(&block)
116
+ else
117
+ enum_for(:each_required_key)
118
+ end
119
+ end
120
+ end
121
+ end
data/lib/rbs/locator.rb CHANGED
@@ -172,16 +172,19 @@ module RBS
172
172
 
173
173
  def find_in_loc(pos, location:, array:)
174
174
  if test_loc(pos, location: location)
175
- if location.is_a?(Location::WithChildren)
176
- location.optional_children.each do |key, range|
177
- if range === pos
178
- array.unshift(key)
179
- return true
175
+ if location.is_a?(Location)
176
+ location.each_optional_key do |key|
177
+ if loc = location[key]
178
+ if loc.range === pos
179
+ array.unshift(key)
180
+ return true
181
+ end
180
182
  end
181
183
  end
182
184
 
183
- location.required_children.each do |key, range|
184
- if range === pos
185
+ location.each_required_key do |key|
186
+ loc = location[key] or raise
187
+ if loc.range === pos
185
188
  array.unshift(key)
186
189
  return true
187
190
  end