rbs 1.0.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/CHANGELOG.md +37 -0
- data/Rakefile +3 -2
- data/Steepfile +2 -0
- data/bin/rbs-prof +1 -1
- data/core/array.rbs +8 -4
- data/core/thread.rbs +14 -1
- data/lib/rbs.rb +3 -0
- data/lib/rbs/ancestor_graph.rb +90 -0
- data/lib/rbs/char_scanner.rb +20 -0
- data/lib/rbs/definition_builder.rb +38 -20
- data/lib/rbs/definition_builder/method_builder.rb +14 -0
- 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/method_builder.rbs +2 -0
- data/sig/parser.rbs +11 -4
- data/sig/polyfill.rbs +0 -14
- data/stdlib/cgi/0/core.rbs +595 -0
- 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/strscan/0/string_scanner.rbs +582 -0
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7a862e1af5773b464ebf201344cf823512ca551df1f827825328863225a26c8
|
4
|
+
data.tar.gz: 2853162048f342a1dad949b518887e82bc4ede46d79d57626fabb49e2edf920d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99fbc15297542d7d0bd952806556b128e071a7f31e0f175b573f77c00db3ec4a6ddd473f33aaf170f2a08f99991939cbcc0484d4287413c9e2b55dfbadc7dff0
|
7
|
+
data.tar.gz: 3553c8cc89269a9579ccd52d3c9f61bd44f4f6117856da23726930c5c5b17f5aa5da7f1d69a9748fffc1b2fe62587149856a2c1ddee0fed79fb155be6aee6037
|
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,43 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 1.1.0 (2021-03-08)
|
6
|
+
|
7
|
+
### Summary
|
8
|
+
|
9
|
+
Errors are now organized by `RBS::BaseError`, `RBS::ParsingError`, `RBS::LoadingError`, and `RBS::DefinitionError`.
|
10
|
+
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`.
|
11
|
+
|
12
|
+
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.
|
13
|
+
See `RBS::Environment#reject`, `RBS::Environment#resolve_type_names`, `RBS::AncestorGraph`, and `RBS::DefinitionBuilder#update`.
|
14
|
+
|
15
|
+
`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.
|
16
|
+
|
17
|
+
### Signature updates
|
18
|
+
|
19
|
+
* rubygem ([\#605](https://github.com/ruby/rbs/pull/605), [\#610](https://github.com/ruby/rbs/pull/610))
|
20
|
+
* Array ([\#612](https://github.com/ruby/rbs/pull/612), [\#614](https://github.com/ruby/rbs/pull/614))
|
21
|
+
* cgi/core ([\#599](https://github.com/ruby/rbs/pull/599))
|
22
|
+
* Thread ([\#618](https://github.com/ruby/rbs/pull/618))
|
23
|
+
|
24
|
+
### Language updates
|
25
|
+
|
26
|
+
* Allow trailing comma for Record and Tuple types ([\#606](https://github.com/ruby/rbs/pull/606))
|
27
|
+
|
28
|
+
### Library changes
|
29
|
+
|
30
|
+
* Allow partial update of RBS declarations ([\#608](https://github.com/ruby/rbs/pull/608), [\#621](https://github.com/ruby/rbs/pull/621))
|
31
|
+
* Let errors have `TypeName` ([\#611](https://github.com/ruby/rbs/pull/611))
|
32
|
+
* Add `Parser::LexerError` ([\#615](https://github.com/ruby/rbs/pull/615))
|
33
|
+
* Performance improvement ([\#617](https://github.com/ruby/rbs/pull/617), [\#620](https://github.com/ruby/rbs/pull/620))
|
34
|
+
* No substitute `instance` types on `#build_singleton` ([\#619](https://github.com/ruby/rbs/pull/619))
|
35
|
+
|
36
|
+
### Miscellaneous
|
37
|
+
|
38
|
+
* Make racc name customizable by `RACC` environment variable ([\#602](https://github.com/ruby/rbs/pull/602))
|
39
|
+
* Suppress warnings ([\#624](https://github.com/ruby/rbs/pull/624))
|
40
|
+
* Remove needless `Gem::Version` polyfill ([\#622](https://github.com/ruby/rbs/pull/622))
|
41
|
+
|
5
42
|
## 1.0.6 (2021-02-17)
|
6
43
|
|
7
44
|
* Signature Updates
|
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
|
|
@@ -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/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/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
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RBS
|
2
|
+
class CharScanner < StringScanner
|
3
|
+
def initialize(string)
|
4
|
+
super(string)
|
5
|
+
@charpos = 0
|
6
|
+
end
|
7
|
+
|
8
|
+
alias original_charpos charpos
|
9
|
+
|
10
|
+
def charpos
|
11
|
+
@charpos
|
12
|
+
end
|
13
|
+
|
14
|
+
def scan(pattern)
|
15
|
+
s = super
|
16
|
+
@charpos += s.size if s
|
17
|
+
s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -10,11 +10,11 @@ module RBS
|
|
10
10
|
attr_reader :singleton0_cache
|
11
11
|
attr_reader :interface_cache
|
12
12
|
|
13
|
-
def initialize(env:)
|
13
|
+
def initialize(env:, ancestor_builder: nil, method_builder: nil)
|
14
14
|
@env = env
|
15
15
|
@type_name_resolver = TypeNameResolver.from_env(env)
|
16
|
-
@ancestor_builder = AncestorBuilder.new(env: env)
|
17
|
-
@method_builder = MethodBuilder.new(env: env)
|
16
|
+
@ancestor_builder = ancestor_builder || AncestorBuilder.new(env: env)
|
17
|
+
@method_builder = method_builder || MethodBuilder.new(env: env)
|
18
18
|
|
19
19
|
@instance_cache = {}
|
20
20
|
@singleton_cache = {}
|
@@ -80,6 +80,7 @@ module RBS
|
|
80
80
|
when AST::Members::Alias
|
81
81
|
unless definition.methods.key?(original.old_name)
|
82
82
|
raise UnknownMethodAliasError.new(
|
83
|
+
type_name: type_name,
|
83
84
|
original_name: original.old_name,
|
84
85
|
aliased_name: original.new_name,
|
85
86
|
location: original.location
|
@@ -360,15 +361,10 @@ module RBS
|
|
360
361
|
when Environment::ClassEntry, Environment::ModuleEntry
|
361
362
|
ancestors = ancestor_builder.singleton_ancestors(type_name)
|
362
363
|
self_type = Types::ClassSingleton.new(name: type_name, location: nil)
|
363
|
-
instance_type = Types::ClassInstance.new(
|
364
|
-
name: type_name,
|
365
|
-
args: entry.type_params.each.map { Types::Bases::Any.new(location: nil) },
|
366
|
-
location: nil
|
367
|
-
)
|
368
364
|
|
369
365
|
Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
|
370
366
|
def0 = build_singleton0(type_name)
|
371
|
-
subst = Substitution.
|
367
|
+
subst = Substitution.new
|
372
368
|
|
373
369
|
merge_definition(src: def0, dest: definition, subst: subst, keep_super: true)
|
374
370
|
|
@@ -561,6 +557,7 @@ module RBS
|
|
561
557
|
|
562
558
|
unless original_method
|
563
559
|
raise UnknownMethodAliasError.new(
|
560
|
+
type_name: definition.type_name,
|
564
561
|
original_name: original.old_name,
|
565
562
|
aliased_name: original.new_name,
|
566
563
|
location: original.location
|
@@ -730,11 +727,13 @@ module RBS
|
|
730
727
|
end
|
731
728
|
|
732
729
|
def merge_method(type_name, methods, name, method, sub, implemented_in: :keep, keep_super: false)
|
733
|
-
|
730
|
+
if sub.empty? && implemented_in == :keep && keep_super
|
731
|
+
methods[name] = method
|
732
|
+
else
|
734
733
|
if sub.empty? && implemented_in == :keep
|
735
|
-
defs
|
734
|
+
defs = method.defs
|
736
735
|
else
|
737
|
-
defs.map do |defn|
|
736
|
+
defs = method.defs.map do |defn|
|
738
737
|
defn.update(
|
739
738
|
type: sub.empty? ? defn.type : defn.type.sub(sub),
|
740
739
|
implemented_in: case implemented_in
|
@@ -748,16 +747,16 @@ module RBS
|
|
748
747
|
)
|
749
748
|
end
|
750
749
|
end
|
751
|
-
end
|
752
750
|
|
753
|
-
|
751
|
+
super_method = methods[name]
|
754
752
|
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
753
|
+
methods[name] = Definition::Method.new(
|
754
|
+
super_method: keep_super ? method.super_method : super_method,
|
755
|
+
accessibility: method.accessibility,
|
756
|
+
defs: defs,
|
757
|
+
alias_of: method.alias_of
|
758
|
+
)
|
759
|
+
end
|
761
760
|
end
|
762
761
|
|
763
762
|
def try_cache(type_name, cache:, key: type_name)
|
@@ -788,5 +787,24 @@ module RBS
|
|
788
787
|
ensure_namespace!(type_name.namespace, location: entry.decl.location)
|
789
788
|
entry.decl.type
|
790
789
|
end
|
790
|
+
|
791
|
+
def update(env:, except:, ancestor_builder:)
|
792
|
+
method_builder = self.method_builder.update(env: env, except: except)
|
793
|
+
|
794
|
+
DefinitionBuilder.new(env: env, ancestor_builder: ancestor_builder, method_builder: method_builder).tap do |builder|
|
795
|
+
builder.instance_cache.merge!(instance_cache)
|
796
|
+
builder.singleton_cache.merge!(singleton_cache)
|
797
|
+
builder.singleton0_cache.merge!(singleton0_cache)
|
798
|
+
builder.interface_cache.merge!(interface_cache)
|
799
|
+
|
800
|
+
except.each do |name|
|
801
|
+
builder.instance_cache.delete([name, true])
|
802
|
+
builder.instance_cache.delete([name, false])
|
803
|
+
builder.singleton_cache.delete(name)
|
804
|
+
builder.singleton0_cache.delete(name)
|
805
|
+
builder.interface_cache.delete(name)
|
806
|
+
end
|
807
|
+
end
|
808
|
+
end
|
791
809
|
end
|
792
810
|
end
|
@@ -219,6 +219,20 @@ module RBS
|
|
219
219
|
end
|
220
220
|
end
|
221
221
|
end
|
222
|
+
|
223
|
+
def update(env:, except:)
|
224
|
+
MethodBuilder.new(env: env).tap do |copy|
|
225
|
+
copy.instance_methods.merge!(instance_methods)
|
226
|
+
copy.singleton_methods.merge!(singleton_methods)
|
227
|
+
copy.interface_methods.merge!(interface_methods)
|
228
|
+
|
229
|
+
except.each do |type_name|
|
230
|
+
copy.instance_methods.delete(type_name)
|
231
|
+
copy.singleton_methods.delete(type_name)
|
232
|
+
copy.interface_methods.delete(type_name)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
222
236
|
end
|
223
237
|
end
|
224
238
|
end
|
data/lib/rbs/environment.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module RBS
|
2
2
|
class Environment
|
3
|
-
attr_reader :buffers
|
4
3
|
attr_reader :declarations
|
5
4
|
|
6
5
|
attr_reader :class_decls
|
@@ -169,7 +168,7 @@ module RBS
|
|
169
168
|
# @type var decl: AST::Declarations::Class
|
170
169
|
existing_entry.insert(decl: decl, outer: outer)
|
171
170
|
else
|
172
|
-
raise DuplicatedDeclarationError.new(name, decl, existing_entry.
|
171
|
+
raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
|
173
172
|
end
|
174
173
|
|
175
174
|
prefix = outer + [decl]
|
@@ -204,12 +203,22 @@ module RBS
|
|
204
203
|
self
|
205
204
|
end
|
206
205
|
|
207
|
-
def
|
206
|
+
def validate_type_params
|
207
|
+
class_decls.each_value do |decl|
|
208
|
+
decl.primary
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def resolve_type_names(only: nil)
|
208
213
|
resolver = TypeNameResolver.from_env(self)
|
209
214
|
env = Environment.new()
|
210
215
|
|
211
216
|
declarations.each do |decl|
|
212
|
-
|
217
|
+
if only && !only.member?(decl)
|
218
|
+
env << decl
|
219
|
+
else
|
220
|
+
env << resolve_declaration(resolver, decl, outer: [], prefix: Namespace.root)
|
221
|
+
end
|
213
222
|
end
|
214
223
|
|
215
224
|
env
|
@@ -431,8 +440,36 @@ module RBS
|
|
431
440
|
end
|
432
441
|
|
433
442
|
def inspect
|
434
|
-
ivars = %i[@
|
443
|
+
ivars = %i[@declarations @class_decls @interface_decls @alias_decls @constant_decls @global_decls]
|
435
444
|
"\#<RBS::Environment #{ivars.map { |iv| "#{iv}=(#{instance_variable_get(iv).size} items)"}.join(' ')}>"
|
436
445
|
end
|
446
|
+
|
447
|
+
def buffers
|
448
|
+
buffers_decls.keys.compact
|
449
|
+
end
|
450
|
+
|
451
|
+
def buffers_decls
|
452
|
+
# @type var hash: Hash[Buffer, Array[AST::Declarations::t]]
|
453
|
+
hash = {}
|
454
|
+
|
455
|
+
declarations.each do |decl|
|
456
|
+
location = decl.location or next
|
457
|
+
(hash[location.buffer] ||= []) << decl
|
458
|
+
end
|
459
|
+
|
460
|
+
hash
|
461
|
+
end
|
462
|
+
|
463
|
+
def reject
|
464
|
+
env = Environment.new
|
465
|
+
|
466
|
+
declarations.each do |decl|
|
467
|
+
unless yield(decl)
|
468
|
+
env << decl
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
472
|
+
env
|
473
|
+
end
|
437
474
|
end
|
438
475
|
end
|