rbs 4.0.0.dev.4 → 4.1.0.pre.2

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.
Files changed (306) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +1 -0
  3. data/.github/dependabot.yml +16 -14
  4. data/.github/workflows/bundle-update.yml +63 -0
  5. data/.github/workflows/c-check.yml +21 -11
  6. data/.github/workflows/comments.yml +5 -3
  7. data/.github/workflows/dependabot.yml +2 -2
  8. data/.github/workflows/jruby.yml +67 -0
  9. data/.github/workflows/milestone.yml +83 -0
  10. data/.github/workflows/ruby.yml +63 -24
  11. data/.github/workflows/rust.yml +184 -0
  12. data/.github/workflows/truffleruby.yml +54 -0
  13. data/.github/workflows/typecheck.yml +5 -2
  14. data/.github/workflows/wasm.yml +53 -0
  15. data/.github/workflows/windows.yml +8 -2
  16. data/.gitignore +11 -0
  17. data/.rubocop.yml +1 -1
  18. data/CHANGELOG.md +357 -0
  19. data/README.md +4 -4
  20. data/Rakefile +365 -33
  21. data/Steepfile +8 -0
  22. data/config.yml +450 -24
  23. data/core/array.rbs +443 -363
  24. data/core/basic_object.rbs +9 -8
  25. data/core/binding.rbs +0 -2
  26. data/core/builtin.rbs +9 -8
  27. data/core/class.rbs +11 -8
  28. data/core/comparable.rbs +55 -34
  29. data/core/complex.rbs +104 -78
  30. data/core/dir.rbs +61 -49
  31. data/core/encoding.rbs +12 -15
  32. data/core/enumerable.rbs +288 -196
  33. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  34. data/core/enumerator/product.rbs +5 -5
  35. data/core/enumerator.rbs +91 -28
  36. data/core/errno.rbs +11 -2
  37. data/core/errors.rbs +58 -29
  38. data/core/exception.rbs +13 -13
  39. data/core/fiber.rbs +74 -54
  40. data/core/file.rbs +260 -1151
  41. data/core/file_constants.rbs +463 -0
  42. data/core/file_stat.rbs +534 -0
  43. data/core/file_test.rbs +3 -3
  44. data/core/float.rbs +257 -92
  45. data/core/gc.rbs +425 -281
  46. data/core/hash.rbs +1151 -829
  47. data/core/integer.rbs +156 -195
  48. data/core/io/buffer.rbs +53 -42
  49. data/core/io/wait.rbs +13 -35
  50. data/core/io.rbs +216 -150
  51. data/core/kernel.rbs +239 -163
  52. data/core/marshal.rbs +4 -4
  53. data/core/match_data.rbs +15 -13
  54. data/core/math.rbs +107 -66
  55. data/core/method.rbs +69 -33
  56. data/core/module.rbs +302 -150
  57. data/core/nil_class.rbs +7 -6
  58. data/core/numeric.rbs +77 -63
  59. data/core/object.rbs +9 -11
  60. data/core/object_space/weak_key_map.rbs +7 -7
  61. data/core/object_space.rbs +30 -23
  62. data/core/pathname.rbs +1322 -0
  63. data/core/proc.rbs +95 -58
  64. data/core/process.rbs +222 -202
  65. data/core/ractor.rbs +371 -515
  66. data/core/random.rbs +21 -3
  67. data/core/range.rbs +181 -79
  68. data/core/rational.rbs +60 -89
  69. data/core/rbs/ops.rbs +154 -0
  70. data/core/rbs/unnamed/argf.rbs +63 -56
  71. data/core/rbs/unnamed/env_class.rbs +19 -14
  72. data/core/rbs/unnamed/main_class.rbs +123 -0
  73. data/core/rbs/unnamed/random.rbs +11 -118
  74. data/core/regexp.rbs +258 -214
  75. data/core/ruby.rbs +53 -0
  76. data/core/ruby_vm.rbs +78 -34
  77. data/core/rubygems/config_file.rbs +5 -5
  78. data/core/rubygems/errors.rbs +4 -71
  79. data/core/rubygems/requirement.rbs +5 -5
  80. data/core/rubygems/rubygems.rbs +16 -82
  81. data/core/rubygems/version.rbs +2 -3
  82. data/core/set.rbs +493 -363
  83. data/core/signal.rbs +26 -16
  84. data/core/string.rbs +3234 -1285
  85. data/core/struct.rbs +43 -42
  86. data/core/symbol.rbs +41 -34
  87. data/core/thread.rbs +141 -73
  88. data/core/time.rbs +81 -50
  89. data/core/trace_point.rbs +41 -35
  90. data/core/true_class.rbs +2 -2
  91. data/core/unbound_method.rbs +24 -16
  92. data/core/warning.rbs +7 -7
  93. data/docs/CONTRIBUTING.md +2 -1
  94. data/docs/aliases.md +79 -0
  95. data/docs/collection.md +3 -3
  96. data/docs/config.md +171 -0
  97. data/docs/encoding.md +56 -0
  98. data/docs/gem.md +0 -1
  99. data/docs/inline.md +634 -0
  100. data/docs/rbs_by_example.md +20 -20
  101. data/docs/rust.md +96 -0
  102. data/docs/sigs.md +3 -3
  103. data/docs/syntax.md +48 -18
  104. data/docs/type_fingerprint.md +21 -0
  105. data/docs/wasm_serialization.md +80 -0
  106. data/exe/rbs +1 -1
  107. data/ext/rbs_extension/ast_translation.c +1441 -671
  108. data/ext/rbs_extension/ast_translation.h +7 -0
  109. data/ext/rbs_extension/class_constants.c +18 -2
  110. data/ext/rbs_extension/class_constants.h +9 -0
  111. data/ext/rbs_extension/extconf.rb +6 -1
  112. data/ext/rbs_extension/legacy_location.c +33 -56
  113. data/ext/rbs_extension/legacy_location.h +37 -0
  114. data/ext/rbs_extension/main.c +183 -39
  115. data/include/rbs/ast.h +597 -297
  116. data/include/rbs/defines.h +40 -0
  117. data/include/rbs/lexer.h +31 -11
  118. data/include/rbs/location.h +25 -44
  119. data/include/rbs/parser.h +6 -6
  120. data/include/rbs/serialize.h +39 -0
  121. data/include/rbs/string.h +0 -2
  122. data/include/rbs/util/rbs_allocator.h +34 -13
  123. data/include/rbs/util/rbs_assert.h +12 -1
  124. data/include/rbs/util/rbs_constant_pool.h +0 -3
  125. data/include/rbs/util/rbs_encoding.h +2 -0
  126. data/include/rbs/util/rbs_unescape.h +2 -1
  127. data/include/rbs.h +8 -0
  128. data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
  129. data/lib/rbs/ast/annotation.rb +1 -1
  130. data/lib/rbs/ast/comment.rb +1 -1
  131. data/lib/rbs/ast/declarations.rb +10 -10
  132. data/lib/rbs/ast/members.rb +14 -14
  133. data/lib/rbs/ast/ruby/annotations.rb +335 -3
  134. data/lib/rbs/ast/ruby/comment_block.rb +30 -4
  135. data/lib/rbs/ast/ruby/declarations.rb +209 -4
  136. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  137. data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
  138. data/lib/rbs/ast/ruby/members.rb +571 -22
  139. data/lib/rbs/ast/type_param.rb +24 -4
  140. data/lib/rbs/buffer.rb +66 -24
  141. data/lib/rbs/cli/diff.rb +16 -15
  142. data/lib/rbs/cli/validate.rb +38 -106
  143. data/lib/rbs/cli.rb +55 -24
  144. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  145. data/lib/rbs/collection/sources/git.rb +7 -0
  146. data/lib/rbs/definition.rb +1 -1
  147. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  148. data/lib/rbs/definition_builder/method_builder.rb +32 -6
  149. data/lib/rbs/definition_builder.rb +147 -25
  150. data/lib/rbs/diff.rb +7 -1
  151. data/lib/rbs/environment.rb +235 -75
  152. data/lib/rbs/environment_loader.rb +0 -6
  153. data/lib/rbs/errors.rb +27 -18
  154. data/lib/rbs/inline_parser.rb +377 -15
  155. data/lib/rbs/location_aux.rb +1 -1
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +47 -11
  159. data/lib/rbs/parser_aux.rb +20 -7
  160. data/lib/rbs/prototype/helpers.rb +57 -0
  161. data/lib/rbs/prototype/rb.rb +3 -28
  162. data/lib/rbs/prototype/rbi.rb +3 -20
  163. data/lib/rbs/prototype/runtime.rb +10 -0
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  166. data/lib/rbs/rewriter.rb +70 -0
  167. data/lib/rbs/subtractor.rb +3 -1
  168. data/lib/rbs/test/type_check.rb +25 -3
  169. data/lib/rbs/type_name.rb +34 -14
  170. data/lib/rbs/types.rb +88 -78
  171. data/lib/rbs/unit_test/type_assertions.rb +44 -8
  172. data/lib/rbs/validator.rb +2 -2
  173. data/lib/rbs/version.rb +1 -1
  174. data/lib/rbs/wasm/deserializer.rb +213 -0
  175. data/lib/rbs/wasm/location.rb +61 -0
  176. data/lib/rbs/wasm/parser.rb +137 -0
  177. data/lib/rbs/wasm/runtime.rb +217 -0
  178. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  179. data/lib/rbs.rb +13 -2
  180. data/lib/rdoc/discover.rb +1 -1
  181. data/lib/rdoc_plugin/parser.rb +1 -1
  182. data/rbs.gemspec +24 -6
  183. data/schema/typeParam.json +17 -1
  184. data/sig/annotate/rdoc_annotater.rbs +12 -9
  185. data/sig/ast/ruby/annotations.rbs +364 -4
  186. data/sig/ast/ruby/comment_block.rbs +8 -0
  187. data/sig/ast/ruby/declarations.rbs +102 -4
  188. data/sig/ast/ruby/members.rbs +128 -2
  189. data/sig/buffer.rbs +19 -1
  190. data/sig/cli/diff.rbs +5 -11
  191. data/sig/cli/validate.rbs +12 -8
  192. data/sig/cli.rbs +18 -18
  193. data/sig/collection/config/lockfile_generator.rbs +2 -0
  194. data/sig/definition.rbs +6 -1
  195. data/sig/definition_builder.rbs +2 -0
  196. data/sig/environment.rbs +70 -12
  197. data/sig/errors.rbs +13 -14
  198. data/sig/inline_parser.rbs +41 -2
  199. data/sig/locator.rbs +0 -2
  200. data/sig/manifest.yaml +0 -2
  201. data/sig/method_builder.rbs +3 -1
  202. data/sig/namespace.rbs +20 -0
  203. data/sig/parser.rbs +41 -13
  204. data/sig/prototype/helpers.rbs +2 -0
  205. data/sig/resolver/type_name_resolver.rbs +36 -10
  206. data/sig/rewriter.rbs +45 -0
  207. data/sig/source.rbs +3 -3
  208. data/sig/type_param.rbs +13 -8
  209. data/sig/typename.rbs +15 -0
  210. data/sig/types.rbs +6 -7
  211. data/sig/unit_test/spy.rbs +0 -8
  212. data/sig/unit_test/type_assertions.rbs +15 -0
  213. data/sig/wasm/deserializer.rbs +66 -0
  214. data/sig/wasm/serialization_schema.rbs +13 -0
  215. data/src/ast.c +443 -162
  216. data/src/lexer.c +1415 -1313
  217. data/src/lexer.re +4 -0
  218. data/src/lexstate.c +63 -37
  219. data/src/location.c +7 -47
  220. data/src/parser.c +1032 -521
  221. data/src/serialize.c +958 -0
  222. data/src/string.c +0 -48
  223. data/src/util/rbs_allocator.c +89 -74
  224. data/src/util/rbs_assert.c +1 -1
  225. data/src/util/rbs_buffer.c +2 -2
  226. data/src/util/rbs_constant_pool.c +10 -14
  227. data/src/util/rbs_encoding.c +4 -8
  228. data/src/util/rbs_unescape.c +56 -20
  229. data/stdlib/abbrev/0/array.rbs +1 -1
  230. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  231. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  232. data/stdlib/cgi/0/core.rbs +9 -393
  233. data/stdlib/cgi/0/manifest.yaml +1 -0
  234. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  235. data/stdlib/coverage/0/coverage.rbs +7 -4
  236. data/stdlib/csv/0/csv.rbs +5 -5
  237. data/stdlib/date/0/date.rbs +92 -79
  238. data/stdlib/date/0/date_time.rbs +25 -24
  239. data/stdlib/delegate/0/delegator.rbs +10 -7
  240. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  241. data/stdlib/digest/0/digest.rbs +111 -1
  242. data/stdlib/erb/0/erb.rbs +748 -347
  243. data/stdlib/etc/0/etc.rbs +73 -54
  244. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  245. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  246. data/stdlib/io-console/0/io-console.rbs +2 -2
  247. data/stdlib/json/0/json.rbs +223 -142
  248. data/stdlib/monitor/0/monitor.rbs +3 -3
  249. data/stdlib/net-http/0/net-http.rbs +162 -134
  250. data/stdlib/objspace/0/objspace.rbs +17 -34
  251. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  252. data/stdlib/open3/0/open3.rbs +469 -10
  253. data/stdlib/openssl/0/openssl.rbs +482 -364
  254. data/stdlib/optparse/0/optparse.rbs +26 -17
  255. data/stdlib/pathname/0/pathname.rbs +11 -1381
  256. data/stdlib/pp/0/pp.rbs +9 -8
  257. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  258. data/stdlib/pstore/0/pstore.rbs +35 -30
  259. data/stdlib/psych/0/psych.rbs +65 -12
  260. data/stdlib/psych/0/store.rbs +2 -4
  261. data/stdlib/pty/0/pty.rbs +9 -6
  262. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  263. data/stdlib/rdoc/0/code_object.rbs +2 -1
  264. data/stdlib/rdoc/0/parser.rbs +1 -1
  265. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  266. data/stdlib/rdoc/0/store.rbs +1 -1
  267. data/stdlib/resolv/0/resolv.rbs +26 -69
  268. data/stdlib/ripper/0/ripper.rbs +22 -19
  269. data/stdlib/securerandom/0/manifest.yaml +2 -0
  270. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  271. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  272. data/stdlib/singleton/0/singleton.rbs +3 -0
  273. data/stdlib/socket/0/addrinfo.rbs +7 -7
  274. data/stdlib/socket/0/basic_socket.rbs +3 -3
  275. data/stdlib/socket/0/ip_socket.rbs +10 -8
  276. data/stdlib/socket/0/socket.rbs +23 -10
  277. data/stdlib/socket/0/tcp_server.rbs +1 -1
  278. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  279. data/stdlib/socket/0/udp_socket.rbs +1 -1
  280. data/stdlib/socket/0/unix_server.rbs +1 -1
  281. data/stdlib/stringio/0/stringio.rbs +1209 -95
  282. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  283. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  284. data/stdlib/time/0/time.rbs +8 -6
  285. data/stdlib/timeout/0/timeout.rbs +63 -7
  286. data/stdlib/tsort/0/cyclic.rbs +4 -1
  287. data/stdlib/tsort/0/interfaces.rbs +8 -8
  288. data/stdlib/tsort/0/tsort.rbs +16 -15
  289. data/stdlib/uri/0/common.rbs +42 -20
  290. data/stdlib/uri/0/file.rbs +3 -3
  291. data/stdlib/uri/0/generic.rbs +26 -18
  292. data/stdlib/uri/0/http.rbs +2 -2
  293. data/stdlib/uri/0/ldap.rbs +2 -2
  294. data/stdlib/uri/0/mailto.rbs +3 -3
  295. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  296. data/stdlib/zlib/0/deflate.rbs +4 -3
  297. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  298. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  299. data/stdlib/zlib/0/inflate.rbs +1 -1
  300. data/stdlib/zlib/0/need_dict.rbs +1 -1
  301. data/stdlib/zlib/0/zstream.rbs +1 -0
  302. data/wasm/README.md +59 -0
  303. data/wasm/rbs_wasm.c +411 -0
  304. metadata +56 -8
  305. data/.vscode/extensions.json +0 -5
  306. data/.vscode/settings.json +0 -19
