rbs 0.12.2 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +8 -4
  3. data/.gitignore +0 -1
  4. data/CHANGELOG.md +32 -0
  5. data/Gemfile +4 -0
  6. data/README.md +8 -2
  7. data/Rakefile +9 -2
  8. data/Steepfile +1 -1
  9. data/bin/annotate-with-rdoc +1 -1
  10. data/bin/setup +0 -2
  11. data/bin/test_runner.rb +15 -1
  12. data/{stdlib/builtin → core}/array.rbs +124 -120
  13. data/{stdlib/builtin → core}/basic_object.rbs +54 -54
  14. data/{stdlib/builtin → core}/binding.rbs +42 -42
  15. data/core/builtin.rbs +70 -0
  16. data/{stdlib/builtin → core}/class.rbs +33 -33
  17. data/{stdlib/builtin → core}/comparable.rbs +0 -0
  18. data/{stdlib/builtin → core}/complex.rbs +90 -90
  19. data/{stdlib/builtin → core}/constants.rbs +0 -0
  20. data/{stdlib/builtin → core}/data.rbs +0 -0
  21. data/{stdlib/builtin → core}/deprecated.rbs +0 -0
  22. data/{stdlib/builtin → core}/dir.rbs +0 -0
  23. data/{stdlib/builtin → core}/encoding.rbs +33 -33
  24. data/{stdlib/builtin → core}/enumerable.rbs +58 -52
  25. data/{stdlib/builtin → core}/enumerator.rbs +35 -35
  26. data/{stdlib/builtin → core}/errno.rbs +0 -0
  27. data/{stdlib/builtin → core}/errors.rbs +2 -2
  28. data/{stdlib/builtin → core}/exception.rbs +50 -50
  29. data/{stdlib/builtin → core}/false_class.rbs +6 -6
  30. data/{stdlib/builtin → core}/fiber.rbs +14 -14
  31. data/{stdlib/builtin → core}/fiber_error.rbs +1 -1
  32. data/{stdlib/builtin → core}/file.rbs +0 -0
  33. data/{stdlib/builtin → core}/file_test.rbs +0 -0
  34. data/{stdlib/builtin → core}/float.rbs +161 -161
  35. data/{stdlib/builtin → core}/gc.rbs +3 -3
  36. data/{stdlib/builtin → core}/hash.rbs +7 -7
  37. data/{stdlib/builtin → core}/integer.rbs +0 -0
  38. data/{stdlib/builtin → core}/io.rbs +88 -88
  39. data/{stdlib/builtin → core}/kernel.rbs +71 -153
  40. data/{stdlib/builtin → core}/marshal.rbs +0 -0
  41. data/{stdlib/builtin → core}/match_data.rbs +1 -1
  42. data/{stdlib/builtin → core}/math.rbs +0 -0
  43. data/{stdlib/builtin → core}/method.rbs +19 -19
  44. data/{stdlib/builtin → core}/module.rbs +13 -13
  45. data/{stdlib/builtin → core}/nil_class.rbs +20 -20
  46. data/{stdlib/builtin → core}/numeric.rbs +101 -101
  47. data/{stdlib/builtin → core}/object.rbs +173 -173
  48. data/{stdlib/builtin → core}/proc.rbs +91 -91
  49. data/{stdlib/builtin → core}/process.rbs +0 -0
  50. data/{stdlib/builtin → core}/random.rbs +1 -1
  51. data/{stdlib/builtin → core}/range.rbs +3 -5
  52. data/{stdlib/builtin → core}/rational.rbs +83 -83
  53. data/{stdlib/builtin → core}/rb_config.rbs +0 -0
  54. data/{stdlib/builtin → core}/regexp.rbs +0 -0
  55. data/{stdlib/builtin → core}/ruby_vm.rbs +0 -0
  56. data/{stdlib/builtin → core}/signal.rbs +7 -7
  57. data/{stdlib/builtin → core}/string.rbs +10 -10
  58. data/{stdlib/builtin → core}/string_io.rbs +8 -8
  59. data/{stdlib/builtin → core}/struct.rbs +1 -1
  60. data/{stdlib/builtin → core}/symbol.rbs +1 -1
  61. data/{stdlib/builtin → core}/thread.rbs +189 -189
  62. data/{stdlib/builtin → core}/thread_group.rbs +2 -2
  63. data/{stdlib/builtin → core}/time.rbs +0 -0
  64. data/{stdlib/builtin → core}/trace_point.rbs +0 -0
  65. data/{stdlib/builtin → core}/true_class.rbs +10 -10
  66. data/{stdlib/builtin → core}/unbound_method.rbs +0 -0
  67. data/{stdlib/builtin → core}/warning.rbs +1 -1
  68. data/docs/CONTRIBUTING.md +1 -0
  69. data/docs/repo.md +125 -0
  70. data/docs/syntax.md +50 -6
  71. data/goodcheck.yml +22 -5
  72. data/lib/rbs.rb +1 -0
  73. data/lib/rbs/ast/comment.rb +1 -1
  74. data/lib/rbs/cli.rb +117 -107
  75. data/lib/rbs/constant.rb +1 -1
  76. data/lib/rbs/constant_table.rb +9 -8
  77. data/lib/rbs/definition_builder.rb +6 -7
  78. data/lib/rbs/environment.rb +5 -1
  79. data/lib/rbs/environment_loader.rb +79 -105
  80. data/lib/rbs/namespace.rb +1 -1
  81. data/lib/rbs/parser.rb +3148 -0
  82. data/lib/rbs/parser.y +10 -3
  83. data/lib/rbs/prototype/rb.rb +38 -6
  84. data/lib/rbs/prototype/runtime.rb +17 -7
  85. data/lib/rbs/repository.rb +121 -0
  86. data/lib/rbs/test/hook.rb +2 -0
  87. data/lib/rbs/test/setup.rb +5 -3
  88. data/lib/rbs/test/setup_helper.rb +4 -4
  89. data/lib/rbs/test/tester.rb +4 -1
  90. data/lib/rbs/test/type_check.rb +12 -6
  91. data/lib/rbs/type_name.rb +3 -2
  92. data/lib/rbs/variance_calculator.rb +2 -2
  93. data/lib/rbs/vendorer.rb +38 -16
  94. data/lib/rbs/version.rb +1 -1
  95. data/lib/rbs/writer.rb +25 -15
  96. data/sig/cli.rbs +58 -0
  97. data/sig/constant.rbs +21 -0
  98. data/sig/constant_table.rbs +30 -0
  99. data/sig/declarations.rbs +2 -2
  100. data/sig/definition.rbs +2 -2
  101. data/sig/definition_builder.rbs +6 -5
  102. data/sig/environment_loader.rbs +100 -0
  103. data/sig/members.rbs +2 -2
  104. data/sig/method_types.rbs +1 -1
  105. data/sig/namespace.rbs +4 -4
  106. data/sig/parser.rbs +25 -0
  107. data/sig/polyfill.rbs +42 -0
  108. data/sig/rbs.rbs +8 -0
  109. data/sig/repository.rbs +79 -0
  110. data/sig/substitution.rbs +3 -3
  111. data/sig/typename.rbs +1 -1
  112. data/sig/types.rbs +1 -1
  113. data/sig/vendorer.rbs +44 -0
  114. data/sig/version.rbs +3 -0
  115. data/sig/writer.rbs +40 -0
  116. data/stdlib/abbrev/{abbrev.rbs → 0/abbrev.rbs} +0 -0
  117. data/stdlib/base64/{base64.rbs → 0/base64.rbs} +1 -1
  118. data/stdlib/benchmark/{benchmark.rbs → 0/benchmark.rbs} +2 -2
  119. data/stdlib/{bigdecimal/math → bigdecimal-math/0}/big_math.rbs +0 -0
  120. data/stdlib/bigdecimal/{big_decimal.rbs → 0/big_decimal.rbs} +0 -0
  121. data/stdlib/coverage/{coverage.rbs → 0/coverage.rbs} +2 -2
  122. data/stdlib/csv/{csv.rbs → 0/csv.rbs} +1 -1
  123. data/stdlib/date/{date.rbs → 0/date.rbs} +4 -4
  124. data/stdlib/date/{date_time.rbs → 0/date_time.rbs} +1 -1
  125. data/stdlib/dbm/0/dbm.rbs +277 -0
  126. data/stdlib/erb/{erb.rbs → 0/erb.rbs} +0 -0
  127. data/stdlib/fiber/{fiber.rbs → 0/fiber.rbs} +0 -0
  128. data/stdlib/find/{find.rbs → 0/find.rbs} +12 -12
  129. data/stdlib/forwardable/{forwardable.rbs → 0/forwardable.rbs} +0 -0
  130. data/stdlib/ipaddr/{ipaddr.rbs → 0/ipaddr.rbs} +0 -0
  131. data/stdlib/json/{json.rbs → 0/json.rbs} +0 -0
  132. data/stdlib/logger/{formatter.rbs → 0/formatter.rbs} +0 -0
  133. data/stdlib/logger/{log_device.rbs → 0/log_device.rbs} +1 -1
  134. data/stdlib/logger/{logger.rbs → 0/logger.rbs} +1 -1
  135. data/stdlib/logger/{period.rbs → 0/period.rbs} +0 -0
  136. data/stdlib/logger/{severity.rbs → 0/severity.rbs} +0 -0
  137. data/stdlib/mutex_m/{mutex_m.rbs → 0/mutex_m.rbs} +0 -0
  138. data/stdlib/pathname/{pathname.rbs → 0/pathname.rbs} +41 -39
  139. data/stdlib/prime/{integer-extension.rbs → 0/integer-extension.rbs} +0 -0
  140. data/stdlib/prime/{prime.rbs → 0/prime.rbs} +0 -0
  141. data/stdlib/pstore/0/pstore.rbs +287 -0
  142. data/stdlib/pty/{pty.rbs → 0/pty.rbs} +1 -1
  143. data/stdlib/securerandom/{securerandom.rbs → 0/securerandom.rbs} +0 -0
  144. data/stdlib/set/{set.rbs → 0/set.rbs} +0 -0
  145. data/stdlib/tmpdir/{tmpdir.rbs → 0/tmpdir.rbs} +12 -12
  146. data/stdlib/uri/{file.rbs → 0/file.rbs} +0 -0
  147. data/stdlib/uri/{generic.rbs → 0/generic.rbs} +2 -2
  148. data/stdlib/uri/0/http.rbs +158 -0
  149. data/stdlib/uri/0/https.rbs +108 -0
  150. data/stdlib/uri/0/ldap.rbs +224 -0
  151. data/stdlib/uri/0/ldaps.rbs +108 -0
  152. data/stdlib/zlib/{zlib.rbs → 0/zlib.rbs} +0 -0
  153. data/steep/Gemfile.lock +13 -17
  154. metadata +105 -89
  155. data/stdlib/builtin/builtin.rbs +0 -42
