steep 0.14.0 → 0.16.3

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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/CHANGELOG.md +25 -0
  4. data/Rakefile +0 -13
  5. data/bin/setup +0 -2
  6. data/bin/smoke_runner.rb +0 -1
  7. data/exe/steep +0 -1
  8. data/lib/steep.rb +18 -2
  9. data/lib/steep/annotation_parser.rb +4 -4
  10. data/lib/steep/ast/buffer.rb +11 -7
  11. data/lib/steep/ast/builtin.rb +8 -0
  12. data/lib/steep/ast/types/factory.rb +55 -55
  13. data/lib/steep/cli.rb +16 -1
  14. data/lib/steep/drivers/annotations.rb +1 -1
  15. data/lib/steep/drivers/check.rb +20 -4
  16. data/lib/steep/drivers/langserver.rb +13 -457
  17. data/lib/steep/drivers/utils/driver_helper.rb +1 -1
  18. data/lib/steep/drivers/vendor.rb +2 -2
  19. data/lib/steep/drivers/watch.rb +97 -85
  20. data/lib/steep/drivers/worker.rb +51 -0
  21. data/lib/steep/project.rb +9 -5
  22. data/lib/steep/project/completion_provider.rb +9 -13
  23. data/lib/steep/project/dsl.rb +14 -0
  24. data/lib/steep/project/file.rb +43 -46
  25. data/lib/steep/project/hover_content.rb +17 -8
  26. data/lib/steep/project/options.rb +25 -3
  27. data/lib/steep/project/target.rb +40 -24
  28. data/lib/steep/server/base_worker.rb +56 -0
  29. data/lib/steep/server/code_worker.rb +151 -0
  30. data/lib/steep/server/interaction_worker.rb +281 -0
  31. data/lib/steep/server/master.rb +196 -0
  32. data/lib/steep/server/signature_worker.rb +148 -0
  33. data/lib/steep/server/utils.rb +36 -0
  34. data/lib/steep/server/worker_process.rb +62 -0
  35. data/lib/steep/signature/errors.rb +1 -1
  36. data/lib/steep/signature/validator.rb +13 -13
  37. data/lib/steep/source.rb +1 -1
  38. data/lib/steep/type_construction.rb +996 -726
  39. data/lib/steep/type_inference/constant_env.rb +3 -11
  40. data/lib/steep/type_inference/context.rb +8 -3
  41. data/lib/steep/type_inference/context_array.rb +111 -0
  42. data/lib/steep/type_inference/local_variable_type_env.rb +226 -0
  43. data/lib/steep/type_inference/logic.rb +130 -0
  44. data/lib/steep/type_inference/type_env.rb +5 -69
  45. data/lib/steep/typing.rb +79 -22
  46. data/lib/steep/version.rb +1 -1
  47. data/smoke/alias/Steepfile +1 -0
  48. data/smoke/and/Steepfile +1 -0
  49. data/smoke/array/Steepfile +1 -0
  50. data/smoke/array/b.rb +0 -2
  51. data/smoke/block/Steepfile +1 -0
  52. data/smoke/case/Steepfile +1 -0
  53. data/smoke/class/Steepfile +1 -0
  54. data/smoke/const/Steepfile +1 -0
  55. data/smoke/dstr/Steepfile +1 -0
  56. data/smoke/ensure/Steepfile +1 -0
  57. data/smoke/enumerator/Steepfile +1 -0
  58. data/smoke/extension/Steepfile +1 -0
  59. data/smoke/extension/c.rb +1 -0
  60. data/smoke/hash/Steepfile +1 -0
  61. data/smoke/hello/Steepfile +1 -0
  62. data/smoke/if/Steepfile +1 -0
  63. data/smoke/if/a.rb +1 -1
  64. data/smoke/implements/Steepfile +1 -0
  65. data/smoke/initialize/Steepfile +1 -0
  66. data/smoke/integer/Steepfile +1 -0
  67. data/smoke/interface/Steepfile +1 -0
  68. data/smoke/kwbegin/Steepfile +1 -0
  69. data/smoke/lambda/Steepfile +1 -0
  70. data/smoke/literal/Steepfile +1 -0
  71. data/smoke/map/Steepfile +1 -0
  72. data/smoke/method/Steepfile +1 -0
  73. data/smoke/module/Steepfile +1 -0
  74. data/smoke/regexp/Steepfile +1 -0
  75. data/smoke/regression/Steepfile +1 -0
  76. data/smoke/rescue/Steepfile +1 -0
  77. data/smoke/rescue/a.rb +1 -1
  78. data/smoke/self/Steepfile +1 -0
  79. data/smoke/skip/Steepfile +1 -0
  80. data/smoke/stdout/Steepfile +1 -0
  81. data/smoke/super/Steepfile +1 -0
  82. data/smoke/type_case/Steepfile +1 -0
  83. data/smoke/yield/Steepfile +1 -0
  84. data/steep.gemspec +7 -8
  85. metadata +26 -141
  86. data/exe/rbs +0 -3
  87. data/exe/ruby-signature +0 -3
  88. data/vendor/ruby-signature/.github/workflows/ruby.yml +0 -27
  89. data/vendor/ruby-signature/.gitignore +0 -12
  90. data/vendor/ruby-signature/.rubocop.yml +0 -15
  91. data/vendor/ruby-signature/BSDL +0 -22
  92. data/vendor/ruby-signature/COPYING +0 -56
  93. data/vendor/ruby-signature/Gemfile +0 -6
  94. data/vendor/ruby-signature/README.md +0 -93
  95. data/vendor/ruby-signature/Rakefile +0 -67
  96. data/vendor/ruby-signature/bin/annotate-with-rdoc +0 -156
  97. data/vendor/ruby-signature/bin/console +0 -14
  98. data/vendor/ruby-signature/bin/query-rdoc +0 -103
  99. data/vendor/ruby-signature/bin/setup +0 -10
  100. data/vendor/ruby-signature/bin/sort +0 -88
  101. data/vendor/ruby-signature/bin/test_runner.rb +0 -17
  102. data/vendor/ruby-signature/docs/CONTRIBUTING.md +0 -97
  103. data/vendor/ruby-signature/docs/sigs.md +0 -148
  104. data/vendor/ruby-signature/docs/stdlib.md +0 -152
  105. data/vendor/ruby-signature/docs/syntax.md +0 -528
  106. data/vendor/ruby-signature/exe/rbs +0 -3
  107. data/vendor/ruby-signature/exe/ruby-signature +0 -7
  108. data/vendor/ruby-signature/lib/ruby/signature.rb +0 -64
  109. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +0 -29
  110. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +0 -29
  111. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +0 -391
  112. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +0 -364
  113. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +0 -52
  114. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +0 -54
  115. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +0 -555
  116. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +0 -28
  117. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +0 -152
  118. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +0 -172
  119. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +0 -921
  120. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +0 -283
  121. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +0 -138
  122. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +0 -126
  123. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +0 -189
  124. data/vendor/ruby-signature/lib/ruby/signature/location.rb +0 -104
  125. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +0 -125
  126. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +0 -93
  127. data/vendor/ruby-signature/lib/ruby/signature/parser.y +0 -1344
  128. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +0 -444
  129. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +0 -579
  130. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +0 -383
  131. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +0 -48
  132. data/vendor/ruby-signature/lib/ruby/signature/test.rb +0 -28
  133. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +0 -63
  134. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +0 -290
  135. data/vendor/ruby-signature/lib/ruby/signature/test/setup.rb +0 -58
  136. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +0 -327
  137. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +0 -185
  138. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +0 -256
  139. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +0 -72
  140. data/vendor/ruby-signature/lib/ruby/signature/types.rb +0 -932
  141. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +0 -140
  142. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +0 -49
  143. data/vendor/ruby-signature/lib/ruby/signature/version.rb +0 -5
  144. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +0 -271
  145. data/vendor/ruby-signature/ruby-signature.gemspec +0 -45
  146. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +0 -3
  147. data/vendor/ruby-signature/stdlib/base64/base64.rbs +0 -15
  148. data/vendor/ruby-signature/stdlib/builtin/array.rbs +0 -1997
  149. data/vendor/ruby-signature/stdlib/builtin/basic_object.rbs +0 -280
  150. data/vendor/ruby-signature/stdlib/builtin/binding.rbs +0 -177
  151. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +0 -35
  152. data/vendor/ruby-signature/stdlib/builtin/class.rbs +0 -145
  153. data/vendor/ruby-signature/stdlib/builtin/comparable.rbs +0 -116
  154. data/vendor/ruby-signature/stdlib/builtin/complex.rbs +0 -400
  155. data/vendor/ruby-signature/stdlib/builtin/constants.rbs +0 -37
  156. data/vendor/ruby-signature/stdlib/builtin/data.rbs +0 -5
  157. data/vendor/ruby-signature/stdlib/builtin/deprecated.rbs +0 -2
  158. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +0 -419
  159. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +0 -606
  160. data/vendor/ruby-signature/stdlib/builtin/enumerable.rbs +0 -404
  161. data/vendor/ruby-signature/stdlib/builtin/enumerator.rbs +0 -260
  162. data/vendor/ruby-signature/stdlib/builtin/errno.rbs +0 -781
  163. data/vendor/ruby-signature/stdlib/builtin/errors.rbs +0 -582
  164. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +0 -193
  165. data/vendor/ruby-signature/stdlib/builtin/false_class.rbs +0 -40
  166. data/vendor/ruby-signature/stdlib/builtin/fiber.rbs +0 -68
  167. data/vendor/ruby-signature/stdlib/builtin/fiber_error.rbs +0 -12
  168. data/vendor/ruby-signature/stdlib/builtin/file.rbs +0 -476
  169. data/vendor/ruby-signature/stdlib/builtin/file_test.rbs +0 -59
  170. data/vendor/ruby-signature/stdlib/builtin/float.rbs +0 -696
  171. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +0 -121
  172. data/vendor/ruby-signature/stdlib/builtin/hash.rbs +0 -1029
  173. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +0 -710
  174. data/vendor/ruby-signature/stdlib/builtin/io.rbs +0 -683
  175. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +0 -574
  176. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +0 -135
  177. data/vendor/ruby-signature/stdlib/builtin/match_data.rbs +0 -271
  178. data/vendor/ruby-signature/stdlib/builtin/math.rbs +0 -66
  179. data/vendor/ruby-signature/stdlib/builtin/method.rbs +0 -182
  180. data/vendor/ruby-signature/stdlib/builtin/module.rbs +0 -248
  181. data/vendor/ruby-signature/stdlib/builtin/nil_class.rbs +0 -82
  182. data/vendor/ruby-signature/stdlib/builtin/numeric.rbs +0 -409
  183. data/vendor/ruby-signature/stdlib/builtin/object.rbs +0 -824
  184. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +0 -426
  185. data/vendor/ruby-signature/stdlib/builtin/process.rbs +0 -354
  186. data/vendor/ruby-signature/stdlib/builtin/random.rbs +0 -93
  187. data/vendor/ruby-signature/stdlib/builtin/range.rbs +0 -226
  188. data/vendor/ruby-signature/stdlib/builtin/rational.rbs +0 -424
  189. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +0 -10
  190. data/vendor/ruby-signature/stdlib/builtin/regexp.rbs +0 -1083
  191. data/vendor/ruby-signature/stdlib/builtin/ruby_vm.rbs +0 -14
  192. data/vendor/ruby-signature/stdlib/builtin/signal.rbs +0 -55
  193. data/vendor/ruby-signature/stdlib/builtin/string.rbs +0 -1894
  194. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +0 -13
  195. data/vendor/ruby-signature/stdlib/builtin/struct.rbs +0 -40
  196. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +0 -230
  197. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +0 -1112
  198. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +0 -23
  199. data/vendor/ruby-signature/stdlib/builtin/time.rbs +0 -739
  200. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +0 -91
  201. data/vendor/ruby-signature/stdlib/builtin/true_class.rbs +0 -46
  202. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +0 -159
  203. data/vendor/ruby-signature/stdlib/builtin/warning.rbs +0 -17
  204. data/vendor/ruby-signature/stdlib/erb/erb.rbs +0 -18
  205. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -44
  206. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +0 -21
  207. data/vendor/ruby-signature/stdlib/prime/integer-extension.rbs +0 -23
  208. data/vendor/ruby-signature/stdlib/prime/prime.rbs +0 -188
  209. data/vendor/ruby-signature/stdlib/securerandom/securerandom.rbs +0 -9
  210. data/vendor/ruby-signature/stdlib/set/set.rbs +0 -77
  211. data/vendor/ruby-signature/stdlib/tmpdir/tmpdir.rbs +0 -53
