rbs 1.0.3 → 1.1.1
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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/CHANGELOG.md +65 -0
- data/Gemfile +0 -1
- data/Rakefile +3 -2
- data/Steepfile +2 -0
- data/bin/rbs-prof +1 -1
- data/core/array.rbs +10 -6
- data/core/complex.rbs +1 -1
- data/core/enumerable.rbs +15 -1
- data/core/enumerator.rbs +4 -0
- data/core/file.rbs +2 -1
- data/core/integer.rbs +2 -1
- data/core/module.rbs +1 -1
- data/core/rational.rbs +2 -1
- data/core/string.rbs +2 -1
- data/core/symbol.rbs +2 -1
- data/core/thread.rbs +14 -1
- data/core/time.rbs +2 -1
- data/docs/stdlib.md +1 -1
- data/lib/rbs.rb +3 -0
- data/lib/rbs/ancestor_graph.rb +90 -0
- data/lib/rbs/ast/members.rb +13 -0
- data/lib/rbs/char_scanner.rb +20 -0
- data/lib/rbs/definition_builder.rb +50 -25
- data/lib/rbs/definition_builder/method_builder.rb +23 -2
- data/lib/rbs/environment.rb +42 -5
- data/lib/rbs/environment_walker.rb +4 -4
- data/lib/rbs/errors.rb +32 -17
- data/lib/rbs/parser.rb +437 -416
- data/lib/rbs/parser.y +29 -16
- data/lib/rbs/test/type_check.rb +7 -3
- data/lib/rbs/version.rb +1 -1
- data/sig/ancestor_graph.rbs +40 -0
- data/sig/char_scanner.rbs +9 -0
- data/sig/definition_builder.rbs +5 -1
- data/sig/environment.rbs +22 -2
- data/sig/environment_walker.rbs +39 -0
- data/sig/errors.rbs +42 -17
- data/sig/members.rbs +2 -0
- data/sig/method_builder.rbs +2 -0
- data/sig/parser.rbs +11 -4
- data/sig/polyfill.rbs +0 -14
- data/sig/types.rbs +7 -1
- data/stdlib/bigdecimal/0/big_decimal.rbs +1 -1
- data/stdlib/cgi/0/core.rbs +595 -0
- data/stdlib/date/0/date.rbs +1 -1
- data/stdlib/json/0/json.rbs +288 -0
- data/stdlib/pathname/0/pathname.rbs +2 -1
- data/stdlib/rubygems/0/basic_specification.rbs +3 -0
- data/stdlib/rubygems/0/config_file.rbs +3 -0
- data/stdlib/rubygems/0/dependency_installer.rbs +5 -0
- data/stdlib/rubygems/0/installer.rbs +3 -0
- data/stdlib/rubygems/0/path_support.rbs +3 -0
- data/stdlib/rubygems/0/platform.rbs +3 -0
- data/stdlib/rubygems/0/request_set.rbs +7 -0
- data/stdlib/rubygems/0/requirement.rbs +3 -0
- data/stdlib/rubygems/0/rubygems.rbs +710 -0
- data/stdlib/rubygems/0/source_list.rbs +2 -0
- data/stdlib/rubygems/0/specification.rbs +3 -0
- data/stdlib/rubygems/0/stream_ui.rbs +3 -0
- data/stdlib/rubygems/0/uninstaller.rbs +3 -0
- data/stdlib/rubygems/0/version.rbs +228 -0
- data/stdlib/set/0/set.rbs +7 -0
- data/stdlib/strscan/0/string_scanner.rbs +582 -0
- data/stdlib/timeout/0/timeout.rbs +57 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +144 -7
- data/steep/Gemfile.lock +17 -19
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d83588e6a5f96ce5953f7c94eaf6f745eddadd1446e91946f18d4b81efb70bc
|
4
|
+
data.tar.gz: 3d7c3148afbe2a6041de6c909ddf08d7991e17c6fa2cebd4393a920582539263
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8a99b1a837a8cf4c7f1ce6b148c25e66433db2800d356a51ad58cc9b41280b097d3db7a3138679bc34f3c536415473a1b5423fac44f1048359d8556c938c298
|
7
|
+
data.tar.gz: 145caea219b5fb1d209e37f03ae0d4999f788895cf6a6dc4150d9ee4864be46ee7dc1126b95d0ddb0b1f1a4576c46f502c415aef56143900be61b726f81a291f
|
data/.github/workflows/ruby.yml
CHANGED
@@ -27,10 +27,10 @@ jobs:
|
|
27
27
|
run: |
|
28
28
|
apt-get update
|
29
29
|
apt-get install -y libdb-dev
|
30
|
-
- name:
|
30
|
+
- name: Update rubygems & bundler
|
31
31
|
run: |
|
32
32
|
ruby -v
|
33
|
-
gem
|
33
|
+
gem update --system
|
34
34
|
- name: bundle config set with
|
35
35
|
run: |
|
36
36
|
echo "NO_MINITEST=true" >> $GITHUB_ENV
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,71 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 1.1.1 (2021-03-12)
|
6
|
+
|
7
|
+
### Signature updates
|
8
|
+
|
9
|
+
* rubygem ([#630](https://github.com/ruby/rbs/pull/630))
|
10
|
+
|
11
|
+
## 1.1.0 (2021-03-08)
|
12
|
+
|
13
|
+
### Summary
|
14
|
+
|
15
|
+
Errors are now organized by `RBS::BaseError`, `RBS::ParsingError`, `RBS::LoadingError`, and `RBS::DefinitionError`.
|
16
|
+
The library users can rescue RBS related errors with `RBS::BaseError`, parsing errors with `RBS::ParsingError`, and other errors with `RBS::LoadingError` and `RBS::DefinitionErrors`.
|
17
|
+
|
18
|
+
Updating a part of environments are supported. Library users can remove declarations read from a set of files, adding new declarations, running name resolution related to the new decls, and deleting `DefinitionBuilder` caches related to the changes.
|
19
|
+
See `RBS::Environment#reject`, `RBS::Environment#resolve_type_names`, `RBS::AncestorGraph`, and `RBS::DefinitionBuilder#update`.
|
20
|
+
|
21
|
+
`RBS::DefinitionBuilder#build_singleton` now returns definitions containing `instance` type, which had returned resolved class instance types. This is a breaking change, but we consider it a bug fix because `RBS::DefinitionBuilder#build_instance` has returned `instance` types and `#build_singleton` has returned `class` type.
|
22
|
+
|
23
|
+
### Signature updates
|
24
|
+
|
25
|
+
* rubygem ([\#605](https://github.com/ruby/rbs/pull/605), [\#610](https://github.com/ruby/rbs/pull/610))
|
26
|
+
* Array ([\#612](https://github.com/ruby/rbs/pull/612), [\#614](https://github.com/ruby/rbs/pull/614))
|
27
|
+
* cgi/core ([\#599](https://github.com/ruby/rbs/pull/599))
|
28
|
+
* Thread ([\#618](https://github.com/ruby/rbs/pull/618))
|
29
|
+
|
30
|
+
### Language updates
|
31
|
+
|
32
|
+
* Allow trailing comma for Record and Tuple types ([\#606](https://github.com/ruby/rbs/pull/606))
|
33
|
+
|
34
|
+
### Library changes
|
35
|
+
|
36
|
+
* Allow partial update of RBS declarations ([\#608](https://github.com/ruby/rbs/pull/608), [\#621](https://github.com/ruby/rbs/pull/621))
|
37
|
+
* Let errors have `TypeName` ([\#611](https://github.com/ruby/rbs/pull/611))
|
38
|
+
* Add `Parser::LexerError` ([\#615](https://github.com/ruby/rbs/pull/615))
|
39
|
+
* Performance improvement ([\#617](https://github.com/ruby/rbs/pull/617), [\#620](https://github.com/ruby/rbs/pull/620))
|
40
|
+
* No substitute `instance` types on `#build_singleton` ([\#619](https://github.com/ruby/rbs/pull/619))
|
41
|
+
|
42
|
+
### Miscellaneous
|
43
|
+
|
44
|
+
* Make racc name customizable by `RACC` environment variable ([\#602](https://github.com/ruby/rbs/pull/602))
|
45
|
+
* Suppress warnings ([\#624](https://github.com/ruby/rbs/pull/624))
|
46
|
+
* Remove needless `Gem::Version` polyfill ([\#622](https://github.com/ruby/rbs/pull/622))
|
47
|
+
|
48
|
+
## 1.0.6 (2021-02-17)
|
49
|
+
|
50
|
+
* Signature Updates
|
51
|
+
* `Enumerable` ([\#595](https://github.com/ruby/rbs/pull/595), [\#596](https://github.com/ruby/rbs/pull/596), [\#601](https://github.com/ruby/rbs/pull/601))
|
52
|
+
* `#as_json` ([\#597](https://github.com/ruby/rbs/pull/597))
|
53
|
+
|
54
|
+
## 1.0.5 (2021-02-13)
|
55
|
+
|
56
|
+
* Signature Updates
|
57
|
+
* Enumerable ([\#596](https://github.com/ruby/rbs/pull/596))
|
58
|
+
* Set ([\#595](https://github.com/ruby/rbs/pull/595))
|
59
|
+
* `#to_json` ([\#592](https://github.com/ruby/rbs/pull/592))
|
60
|
+
* `<=>` ([\#593](https://github.com/ruby/rbs/pull/593))
|
61
|
+
* Timeout ([\#586](https://github.com/ruby/rbs/pull/586))
|
62
|
+
* URI::RFC2396_Parser ([\#587](https://github.com/ruby/rbs/pull/587))
|
63
|
+
* Rename generic class parameters on re-open ([\#594](https://github.com/ruby/rbs/pull/594))
|
64
|
+
* Make `refute_send_type` check that method call doesn't match with types in RBS ([\#588](https://github.com/ruby/rbs/pull/588))
|
65
|
+
|
66
|
+
## 1.0.4 (2021-01-31)
|
67
|
+
|
68
|
+
* Unbundle `rr` to run test in `ruby/ruby` repo ([#585](https://github.com/ruby/rbs/pull/585))
|
69
|
+
|
5
70
|
## 1.0.3 (2021-01-28)
|
6
71
|
|
7
72
|
* Set up `#ancestors` and `#location` of `RecursiveAncestorError` ([#583](https://github.com/ruby/rbs/pull/583))
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -3,6 +3,7 @@ require "rake/testtask"
|
|
3
3
|
require "rbconfig"
|
4
4
|
|
5
5
|
ruby = ENV["RUBY"] || RbConfig.ruby
|
6
|
+
racc = ENV.fetch("RACC", "racc")
|
6
7
|
rbs = File.join(__dir__, "exe/rbs")
|
7
8
|
bin = File.join(__dir__, "bin")
|
8
9
|
|
@@ -67,7 +68,7 @@ task :rubocop do
|
|
67
68
|
end
|
68
69
|
|
69
70
|
rule ".rb" => ".y" do |t|
|
70
|
-
sh "racc -v -o #{t.name} #{t.source}"
|
71
|
+
sh "#{racc} -v -o #{t.name} #{t.source}"
|
71
72
|
end
|
72
73
|
|
73
74
|
task :parser => "lib/rbs/parser.rb"
|
@@ -77,7 +78,7 @@ task :build => :parser
|
|
77
78
|
|
78
79
|
task :confirm_parser do
|
79
80
|
puts "Testing if parser.rb is updated with respect to parser.y"
|
80
|
-
sh "racc -v -o lib/rbs/parser.rb lib/rbs/parser.y"
|
81
|
+
sh "#{racc} -v -o lib/rbs/parser.rb lib/rbs/parser.y"
|
81
82
|
sh "git diff --exit-code lib/rbs/parser.rb"
|
82
83
|
end
|
83
84
|
|
data/Steepfile
CHANGED
data/bin/rbs-prof
CHANGED
data/core/array.rbs
CHANGED
@@ -1584,8 +1584,8 @@ class Array[unchecked out Elem] < Object
|
|
1584
1584
|
# a.sample(random: Random.new(1)) #=> 6
|
1585
1585
|
# a.sample(4, random: Random.new(1)) #=> [6, 10, 9, 2]
|
1586
1586
|
#
|
1587
|
-
def sample: (?random:
|
1588
|
-
| (?int n, ?random:
|
1587
|
+
def sample: (?random: _Rand rng) -> Elem?
|
1588
|
+
| (?int n, ?random: _Rand rng) -> ::Array[Elem]
|
1589
1589
|
|
1590
1590
|
# Returns a new array containing all elements of `ary` for which the given
|
1591
1591
|
# `block` returns a true value.
|
@@ -1649,7 +1649,7 @@ class Array[unchecked out Elem] < Object
|
|
1649
1649
|
#
|
1650
1650
|
# a.shuffle(random: Random.new(1)) #=> [1, 3, 2]
|
1651
1651
|
#
|
1652
|
-
def shuffle: (?random:
|
1652
|
+
def shuffle: (?random: _Rand rng) -> ::Array[Elem]
|
1653
1653
|
|
1654
1654
|
# Shuffles elements in `self` in place.
|
1655
1655
|
#
|
@@ -1661,7 +1661,7 @@ class Array[unchecked out Elem] < Object
|
|
1661
1661
|
#
|
1662
1662
|
# a.shuffle!(random: Random.new(1)) #=> [1, 3, 2]
|
1663
1663
|
#
|
1664
|
-
def shuffle!: (?random:
|
1664
|
+
def shuffle!: (?random: _Rand rng) -> self
|
1665
1665
|
|
1666
1666
|
alias size length
|
1667
1667
|
|
@@ -1736,7 +1736,7 @@ class Array[unchecked out Elem] < Object
|
|
1736
1736
|
# See also Enumerable#sort_by.
|
1737
1737
|
#
|
1738
1738
|
def sort: () -> ::Array[Elem]
|
1739
|
-
| () { (Elem a, Elem b) -> ::Integer
|
1739
|
+
| () { (Elem a, Elem b) -> ::Integer } -> ::Array[Elem]
|
1740
1740
|
|
1741
1741
|
# Sorts `self` in place.
|
1742
1742
|
#
|
@@ -1757,7 +1757,7 @@ class Array[unchecked out Elem] < Object
|
|
1757
1757
|
# See also Enumerable#sort_by.
|
1758
1758
|
#
|
1759
1759
|
def sort!: () -> self
|
1760
|
-
| () { (Elem a, Elem b) -> ::Integer
|
1760
|
+
| () { (Elem a, Elem b) -> ::Integer } -> self
|
1761
1761
|
|
1762
1762
|
# Sorts `self` in place using a set of keys generated by mapping the values in
|
1763
1763
|
# `self` through the given block.
|
@@ -1997,6 +1997,10 @@ interface _ToAry[T]
|
|
1997
1997
|
def to_ary: () -> ::Array[T]
|
1998
1998
|
end
|
1999
1999
|
|
2000
|
+
interface _Rand
|
2001
|
+
def rand: (::Integer max) -> ::Integer
|
2002
|
+
end
|
2003
|
+
|
2000
2004
|
interface Array::_Pattern[T]
|
2001
2005
|
def ===: (T) -> bool
|
2002
2006
|
end
|
data/core/complex.rbs
CHANGED
data/core/enumerable.rbs
CHANGED
@@ -286,8 +286,22 @@ module Enumerable[unchecked out Elem]: _Each[Elem]
|
|
286
286
|
def sort_by: () { (Elem arg0) -> (Comparable | ::Array[untyped]) } -> ::Array[Elem]
|
287
287
|
| () -> ::Enumerator[Elem, ::Array[Elem]]
|
288
288
|
|
289
|
-
|
289
|
+
# Returns first n elements from *enum*.
|
290
|
+
#
|
291
|
+
# a = [1, 2, 3, 4, 5, 0]
|
292
|
+
# a.take(3) #=> [1, 2, 3]
|
293
|
+
# a.take(30) #=> [1, 2, 3, 4, 5, 0]
|
294
|
+
#
|
295
|
+
def take: (Integer n) -> ::Array[Elem]
|
290
296
|
|
297
|
+
# Passes elements to the block until the block returns `nil` or `false`, then
|
298
|
+
# stops iterating and returns an array of all prior elements.
|
299
|
+
#
|
300
|
+
# If no block is given, an enumerator is returned instead.
|
301
|
+
#
|
302
|
+
# a = [1, 2, 3, 4, 5, 0]
|
303
|
+
# a.take_while { |i| i < 3 } #=> [1, 2]
|
304
|
+
#
|
291
305
|
def take_while: () { (Elem) -> boolish } -> ::Array[Elem]
|
292
306
|
| () -> ::Enumerator[Elem, ::Array[Elem]]
|
293
307
|
|
data/core/enumerator.rbs
CHANGED
@@ -244,6 +244,8 @@ end
|
|
244
244
|
|
245
245
|
class Enumerator::Generator[out Elem] < Object
|
246
246
|
include Enumerable[Elem]
|
247
|
+
|
248
|
+
def each: () { (Elem) -> void } -> void
|
247
249
|
end
|
248
250
|
|
249
251
|
class Enumerator::Lazy[out Elem, out Return] < Enumerator[Elem, Return]
|
@@ -259,4 +261,6 @@ end
|
|
259
261
|
|
260
262
|
class Enumerator::Chain[out Elem] < Object
|
261
263
|
include Enumerable[Elem]
|
264
|
+
|
265
|
+
def each: () { (Elem) -> void } -> void
|
262
266
|
end
|
data/core/file.rbs
CHANGED
data/core/integer.rbs
CHANGED
@@ -112,7 +112,8 @@ class Integer < Numeric
|
|
112
112
|
#
|
113
113
|
# `nil` is returned if the two values are incomparable.
|
114
114
|
#
|
115
|
-
def <=>: (
|
115
|
+
def <=>: (Integer | Rational) -> Integer
|
116
|
+
| (untyped) -> Integer?
|
116
117
|
|
117
118
|
# Returns `true` if `int` equals `other` numerically. Contrast this with
|
118
119
|
# Integer#eql?, which requires `other` to be an Integer.
|
data/core/module.rbs
CHANGED
@@ -90,7 +90,7 @@ class Module < Object
|
|
90
90
|
# Returns `nil` if `module` has no relationship with `other_module`, if
|
91
91
|
# `other_module` is not a module, or if the two values are incomparable.
|
92
92
|
#
|
93
|
-
def <=>: (
|
93
|
+
def <=>: (untyped other) -> Integer?
|
94
94
|
|
95
95
|
# Equality --- At the Object level, #== returns `true` only if `obj` and `other`
|
96
96
|
# are the same object. Typically, this method is overridden in descendant
|
data/core/rational.rbs
CHANGED
@@ -125,7 +125,8 @@ class Rational < Numeric
|
|
125
125
|
#
|
126
126
|
# Rational(1, 3) <=> "0.3" #=> nil
|
127
127
|
#
|
128
|
-
def <=>: (
|
128
|
+
def <=>: (Integer | Rational) -> Integer
|
129
|
+
| (untyped) -> Integer?
|
129
130
|
|
130
131
|
# Returns `true` if `rat` equals `object` numerically.
|
131
132
|
#
|
data/core/string.rbs
CHANGED
@@ -91,7 +91,8 @@ class String
|
|
91
91
|
# "abcdef" <=> "ABCDEF" #=> 1
|
92
92
|
# "abcdef" <=> 1 #=> nil
|
93
93
|
#
|
94
|
-
def <=>: (
|
94
|
+
def <=>: (string other) -> Integer
|
95
|
+
| (untyped other) -> Integer?
|
95
96
|
|
96
97
|
# Equality---Returns whether `str` == `obj`, similar to Object#==.
|
97
98
|
#
|
data/core/symbol.rbs
CHANGED
@@ -47,7 +47,8 @@ class Symbol
|
|
47
47
|
#
|
48
48
|
# See String#<=> for more information.
|
49
49
|
#
|
50
|
-
def <=>: (
|
50
|
+
def <=>: (Symbol other) -> Integer
|
51
|
+
| (untyped other) -> Integer?
|
51
52
|
|
52
53
|
# Equality---If *sym* and *obj* are exactly the same symbol, returns `true`.
|
53
54
|
#
|
data/core/thread.rbs
CHANGED
@@ -287,7 +287,20 @@ class Thread < Object
|
|
287
287
|
|
288
288
|
def group: () -> ThreadGroup?
|
289
289
|
|
290
|
-
|
290
|
+
# Creates a new thread executing the given block.
|
291
|
+
#
|
292
|
+
# Any `args` given to ::new will be passed to the block:
|
293
|
+
#
|
294
|
+
# arr = []
|
295
|
+
# a, b, c = 1, 2, 3
|
296
|
+
# Thread.new(a,b,c) { |d,e,f| arr << d << e << f }.join
|
297
|
+
# arr #=> [1, 2, 3]
|
298
|
+
#
|
299
|
+
# A ThreadError exception is raised if ::new is called without a block.
|
300
|
+
#
|
301
|
+
# If you're going to subclass Thread, be sure to call super in your `initialize`
|
302
|
+
# method, otherwise a ThreadError will be raised.
|
303
|
+
def initialize: (*untyped) { (*untyped) -> void } -> void
|
291
304
|
|
292
305
|
# The calling thread will suspend execution and run this `thr` .
|
293
306
|
#
|
data/core/time.rbs
CHANGED
data/docs/stdlib.md
CHANGED
@@ -70,7 +70,7 @@ One non-trivial but absolutely better solution is to make a tool:
|
|
70
70
|
The next step should be importing RDoc documents.
|
71
71
|
|
72
72
|
```
|
73
|
-
$ bin/annotate-with-rdoc stdlib/pathname/pathname.rbs
|
73
|
+
$ bin/annotate-with-rdoc stdlib/pathname/0/pathname.rbs
|
74
74
|
Loading store from /Users/soutaro/.rbenv/versions/2.7.0-dev/share/ri/2.7.0/system...
|
75
75
|
Loading store from /Users/soutaro/.rbenv/versions/2.7.0-dev/share/ri/2.7.0/site...
|
76
76
|
Opening stdlib/pathname/pathname.rbs...
|
data/lib/rbs.rb
CHANGED
@@ -7,7 +7,9 @@ require "pp"
|
|
7
7
|
require "ripper"
|
8
8
|
require "logger"
|
9
9
|
require "tsort"
|
10
|
+
require "strscan"
|
10
11
|
|
12
|
+
require "rbs/char_scanner"
|
11
13
|
require "rbs/errors"
|
12
14
|
require "rbs/buffer"
|
13
15
|
require "rbs/location"
|
@@ -40,6 +42,7 @@ require "rbs/vendorer"
|
|
40
42
|
require "rbs/validator"
|
41
43
|
require "rbs/factory"
|
42
44
|
require "rbs/repository"
|
45
|
+
require "rbs/ancestor_graph"
|
43
46
|
|
44
47
|
begin
|
45
48
|
require "rbs/parser"
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module RBS
|
2
|
+
class AncestorGraph
|
3
|
+
InstanceNode = _ = Struct.new(:type_name, keyword_init: true)
|
4
|
+
SingletonNode = _ = Struct.new(:type_name, keyword_init: true)
|
5
|
+
|
6
|
+
attr_reader :env
|
7
|
+
attr_reader :ancestor_builder
|
8
|
+
attr_reader :parents
|
9
|
+
attr_reader :children
|
10
|
+
|
11
|
+
def initialize(env:, ancestor_builder: DefinitionBuilder::AncestorBuilder.new(env: env))
|
12
|
+
@env = env
|
13
|
+
@ancestor_builder = ancestor_builder
|
14
|
+
build()
|
15
|
+
end
|
16
|
+
|
17
|
+
def build()
|
18
|
+
@parents = {}
|
19
|
+
@children = {}
|
20
|
+
|
21
|
+
env.class_decls.each_key do |type_name|
|
22
|
+
build_ancestors(InstanceNode.new(type_name: type_name), ancestor_builder.one_instance_ancestors(type_name))
|
23
|
+
build_ancestors(SingletonNode.new(type_name: type_name), ancestor_builder.one_singleton_ancestors(type_name))
|
24
|
+
end
|
25
|
+
env.interface_decls.each_key do |type_name|
|
26
|
+
build_ancestors(InstanceNode.new(type_name: type_name), ancestor_builder.one_interface_ancestors(type_name))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def build_ancestors(node, ancestors)
|
31
|
+
ancestors.each_ancestor do |ancestor|
|
32
|
+
case ancestor
|
33
|
+
when Definition::Ancestor::Instance
|
34
|
+
register(child: node, parent: InstanceNode.new(type_name: ancestor.name))
|
35
|
+
when Definition::Ancestor::Singleton
|
36
|
+
register(child: node, parent: SingletonNode.new(type_name: ancestor.name))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def register(parent:, child:)
|
42
|
+
(parents[child] ||= Set[]) << parent
|
43
|
+
(children[parent] ||= Set[]) << child
|
44
|
+
end
|
45
|
+
|
46
|
+
def each_parent(node, &block)
|
47
|
+
if block
|
48
|
+
parents[node]&.each(&block)
|
49
|
+
else
|
50
|
+
enum_for :each_parent, node
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def each_child(node, &block)
|
55
|
+
if block
|
56
|
+
children[node]&.each(&block)
|
57
|
+
else
|
58
|
+
enum_for :each_child, node
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def each_ancestor(node, yielded: Set[], &block)
|
63
|
+
if block
|
64
|
+
each_parent(node) do |parent|
|
65
|
+
unless yielded.member?(parent)
|
66
|
+
yielded << parent
|
67
|
+
yield parent
|
68
|
+
each_ancestor(parent, yielded: yielded, &block)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
else
|
72
|
+
enum_for :each_ancestor, node
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def each_descendant(node, yielded: Set[], &block)
|
77
|
+
if block
|
78
|
+
each_child(node) do |child|
|
79
|
+
unless yielded.member?(child)
|
80
|
+
yielded << child
|
81
|
+
yield child
|
82
|
+
each_descendant(child, yielded: yielded, &block)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
else
|
86
|
+
enum_for :each_descendant, node
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|