@@ -3,12 +3,13 @@
3
3
  module RBS
4
4
  module AST
5
5
  class TypeParam
6
- attr_reader :name, :variance, :location, :upper_bound_type, :default_type
6
+ attr_reader :name, :variance, :location, :upper_bound_type, :lower_bound_type, :default_type
7
7
 
8
- def initialize(name:, variance:, upper_bound:, location:, default_type: nil, unchecked: false)
8
+ def initialize(name:, variance:, upper_bound:, lower_bound:, location:, default_type: nil, unchecked: false)
9
9
  @name = name
10
10
  @variance = variance
11
11
  @upper_bound_type = upper_bound
12
+ @lower_bound_type = lower_bound
12
13
  @location = location
13
14
  @default_type = default_type
14
15
  @unchecked = unchecked
@@ -21,6 +22,13 @@ module RBS
21
22
  end
22
23
  end
23
24
 
25
+ def lower_bound
26
+ case lower_bound_type
27
+ when Types::ClassInstance, Types::ClassSingleton, Types::Interface
28
+ lower_bound_type
29
+ end
30
+ end
31
+
24
32
  def unchecked!(value = true)
25
33
  @unchecked = value ? true : false
26
34
  self
@@ -35,6 +43,7 @@ module RBS
35
43
  other.name == name &&