@@ -1,13 +0,0 @@
1
- class StringIO
2
- def initialize: (?String, ?String) -> untyped
3
- def puts: (*untyped) -> void
4
- def readline: () -> String
5
- | (String) -> String
6
- def write: (String) -> void
7
- def flush: () -> void
8
- def string: -> String
9
- def close_read: -> nil
10
- def closed_read?: -> bool
11
- def close_write: -> nil
12
- def closed_write?: -> bool
13
- end
@@ -1,40 +0,0 @@
1
- # A [Struct](Struct) is a convenient way to bundle a
2
- # number of attributes together, using accessor methods, without having to
3
- # write an explicit class.
4
- #
5
- # The [Struct](Struct) class generates new subclasses
6
- # that hold a set of members and their values. For each member a reader
7
- # and writer method is created similar to
8
- # [Module\#attr\_accessor](https://ruby-doc.org/core-2.6.3/Module.html#method-i-attr_accessor)
9
- # .
10
- #
11
- # ```ruby
12
- # Customer = Struct.new(:name, :address) do
13
- # def greeting
14
- # "Hello #{name}!"
15
- # end
16
- # end
17
- #
18
- # dave = Customer.new("Dave", "123 Main")
19
- # dave.name #=> "Dave"
20
- # dave.greeting #=> "Hello Dave!"
21
- # ```
22
- #
23
- # See [::new](Struct#method-c-new) for further
24
- # examples of creating struct subclasses and instances.
25
- #
26
- # In the method descriptions that follow, a "member" parameter refers to a
27
- # struct member which is either a quoted string ( `"name"` ) or a
28
- # [Symbol](https://ruby-doc.org/core-2.6.3/Symbol.html) ( `:name` ).
29
- class Struct[Elem] < Object
30
- include Enumerable[Elem, Struct[Elem]]
31
-
32
- def initialize: (Symbol | String arg0, *Symbol | String arg1, ?keyword_init: bool keyword_init) -> void
33
-
34
- def each: () { (Elem arg0) -> untyped } -> untyped
35
- | () -> self
36
-
37
- def self.members: () -> ::Array[Symbol]
38
-
39
- def new: (*untyped args) -> Struct[untyped]
40
- end
@@ -1,230 +0,0 @@
1
- # Symbol objects represent names inside the Ruby interpreter. They are generated
2
- # using the `:name` and `:"string"` literals syntax, and by the various `to_sym`
3
- # methods. The same Symbol object will be created for a given name or string for
4
- # the duration of a program's execution, regardless of the context or meaning of
5
- # that name. Thus if `Fred` is a constant in one context, a method in another,
6
- # and a class in a third, the Symbol `:Fred` will be the same object in all
7
- # three contexts.
8
- #
9
- # module One
10
- # class Fred
11
- # end
12
- # $f1 = :Fred
13
- # end
14
- # module Two
15
- # Fred = 1
16
- # $f2 = :Fred
17
- # end
18
- # def Fred()
19
- # end
20
- # $f3 = :Fred
21
- # $f1.object_id #=> 2514190
22
- # $f2.object_id #=> 2514190
23
- # $f3.object_id #=> 2514190
24
- #
25
- class Symbol
26
- include Comparable
27
-
28
- # Returns an array of all the symbols currently in Ruby's symbol table.
29
- #
30
- # Symbol.all_symbols.size #=> 903
31
- # Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink,
32
- # :chown, :EOFError, :$;, :String,
33
- # :LOCK_SH, :"setuid?", :$<,
34
- # :default_proc, :compact, :extend,
35
- # :Tms, :getwd, :$=, :ThreadGroup,
36
- # :wait2, :$>]
37
- #
38
- def self.all_symbols: () -> ::Array[Symbol]
39
-
40
- public
41
-
42
- # Compares `symbol` with `other_symbol` after calling #to_s on each of the
43
- # symbols. Returns -1, 0, +1, or `nil` depending on whether `symbol` is less
44
- # than, equal to, or greater than `other_symbol`.
45
- #
46
- # `nil` is returned if the two values are incomparable.
47
- #
48
- # See String#<=> for more information.
49
- #
50
- def <=>: (Symbol other) -> Integer
51
- | (untyped other) -> Integer?
52
-
53
- # Equality---If *sym* and *obj* are exactly the same symbol, returns `true`.
54
- #
55
- def ==: (untyped obj) -> bool
56
-
57
- # Equality---If *sym* and *obj* are exactly the same symbol, returns `true`.
58
- #
59
- def ===: (untyped obj) -> bool
60
-
61
- # Returns `sym.to_s =~ obj`.
62
- #
63
- def =~: (untyped obj) -> Integer?
64
-
65
- # Returns `sym.to_s[]`.
66
- #
67
- def []: (Integer index) -> String?
68
- | (Integer start, Integer length) -> String?
69
- | (Range[Integer?] range) -> String?
70
- | (Regexp regexp) -> String?
71
- | (Regexp regexp, Integer | String capture) -> String?
72
- | (String match_str) -> String?
73
-
74
- # Same as `sym.to_s.capitalize.intern`.
75
- #
76
- def capitalize: () -> Symbol
77
- | (:ascii | :lithuanian | :turkic) -> Symbol
78
- | (:lithuanian, :turkic) -> Symbol
79
- | (:turkic, :lithuanian) -> Symbol
80
-
81
- # Case-insensitive version of Symbol#<=>. Currently, case-insensitivity only
82
- # works on characters A-Z/a-z, not all of Unicode. This is different from
83
- # Symbol#casecmp?.
84
- #
85
- # :aBcDeF.casecmp(:abcde) #=> 1
86
- # :aBcDeF.casecmp(:abcdef) #=> 0
87
- # :aBcDeF.casecmp(:abcdefg) #=> -1
88
- # :abcdef.casecmp(:ABCDEF) #=> 0
89
- #
90
- # `nil` is returned if the two symbols have incompatible encodings, or if
91
- # `other_symbol` is not a symbol.
92
- #
93
- # :foo.casecmp(2) #=> nil
94
- # "\u{e4 f6 fc}".encode("ISO-8859-1").to_sym.casecmp(:"\u{c4 d6 dc}") #=> nil
95
- #
96
- def casecmp: (Symbol other) -> Integer?
97
- | (untyped other) -> Integer?
98
-
99
- # Returns `true` if `sym` and `other_symbol` are equal after Unicode case
100
- # folding, `false` if they are not equal.
101
- #
102
- # :aBcDeF.casecmp?(:abcde) #=> false
103
- # :aBcDeF.casecmp?(:abcdef) #=> true
104
- # :aBcDeF.casecmp?(:abcdefg) #=> false
105
- # :abcdef.casecmp?(:ABCDEF) #=> true
106
- # :"\u{e4 f6 fc}".casecmp?(:"\u{c4 d6 dc}") #=> true
107
- #
108
- # `nil` is returned if the two symbols have incompatible encodings, or if
109
- # `other_symbol` is not a symbol.
110
- #
111
- # :foo.casecmp?(2) #=> nil
112
- # "\u{e4 f6 fc}".encode("ISO-8859-1").to_sym.casecmp?(:"\u{c4 d6 dc}") #=> nil
113
- #
114
- def casecmp?: (Symbol other) -> bool
115
- | (untyped other) -> bool
116
-
117
- # Same as `sym.to_s.downcase.intern`.
118
- #
119
- def downcase: () -> Symbol
120
- | (:ascii | :fold | :lithuanian | :turkic) -> Symbol
121
- | (:lithuanian, :turkic) -> Symbol
122
- | (:turkic, :lithuanian) -> Symbol
123
-
124
- # Returns whether *sym* is :"" or not.
125
- #
126
- def empty?: () -> bool
127
-
128
- # Returns the Encoding object that represents the encoding of *sym*.
129
- #
130
- def encoding: () -> Encoding
131
-
132
- # Returns true if `sym` ends with one of the `suffixes` given.
133
- #
134
- # :hello.end_with?("ello") #=> true
135
- #
136
- # # returns true if one of the +suffixes+ matches.
137
- # :hello.end_with?("heaven", "ello") #=> true
138
- # :hello.end_with?("heaven", "paradise") #=> false
139
- #
140
- def end_with?: (String str, *String str) -> bool
141
-
142
- # Returns the name or string corresponding to *sym*.
143
- #
144
- # :fred.id2name #=> "fred"
145
- # :ginger.to_s #=> "ginger"
146
- #
147
- def id2name: () -> String
148
-
149
- # Returns the representation of *sym* as a symbol literal.
150
- #
151
- # :fred.inspect #=> ":fred"
152
- #
153
- def inspect: () -> String
154
-
155
- # In general, `to_sym` returns the Symbol corresponding to an object. As *sym*
156
- # is already a symbol, `self` is returned in this case.
157
- #
158
- def intern: () -> self
159
-
160
- # Same as `sym.to_s.length`.
161
- #
162
- def length: () -> Integer
163
-
164
- # Returns `sym.to_s.match`.
165
- #
166
- def match: (Regexp | String pattern, ?Integer pos) ?{ (MatchData) -> void } -> MatchData?
167
-
168
- # Returns `sym.to_s.match?`.
169
- #
170
- def match?: (Regexp | String pattern, ?Integer pos) -> bool
171
-
172
- # Same as `sym.to_s.succ.intern`.
173
- #
174
- def next: () -> Symbol
175
-
176
- # Same as `sym.to_s.length`.
177
- #
178
- alias size length
179
-
180
- # Returns `sym.to_s[]`.
181
- #
182
- alias slice `[]`
183
-
184
- # Returns true if `sym` starts with one of the `prefixes` given. Each of the
185
- # `prefixes` should be a String or a Regexp.
186
- #
187
- # :hello.start_with?("hell") #=> true
188
- # :hello.start_with?(/H/i) #=> true
189
- #
190
- # # returns true if one of the prefixes matches.
191
- # :hello.start_with?("heaven", "hell") #=> true
192
- # :hello.start_with?("heaven", "paradise") #=> false
193
- def start_with?: (String str, *String str) -> bool
194
-
195
- # Same as `sym.to_s.succ.intern`.
196
- #
197
- alias succ next
198
-
199
- # Same as `sym.to_s.swapcase.intern`.
200
- #
201
- def swapcase: () -> Symbol
202
- | (:ascii | :lithuanian | :turkic) -> Symbol
203
- | (:lithuanian, :turkic) -> Symbol
204
- | (:turkic, :lithuanian) -> Symbol
205
-
206
- # Returns a *Proc* object which responds to the given method by *sym*.
207
- #
208
- # (1..3).collect(&:to_s) #=> ["1", "2", "3"]
209
- #
210
- def to_proc: () -> Proc
211
-
212
- # Returns the name or string corresponding to *sym*.
213
- #
214
- # :fred.id2name #=> "fred"
215
- # :ginger.to_s #=> "ginger"
216
- #
217
- alias to_s id2name
218
-
219
- # In general, `to_sym` returns the Symbol corresponding to an object. As *sym*
220
- # is already a symbol, `self` is returned in this case.
221
- #
222
- alias to_sym intern
223
-
224
- # Same as `sym.to_s.upcase.intern`.
225
- #
226
- def upcase: () -> Symbol
227
- | (:ascii | :lithuanian | :turkic) -> Symbol
228
- | (:lithuanian, :turkic) -> Symbol
229
- | (:turkic, :lithuanian) -> Symbol
230
- end
@@ -1,1112 +0,0 @@
1
- # Threads are the Ruby implementation for a concurrent programming model.
2
- #
3
- # Programs that require multiple threads of execution are a perfect
4
- # candidate for Ruby's [Thread](Thread) class.
5
- #
6
- # For example, we can create a new thread separate from the main thread's
7
- # execution using [::new](Thread#method-c-new).
8
- #
9
- # ```ruby
10
- # thr = Thread.new { puts "Whats the big deal" }
11
- # ```
12
- #
13
- # Then we are able to pause the execution of the main thread and allow our
14
- # new thread to finish, using
15
- # [join](Thread#method-i-join):
16
- #
17
- # ```ruby
18
- # thr.join #=> "Whats the big deal"
19
- # ```
20
- #
21
- # If we don't call `thr.join` before the main thread terminates, then all
22
- # other threads including `thr` will be killed.
23
- #
24
- # Alternatively, you can use an array for handling multiple threads at
25
- # once, like in the following example:
26
- #
27
- # ```ruby
28
- # threads = []
29
- # threads << Thread.new { puts "Whats the big deal" }
30
- # threads << Thread.new { 3.times { puts "Threads are fun!" } }
31
- # ```
32
- #
33
- # After creating a few threads we wait for them all to finish
34
- # consecutively.
35
- #
36
- # ```ruby
37
- # threads.each { |thr| thr.join }
38
- # ```
39
- #
40
- #
41
- # In order to create new threads, Ruby provides
42
- # [::new](Thread#method-c-new),
43
- # [::start](Thread#method-c-start), and
44
- # [::fork](Thread#method-c-fork). A block must be
45
- # provided with each of these methods, otherwise a
46
- # [ThreadError](https://ruby-doc.org/core-2.6.3/ThreadError.html) will be
47
- # raised.
48
- #
49
- # When subclassing the [Thread](Thread) class, the
50
- # `initialize` method of your subclass will be ignored by
51
- # [::start](Thread#method-c-start) and
52
- # [::fork](Thread#method-c-fork). Otherwise, be sure
53
- # to call super in your `initialize` method.
54
- #
55
- #
56
- # For terminating threads, Ruby provides a variety of ways to do this.
57
- #
58
- # The class method [::kill](Thread#method-c-kill), is
59
- # meant to exit a given thread:
60
- #
61
- # thr = Thread.new { ... }
62
- # Thread.kill(thr) # sends exit() to thr
63
- #
64
- # Alternatively, you can use the instance method
65
- # [exit](Thread#method-i-exit), or any of its aliases
66
- # [kill](Thread#method-i-kill) or
67
- # [terminate](Thread#method-i-terminate).
68
- #
69
- # ```ruby
70
- # thr.exit
71
- # ```
72
- #
73
- #
74
- # Ruby provides a few instance methods for querying the state of a given
75
- # thread. To get a string with the current thread's state use
76
- # [status](Thread#method-i-status)
77
- #
78
- # ```ruby
79
- # thr = Thread.new { sleep }
80
- # thr.status # => "sleep"
81
- # thr.exit
82
- # thr.status # => false
83
- # ```
84
- #
85
- # You can also use [alive?](Thread#method-i-alive-3F)
86
- # to tell if the thread is running or sleeping, and
87
- # [stop?](Thread#method-i-stop-3F) if the thread is
88
- # dead or sleeping.
89
- #
90
- #
91
- # Since threads are created with blocks, the same rules apply to other
92
- # Ruby blocks for variable scope. Any local variables created within this
93
- # block are accessible to only this thread.
94
- #
95
- #
96
- # Each fiber has its own bucket for
97
- # [\#\[\]](Thread#method-i-5B-5D) storage. When you
98
- # set a new fiber-local it is only accessible within this
99
- # [Fiber](https://ruby-doc.org/core-2.6.3/Fiber.html). To illustrate:
100
- #
101
- # ```ruby
102
- # Thread.new {
103
- # Thread.current[:foo] = "bar"
104
- # Fiber.new {
105
- # p Thread.current[:foo] # => nil
106
- # }.resume
107
- # }.join
108
- # ```
109
- #
110
- # This example uses [\[\]](Thread#method-i-5B-5D) for
111
- # getting and [\[\]=](Thread#method-i-5B-5D-3D) for
112
- # setting fiber-locals, you can also use
113
- # [keys](Thread#method-i-keys) to list the
114
- # fiber-locals for a given thread and
115
- # [key?](Thread#method-i-key-3F) to check if a
116
- # fiber-local exists.
117
- #
118
- # When it comes to thread-locals, they are accessible within the entire
119
- # scope of the thread. Given the following example:
120
- #
121
- # ```ruby
122
- # Thread.new{
123
- # Thread.current.thread_variable_set(:foo, 1)
124
- # p Thread.current.thread_variable_get(:foo) # => 1
125
- # Fiber.new{
126
- # Thread.current.thread_variable_set(:foo, 2)
127
- # p Thread.current.thread_variable_get(:foo) # => 2
128
- # }.resume
129
- # p Thread.current.thread_variable_get(:foo) # => 2
130
- # }.join
131
- # ```
132
- #
133
- # You can see that the thread-local `:foo` carried over into the fiber and
134
- # was changed to `2` by the end of the thread.
135
- #
136
- # This example makes use of
137
- # [thread\_variable\_set](Thread#method-i-thread_variable_set)
138
- # to create new thread-locals, and
139
- # [thread\_variable\_get](Thread#method-i-thread_variable_get)
140
- # to reference them.
141
- #
142
- # There is also
143
- # [thread\_variables](Thread#method-i-thread_variables)
144
- # to list all thread-locals, and
145
- # [thread\_variable?](Thread#method-i-thread_variable-3F)
146
- # to check if a given thread-local exists.
147
- #
148
- #
149
- # Any thread can raise an exception using the
150
- # [raise](Thread#method-i-raise) instance method,
151
- # which operates similarly to
152
- # [Kernel\#raise](https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-raise)
153
- # .
154
- #
155
- # However, it's important to note that an exception that occurs in any
156
- # thread except the main thread depends on
157
- # [abort\_on\_exception](Thread#method-i-abort_on_exception)
158
- # . This option is `false` by default, meaning that any unhandled
159
- # exception will cause the thread to terminate silently when waited on by
160
- # either [join](Thread#method-i-join) or
161
- # [value](Thread#method-i-value). You can change this
162
- # default by either
163
- # [abort\_on\_exception=](Thread#method-i-abort_on_exception-3D)
164
- # `true` or setting $DEBUG to `true` .
165
- #
166
- # With the addition of the class method
167
- # [::handle\_interrupt](Thread#method-c-handle_interrupt)
168
- # , you can now handle exceptions asynchronously with threads.
169
- #
170
- #
171
- # Ruby provides a few ways to support scheduling threads in your program.
172
- #
173
- # The first way is by using the class method
174
- # [::stop](Thread#method-c-stop), to put the current
175
- # running thread to sleep and schedule the execution of another thread.
176
- #
177
- # Once a thread is asleep, you can use the instance method
178
- # [wakeup](Thread#method-i-wakeup) to mark your thread
179
- # as eligible for scheduling.
180
- #
181
- # You can also try [::pass](Thread#method-c-pass),
182
- # which attempts to pass execution to another thread but is dependent on
183
- # the OS whether a running thread will switch or not. The same goes for
184
- # [priority](Thread#method-i-priority), which lets
185
- # you hint to the thread scheduler which threads you want to take
186
- # precedence when passing execution. This method is also dependent on the
187
- # OS and may be ignored on some platforms.
188
- class Thread < Object
189
- def self.current: () -> Thread
190
-
191
- # Returns the main thread.
192
- def self.main: () -> Thread
193
-
194
- def []: (String | Symbol key) -> untyped
195
-
196
- # Attribute Assignment—Sets or creates the value of a fiber-local
197
- # variable, using either a symbol or a string.
198
- #
199
- # See also [\#\[\]](Thread.downloaded.ruby_doc#method-i-5B-5D).
200
- #
201
- # For thread-local variables, please see
202
- # [thread\_variable\_set](Thread.downloaded.ruby_doc#method-i-thread_variable_set)
203
- # and
204
- # [thread\_variable\_get](Thread.downloaded.ruby_doc#method-i-thread_variable_get)
205
- # .
206
- def []=: (String | Symbol key, untyped value) -> untyped
207
-
208
- def alive?: () -> bool
209
-
210
- # Terminates `thr` and schedules another thread to be run.
211
- #
212
- # If this thread is already marked to be killed,
213
- # [exit](Thread.downloaded.ruby_doc#method-i-exit) returns the
214
- # [Thread](Thread.downloaded.ruby_doc).
215
- #
216
- # If this is the main thread, or the last thread, exits the process.
217
- def kill: () -> Thread?
218
-
219
- # Returns the status of the thread-local “abort on exception” condition
220
- # for this `thr` .
221
- #
222
- # The default is `false` .
223
- #
224
- # See also
225
- # [abort\_on\_exception=](Thread.downloaded.ruby_doc#method-i-abort_on_exception-3D)
226
- # .
227
- #
228
- # There is also a class level method to set this for all threads, see
229
- # [::abort\_on\_exception](Thread.downloaded.ruby_doc#method-c-abort_on_exception)
230
- # .
231
- def abort_on_exception: () -> bool
232
-
233
- # When set to `true`, if this `thr` is aborted by an exception, the
234
- # raised exception will be re-raised in the main thread.
235
- #
236
- # See also
237
- # [abort\_on\_exception](Thread.downloaded.ruby_doc#method-i-abort_on_exception)
238
- # .
239
- #
240
- # There is also a class level method to set this for all threads, see
241
- # [::abort\_on\_exception=](Thread.downloaded.ruby_doc#method-c-abort_on_exception-3D)
242
- # .
243
- def abort_on_exception=: (bool abort_on_exception) -> untyped
244
-
245
- # Adds *proc* as a handler for tracing.
246
- #
247
- # See
248
- # [\#set\_trace\_func](Thread.downloaded.ruby_doc#method-i-set_trace_func)
249
- # and
250
- # [Kernel\#set\_trace\_func](https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-set_trace_func)
251
- # .
252
- def add_trace_func: (untyped proc) -> untyped
253
-
254
- # Returns the current backtrace of the target thread.
255
- def backtrace: (*untyped args) -> ::Array[untyped]
256
-
257
- # Returns the execution stack for the target thread—an array containing
258
- # backtrace location objects.
259
- #
260
- # See
261
- # [Thread::Backtrace::Location](https://ruby-doc.org/core-2.6.3/Thread/Backtrace/Location.html)
262
- # for more information.
263
- #
264
- # This method behaves similarly to
265
- # [Kernel\#caller\_locations](https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-caller_locations)
266
- # except it applies to a specific thread.
267
- def backtrace_locations: (*untyped args) -> ::Array[untyped]?
268
-
269
- # Terminates `thr` and schedules another thread to be run.
270
- #
271
- # If this thread is already marked to be killed,
272
- # [exit](Thread.downloaded.ruby_doc#method-i-exit) returns the
273
- # [Thread](Thread.downloaded.ruby_doc).
274
- #
275
- # If this is the main thread, or the last thread, exits the process.
276
- def exit: () -> Thread?
277
-
278
- # Returns a fiber-local for the given key. If the key can’t be found,
279
- # there are several options: With no other arguments, it will raise a
280
- # `KeyError` exception; if *default* is given, then that will be returned;
281
- # if the optional code block is specified, then that will be run and its
282
- # result returned. See [\#\[\]](Thread.downloaded.ruby_doc#method-i-5B-5D)
283
- # and
284
- # [Hash\#fetch](https://ruby-doc.org/core-2.6.3/Hash.html#method-i-fetch)
285
- # .
286
- def fetch: (*untyped sym) -> untyped
287
-
288
- def group: () -> ThreadGroup?
289
-
290
- def initialize: (*untyped args) -> Thread
291
-
292
- # The calling thread will suspend execution and run this `thr` .
293
- #
294
- # Does not return until `thr` exits or until the given `limit` seconds
295
- # have passed.
296
- #
297
- # If the time limit expires, `nil` will be returned, otherwise `thr` is
298
- # returned.
299
- #
300
- # Any threads not joined will be killed when the main program exits.
301
- #
302
- # If `thr` had previously raised an exception and the
303
- # [::abort\_on\_exception](Thread.downloaded.ruby_doc#method-c-abort_on_exception)
304
- # or $DEBUG flags are not set, (so the exception has not yet been
305
- # processed), it will be processed at this time.
306
- #
307
- # ```ruby
308
- # a = Thread.new { print "a"; sleep(10); print "b"; print "c" }
309
- # x = Thread.new { print "x"; Thread.pass; print "y"; print "z" }
310
- # x.join # Let thread x finish, thread a will be killed on exit.
311
- # #=> "axyz"
312
- # ```
313
- #
314
- # The following example illustrates the `limit` parameter.
315
- #
316
- # ```ruby
317
- # y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }}
318
- # puts "Waiting" until y.join(0.15)
319
- # ```
320
- #
321
- # This will produce:
322
- #
323
- # tick...
324
- # Waiting
325
- # tick...
326
- # Waiting
327
- # tick...
328
- # tick...
329
- def join: (*untyped limit) -> Thread
330
-
331
- # Returns `true` if the given string (or symbol) exists as a fiber-local
332
- # variable.
333
- #
334
- # ```ruby
335
- # me = Thread.current
336
- # me[:oliver] = "a"
337
- # me.key?(:oliver) #=> true
338
- # me.key?(:stanley) #=> false
339
- # ```
340
- def key?: (Symbol sym) -> bool
341
-
342
- def keys: () -> ::Array[Symbol]
343
-
344
- # show the name of the thread.
345
- def name: () -> String
346
-
347
- # set given name to the ruby thread. On some platform, it may set the name
348
- # to pthread and/or kernel.
349
- def name=: (untyped name) -> untyped
350
-
351
- # Returns whether or not the asynchronous queue is empty for the target
352
- # thread.
353
- #
354
- # If `error` is given, then check only for `error` type deferred events.
355
- #
356
- # See
357
- # [::pending\_interrupt?](Thread.downloaded.ruby_doc#method-c-pending_interrupt-3F)
358
- # for more information.
359
- def pending_interrupt?: (*untyped args) -> bool
360
-
361
- # Returns the priority of *thr* . Default is inherited from the current
362
- # thread which creating the new thread, or zero for the initial main
363
- # thread; higher-priority thread will run more frequently than
364
- # lower-priority threads (but lower-priority threads can also run).
365
- #
366
- # This is just hint for Ruby thread scheduler. It may be ignored on some
367
- # platform.
368
- #
369
- # ```ruby
370
- # Thread.current.priority #=> 0
371
- # ```
372
- def priority: () -> Integer
373
-
374
- # Sets the priority of *thr* to *integer* . Higher-priority threads will
375
- # run more frequently than lower-priority threads (but lower-priority
376
- # threads can also run).
377
- #
378
- # This is just hint for Ruby thread scheduler. It may be ignored on some
379
- # platform.
380
- #
381
- # ```ruby
382
- # count1 = count2 = 0
383
- # a = Thread.new do
384
- # loop { count1 += 1 }
385
- # end
386
- # a.priority = -1
387
- #
388
- # b = Thread.new do
389
- # loop { count2 += 1 }
390
- # end
391
- # b.priority = -2
392
- # sleep 1 #=> 1
393
- # count1 #=> 622504
394
- # count2 #=> 5832
395
- # ```
396
- def priority=: (Integer priority) -> untyped
397
-
398
- # Returns the status of the thread-local “report on exception” condition
399
- # for this `thr` .
400
- #
401
- # The default value when creating a [Thread](Thread.downloaded.ruby_doc)
402
- # is the value of the global flag
403
- # [::report\_on\_exception](Thread.downloaded.ruby_doc#method-c-report_on_exception)
404
- # .
405
- #
406
- # See also
407
- # [report\_on\_exception=](Thread.downloaded.ruby_doc#method-i-report_on_exception-3D)
408
- # .
409
- #
410
- # There is also a class level method to set this for all new threads, see
411
- # [::report\_on\_exception=](Thread.downloaded.ruby_doc#method-c-report_on_exception-3D)
412
- # .
413
- def report_on_exception: () -> bool
414
-
415
- # When set to `true`, a message is printed on $stderr if an exception
416
- # kills this `thr` . See
417
- # [::report\_on\_exception](Thread.downloaded.ruby_doc#method-c-report_on_exception)
418
- # for details.
419
- #
420
- # See also
421
- # [report\_on\_exception](Thread.downloaded.ruby_doc#method-i-report_on_exception)
422
- # .
423
- #
424
- # There is also a class level method to set this for all new threads, see
425
- # [::report\_on\_exception=](Thread.downloaded.ruby_doc#method-c-report_on_exception-3D)
426
- # .
427
- def report_on_exception=: (bool report_on_exception) -> untyped
428
-
429
- # Wakes up `thr`, making it eligible for scheduling.
430
- #
431
- # ```ruby
432
- # a = Thread.new { puts "a"; Thread.stop; puts "c" }
433
- # sleep 0.1 while a.status!='sleep'
434
- # puts "Got here"
435
- # a.run
436
- # a.join
437
- # ```
438
- #
439
- # This will produce:
440
- #
441
- # ```ruby
442
- # a
443
- # Got here
444
- # c
445
- # ```
446
- #
447
- # See also the instance method
448
- # [wakeup](Thread.downloaded.ruby_doc#method-i-wakeup).
449
- def run: () -> Thread
450
-
451
- # Returns the safe level.
452
- #
453
- # This method is obsolete because $SAFE is a process global state. Simply
454
- # check $SAFE.
455
- def safe_level: () -> Integer
456
-
457
- def status: () -> (String | bool)?
458
-
459
- # Returns `true` if `thr` is dead or sleeping.
460
- #
461
- # ```ruby
462
- # a = Thread.new { Thread.stop }
463
- # b = Thread.current
464
- # a.stop? #=> true
465
- # b.stop? #=> false
466
- # ```
467
- #
468
- # See also [alive?](Thread.downloaded.ruby_doc#method-i-alive-3F) and
469
- # [status](Thread.downloaded.ruby_doc#method-i-status).
470
- def `stop?`: () -> bool
471
-
472
- # Terminates `thr` and schedules another thread to be run.
473
- #
474
- # If this thread is already marked to be killed,
475
- # [exit](Thread.downloaded.ruby_doc#method-i-exit) returns the
476
- # [Thread](Thread.downloaded.ruby_doc).
477
- #
478
- # If this is the main thread, or the last thread, exits the process.
479
- def terminate: () -> Thread?
480
-
481
- # Returns `true` if the given string (or symbol) exists as a thread-local
482
- # variable.
483
- #
484
- # ```ruby
485
- # me = Thread.current
486
- # me.thread_variable_set(:oliver, "a")
487
- # me.thread_variable?(:oliver) #=> true
488
- # me.thread_variable?(:stanley) #=> false
489
- # ```
490
- #
491
- # Note that these are not fiber local variables. Please see
492
- # [\#\[\]](Thread.downloaded.ruby_doc#method-i-5B-5D) and
493
- # [\#thread\_variable\_get](Thread.downloaded.ruby_doc#method-i-thread_variable_get)
494
- # for more details.
495
- def thread_variable?: (String | Symbol key) -> bool
496
-
497
- # Returns the value of a thread local variable that has been set. Note
498
- # that these are different than fiber local values. For fiber local
499
- # values, please see [\#\[\]](Thread.downloaded.ruby_doc#method-i-5B-5D)
500
- # and [\#\[\]=](Thread.downloaded.ruby_doc#method-i-5B-5D-3D).
501
- #
502
- # [Thread](Thread.downloaded.ruby_doc) local values are carried along with
503
- # threads, and do not respect fibers. For example:
504
- #
505
- # ```ruby
506
- # Thread.new {
507
- # Thread.current.thread_variable_set("foo", "bar") # set a thread local
508
- # Thread.current["foo"] = "bar" # set a fiber local
509
- #
510
- # Fiber.new {
511
- # Fiber.yield [
512
- # Thread.current.thread_variable_get("foo"), # get the thread local
513
- # Thread.current["foo"], # get the fiber local
514
- # ]
515
- # }.resume
516
- # }.join.value # => ['bar', nil]
517
- # ```
518
- #
519
- # The value “bar” is returned for the thread local, where nil is returned
520
- # for the fiber local. The fiber is executed in the same thread, so the
521
- # thread local values are available.
522
- def thread_variable_get: (untyped key) -> untyped
523
-
524
- # Sets a thread local with `key` to `value` . Note that these are local to
525
- # threads, and not to fibers. Please see
526
- # [\#thread\_variable\_get](Thread.downloaded.ruby_doc#method-i-thread_variable_get)
527
- # and [\#\[\]](Thread.downloaded.ruby_doc#method-i-5B-5D) for more
528
- # information.
529
- def thread_variable_set: (untyped key, untyped value) -> untyped
530
-
531
- def thread_variables: () -> ::Array[Symbol]
532
-
533
- # Waits for `thr` to complete, using
534
- # [join](Thread.downloaded.ruby_doc#method-i-join), and returns its value
535
- # or raises the exception which terminated the thread.
536
- #
537
- # ```ruby
538
- # a = Thread.new { 2 + 2 }
539
- # a.value #=> 4
540
- #
541
- # b = Thread.new { raise 'something went wrong' }
542
- # b.value #=> RuntimeError: something went wrong
543
- # ```
544
- def value: () -> Object
545
-
546
- # Marks a given thread as eligible for scheduling, however it may still
547
- # remain blocked on I/O.
548
- #
549
- # **Note:** This does not invoke the scheduler, see
550
- # [run](Thread.downloaded.ruby_doc#method-i-run) for more information.
551
- #
552
- # ```ruby
553
- # c = Thread.new { Thread.stop; puts "hey!" }
554
- # sleep 0.1 while c.status!='sleep'
555
- # c.wakeup
556
- # c.join
557
- # #=> "hey!"
558
- # ```
559
- def wakeup: () -> Thread
560
-
561
- # Returns the status of the global “abort on exception” condition.
562
- #
563
- # The default is `false` .
564
- #
565
- # When set to `true`, if any thread is aborted by an exception, the
566
- # raised exception will be re-raised in the main thread.
567
- #
568
- # Can also be specified by the global $DEBUG flag or command line option
569
- # `-d` .
570
- #
571
- # See also
572
- # [::abort\_on\_exception=](Thread.downloaded.ruby_doc#method-c-abort_on_exception-3D)
573
- # .
574
- #
575
- # There is also an instance level method to set this for a specific
576
- # thread, see
577
- # [abort\_on\_exception](Thread.downloaded.ruby_doc#method-i-abort_on_exception)
578
- # .
579
- def self.abort_on_exception: () -> untyped
580
-
581
- # When set to `true`, if any thread is aborted by an exception, the
582
- # raised exception will be re-raised in the main thread. Returns the new
583
- # state.
584
- #
585
- # ```ruby
586
- # Thread.abort_on_exception = true
587
- # t1 = Thread.new do
588
- # puts "In new thread"
589
- # raise "Exception from thread"
590
- # end
591
- # sleep(1)
592
- # puts "not reached"
593
- # ```
594
- #
595
- # This will produce:
596
- #
597
- # In new thread
598
- # prog.rb:4: Exception from thread (RuntimeError)
599
- # from prog.rb:2:in `initialize'
600
- # from prog.rb:2:in `new'
601
- # from prog.rb:2
602
- #
603
- # See also
604
- # [::abort\_on\_exception](Thread.downloaded.ruby_doc#method-c-abort_on_exception)
605
- # .
606
- #
607
- # There is also an instance level method to set this for a specific
608
- # thread, see
609
- # [abort\_on\_exception=](Thread.downloaded.ruby_doc#method-i-abort_on_exception-3D)
610
- # .
611
- def self.abort_on_exception=: (untyped abort_on_exception) -> untyped
612
-
613
- # Wraps the block in a single, VM-global
614
- # [Mutex\#synchronize](https://ruby-doc.org/core-2.6.3/Mutex.html#method-i-synchronize)
615
- # , returning the value of the block. A thread executing inside the
616
- # exclusive section will only block other threads which also use the
617
- # [::exclusive](Thread.downloaded.ruby_doc#method-c-exclusive) mechanism.
618
- def self.exclusive: () { () -> untyped } -> untyped
619
-
620
- # Terminates the currently running thread and schedules another thread to
621
- # be run.
622
- #
623
- # If this thread is already marked to be killed,
624
- # [::exit](Thread.downloaded.ruby_doc#method-c-exit) returns the
625
- # [Thread](Thread.downloaded.ruby_doc).
626
- #
627
- # If this is the main thread, or the last thread, exit the process.
628
- def self.exit: () -> untyped
629
-
630
- # Basically the same as [::new](Thread.downloaded.ruby_doc#method-c-new).
631
- # However, if class [Thread](Thread.downloaded.ruby_doc) is subclassed,
632
- # then calling `start` in that subclass will not invoke the subclass’s
633
- # `initialize` method.
634
- def self.fork: (*untyped args) -> untyped
635
-
636
- # Changes asynchronous interrupt timing.
637
- #
638
- # *interrupt* means asynchronous event and corresponding procedure by
639
- # [\#raise](Thread.downloaded.ruby_doc#method-i-raise),
640
- # [\#kill](Thread.downloaded.ruby_doc#method-i-kill), signal trap (not
641
- # supported yet) and main thread termination (if main thread terminates,
642
- # then all other thread will be killed).
643
- #
644
- # The given `hash` has pairs like `ExceptionClass => :TimingSymbol` .
645
- # Where the ExceptionClass is the interrupt handled by the given block.
646
- # The TimingSymbol can be one of the following symbols:
647
- #
648
- # - `:immediate`
649
- # Invoke interrupts immediately.
650
- #
651
- # - `:on_blocking`
652
- # Invoke interrupts while *BlockingOperation* .
653
- #
654
- # - `:never`
655
- # Never invoke all interrupts.
656
- #
657
- # *BlockingOperation* means that the operation will block the calling
658
- # thread, such as read and write. On CRuby implementation,
659
- # *BlockingOperation* is any operation executed without GVL.
660
- #
661
- # Masked asynchronous interrupts are delayed until they are enabled. This
662
- # method is similar to sigprocmask(3).
663
- #
664
- #
665
- # Asynchronous interrupts are difficult to use.
666
- #
667
- # If you need to communicate between threads, please consider to use
668
- # another way such as [Queue](https://ruby-doc.org/core-2.6.3/Queue.html)
669
- # .
670
- #
671
- # Or use them with deep understanding about this method.
672
- #
673
- #
674
- # In this example, we can guard from
675
- # [\#raise](Thread.downloaded.ruby_doc#method-i-raise) exceptions.
676
- #
677
- # Using the `:never` TimingSymbol the
678
- # [RuntimeError](https://ruby-doc.org/core-2.6.3/RuntimeError.html)
679
- # exception will always be ignored in the first block of the main thread.
680
- # In the second
681
- # [::handle\_interrupt](Thread.downloaded.ruby_doc#method-c-handle_interrupt)
682
- # block we can purposefully handle
683
- # [RuntimeError](https://ruby-doc.org/core-2.6.3/RuntimeError.html)
684
- # exceptions.
685
- #
686
- # ```ruby
687
- # th = Thread.new do
688
- # Thread.handle_interrupt(RuntimeError => :never) {
689
- # begin
690
- # # You can write resource allocation code safely.
691
- # Thread.handle_interrupt(RuntimeError => :immediate) {
692
- # # ...
693
- # }
694
- # ensure
695
- # # You can write resource deallocation code safely.
696
- # end
697
- # }
698
- # end
699
- # Thread.pass
700
- # # ...
701
- # th.raise "stop"
702
- # ```
703
- #
704
- # While we are ignoring the
705
- # [RuntimeError](https://ruby-doc.org/core-2.6.3/RuntimeError.html)
706
- # exception, it’s safe to write our resource allocation code. Then, the
707
- # ensure block is where we can safely deallocate your resources.
708
- #
709
- #
710
- # In the next example, we will guard from the Timeout::Error exception.
711
- # This will help prevent from leaking resources when Timeout::Error
712
- # exceptions occur during normal ensure clause. For this example we use
713
- # the help of the standard library Timeout, from lib/timeout.rb
714
- #
715
- # ```ruby
716
- # require 'timeout'
717
- # Thread.handle_interrupt(Timeout::Error => :never) {
718
- # timeout(10){
719
- # # Timeout::Error doesn't occur here
720
- # Thread.handle_interrupt(Timeout::Error => :on_blocking) {
721
- # # possible to be killed by Timeout::Error
722
- # # while blocking operation
723
- # }
724
- # # Timeout::Error doesn't occur here
725
- # }
726
- # }
727
- # ```
728
- #
729
- # In the first part of the `timeout` block, we can rely on Timeout::Error
730
- # being ignored. Then in the `Timeout::Error => :on_blocking` block, any
731
- # operation that will block the calling thread is susceptible to a
732
- # Timeout::Error exception being raised.
733
- #
734
- #
735
- # It’s possible to stack multiple levels of
736
- # [::handle\_interrupt](Thread.downloaded.ruby_doc#method-c-handle_interrupt)
737
- # blocks in order to control more than one ExceptionClass and TimingSymbol
738
- # at a time.
739
- #
740
- # ```ruby
741
- # Thread.handle_interrupt(FooError => :never) {
742
- # Thread.handle_interrupt(BarError => :never) {
743
- # # FooError and BarError are prohibited.
744
- # }
745
- # }
746
- # ```
747
- #
748
- #
749
- # All exceptions inherited from the ExceptionClass parameter will be
750
- # considered.
751
- #
752
- # ```ruby
753
- # Thread.handle_interrupt(Exception => :never) {
754
- # # all exceptions inherited from Exception are prohibited.
755
- # }
756
- # ```
757
- def self.handle_interrupt: (untyped hash) -> untyped
758
-
759
- def self.kill: (Thread thread) -> untyped
760
-
761
- def self.list: () -> untyped
762
-
763
- # Give the thread scheduler a hint to pass execution to another thread. A
764
- # running thread may or may not switch, it depends on OS and processor.
765
- def self.pass: () -> untyped
766
-
767
- # Returns whether or not the asynchronous queue is empty.
768
- #
769
- # Since
770
- # [::handle\_interrupt](Thread.downloaded.ruby_doc#method-c-handle_interrupt)
771
- # can be used to defer asynchronous events, this method can be used to
772
- # determine if there are any deferred events.
773
- #
774
- # If you find this method returns true, then you may finish `:never`
775
- # blocks.
776
- #
777
- # For example, the following method processes deferred asynchronous events
778
- # immediately.
779
- #
780
- # ```ruby
781
- # def Thread.kick_interrupt_immediately
782
- # Thread.handle_interrupt(Object => :immediate) {
783
- # Thread.pass
784
- # }
785
- # end
786
- # ```
787
- #
788
- # If `error` is given, then check only for `error` type deferred events.
789
- #
790
- #
791
- # th = Thread.new{
792
- # Thread.handle_interrupt(RuntimeError => :on_blocking){
793
- # while true
794
- # ...
795
- # # reach safe point to invoke interrupt
796
- # if Thread.pending_interrupt?
797
- # Thread.handle_interrupt(Object => :immediate){}
798
- # end
799
- # ...
800
- # end
801
- # }
802
- # }
803
- # ...
804
- # th.raise # stop thread
805
- #
806
- # This example can also be written as the following, which you should use
807
- # to avoid asynchronous interrupts.
808
- #
809
- # flag = true
810
- # th = Thread.new{
811
- # Thread.handle_interrupt(RuntimeError => :on_blocking){
812
- # while true
813
- # ...
814
- # # reach safe point to invoke interrupt
815
- # break if flag == false
816
- # ...
817
- # end
818
- # }
819
- # }
820
- # ...
821
- # flag = false # stop thread
822
- def self.pending_interrupt?: (*untyped args) -> bool
823
-
824
- def self.report_on_exception: () -> untyped
825
-
826
- def self.report_on_exception=: (untyped report_on_exception) -> untyped
827
-
828
- # Basically the same as [::new](Thread.downloaded.ruby_doc#method-c-new).
829
- # However, if class [Thread](Thread.downloaded.ruby_doc) is subclassed,
830
- # then calling `start` in that subclass will not invoke the subclass’s
831
- # `initialize` method.
832
- def self.start: (*untyped args) -> untyped
833
-
834
- # Stops execution of the current thread, putting it into a “sleep” state,
835
- # and schedules execution of another thread.
836
- #
837
- # ```ruby
838
- # a = Thread.new { print "a"; Thread.stop; print "c" }
839
- # sleep 0.1 while a.status!='sleep'
840
- # print "b"
841
- # a.run
842
- # a.join
843
- # #=> "abc"
844
- # ```
845
- def self.`stop`: () -> untyped
846
- end
847
-
848
- class Thread::Backtrace < Object
849
- end
850
-
851
- class Thread::Backtrace::Location
852
- def absolute_path: () -> String?
853
-
854
- def base_label: () -> String?
855
-
856
- def label: () -> String?
857
-
858
- def lineno: () -> Integer
859
-
860
- def path: () -> String?
861
- end
862
-
863
- # [ConditionVariable](ConditionVariable) objects
864
- # augment class [Mutex](https://ruby-doc.org/core-2.6.3/Mutex.html).
865
- # Using condition variables, it is possible to suspend while in the middle
866
- # of a critical section until a resource becomes available.
867
- #
868
- # Example:
869
- #
870
- # ```ruby
871
- # mutex = Mutex.new
872
- # resource = ConditionVariable.new
873
- #
874
- # a = Thread.new {
875
- # mutex.synchronize {
876
- # # Thread 'a' now needs the resource
877
- # resource.wait(mutex)
878
- # # 'a' can now have the resource
879
- # }
880
- # }
881
- #
882
- # b = Thread.new {
883
- # mutex.synchronize {
884
- # # Thread 'b' has finished using the resource
885
- # resource.signal
886
- # }
887
- # }
888
- # ```
889
- class Thread::ConditionVariable < Object
890
- # Wakes up all threads waiting for this lock.
891
- def broadcast: () -> untyped
892
-
893
- def marshal_dump: () -> untyped
894
-
895
- # Wakes up the first thread in line waiting for this lock.
896
- def signal: () -> untyped
897
-
898
- # Releases the lock held in `mutex` and waits; reacquires the lock on
899
- # wakeup.
900
- #
901
- # If `timeout` is given, this method returns after `timeout` seconds
902
- # passed, even if no other thread doesn't signal.
903
- def wait: (*untyped _) -> untyped
904
- end
905
-
906
- # [Mutex](Mutex) implements a simple semaphore that
907
- # can be used to coordinate access to shared data from multiple concurrent
908
- # threads.
909
- #
910
- # Example:
911
- #
912
- # ```ruby
913
- # semaphore = Mutex.new
914
- #
915
- # a = Thread.new {
916
- # semaphore.synchronize {
917
- # # access shared resource
918
- # }
919
- # }
920
- #
921
- # b = Thread.new {
922
- # semaphore.synchronize {
923
- # # access shared resource
924
- # }
925
- # }
926
- # ```
927
- class Thread::Mutex < Object
928
- # Attempts to grab the lock and waits if it isn’t available. Raises
929
- # `ThreadError` if `mutex` was locked by the current thread.
930
- def lock: () -> untyped
931
-
932
- # Returns `true` if this lock is currently held by some thread.
933
- def locked?: () -> bool
934
-
935
- # Returns `true` if this lock is currently held by current thread.
936
- def owned?: () -> bool
937
-
938
- # Obtains a lock, runs the block, and releases the lock when the block
939
- # completes. See the example under `Mutex` .
940
- def synchronize: () -> untyped
941
-
942
- # Attempts to obtain the lock and returns immediately. Returns `true` if
943
- # the lock was granted.
944
- def try_lock: () -> bool
945
-
946
- # Releases the lock. Raises `ThreadError` if `mutex` wasn’t locked by the
947
- # current thread.
948
- def unlock: () -> untyped
949
- end
950
-
951
- # The [Queue](Queue) class implements multi-producer,
952
- # multi-consumer queues. It is especially useful in threaded programming
953
- # when information must be exchanged safely between multiple threads. The
954
- # [Queue](Queue) class implements all the required
955
- # locking semantics.
956
- #
957
- # The class implements FIFO type of queue. In a FIFO queue, the first
958
- # tasks added are the first retrieved.
959
- #
960
- # Example:
961
- #
962
- # ```ruby
963
- # queue = Queue.new
964
- #
965
- # producer = Thread.new do
966
- # 5.times do |i|
967
- # sleep rand(i) # simulate expense
968
- # queue << i
969
- # puts "#{i} produced"
970
- # end
971
- # end
972
- #
973
- # consumer = Thread.new do
974
- # 5.times do |i|
975
- # value = queue.pop
976
- # sleep rand(i/2) # simulate expense
977
- # puts "consumed #{value}"
978
- # end
979
- # end
980
- #
981
- # consumer.join
982
- # ```
983
- class Thread::Queue < Object
984
- # Alias for: [push](Queue.downloaded.ruby_doc#method-i-push)
985
- def <<: (untyped obj) -> untyped
986
-
987
- # Removes all objects from the queue.
988
- def clear: () -> untyped
989
-
990
- # Closes the queue. A closed queue cannot be re-opened.
991
- #
992
- # After the call to close completes, the following are true:
993
- #
994
- # - `closed?` will return true
995
- #
996
- # - `close` will be ignored.
997
- #
998
- # - calling enq/push/\<\< will raise a `ClosedQueueError` .
999
- #
1000
- # - when `empty?` is false, calling deq/pop/shift will return an object
1001
- # from the queue as usual.
1002
- #
1003
- # - when `empty?` is true, deq(false) will not suspend the thread and
1004
- # will return nil. deq(true) will raise a `ThreadError` .
1005
- #
1006
- # [ClosedQueueError](https://ruby-doc.org/core-2.6.3/ClosedQueueError.html)
1007
- # is inherited from
1008
- # [StopIteration](https://ruby-doc.org/core-2.6.3/StopIteration.html), so
1009
- # that you can break loop block.
1010
- #
1011
- # Example:
1012
- #
1013
- # q = Queue.new
1014
- # Thread.new{
1015
- # while e = q.deq # wait for nil to break loop
1016
- # # ...
1017
- # end
1018
- # }
1019
- # q.close
1020
- def close: () -> untyped
1021
-
1022
- # Returns `true` if the queue is closed.
1023
- def closed?: () -> bool
1024
-
1025
- # Alias for: [pop](Queue.downloaded.ruby_doc#method-i-pop)
1026
- def deq: (*untyped args) -> untyped
1027
-
1028
- # Returns `true` if the queue is empty.
1029
- def empty?: () -> bool
1030
-
1031
- # Alias for: [push](Queue.downloaded.ruby_doc#method-i-push)
1032
- def enq: (untyped obj) -> untyped
1033
-
1034
- # Returns the length of the queue.
1035
- #
1036
- #
1037
- #
1038
- # Also aliased as: [size](Queue.downloaded.ruby_doc#method-i-size)
1039
- def length: () -> Integer
1040
-
1041
- def marshal_dump: () -> untyped
1042
-
1043
- # Returns the number of threads waiting on the queue.
1044
- def num_waiting: () -> untyped
1045
-
1046
- # Retrieves data from the queue.
1047
- #
1048
- # If the queue is empty, the calling thread is suspended until data is
1049
- # pushed onto the queue. If `non_block` is true, the thread isn't
1050
- # suspended, and `ThreadError` is raised.
1051
- #
1052
- #
1053
- #
1054
- # Also aliased as: [deq](Queue.downloaded.ruby_doc#method-i-deq),
1055
- # [shift](Queue.downloaded.ruby_doc#method-i-shift)
1056
- def pop: (*untyped args) -> untyped
1057
-
1058
- # Pushes the given `object` to the queue.
1059
- #
1060
- #
1061
- #
1062
- # Also aliased as: [enq](Queue.downloaded.ruby_doc#method-i-enq),
1063
- # [\<\<](Queue.downloaded.ruby_doc#method-i-3C-3C)
1064
- def push: (untyped obj) -> untyped
1065
-
1066
- # Alias for: [pop](Queue.downloaded.ruby_doc#method-i-pop)
1067
- def shift: (*untyped args) -> untyped
1068
-
1069
- # Alias for: [length](Queue.downloaded.ruby_doc#method-i-length)
1070
- def size: () -> Integer
1071
- end
1072
-
1073
- # This class represents queues of specified size capacity. The push
1074
- # operation may be blocked if the capacity is full.
1075
- #
1076
- # See [Queue](https://ruby-doc.org/core-2.6.3/Queue.html) for an example
1077
- # of how a [SizedQueue](SizedQueue) works.
1078
- class Thread::SizedQueue < Thread::Queue
1079
- # Alias for: [push](SizedQueue.downloaded.ruby_doc#method-i-push)
1080
- def <<: (*untyped args) -> untyped
1081
-
1082
- # Alias for: [push](SizedQueue.downloaded.ruby_doc#method-i-push)
1083
- def enq: (*untyped args) -> untyped
1084
-
1085
- def initialize: (untyped max) -> SizedQueue
1086
-
1087
- # Returns the maximum size of the queue.
1088
- def max: () -> Integer
1089
-
1090
- # Sets the maximum size of the queue to the given `number` .
1091
- def max=: (Integer max) -> untyped
1092
-
1093
- # Pushes `object` to the queue.
1094
- #
1095
- # If there is no space left in the queue, waits until space becomes
1096
- # available, unless `non_block` is true. If `non_block` is true, the
1097
- # thread isn't suspended, and `ThreadError` is raised.
1098
- #
1099
- #
1100
- #
1101
- # Also aliased as: [enq](SizedQueue.downloaded.ruby_doc#method-i-enq),
1102
- # [\<\<](SizedQueue.downloaded.ruby_doc#method-i-3C-3C)
1103
- def push: (*untyped args) -> untyped
1104
- end
1105
-
1106
- ConditionVariable: untyped
1107
-
1108
- Mutex: untyped
1109
-
1110
- Queue: untyped
1111
-
1112
- SizedQueue: untyped