@@ -1,5 +1,6 @@
1
1
  class RBS::Parser
2
- token tUIDENT tLIDENT tNAMESPACE tINTERFACEIDENT tLKEYWORD tUKEYWORD tGLOBALIDENT
2
+ token tUIDENT tLIDENT tNAMESPACE tINTERFACEIDENT tGLOBALIDENT
3
+ tLKEYWORD tUKEYWORD tLKEYWORD_Q_E tUKEYWORD_Q_E
3
4
  tIVAR tCLASSVAR
4
5
  tANNOTATION
5
6
  tSTRING tSYMBOL tINTEGER tWRITE_ATTR
@@ -474,6 +475,8 @@ rule
474
475
 
475
476
  method_type:
476
477
  start_merged_scope type_params params_opt block_opt kARROW simple_type {
478
+ reset_variable_scope
479
+
477
480
  location = (val[1] || val[2] || val[3] || val[4]).location + val[5].location
478
481
  type_params = val[1]&.value || []
479
482
 
@@ -846,7 +849,7 @@ rule
846
849
  result = val[0]
847
850
  }
848
851
 
849
- keyword: tLKEYWORD | tUKEYWORD
852
+ keyword: tLKEYWORD | tUKEYWORD | tLKEYWORD_Q_E | tUKEYWORD_Q_E
850
853
 