36
44
  other.variance == variance &&
37
45
  other.upper_bound_type == upper_bound_type &&
46
+ other.lower_bound_type == lower_bound_type &&
38
47
  other.default_type == default_type &&
39
48
  other.unchecked? == unchecked?
40
49
  end
@@ -42,7 +51,7 @@ module RBS
42
51
  alias eql? ==
43
52
 
44
53
  def hash
45
- self.class.hash ^ name.hash ^ variance.hash ^ upper_bound_type.hash ^ unchecked?.hash ^ default_type.hash
54
+ self.class.hash ^ name.hash ^ variance.hash ^ upper_bound_type.hash ^ lower_bound_type.hash ^ unchecked?.hash ^ default_type.hash
46
55
  end
47
56
 
48
57
  def to_json(state = JSON::State.new)
@@ -52,6 +61,7 @@ module RBS
52
61
  unchecked: unchecked?,
53
62
  location: location,
54
63
  upper_bound: upper_bound_type,
64
+ lower_bound: lower_bound_type,
55
65
  default_type: default_type
56
66
  }.to_json(state)
57
67
  end
@@ -61,6 +71,10 @@ module RBS
61
71
  _upper_bound_type = yield(b)
62
72
  end
63
73
 
74
+ if b = lower_bound_type
75
+ _lower_bound_type = yield(b)
76
+ end
77
+
64
78
  if dt = default_type
