rbs 2.2.2 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +4 -0
  3. data/.github/workflows/comments.yml +2 -2
  4. data/.github/workflows/ruby.yml +1 -1
  5. data/.gitignore +0 -1
  6. data/CHANGELOG.md +43 -0
  7. data/Gemfile +2 -1
  8. data/Gemfile.lock +117 -0
  9. data/Rakefile +1 -1
  10. data/core/dir.rbs +1 -1
  11. data/core/enumerator.rbs +1 -1
  12. data/core/false_class.rbs +1 -1
  13. data/core/integer.rbs +4 -4
  14. data/core/io/wait.rbs +1 -1
  15. data/core/module.rbs +21 -2
  16. data/core/nil_class.rbs +7 -5
  17. data/core/object.rbs +9 -0
  18. data/core/trace_point.rbs +42 -3
  19. data/core/true_class.rbs +1 -1
  20. data/ext/rbs_extension/constants.c +1 -1
  21. data/ext/rbs_extension/extconf.rb +1 -1
  22. data/ext/rbs_extension/location.c +1 -1
  23. data/ext/rbs_extension/parser.c +4 -3
  24. data/ext/rbs_extension/parserstate.c +2 -2
  25. data/ext/rbs_extension/unescape.c +1 -1
  26. data/lib/rbs/ast/members.rb +2 -1
  27. data/lib/rbs/collection/installer.rb +4 -1
  28. data/lib/rbs/definition_builder/ancestor_builder.rb +4 -2
  29. data/lib/rbs/definition_builder/method_builder.rb +1 -1
  30. data/lib/rbs/definition_builder.rb +2 -2
  31. data/lib/rbs/environment.rb +24 -12
  32. data/lib/rbs/locator.rb +24 -15
  33. data/lib/rbs/prototype/rb.rb +17 -6
  34. data/lib/rbs/resolver/constant_resolver.rb +192 -0
  35. data/lib/rbs/resolver/type_name_resolver.rb +55 -0
  36. data/lib/rbs/type_name.rb +15 -0
  37. data/lib/rbs/version.rb +1 -1
  38. data/lib/rbs.rb +2 -0
  39. data/schema/members.json +4 -1
  40. data/sig/environment.rbs +28 -21
  41. data/sig/environment_loader.rbs +23 -23
  42. data/sig/locator.rbs +2 -0
  43. data/sig/manifest.yaml +8 -0
  44. data/sig/resolver/constant_resolver.rbs +93 -0
  45. data/sig/resolver/context.rbs +34 -0
  46. data/sig/resolver/type_name_resolver.rbs +31 -0
  47. data/sig/typename.rbs +9 -3
  48. data/stdlib/bigdecimal/0/big_decimal.rbs +135 -0
  49. data/stdlib/erb/0/erb.rbs +237 -0
  50. data/stdlib/optparse/0/optparse.rbs +20 -18
  51. data/stdlib/prime/0/prime.rbs +115 -4
  52. data/stdlib/rubygems/0/version.rbs +159 -1
  53. data/steep/Gemfile.lock +13 -15
  54. metadata +10 -3
@@ -140,7 +140,7 @@ module RBS
140
140
  case entry
141
141
  when Environment::ClassEntry, Environment::ModuleEntry
142
142
  ancestors = ancestor_builder.instance_ancestors(type_name)
143
- args = Types::Variable.build(entry.type_params.each.map(&:name))
143
+ args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
144
144
  self_type = Types::ClassInstance.new(name: type_name, args: args, location: nil)
145
145
 
146
146
  Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
@@ -425,7 +425,7 @@ module RBS
425
425
  type: method_type.type.with_return_type(
426
426
  Types::ClassInstance.new(
427
427
  name: type_name,
428
- args: Types::Variable.build(entry.type_params.each.map(&:name)),
428
+ args: entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) },
429
429
  location: nil
430
430
  )
431
431
  )
@@ -9,19 +9,23 @@ module RBS
9
9
  attr_reader :global_decls
10
10
 
11
11
  module ContextUtil
