rbs 2.2.2 → 2.3.0

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 (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