65
79
  _default_type = yield(dt)
66
80
  end
@@ -69,6 +83,7 @@ module RBS
69
83
  name: name,
70
84
  variance: variance,
71
85
  upper_bound: _upper_bound_type,
86
+ lower_bound: _lower_bound_type,
72
87
  location: location,
73
88
  default_type: _default_type
74
89
  ).unchecked!(unchecked?)
@@ -108,6 +123,7 @@ module RBS
108
123
  name: new_name,
109
124
  variance: param.variance,
110
125
  upper_bound: param.upper_bound_type&.map_type {|type| type.sub(subst) },
126
+ lower_bound: param.lower_bound_type&.map_type {|type| type.sub(subst) },
111
127
  location: param.location,
112
128
  default_type: param.default_type&.map_type {|type| type.sub(subst) }
113
129
  ).unchecked!(param.unchecked?)
@@ -136,6 +152,10 @@ module RBS
136
152
  s << " < #{type}"
137
153
  end
138
154
 
155
+ if type = lower_bound_type
156
+ s << " > #{type}"
157
+ end
158
+
139
159
  if dt = default_type
140
160
  s << " = #{dt}"
141
161
  end
@@ -176,7 +196,7 @@ module RBS
176
196
  end
177
197
 
178
198
  def self.normalize_args(params, args)