12
- def context
13
- @context ||= begin
14
- (outer + [decl]).each.with_object([Namespace.root]) do |decl, array|
15
- first = array.first or raise
16
- array.unshift(first + decl.name.to_namespace)
17
- end
18
- end
12
+ def calculate_context(decls)
13
+ decls.each.with_object([Namespace.root]) do |decl, array|
14
+ first = array.first or raise
15
+ array.unshift(first + decl.name.to_namespace)
16
+ end
19
17
  end
20
18
  end
21
19
 
22
20
  class MultiEntry
23
21
  D = _ = Struct.new(:decl, :outer, keyword_init: true) do
22
+ # @implements D[M]
23
+
24
24
  include ContextUtil
25
+
26
+ def context
27
+ @context ||= calculate_context(outer + [decl])
28
+ end
25
29
  end
26
30
 
27
31
  attr_reader :name
@@ -39,8 +43,6 @@ module RBS
39
43
 
40
44
  def validate_type_params
41
45
  unless decls.empty?
42
- # @type var hd_decl: MultiEntry::D[module_decl]
43
- # @type var tl_decls: Array[MultiEntry::D[module_decl]]
44
46
  hd_decl, *tl_decls = decls
45
47
  raise unless hd_decl
46
48
 
@@ -50,7 +52,7 @@ module RBS
50
52
  tl_params = tl_decl.decl.type_params
51
53
 
52
54
  unless compatible_params?(hd_params, tl_params)
53
- raise GenericParameterMismatchError.new(name: name, decl: tl_decl.decl)
55
+ raise GenericParameterMismatchError.new(name: name, decl: _ = tl_decl.decl)
54
56
  end
55
57
  end
56
58
  end
@@ -86,6 +88,12 @@ module RBS
86
88
  end
87
89
  end
88
90
 
91
+ def foo
92
+ a = [1].sample()
93
+ return unless a
94
+ a + 1
95
+ end
96
+
89
97
  class ClassEntry < MultiEntry
90
98
  def primary
91
99
  @primary ||= begin
@@ -96,8 +104,6 @@ module RBS
96
104
  end
97
105
 
98
106
  class SingleEntry
99
- include ContextUtil
100
-
101
107
  attr_reader :name
102
108
  attr_reader :outer
103
109
  attr_reader :decl
@@ -107,6 +113,12 @@ module RBS
107
113
  @decl = decl
108
114
  @outer = outer
109
115
  end
116
+
117
+ include ContextUtil
118
+
119
+ def context
120
+ @context = calculate_context(outer)
121
+ end
110
122
  end
111
123
 
112
124
  def initialize
data/lib/rbs/locator.rb CHANGED
@@ -41,11 +41,7 @@ module RBS
41
41
  case decl
42
42
  when AST::Declarations::Class
43
43
  decl.type_params.each do |param|
44
- if test_loc(pos, location: param.location)
45
- array.unshift(param)
46
- find_in_loc(pos, array: array, location: param.location)
47
- return true
48
- end
44
+ find_in_type_param(pos, type_param: param, array: array) and return true
49
45
  end
50
46
 
51
47
  if super_class = decl.super_class
@@ -66,11 +62,7 @@ module RBS
66
62
 
67
63
  when AST::Declarations::Module
68
64
  decl.type_params.each do |param|
69
- if test_loc(pos, location: param.location)
70
- array.unshift(param)
71
- find_in_loc(pos, array: array, location: param.location)
72
- return true
73
- end
65
+ find_in_type_param(pos, type_param: param, array: array) and return true
74
66
  end
75
67
 
76
68
  decl.self_types.each do |self_type|
@@ -91,11 +83,7 @@ module RBS
91
83
 
92
84
  when AST::Declarations::Interface
93
85
  decl.type_params.each do |param|
94
- if test_loc(pos, location: param.location)
95
- array.unshift(param)
96
- find_in_loc(pos, array: array, location: param.location)
97
- return true
98
- end
86
+ find_in_type_param(pos, type_param: param, array: array) and return true
99
87
  end
100
88
 
101
89
  decl.members.each do |member|
@@ -144,6 +132,10 @@ module RBS
144
132
  if test_loc(pos, location: method_type.location)
145
133
  array.unshift(method_type)
146
134
 
135
+ method_type.type_params.each do |param|
136
+ find_in_type_param(pos, type_param: param, array: array) and return true
137
+ end
138
+
147
139
  method_type.each_type do |type|