851
854
  function_type:
852
855
  kLPAREN params kRPAREN kARROW simple_type {
@@ -874,7 +877,7 @@ rule
874
877
  required_keywords: {},
875
878
  optional_keywords: {},
876
879
  rest_keywords: nil,
877
- return_type: val[2]
880
+ return_type: val[1]
878
881
  )
879
882
 
880
883
  result = LocatedValue.new(value: type, location: location)
@@ -1344,8 +1347,12 @@ def next_token
1344
1347
  new_token(:tNAMESPACE)
1345
1348
  when input.scan(/[a-z_]\w*:/)
1346
1349
  new_token(:tLKEYWORD, input.matched.chop.to_sym)
1350
+ when input.scan(/[a-z_]\w*[?!]:/)
1351
+ new_token(:tLKEYWORD_Q_E, input.matched.chop.to_sym)
1347
1352
  when input.scan(/[A-Z]\w*:/)
1348
1353
  new_token(:tUKEYWORD, input.matched.chop.to_sym)
1354
+ when input.scan(/[A-Z]\w*[?!]:/)
1355
+ new_token(:tUKEYWORD_Q_E, input.matched.chop.to_sym)
1349
1356
  when input.scan(/\$[A-Za-z_]\w*/)
1350
1357
  new_token(:tGLOBALIDENT)