179
- app = application(params, args) or return []
199
+ app = application(params, args) or return args
180
200
 
181
201
  min_count = params.count { _1.default_type.nil? }
182
202
  unless min_count <= args.size && args.size <= params.size
data/lib/rbs/buffer.rb CHANGED
@@ -29,19 +29,24 @@ module RBS
29
29
 
30
30
  def ranges
31
31
  @ranges ||= begin
32
- lines = content.lines
33
- lines << "" if content.end_with?("\n")
34
-
35
- ranges = [] #: Array[Range[Integer]]
36
- offset = 0
37
-
38
- lines.each do |line|
39
- size0 = line.size
40
- line = line.chomp
41
- range = offset...(offset+line.size)
42
- ranges << range
43
-
44
- offset += size0
32
+ if content.empty?
33
+ ranges = [0...0] #: Array[Range[Integer]]
34
+ lines = [""]
35
+ else
36
+ lines = content.lines
37
+ lines << "" if content.end_with?("\n")
38
+
39
+ ranges = [] #: Array[Range[Integer]]
40
+ offset = 0
41
+
42
+ lines.each do |line|
43
+ size0 = line.size
44
+ line = line.chomp
45
+ range = offset...(offset+line.size)
46
+ ranges << range
47
+
48
+ offset += size0
49
+ end
45
50
  end
46
51
 
47
52
  ranges
@@ -82,25 +87,62 @@ module RBS
82
87
  "#<RBS::Buffer:#{__id__} @name=#{name}, @content=#{content.bytesize} bytes, @lines=#{ranges.size} lines,>"
83
88
  end
84
89
 
90
+ def character_offset(byte_offset)
91
+ top = top_buffer
92
+ return top.character_offset(byte_offset) unless top.equal?(self)
93
+
94
+ keys, vals = (@character_offset_cache ||= [[0], [0]])
95
+
96
+ idx = keys.bsearch_index { |k| k > byte_offset }
97
+ lo = idx ? idx - 1 : keys.size - 1
98
+
99
+ base_byte = keys[lo]
100
+ base_char = vals[lo]
101
+ delta = byte_offset - base_byte
102
+ return base_char if delta == 0
103
+
104
+ result = base_char + (content.byteslice(base_byte, delta) or raise).length
105
+
106
+ if base_byte == keys[-1]
107
+ keys << byte_offset
108
+ vals << result
109
+ end
110
+
111
+ result
112
+ end
113
+
85
114
  def rbs_location(location, loc2=nil)
115
+ top = top_buffer
86
116
  if loc2
87
- Location.new(self, location.start_character_offset, loc2.end_character_offset)
117
+ Location.new(top, character_offset(location.start_offset), character_offset(loc2.end_offset))
88
118
  else
89
- Location.new(self, location.start_character_offset, location.end_character_offset)
119
+ Location.new(top, character_offset(location.start_offset), character_offset(location.end_offset))
90
120
  end
91
121
  end
92
122
 
93
- def sub_buffer(lines:)
123
+ def sub_buffer(lines:, byte_lines_hint: nil)
94
124
  buf = +""