148
140
  find_in_type(pos, array: array, type: type) and break
149
141
  end
@@ -154,6 +146,23 @@ module RBS
154
146
  end
155
147
  end
156
148
 
149
+ def find_in_type_param(pos, type_param:, array:)
150
+ if test_loc(pos, location: type_param.location)
151
+ array.unshift(type_param)
152
+
153
+ if upper_bound = type_param.upper_bound
154
+ find_in_type(pos, type: upper_bound, array: array) or
155
+ find_in_loc(pos, location: type_param.location, array: array)
156
+ else
157
+ find_in_loc(pos, location: type_param.location, array: array)
158
+ end
159
+
160
+ true
161
+ else
162
+ false
163
+ end
164
+ end
165
+
157
166
  def find_in_type(pos, type:, array:)
158
167
  if test_loc(pos, location: type.location)
159
168
  array.unshift(type)
@@ -338,7 +338,7 @@ module RBS
338
338
  # Give up type prediction when node is MASGN.
339
339
  Types::Bases::Any.new(location: nil)
340
340
  else
341
- node_type(value_node)
341
+ literal_to_type(value_node)
342
342
  end
343
343
  decls << AST::Declarations::Constant.new(
344
344
  name: const_name,
@@ -408,7 +408,7 @@ module RBS
408
408
  name = lvasgn.children[0]
409
409
  fun.optional_positionals << Types::Function::Param.new(
410
410
  name: name,
411
- type: node_type(lvasgn.children[1])
411
+ type: param_type(lvasgn.children[1])
412
412
  )
413
413
  end
414
414
 
@@ -429,7 +429,7 @@ module RBS
429
429
  when nil, :NODE_SPECIAL_REQUIRED_KEYWORD
430
430
  fun.required_keywords[name] = Types::Function::Param.new(name: name, type: untyped)
431
431
  when RubyVM::AbstractSyntaxTree::Node
432
- fun.optional_keywords[name] = Types::Function::Param.new(name: name, type: node_type(value))
432
+ fun.optional_keywords[name] = Types::Function::Param.new(name: name, type: param_type(value))
433
433
  else
434
434
  raise "Unexpected keyword arg value: #{value}"
435
435
  end
@@ -477,9 +477,9 @@ module RBS
477
477
  when :DREGX
478
478
  BuiltinNames::Regexp.instance_type
479
479
  when :TRUE
480
- BuiltinNames::TrueClass.instance_type
480
+ Types::Literal.new(literal: true, location: nil)
481
481
  when :FALSE
482
- BuiltinNames::FalseClass.instance_type
482
+ Types::Literal.new(literal: false, location: nil)
483
483
  when :NIL
484
484
  Types::Bases::Nil.new(location: nil)
485
485
  when :LIT
@@ -536,6 +536,14 @@ module RBS
536
536
  value_type = types_to_union_type(value_types)
537
537
  BuiltinNames::Hash.instance_type([key_type, value_type])
538
538
  end
539
+ when :CALL
540
+ receiver, method_name, * = node.children
541
+ case method_name
542
+ when :freeze, :tap, :itself, :dup, :clone, :taint, :untaint, :extend
543
+ literal_to_type(receiver)
544
+ else
545
+ default
546
+ end
539
547
  else
540
548
  untyped
541
549
  end
@@ -570,7 +578,7 @@ module RBS
570
578
  end
571
579
  end
572
580
 
573
- def node_type(node, default: Types::Bases::Any.new(location: nil))
581
+ def param_type(node, default: Types::Bases::Any.new(location: nil))
574
582
  case node.type
575
583
  when :LIT
576
584
  case node.children[0]
@@ -602,6 +610,9 @@ module RBS
602
610
  end
603
611
  end
604
612
 
613
+ # backward compatible
614
+ alias node_type param_type
615
+
605
616
  def private
606
617
  @private ||= AST::Members::Private.new(location: nil)
607
618
  end
@@ -0,0 +1,192 @@
1
+ module RBS
2
+ module Resolver
3
+ class ConstantResolver
4
+ class Table
5
+ attr_reader :children_table, :toplevel
6
+ attr_reader :constants_table
7
+
8
+ def initialize(environment)
9
+ @children_table = {}
10
+ @toplevel = {}
11
+
12
+ @constants_table = {}
13
+
14
+ environment.class_decls.each_key do |name|
15
+ children_table[name] = {}
16
+ end
17
+
18
+ environment.class_decls.each do |name, entry|
19
+ unless name.namespace.empty?
20
+ parent = name.namespace.to_type_name
21
+
22
+ table = children_table[parent] or raise
23
+ constant = constant_of_module(name, entry)
24
+ else
25
+ table = toplevel
26
+ constant = constant_of_module(name, entry)
27
+ end
28
+
29
+ table[name.name] = constant
30
+ constants_table[name] = constant
31
+ end
32
+
33
+ environment.constant_decls.each do |name, entry|
34
+ unless name.namespace.empty?
35
+ parent = name.namespace.to_type_name
36
+
37
+ table = children_table[parent] or raise
38
+ constant = constant_of_constant(name, entry)
39
+ else
40
+ table = toplevel
41
+ constant = constant_of_constant(name, entry)
42
+ end
43
+
44
+ table[name.name] = constant
45
+ end
46
+ end
47
+
48
+ def children(name)
49
+ children_table[name]
50
+ end
51
+
52
+ def constant(name)
53
+ constants_table[name]
54
+ end
55
+
56
+ def constant_of_module(name, entry)
57
+ type = Types::ClassSingleton.new(
58
+ name: name,
59
+ location: nil
60
+ )
61
+
62
+ Constant.new(name: name, type: type, entry: entry)
63
+ end
64
+
65
+ def constant_of_constant(name, entry)
66
+ Constant.new(name: name, type: entry.decl.type, entry: entry)
67
+ end
68
+ end
69
+
70
+ attr_reader :builder, :table
71
+ attr_reader :context_constants_cache, :child_constants_cache
72
+
73
+ def initialize(builder:)
74
+ @builder = builder
75
+ @table = Table.new(builder.env)
76
+ @context_constants_cache = {}
77
+ @child_constants_cache = {}
78
+ end
79
+
80
+ def resolve(name, context:)
81
+ cs = constants(context) or raise "Broken context is given"
82
+ cs[name]
83
+ end
84
+
85
+ def constants(context)
86
+ unless context_constants_cache.key?(context)
87
+ load_context_constants(context)
88
+ end
89
+
90
+ context_constants_cache[context]
91
+ end
92
+
93
+ def resolve_child(module_name, name)
94
+ children(module_name)[name]
95
+ end
96
+
97
+ def children(module_name)
98
+ unless child_constants_cache.key?(module_name)
99
+ load_child_constants(module_name)
100
+ end
101
+
102
+ child_constants_cache[module_name] or raise
103
+ end
104
+
105
+ def load_context_constants(context)
106
+ # @type var consts: Hash[Symbol, Constant]
107
+ consts = {}
108
+
109
+ if context
110
+ if last = context[1]
111
+ constants_from_ancestors(last, constants: consts)
112
+ end
113
+ end
114
+ constants_from_context(context, constants: consts) or return
115
+ constants_itself(context, constants: consts)
116
+
117
+ context_constants_cache[context] = consts
118
+ end
119
+
120
+ def load_child_constants(name)
121
+ # @type var constants: Hash[Symbol, Constant]
122
+ constants = {}
123
+
124
+ if table.children(name)
125
+ builder.ancestor_builder.instance_ancestors(name).ancestors.each do |ancestor|
126
+ if ancestor.is_a?(Definition::Ancestor::Instance)
127
+ if ancestor.name == BuiltinNames::Object.name
128
+ if name != BuiltinNames::Object.name
129
+ next
130
+ end
131
+ end
132
+
133
+ case ancestor.source
134
+ when AST::Members::Include, :super, nil
135
+ consts = table.children(ancestor.name) or raise
136
+ constants.merge!(consts)
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ child_constants_cache[name] = constants
143
+ end
144
+
145
+ def constants_from_context(context, constants:)
146
+ if context
147
+ parent, last = context
148
+
149
+ constants_from_context(parent, constants: constants) or return false
150
+
151
+ if last
152
+ consts = table.children(last) or return false
153
+ constants.merge!(consts)
154
+ end
155
+ else
156
+ constants.merge!(table.toplevel)
157
+ end
158
+
159
+ true
160
+ end
161
+
162
+ def constants_from_ancestors(module_name, constants:)
163
+ builder.ancestor_builder.instance_ancestors(module_name).ancestors.each do |ancestor|
164
+ if ancestor.is_a?(Definition::Ancestor::Instance)
165
+ case ancestor.source
166
+ when AST::Members::Include, :super, nil
167
+ consts = table.children(ancestor.name) or raise
168
+ constants.merge!(consts)
169
+ end
170
+ end
171
+ end
172
+ end
173
+
174
+ def constants_itself(context, constants:)
175
+ if context
176
+ _, typename = context
177
+
178
+ if typename
179
+ if (ns = typename.namespace).empty?
180
+ constant = table.toplevel[typename.name] or raise
181
+ else
182
+ hash = table.children(ns.to_type_name) or raise
183
+ constant = hash[typename.name]
184
+ end
185
+
186
+ constants[typename.name] = constant
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,55 @@
1
+ module RBS
2
+ module Resolver
3
+ class TypeNameResolver
4
+ attr_reader :all_names
5
+ attr_reader :cache
6
+
7
+ def initialize(env)
8
+ @all_names = Set[]
9
+ @cache = {}
10
+
11
+ all_names.merge(env.class_decls.keys)
12
+ all_names.merge(env.interface_decls.keys)
13
+ all_names.merge(env.alias_decls.keys)
14
+ end
15
+
16
+ def try_cache(query)
17
+ cache.fetch(query) do
18
+ result = yield
19
+ cache[query] = result
20
+ end
21
+ end
22
+
23
+ def resolve(type_name, context:)
24
+ if type_name.absolute?
25
+ return type_name
26
+ end
27
+
28
+ try_cache([type_name, context]) do
29
+ resolve_in(type_name, context)
30
+ end
31
+ end
32
+
33
+ def resolve_in(type_name, context)
34
+ if context
35
+ parent, child = context
36
+ case child
37
+ when false
38
+ resolve_in(type_name, parent)
39
+ when TypeName
40
+ name = type_name.with_prefix(child.to_namespace)
41
+ has_name?(name) || resolve_in(type_name, parent)
42
+ end
43
+ else
44
+ has_name?(type_name.absolute!)
45
+ end
46
+ end
47
+
48
+ def has_name?(full_name)
49
+ if all_names.include?(full_name)
50
+ full_name
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
data/lib/rbs/type_name.rb CHANGED
@@ -69,6 +69,21 @@ module RBS
69
69
  def with_prefix(namespace)
70
70
  self.class.new(namespace: namespace + self.namespace, name: name)
71
71
  end
72
+
73
+ def split
74
+ namespace.path + [name]
75
+ end
76
+
77
+ def +(other)
78
+ if other.absolute?
79
+ other
80
+ else
81
+ TypeName.new(
82
+ namespace: self.to_namespace + other.namespace,
83
+ name: other.name
84
+ )
85
+ end
86
+ end
72
87
  end
73
88
  end
74
89
 
data/lib/rbs/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RBS
2
- VERSION = "2.2.2"
2
+ VERSION = "2.3.0"
3
3
  end
data/lib/rbs.rb CHANGED
@@ -28,6 +28,8 @@ require "rbs/definition_builder/method_builder"
28
28
  require "rbs/variance_calculator"
29
29
  require "rbs/substitution"
30
30
  require "rbs/constant"
31
+ require "rbs/resolver/constant_resolver"
32
+ require "rbs/resolver/type_name_resolver"
31
33
  require "rbs/constant_table"
32
34
  require "rbs/ast/comment"
33
35
  require "rbs/writer"
data/schema/members.json CHANGED
@@ -37,9 +37,12 @@
37
37
  },