1351
1358
  when input.scan(/@[a-zA-Z_]\w*/)
@@ -135,6 +135,18 @@ module RBS
135
135
 
136
136
  decls.push member unless decls.include?(member)
137
137
 
138
+ when :ALIAS
139
+ new_name, old_name = node.children.map { |c| literal_to_symbol(c) }
140
+ member = AST::Members::Alias.new(
141
+ new_name: new_name,
142
+ old_name: old_name,
143
+ kind: singleton ? :singleton : :instance,
144
+ annotations: [],
145
+ location: nil,
146
+ comment: comments[node.first_lineno - 1],
147
+ )
148
+ decls.push member unless decls.include?(member)
149
+
138
150
  when :FCALL
139
151
  # Inside method definition cannot reach here.
140
152
  args = node.children[1]&.children || []
@@ -166,9 +178,9 @@ module RBS
166
178
  end
167
179
  when :attr_reader
168
180
  args.each do |arg|
169
- if arg&.type == :LIT && arg.children[0].is_a?(Symbol)
181
+ if arg && (name = literal_to_symbol(arg))
170
182
  decls << AST::Members::AttrReader.new(
171
- name: arg.children[0],
183
+ name: name,
172
184
  ivar_name: nil,
173
185
  type: Types::Bases::Any.new(location: nil),
174
186
  location: nil,
@@ -179,9 +191,9 @@ module RBS
179
191
  end
180
192
  when :attr_accessor
181
193
  args.each do |arg|
182
- if arg&.type == :LIT && arg.children[0].is_a?(Symbol)
194
+ if arg && (name = literal_to_symbol(arg))
183
195
  decls << AST::Members::AttrAccessor.new(
184
- name: arg.children[0],
196
+ name: name,
185
197
  ivar_name: nil,
186
198
  type: Types::Bases::Any.new(location: nil),
187
199
  location: nil,
@@ -192,9 +204,9 @@ module RBS
192
204
  end
193
205
  when :attr_writer
194
206
  args.each do |arg|
195
- if arg&.type == :LIT && arg.children[0].is_a?(Symbol)
207
+ if arg && (name = literal_to_symbol(arg))
196
208
  decls << AST::Members::AttrWriter.new(
197
- name: arg.children[0],
209
+ name: name,
198
210
  ivar_name: nil,
199
211
  type: Types::Bases::Any.new(location: nil),
200
212
  location: nil,
@@ -203,6 +215,17 @@ module RBS
203
215
  )
204
216
  end
205
217
  end
218
+ when :alias_method
219
+ if args[0] && args[1] && (new_name = literal_to_symbol(args[0])) && (old_name = literal_to_symbol(args[1]))
220
+ decls << AST::Members::Alias.new(
221
+ new_name: new_name,
222
+ old_name: old_name,
223
+ kind: singleton ? :singleton : :instance,
224
+ annotations: [],
225
+ location: nil,
226
+ comment: comments[node.first_lineno - 1],
227
+ )
228
+ end
206
229
  end
207
230
 
208
231
  each_child node do |child|
@@ -248,6 +271,15 @@ module RBS
248
271
  end
249
272
  end
250
273
 
274
+ def literal_to_symbol(node)
275
+ case node.type
276
+ when :LIT
277
+ node.children[0] if node.children[0].is_a?(Symbol)
278
+ when :STR
279
+ node.children[0].to_sym
280
+ end
281
+ end
282
+
251
283
  def each_node(nodes)
252
284
  nodes.each do |child|
253
285
  if child.is_a?(RubyVM::AbstractSyntaxTree::Node)
@@ -17,11 +17,13 @@ module RBS
17
17
  end
18
18
 
19
19
  def target?(const)
20
+ name = const_name(const)
21
+
20
22
  patterns.any? do |pattern|
21
23
  if pattern.end_with?("*")
22
- (const.name || "").start_with?(pattern.chop)
24
+ (name || "").start_with?(pattern.chop)
23
25
  else
24
- const.name == pattern
26
+ name == pattern
25
27
  end
26
28
  end
27
29
  end
@@ -37,7 +39,7 @@ module RBS
37
39
  def decls
38
40
  unless @decls
39
41
  @decls = []
40
- ObjectSpace.each_object(Module).select {|mod| target?(mod) }.sort_by(&:name).each do |mod|
42
+ ObjectSpace.each_object(Module).select {|mod| target?(mod) }.sort_by{|mod| const_name(mod) }.each do |mod|
41
43
  case mod
42
44
  when Class
43
45
  generate_class mod
@@ -356,12 +358,14 @@ module RBS
356
358
  end
357
359
 
358
360
  def generate_module(mod)
359
- unless mod.name
361
+ name = const_name(mod)
362
+
363
+ unless name
360
364
  RBS.logger.warn("Skipping anonymous module #{mod}")
361
365
  return
362
366
  end
363
367
 
364
- type_name = to_type_name(mod.name)
368
+ type_name = to_type_name(name)
365
369
 
366
370
  decl = AST::Declarations::Module.new(
367
371
  name: type_name,
@@ -374,12 +378,13 @@ module RBS
374
378
  )
375
379
 
376
380
  each_mixin(mod.included_modules, *mod.included_modules.flat_map(&:included_modules), namespace: type_name.namespace) do |included_module|
377
- unless included_module.name
381
+ included_module_name = const_name(included_module)
382
+ unless included_module_name
378
383
  RBS.logger.warn("Skipping anonymous module #{included_module} included in #{mod}")
379
384
  next
380
385
  end
381
386
 
382
- module_name = to_type_name(included_module.name)
387
+ module_name = to_type_name(included_module_name)
383
388
  if module_name.namespace == type_name.namespace
384
389
  module_name = TypeName.new(name: module_name.name, namespace: Namespace.empty)
385
390
  end
@@ -399,6 +404,11 @@ module RBS
399
404
 
400
405
  generate_constants mod
401
406
  end
407
+
408
+ def const_name(const)
409
+ @module_name_method ||= Module.instance_method(:name)
410
+ @module_name_method.bind(const).call
411
+ end
402
412
  end
403
413
  end
404
414
  end
@@ -0,0 +1,121 @@
1
+ module RBS
2
+ class Repository
3
+ DEFAULT_STDLIB_ROOT = Pathname(_ = __dir__) + "../../stdlib"
4
+
5
+ class GemRBS
6
+ attr_reader :name
7
+ attr_reader :paths
8
+
9
+ def initialize(name:)
10
+ @name = name
11
+ @paths = []
12
+ @versions = nil
13
+ end
14
+
15
+ def versions
16
+ load! unless @versions
17
+ @versions or raise
18
+ end
19
+
20
+ def load!
21
+ @versions = {}
22
+ versions = @versions or raise
23
+
24
+ paths.each do |gem_path|
25
+ gem_path.each_child(false) do |child|
26
+ next unless Gem::Version.correct?(child.to_s)
27
+
28
+ if version = Gem::Version.create(child.to_s)
29
+ unless version.prerelease?
30
+ path = gem_path + child
31
+
32
+ if prev = versions[version]
33
+ RBS.logger.info { "Overwriting gem RBS in repository: gem=#{name}, prev_path=#{prev.path}, new_path=#{path}" }
34
+ end
35
+
36
+ versions[version] = VersionPath.new(gem: self, version: version, path: path)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ def version_names
44
+ versions.keys.sort_by(&:version)
45
+ end
46
+
47
+ def oldest_version
48
+ oldest = version_names.first or raise
49
+ versions[oldest] or raise
50
+ end
51
+
52
+ def latest_version
53
+ latest = version_names.last or raise
54
+ versions[latest] or raise
55
+ end
56
+
57
+ def find_best_version(version)
58
+ return latest_version unless version
59
+
60
+ if v = version_names.reverse.bsearch {|v| v <= version ? true : false }
61
+ versions[v]
62
+ else
63
+ oldest_version
64
+ end
65
+ end
66
+
67
+ def empty?
68
+ versions.empty?
69
+ end
70
+ end
71
+
72
+ VersionPath = _ = Struct.new(:gem, :version, :path, keyword_init: true)
73
+
74
+ attr_reader :dirs
75
+ attr_reader :gems
76
+
77
+ def initialize(no_stdlib: false)
78
+ @dirs = []
79
+ @gems = {}
80
+
81
+ unless no_stdlib
82
+ add(DEFAULT_STDLIB_ROOT)
83
+ end
84
+ end
85
+
86
+ def self.default
87
+ new().tap do |repo|
88
+ repo.add(DEFAULT_STDLIB_ROOT)
89
+ end
90
+ end
91
+
92
+ def add(dir)
93
+ dirs << dir
94
+
95
+ dir.each_child(false) do |child|
96
+ gem_name = child.to_s
97
+ gem_rbs = (gems[gem_name] ||= GemRBS.new(name: gem_name))
98
+ gem_rbs.paths << dir + child
99
+ end
100
+ end
101
+
102
+ def lookup(gem, version)
103
+ _, set = lookup_path(gem, version)
104
+ set&.path
105
+ end
106
+
107
+ def lookup_path(gem, version)
108
+ if gem_rbs = gems[gem]
109
+ unless gem_rbs.empty?
110
+ set = if v = Gem::Version.create(version)&.release
111
+ gem_rbs.find_best_version(v)
112
+ else
113
+ gem_rbs.latest_version
114
+ end
115
+
116
+ [gem_rbs, set]
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -5,6 +5,8 @@ module RBS
5
5
  module Test
6
6
  module Hook
7
7
  OPERATORS = {
8
+ :[] => "indexlookup",
9
+ :[]= => "indexset",
8
10
  :== => "eqeq",
9
11
  :=== => "eqeqeq",
10
12
  :!= => "noteq",
@@ -2,6 +2,7 @@ require "rbs"
2
2
  require "rbs/test"
3
3
  require "optparse"
4
4
  require "shellwords"
5
+ require "rbs/cli"
5
6
 
6
7
  include RBS::Test::SetupHelper
7
8
 
@@ -32,12 +33,13 @@ if filter.empty?
32
33
  exit 1
33
34
  end
34
35
 
35
- loader = RBS::EnvironmentLoader.new
36
+ options = RBS::CLI::LibraryOptions.new()
37
+
36
38
  OptionParser.new do |opts|
37
- opts.on("-r [LIB]") do |name| loader.add(library: name) end
38
- opts.on("-I [DIR]") do |dir| loader.add(path: Pathname(dir)) end
39
+ options.setup_library_options(opts)
39
40
  end.parse!(opts)
40
41
 
42
+ loader = options.loader
41
43
  env = RBS::Environment.from_loader(loader).resolve_type_names
42
44
 
43
45
  def match(filter, name)
@@ -3,15 +3,15 @@ module RBS
3
3
  module SetupHelper
4
4
  class InvalidSampleSizeError < StandardError
5
5
  attr_reader :string
6
-
6
+
7
7
  def initialize(string)
8
8
  @string = string
9
9
  super("Sample size should be a positive integer: `#{string}`")
10
10
  end
11
11
  end
12
-
12
+
13
13
  DEFAULT_SAMPLE_SIZE = 100
14
-
14
+
15
15
  def get_sample_size(string)
16
16
  case string
17
17
  when ""
@@ -32,7 +32,7 @@ module RBS
32
32
  when 'rspec'
33
33
  ['::RSpec::Mocks::Double']
34
34
  when 'minitest'
35
- ['::Minitest::Mock']
35
+ ['::Minitest::Mock']
36
36
  else
37
37
  RBS.logger.warn "Unknown test suite - defaults to nil"
38
38
  nil
@@ -56,7 +56,10 @@ module RBS
56
56
  RBS.logger.info { "Skipping ##{name} because of `#{reason}`..." }
57
57
  end
58
58
  else
59
- if klass.instance_methods(false).include?(name) && !set.include?(name)
59
+ if !set.include?(name) && (
60
+ name == :initialize ||
61
+ klass.instance_methods(false).include?(name) ||
62
+ klass.private_instance_methods(false).include?(name))
60
63
  RBS.logger.info { "Setting up method hook in ##{name}..." }
61
64
  Hook.hook_instance_method klass, name, key: instance_key
62
65
  set << name
@@ -202,24 +202,30 @@ module RBS
202
202
  end
203
203
 
204
204
  def get_class(type_name)
205
- const_cache[type_name] ||= Object.const_get(type_name.to_s)
205
+ const_cache[type_name] ||= begin
206
+ Object.const_get(type_name.to_s)
207
+ rescue NameError
208
+ nil
209
+ end
206
210
  end
207
211
 
208
212
  def is_double?(value)
209
213
  unchecked_classes.any? { |unchecked_class| Test.call(value, IS_AP, Object.const_get(unchecked_class))}
214
+ rescue NameError
215
+ false
210
216
  end
211
217
 
212
218
  def value(val, type)
213
219
  if is_double?(val)
214
220
  RBS.logger.info("A double (#{val.inspect}) is detected!")
215
- return true
221
+ return true
216
222
  end
217
223
 
218
224
  case type
219
225
  when Types::Bases::Any
220
226
  true
221
227
  when Types::Bases::Bool
222
- true
228
+ val.is_a?(TrueClass) || val.is_a?(FalseClass)
223
229
  when Types::Bases::Top
224
230
  true
225
231
  when Types::Bases::Bottom
@@ -235,7 +241,7 @@ module RBS
235
241
  when Types::Bases::Instance
236
242
  Test.call(val, IS_AP, self_class)
237
243
  when Types::ClassInstance
238
- klass = get_class(type.name)
244
+ klass = get_class(type.name) or return false
239
245
  case
240
246
  when klass == ::Array
241
247
  Test.call(val, IS_AP, klass) && each_sample(val).all? {|v| value(v, type.args[0]) }
@@ -281,7 +287,7 @@ module RBS
281
287
  Test.call(val, IS_AP, klass)
282
288
  end
283
289
  when Types::ClassSingleton
284
- klass = get_class(type.name)
290
+ klass = get_class(type.name) or return false
285
291
  val == klass
286
292
  when Types::Interface
287
293
  methods = Set.new(Test.call(val, METHODS))
@@ -306,7 +312,7 @@ module RBS
306
312
  Test.call(val, IS_AP, ::Array) &&
307
313
  type.types.map.with_index {|ty, index| value(val[index], ty) }.all?
308
314
  when Types::Record
309
- Test::call(val, IS_AP, ::Hash) &&
315
+ Test::call(val, IS_AP, ::Hash) &&
310
316
  type.fields.map {|key, type| value(val[key], type) }.all?
311
317
  when Types::Proc
312
318
  Test::call(val, IS_AP, ::Proc)