95
- lines.each_with_index do |range, index|
96
- start_pos = range.begin
97
- end_pos = range.end
98
- slice = content[start_pos...end_pos] or raise
99
- if slice.include?("\n")
100
- raise "Line #{index + 1} cannot contain newline character."
125
+
126
+ if byte_lines_hint
127
+ byte_lines_hint.each_with_index do |range, index|
128
+ slice = content.byteslice(range.begin, range.end - range.begin) or raise
129
+ if slice.include?("\n")
130
+ raise "Line #{index + 1} cannot contain newline character."
131
+ end
132
+ buf << slice
133
+ buf << "\n"
134
+ end
135
+ else
136
+ lines.each_with_index do |range, index|
137
+ start_pos = range.begin
138
+ end_pos = range.end
139
+ slice = content[start_pos...end_pos] or raise
140
+ if slice.include?("\n")
141
+ raise "Line #{index + 1} cannot contain newline character."
142
+ end
143
+ buf << slice
144
+ buf << "\n"
101
145
  end
102
- buf << slice
103
- buf << "\n"
104
146
  end
105
147
 
106
148
  buf.chomp!
data/lib/rbs/cli/diff.rb CHANGED
@@ -3,13 +3,14 @@
3
3
  module RBS
4
4
  class CLI
5
5
  class Diff
6
- def initialize(argv:, library_options:, stdout: $stdout, stderr: $stderr)
7
- @format = nil
6
+ def initialize(stdout: $stdout, stderr: $stderr)
8
7
  @stdout = stdout
9
8
  @stderr = stderr
9
+ end
10
10
 
11
- # @type var type_name: String?
12
- type_name = nil
11
+ def run(argv:, library_options:)
12
+ format = nil #: String?
13
+ type_name = nil #: String?
13
14
  library_options = library_options
14
15
  before_path = [] #: Array[String]
15
16
  after_path = [] #: Array[String]
@@ -32,7 +33,7 @@ module RBS
32
33
  # Confirmation of methods related to Time class added by including stdlib/time
33
34
  $ rbs diff --format diff --type-name Time --after stdlib/time
34
35
  HELP
35
- o.on("--format NAME") { |arg| @format = arg }
36
+ o.on("--format NAME") { |arg| format = arg }
36
37
  o.on("--type-name NAME") { |arg| type_name = arg }
37
38
  o.on("--before DIR") { |arg| before_path << arg }
38
39
  o.on("--after DIR") { |arg| after_path << arg }
@@ -40,28 +41,28 @@ module RBS
40
41
  end
41
42
  opt.parse!(argv)
42
43
 
43
- unless @format && type_name && ["markdown", "diff"].include?(@format)
44
+ unless format && type_name && ["markdown", "diff"].include?(format)
44
45
  @stderr.puts opt.banner
45
- exit 1
46
+ return 1
46
47
  end
47
48
 