38
38
  "overload": {
39
39
  "type": "boolean"
40
+ },
41
+ "visibility": {
42
+ "enum": ["public", "private", null]
40
43
  }
41
44
  },
42
- "required": ["member", "kind", "types", "comment", "annotations", "location"]
45
+ "required": ["member", "kind", "types", "comment", "annotations", "location", "visibility"]
43
46
  },
44
47
  "variable": {
45
48
  "title": "Declaration for instance variables and class variables",
data/sig/environment.rbs CHANGED
@@ -2,32 +2,40 @@ module RBS
2
2
  class Environment
3
3
  type module_decl = AST::Declarations::Class | AST::Declarations::Module
4
4
 
5
- interface _WithContext
6
- def outer: () -> Array[module_decl]
5
+ interface _ModuleOrClass
6
+ def name: () -> TypeName
7
7
 
8
- def decl: () -> untyped
8
+ def type_params: () -> Array[AST::TypeParam]
9
9
  end
10
10
 
11
- module ContextUtil : _WithContext
12
- def context: () -> Array[Namespace]
11
+ interface _NamedDecl
12
+ def name: () -> TypeName
13
+ end
14
+
15
+ module ContextUtil
16
+ def calculate_context: (Array[_NamedDecl]) -> Array[Namespace]
13
17
  end
14
18
 
15
- class MultiEntry
16
- class D[M]
19
+ class MultiEntry[M < _ModuleOrClass]
20
+ class D[M < _ModuleOrClass]
17
21
  attr_reader decl: M
18
22
  attr_reader outer: Array[module_decl]
19
23
 
20
- def initialize: (decl: module_decl, outer: Array[module_decl]) -> void
24
+ def initialize: (decl: M, outer: Array[module_decl]) -> void
21
25
 
22
26
  include ContextUtil
27
+
28
+ @context: Array[Namespace]
29
+
30
+ def context: () -> Array[Namespace]
23
31
  end
24
32
 
25
33
  attr_reader name: TypeName
26
- attr_reader decls: Array[untyped]
34
+ attr_reader decls: Array[D[M]]
27
35
 
28
36
  def initialize: (name: TypeName) -> void
29
37
 
30
- def insert: (decl: module_decl, outer: Array[module_decl]) -> void
38
+ def insert: (decl: M, outer: Array[module_decl]) -> void
31
39
 
32
40
  def validate_type_params: () -> void
33
41
 
@@ -35,29 +43,28 @@ module RBS
35
43
 
36
44
  def type_params: () -> Array[AST::TypeParam]
37
45
 
38
- def primary: () -> D[module_decl]
46
+ def primary: () -> D[M]
39
47
  end
40
48
 
41
- class ModuleEntry < MultiEntry
42
- attr_reader decls: Array[MultiEntry::D[AST::Declarations::Module]]
43
- attr_reader primary: MultiEntry::D[AST::Declarations::Module]
44
-
49
+ class ModuleEntry < MultiEntry[AST::Declarations::Module]
45
50
  def self_types: () -> Array[AST::Declarations::Module::Self]
46
51
  end
47
52
 
48
- class ClassEntry < MultiEntry
49
- attr_reader decls: Array[MultiEntry::D[AST::Declarations::Class]]
50
- attr_reader primary: MultiEntry::D[AST::Declarations::Class]
53
+ class ClassEntry < MultiEntry[AST::Declarations::Class]
51
54
  end
52
55
 
53
56
  class SingleEntry[N, D]
54
- include ContextUtil
55
-
56
57
  attr_reader name: N
57
58
  attr_reader decl: D
58
59
  attr_reader outer: Array[module_decl]
59
60
 
60
61
  def initialize: (name: N, decl: D, outer: Array[module_decl]) -> void
62
+
63
+ include ContextUtil
64
+
65
+ @context: Array[Namespace]
66
+
67
+ def context: () -> Array[Namespace]
61
68
  end
62
69
 
63
70
  # Top level declarations.
@@ -75,7 +82,7 @@ module RBS
75
82
 
76
83
  def self.from_loader: (EnvironmentLoader) -> Environment
77
84
 
78
- def cache_name: [Key, D] (Hash[Key, SingleEntry[Key, D]] cache, name: Key, decl: D, outer: Array[module_decl]) -> SingleEntry[Key, D]
85
+ def cache_name: [N, D] (Hash[N, SingleEntry[N, D]] cache, name: N, decl: D, outer: Array[module_decl]) -> SingleEntry[N, D]
79
86
 
80
87
  def insert_decl: (AST::Declarations::t, outer: Array[module_decl], namespace: Namespace) -> void
81
88