rbs 4.0.0.dev.4 → 4.0.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.
Files changed (281) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +18 -11
  5. data/.github/workflows/comments.yml +5 -3
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +27 -34
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +2 -2
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +1 -1
  12. data/CHANGELOG.md +323 -0
  13. data/README.md +1 -1
  14. data/Rakefile +43 -33
  15. data/Steepfile +1 -0
  16. data/config.yml +426 -24
  17. data/core/array.rbs +307 -227
  18. data/core/basic_object.rbs +9 -8
  19. data/core/binding.rbs +0 -2
  20. data/core/builtin.rbs +2 -2
  21. data/core/class.rbs +6 -5
  22. data/core/comparable.rbs +55 -34
  23. data/core/complex.rbs +104 -78
  24. data/core/dir.rbs +61 -49
  25. data/core/encoding.rbs +12 -15
  26. data/core/enumerable.rbs +179 -87
  27. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  28. data/core/enumerator.rbs +65 -2
  29. data/core/errno.rbs +11 -2
  30. data/core/errors.rbs +58 -29
  31. data/core/exception.rbs +13 -13
  32. data/core/fiber.rbs +74 -54
  33. data/core/file.rbs +280 -177
  34. data/core/file_test.rbs +3 -3
  35. data/core/float.rbs +257 -92
  36. data/core/gc.rbs +425 -281
  37. data/core/hash.rbs +1045 -739
  38. data/core/integer.rbs +135 -137
  39. data/core/io/buffer.rbs +53 -42
  40. data/core/io/wait.rbs +13 -35
  41. data/core/io.rbs +192 -144
  42. data/core/kernel.rbs +216 -155
  43. data/core/marshal.rbs +4 -4
  44. data/core/match_data.rbs +15 -13
  45. data/core/math.rbs +107 -66
  46. data/core/method.rbs +69 -33
  47. data/core/module.rbs +244 -106
  48. data/core/nil_class.rbs +7 -6
  49. data/core/numeric.rbs +74 -63
  50. data/core/object.rbs +9 -11
  51. data/core/object_space.rbs +30 -23
  52. data/core/pathname.rbs +1322 -0
  53. data/core/proc.rbs +95 -58
  54. data/core/process.rbs +222 -202
  55. data/core/ractor.rbs +371 -515
  56. data/core/random.rbs +21 -3
  57. data/core/range.rbs +159 -57
  58. data/core/rational.rbs +60 -89
  59. data/core/rbs/unnamed/argf.rbs +60 -53
  60. data/core/rbs/unnamed/env_class.rbs +19 -14
  61. data/core/rbs/unnamed/main_class.rbs +123 -0
  62. data/core/rbs/unnamed/random.rbs +11 -118
  63. data/core/regexp.rbs +258 -214
  64. data/core/ruby.rbs +53 -0
  65. data/core/ruby_vm.rbs +38 -34
  66. data/core/rubygems/config_file.rbs +5 -5
  67. data/core/rubygems/errors.rbs +4 -71
  68. data/core/rubygems/requirement.rbs +5 -5
  69. data/core/rubygems/rubygems.rbs +16 -82
  70. data/core/rubygems/version.rbs +2 -3
  71. data/core/set.rbs +490 -360
  72. data/core/signal.rbs +26 -16
  73. data/core/string.rbs +3234 -1285
  74. data/core/struct.rbs +27 -26
  75. data/core/symbol.rbs +41 -34
  76. data/core/thread.rbs +135 -67
  77. data/core/time.rbs +81 -50
  78. data/core/trace_point.rbs +41 -35
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +24 -16
  81. data/core/warning.rbs +7 -7
  82. data/docs/aliases.md +79 -0
  83. data/docs/collection.md +3 -3
  84. data/docs/config.md +171 -0
  85. data/docs/encoding.md +56 -0
  86. data/docs/gem.md +0 -1
  87. data/docs/inline.md +576 -0
  88. data/docs/sigs.md +3 -3
  89. data/docs/syntax.md +46 -16
  90. data/docs/type_fingerprint.md +21 -0
  91. data/exe/rbs +1 -1
  92. data/ext/rbs_extension/ast_translation.c +544 -116
  93. data/ext/rbs_extension/ast_translation.h +3 -0
  94. data/ext/rbs_extension/class_constants.c +16 -2
  95. data/ext/rbs_extension/class_constants.h +8 -0
  96. data/ext/rbs_extension/extconf.rb +5 -1
  97. data/ext/rbs_extension/legacy_location.c +33 -56
  98. data/ext/rbs_extension/legacy_location.h +37 -0
  99. data/ext/rbs_extension/main.c +44 -35
  100. data/include/rbs/ast.h +448 -173
  101. data/include/rbs/defines.h +27 -0
  102. data/include/rbs/lexer.h +30 -11
  103. data/include/rbs/location.h +25 -44
  104. data/include/rbs/parser.h +6 -6
  105. data/include/rbs/string.h +0 -2
  106. data/include/rbs/util/rbs_allocator.h +34 -13
  107. data/include/rbs/util/rbs_assert.h +12 -1
  108. data/include/rbs/util/rbs_constant_pool.h +0 -3
  109. data/include/rbs/util/rbs_encoding.h +2 -0
  110. data/include/rbs/util/rbs_unescape.h +2 -1
  111. data/include/rbs.h +8 -0
  112. data/lib/rbs/ast/annotation.rb +1 -1
  113. data/lib/rbs/ast/comment.rb +1 -1
  114. data/lib/rbs/ast/declarations.rb +10 -10
  115. data/lib/rbs/ast/members.rb +14 -14
  116. data/lib/rbs/ast/ruby/annotations.rb +293 -3
  117. data/lib/rbs/ast/ruby/comment_block.rb +24 -0
  118. data/lib/rbs/ast/ruby/declarations.rb +198 -3
  119. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  120. data/lib/rbs/ast/ruby/members.rb +532 -22
  121. data/lib/rbs/ast/type_param.rb +24 -4
  122. data/lib/rbs/buffer.rb +20 -15
  123. data/lib/rbs/cli/diff.rb +16 -15
  124. data/lib/rbs/cli/validate.rb +38 -106
  125. data/lib/rbs/cli.rb +52 -19
  126. data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
  127. data/lib/rbs/collection/sources/git.rb +1 -0
  128. data/lib/rbs/definition.rb +1 -1
  129. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  130. data/lib/rbs/definition_builder/method_builder.rb +20 -0
  131. data/lib/rbs/definition_builder.rb +147 -25
  132. data/lib/rbs/diff.rb +7 -1
  133. data/lib/rbs/environment.rb +227 -74
  134. data/lib/rbs/environment_loader.rb +0 -6
  135. data/lib/rbs/errors.rb +27 -18
  136. data/lib/rbs/inline_parser.rb +342 -6
  137. data/lib/rbs/location_aux.rb +1 -1
  138. data/lib/rbs/locator.rb +5 -1
  139. data/lib/rbs/method_type.rb +5 -3
  140. data/lib/rbs/parser_aux.rb +20 -7
  141. data/lib/rbs/prototype/helpers.rb +57 -0
  142. data/lib/rbs/prototype/rb.rb +3 -28
  143. data/lib/rbs/prototype/rbi.rb +3 -20
  144. data/lib/rbs/prototype/runtime.rb +8 -0
  145. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  146. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  147. data/lib/rbs/subtractor.rb +3 -1
  148. data/lib/rbs/test/type_check.rb +19 -2
  149. data/lib/rbs/type_name.rb +1 -1
  150. data/lib/rbs/types.rb +88 -78
  151. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  152. data/lib/rbs/validator.rb +2 -2
  153. data/lib/rbs/version.rb +1 -1
  154. data/lib/rbs.rb +1 -2
  155. data/lib/rdoc/discover.rb +1 -1
  156. data/lib/rdoc_plugin/parser.rb +1 -1
  157. data/rbs.gemspec +4 -3
  158. data/rust/.gitignore +1 -0
  159. data/rust/Cargo.lock +378 -0
  160. data/rust/Cargo.toml +7 -0
  161. data/rust/ruby-rbs/Cargo.toml +22 -0
  162. data/rust/ruby-rbs/build.rs +764 -0
  163. data/rust/ruby-rbs/examples/locations.rs +60 -0
  164. data/rust/ruby-rbs/src/lib.rs +1 -0
  165. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  166. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  167. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  168. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  169. data/rust/ruby-rbs-sys/build.rs +204 -0
  170. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  171. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  172. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  173. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  174. data/schema/typeParam.json +17 -1
  175. data/sig/ast/ruby/annotations.rbs +315 -4
  176. data/sig/ast/ruby/comment_block.rbs +8 -0
  177. data/sig/ast/ruby/declarations.rbs +102 -4
  178. data/sig/ast/ruby/members.rbs +108 -2
  179. data/sig/cli/diff.rbs +5 -11
  180. data/sig/cli/validate.rbs +12 -8
  181. data/sig/cli.rbs +18 -18
  182. data/sig/definition.rbs +6 -1
  183. data/sig/definition_builder.rbs +2 -0
  184. data/sig/environment.rbs +70 -12
  185. data/sig/errors.rbs +13 -14
  186. data/sig/inline_parser.rbs +39 -2
  187. data/sig/locator.rbs +0 -2
  188. data/sig/manifest.yaml +0 -1
  189. data/sig/method_builder.rbs +3 -1
  190. data/sig/parser.rbs +31 -13
  191. data/sig/prototype/helpers.rbs +2 -0
  192. data/sig/resolver/type_name_resolver.rbs +35 -7
  193. data/sig/source.rbs +3 -3
  194. data/sig/type_param.rbs +13 -8
  195. data/sig/types.rbs +6 -7
  196. data/sig/unit_test/spy.rbs +0 -8
  197. data/sig/unit_test/type_assertions.rbs +11 -0
  198. data/src/ast.c +410 -153
  199. data/src/lexer.c +1392 -1313
  200. data/src/lexer.re +3 -0
  201. data/src/lexstate.c +58 -37
  202. data/src/location.c +8 -48
  203. data/src/parser.c +977 -516
  204. data/src/string.c +0 -48
  205. data/src/util/rbs_allocator.c +89 -71
  206. data/src/util/rbs_assert.c +1 -1
  207. data/src/util/rbs_buffer.c +2 -2
  208. data/src/util/rbs_constant_pool.c +10 -14
  209. data/src/util/rbs_encoding.c +4 -8
  210. data/src/util/rbs_unescape.c +56 -20
  211. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  212. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  213. data/stdlib/cgi/0/core.rbs +9 -393
  214. data/stdlib/cgi/0/manifest.yaml +1 -0
  215. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  216. data/stdlib/coverage/0/coverage.rbs +7 -4
  217. data/stdlib/date/0/date.rbs +92 -79
  218. data/stdlib/date/0/date_time.rbs +25 -24
  219. data/stdlib/delegate/0/delegator.rbs +10 -7
  220. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  221. data/stdlib/digest/0/digest.rbs +110 -0
  222. data/stdlib/erb/0/erb.rbs +748 -347
  223. data/stdlib/etc/0/etc.rbs +55 -50
  224. data/stdlib/fileutils/0/fileutils.rbs +158 -139
  225. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  226. data/stdlib/io-console/0/io-console.rbs +2 -2
  227. data/stdlib/json/0/json.rbs +217 -136
  228. data/stdlib/monitor/0/monitor.rbs +3 -3
  229. data/stdlib/net-http/0/net-http.rbs +162 -134
  230. data/stdlib/objspace/0/objspace.rbs +17 -34
  231. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  232. data/stdlib/open3/0/open3.rbs +469 -10
  233. data/stdlib/openssl/0/openssl.rbs +475 -357
  234. data/stdlib/optparse/0/optparse.rbs +26 -17
  235. data/stdlib/pathname/0/pathname.rbs +11 -1381
  236. data/stdlib/pp/0/pp.rbs +9 -8
  237. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  238. data/stdlib/pstore/0/pstore.rbs +35 -30
  239. data/stdlib/psych/0/psych.rbs +65 -12
  240. data/stdlib/psych/0/store.rbs +2 -4
  241. data/stdlib/pty/0/pty.rbs +9 -6
  242. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  243. data/stdlib/rdoc/0/code_object.rbs +2 -1
  244. data/stdlib/rdoc/0/parser.rbs +1 -1
  245. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  246. data/stdlib/rdoc/0/store.rbs +1 -1
  247. data/stdlib/resolv/0/resolv.rbs +25 -68
  248. data/stdlib/ripper/0/ripper.rbs +22 -19
  249. data/stdlib/securerandom/0/manifest.yaml +2 -0
  250. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  251. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  252. data/stdlib/singleton/0/singleton.rbs +3 -0
  253. data/stdlib/socket/0/addrinfo.rbs +7 -7
  254. data/stdlib/socket/0/basic_socket.rbs +3 -3
  255. data/stdlib/socket/0/ip_socket.rbs +10 -8
  256. data/stdlib/socket/0/socket.rbs +23 -10
  257. data/stdlib/socket/0/tcp_server.rbs +1 -1
  258. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  259. data/stdlib/socket/0/udp_socket.rbs +1 -1
  260. data/stdlib/socket/0/unix_server.rbs +1 -1
  261. data/stdlib/stringio/0/stringio.rbs +1177 -85
  262. data/stdlib/strscan/0/string_scanner.rbs +27 -25
  263. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  264. data/stdlib/time/0/time.rbs +8 -6
  265. data/stdlib/timeout/0/timeout.rbs +63 -7
  266. data/stdlib/tsort/0/cyclic.rbs +3 -0
  267. data/stdlib/tsort/0/tsort.rbs +7 -6
  268. data/stdlib/uri/0/common.rbs +42 -20
  269. data/stdlib/uri/0/file.rbs +3 -3
  270. data/stdlib/uri/0/generic.rbs +26 -18
  271. data/stdlib/uri/0/http.rbs +2 -2
  272. data/stdlib/uri/0/ldap.rbs +2 -2
  273. data/stdlib/uri/0/mailto.rbs +3 -3
  274. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  275. data/stdlib/zlib/0/deflate.rbs +4 -3
  276. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  277. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  278. data/stdlib/zlib/0/inflate.rbs +1 -1
  279. data/stdlib/zlib/0/need_dict.rbs +1 -1
  280. data/stdlib/zlib/0/zstream.rbs +1 -0
  281. metadata +50 -6
@@ -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
@@ -84,9 +89,9 @@ module RBS
84
89
 
85
90
  def rbs_location(location, loc2=nil)
86
91
  if loc2
87
- Location.new(self, location.start_character_offset, loc2.end_character_offset)
92
+ Location.new(self.top_buffer, location.start_character_offset, loc2.end_character_offset)
88
93
  else
89
- Location.new(self, location.start_character_offset, location.end_character_offset)
94
+ Location.new(self.top_buffer, location.start_character_offset, location.end_character_offset)
90
95
  end
91
96
  end
92
97
 
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