48
- @diff = RBS::Diff.new(
49
+ diff = RBS::Diff.new(
49
50
  type_name: TypeName.parse(type_name).absolute!,
50
51
  library_options: library_options,
51
52
  after_path: after_path,
52
53
  before_path: before_path,
53
54
  detail: detail,
54
55
  )
55
- end
56
56
 
57
- def run
58
- public_send("run_#{@format}")
57
+ public_send("run_#{format}", diff)
58
+
59
+ 0
59
60
  end
60
61
 
61
- def run_diff
62
+ def run_diff(diff)
62
63
  first = true
63
64
  io = RBS::CLI::ColoredIO.new(stdout: @stdout)
64
- @diff.each_diff do |before, after|
65
+ diff.each_diff do |before, after|
65
66
  io.puts if !first
66
67
  io.puts_red "- #{before}"
67
68
  io.puts_green "+ #{after}"
@@ -69,10 +70,10 @@ module RBS
69
70
  end
70
71
  end
71
72
 
72
- def run_markdown
73
+ def run_markdown(diff)
73
74
  @stdout.puts "| before | after |"
74
75
  @stdout.puts "| --- | --- |"
75
- @diff.each_diff do |before, after|
76
+ diff.each_diff do |before, after|
76
77
  before.gsub!("|", "\\|")
77
78
  after.gsub!("|", "\\|")
78
79
  @stdout.puts "| `#{before}` | `#{after}` |"
@@ -4,36 +4,33 @@ module RBS
4
4
  class CLI
5
5
  class Validate
6
6
  class Errors
7
- def initialize(limit:, exit_error:)
7
+ def initialize(limit:)
8
8
  @limit = limit
9
- @exit_error = exit_error
10
9
  @errors = []
11
- @has_syntax_error = false
12
10
  end
13
11
 
14
12
  def add(error)
15
- if error.instance_of?(WillSyntaxError)
16
- RBS.logger.warn(build_message(error))
17
- @has_syntax_error = true
18
- else
19
- @errors << error
20
- end
13
+ @errors << error
21
14
  finish if @limit == 1
22
15
  end
23
16
 
17
+ def try(&block)
18
+ catch(:finish) do |tag|
19
+ @tag = tag
20
+ yield
21
+ finish()
22
+ end
23
+ end
24
+
24
25
  def finish
25
- if @errors.empty?
26
- if @exit_error && @has_syntax_error
27
- exit 1
28
- else
29
- # success
30
- end
31
- else
26
+ unless @errors.empty?
32
27
  @errors.each do |error|
33
28
  RBS.logger.error(build_message(error))
34
29
  end
35
- exit 1
30
+ throw @tag, 1
36
31
  end
32
+
33
+ 0
37
34
  end
38
35
 
39
36
  private
@@ -53,7 +50,6 @@ module RBS
53
50
  @env = Environment.from_loader(loader).resolve_type_names
54
51
  @builder = DefinitionBuilder.new(env: @env)
55
52
  @validator = Validator.new(env: @env)
56
- exit_error = false
57
53
  limit = nil #: Integer?
58
54
  OptionParser.new do |opts|
59
55
  opts.banner = <<EOU
@@ -70,25 +66,25 @@ EOU
70
66
  RBS.print_warning { "`--silent` option is deprecated because it's silent by default. You can use --log-level option of rbs command to display more information." }
71
67
  end
72
68
  opts.on("--[no-]exit-error-on-syntax-error", "exit(1) if syntax error is detected") {|bool|
73
- exit_error = bool
69
+ RBS.print_warning { "`--exit-error-on-syntax-error` option is deprecated because it's validated during parsing.." }
74
70
  }
75
71
  opts.on("--fail-fast", "Exit immediately as soon as a validation error is found.") do |arg|
76
72
  limit = 1
77
73
  end
78
74
  end.parse!(args)
79
75
 
80
- @errors = Errors.new(limit: limit, exit_error: exit_error)
76
+ @errors = Errors.new(limit: limit)
81
77
  end
82
78
 
83
79
  def run
84
- validate_class_module_definition
85
- validate_class_module_alias_definition
86
- validate_interface
87
- validate_constant
88
- validate_global
89
- validate_type_alias
90
-
91
- @errors.finish
80
+ @errors.try do
81
+ validate_class_module_definition
82
+ validate_class_module_alias_definition
83
+ validate_interface
84
+ validate_constant
85
+ validate_global
86
+ validate_type_alias
87
+ end
92
88
  end
93
89
 
94
90
  private
@@ -112,9 +108,6 @@ EOU
112
108
  entry.each_decl do |decl|
113
109
  if super_class = decl.super_class
114
110
  super_class.args.each do |arg|
115
- void_type_context_validator(arg, true)
116
- no_self_type_validator(arg)
117
- no_classish_type_validator(arg)
118
111
  @validator.validate_type(arg, context: nil)
119
112
  end
120
113
  end
@@ -123,15 +116,12 @@ EOU
123
116
  entry.each_decl do |decl|
124
117
  decl.self_types.each do |self_type|
125
118
  self_type.args.each do |arg|
126
- void_type_context_validator(arg, true)
127
- no_self_type_validator(arg)
128
- no_classish_type_validator(arg)
129
119
  @validator.validate_type(arg, context: nil)
130
120
  end
131
121
 
132
122
  self_params =
133
123
  if self_type.name.class?
134
- @env.normalized_module_entry(self_type.name)&.type_params
124
+ @env.module_entry(self_type.name, normalized: true)&.type_params
135
125
  else
136
126
  @env.interface_decls[self_type.name]&.decl&.type_params
137
127
  end
@@ -153,16 +143,14 @@ EOU
153
143
 
154
144
  d.type_params.each do |param|
155
145
  if ub = param.upper_bound_type
156
- void_type_context_validator(ub)
157
- no_self_type_validator(ub)
158
- no_classish_type_validator(ub)
159
146
  @validator.validate_type(ub, context: nil)
160
147
  end
161
148
 
149
+ if lb = param.lower_bound_type
150
+ @validator.validate_type(lb, context: nil)
151
+ end
152
+
162
153
  if dt = param.default_type
163
- void_type_context_validator(dt, true)
164
- no_self_type_validator(dt)
165
- no_classish_type_validator(dt)
166
154
  @validator.validate_type(dt, context: nil)
167
155
  end
168
156
  end
@@ -176,21 +164,10 @@ EOU
176
164
  case member
177
165
  when AST::Members::MethodDefinition
178
166
  @validator.validate_method_definition(member, type_name: name)
179
- member.overloads.each do |ov|
180
- void_type_context_validator(ov.method_type)
181
- end
182
- when AST::Members::Attribute
183
- void_type_context_validator(member.type)
184
167
  when AST::Members::Mixin
185
- member.args.each do |arg|
186
- no_self_type_validator(arg)
187
- unless arg.is_a?(Types::Bases::Void)
188
- void_type_context_validator(arg, true)
189
- end
190
- end
191
168
  params =
192
169
  if member.name.class?
193
- module_decl = @env.normalized_module_entry(member.name) or raise
170
+ module_decl = @env.module_entry(member.name, normalized: true) or raise
194
171
  module_decl.type_params
195
172
  else
196
173
  interface_decl = @env.interface_decls.fetch(member.name)
@@ -199,10 +176,6 @@ EOU
199
176
  InvalidTypeApplicationError.check!(type_name: member.name, params: params, args: member.args, location: member.location)
200
177
  when AST::Members::Var
201
178
  @validator.validate_variable(member)
202
- void_type_context_validator(member.type)
203
- if member.is_a?(AST::Members::ClassVariable)
204
- no_self_type_validator(member.type)
205
- end
206
179
  end
207
180
  end
208
181
  else
@@ -238,16 +211,14 @@ EOU
238
211
 
239
212
  decl.decl.type_params.each do |param|
240
213
  if ub = param.upper_bound_type
241
- void_type_context_validator(ub)
242
- no_self_type_validator(ub)
243
- no_classish_type_validator(ub)
244
214
  @validator.validate_type(ub, context: nil)
245
215
  end
246
216
 
217
+ if lb = param.lower_bound_type
218
+ @validator.validate_type(lb, context: nil)
219
+ end
220
+
247
221
  if dt = param.default_type
248
- void_type_context_validator(dt, true)
249
- no_self_type_validator(dt)
250
- no_classish_type_validator(dt)
251
222
  @validator.validate_type(dt, context: nil)
252
223
  end
253
224
  end
@@ -258,10 +229,6 @@ EOU
258
229
  case member
259
230
  when AST::Members::MethodDefinition
260
231
  @validator.validate_method_definition(member, type_name: name)
261
- member.overloads.each do |ov|
262
- void_type_context_validator(ov.method_type)
263
- no_classish_type_validator(ov.method_type)
264
- end
265
232
  end
266
233
  end
267
234
  rescue BaseError => error
@@ -274,9 +241,6 @@ EOU
274
241
  RBS.logger.info "Validating constant: `#{name}`..."
275
242
  @validator.validate_type const.decl.type, context: const.context
276
243
  @builder.ensure_namespace!(name.namespace, location: const.decl.location)
277
- no_self_type_validator(const.decl.type)
278
- no_classish_type_validator(const.decl.type)
279
- void_type_context_validator(const.decl.type)
280
244
  rescue BaseError => error
281
245
  @errors.add(error)
282
246
  end
@@ -286,9 +250,6 @@ EOU
286
250
  @env.global_decls.each do |name, global|
287
251
  RBS.logger.info "Validating global: `#{name}`..."
288
252
  @validator.validate_type global.decl.type, context: nil
289
- no_self_type_validator(global.decl.type)
290
- no_classish_type_validator(global.decl.type)
291
- void_type_context_validator(global.decl.type)
292
253
  rescue BaseError => error
293
254
  @errors.add(error)
294
255
  end
@@ -311,52 +272,23 @@ EOU
311
272
 
312
273
  decl.decl.type_params.each do |param|
313
274
  if ub = param.upper_bound_type
314
- void_type_context_validator(ub)
315
- no_self_type_validator(ub)
316
- no_classish_type_validator(ub)
317
275
  @validator.validate_type(ub, context: nil)
318
276
  end
319
277
 
278
+ if lb = param.lower_bound_type
279
+ @validator.validate_type(lb, context: nil)
280
+ end
281
+
320
282
  if dt = param.default_type
321
- void_type_context_validator(dt, true)
322
- no_self_type_validator(dt)
323
- no_classish_type_validator(dt)
324
283
  @validator.validate_type(dt, context: nil)
325
284
  end
326
285
  end
327
286
 
328
287
  TypeParamDefaultReferenceError.check!(decl.decl.type_params)
329
-
330
- no_self_type_validator(decl.decl.type)
331
- no_classish_type_validator(decl.decl.type)
332
- void_type_context_validator(decl.decl.type)
333
288
  rescue BaseError => error
334
289
  @errors.add(error)
335
290
  end
336
291
  end
337
-
338
- private
339
-
340
- def no_self_type_validator(type)
341
- if type.has_self_type?
342
- @errors.add WillSyntaxError.new("`self` type is not allowed in this context", location: type.location)
343
- end
344
- end
345
-
346
- def no_classish_type_validator(type)
347
- if type.has_classish_type?
348
- @errors.add WillSyntaxError.new("`instance` or `class` type is not allowed in this context", location: type.location)
349
- end
350
- end
351
-
352
- def void_type_context_validator(type, allowed_here = false)
353
- if allowed_here
354
- return if type.is_a?(Types::Bases::Void)
355
- end
356
- if type.with_nonreturn_void?
357
- @errors.add WillSyntaxError.new("`void` type is only allowed in return type or generics parameter", location: type.location)
358
- end
359
- end
360
292
  end
361
293
  end
362
294
  end