steep 0.16.0 → 0.16.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/CHANGELOG.md +6 -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/project/file.rb +1 -1
  9. data/lib/steep/project/hover_content.rb +1 -1
  10. data/lib/steep/server/code_worker.rb +1 -1
  11. data/lib/steep/server/signature_worker.rb +4 -4
  12. data/lib/steep/type_construction.rb +10 -16
  13. data/lib/steep/type_inference/constant_env.rb +2 -10
  14. data/lib/steep/type_inference/context.rb +1 -0
  15. data/lib/steep/version.rb +1 -1
  16. data/steep.gemspec +1 -5
  17. metadata +17 -135
  18. data/exe/rbs +0 -3
  19. data/vendor/ruby-signature/.github/workflows/ruby.yml +0 -27
  20. data/vendor/ruby-signature/.gitignore +0 -12
  21. data/vendor/ruby-signature/.rubocop.yml +0 -15
  22. data/vendor/ruby-signature/BSDL +0 -22
  23. data/vendor/ruby-signature/COPYING +0 -56
  24. data/vendor/ruby-signature/Gemfile +0 -6
  25. data/vendor/ruby-signature/README.md +0 -93
  26. data/vendor/ruby-signature/Rakefile +0 -142
  27. data/vendor/ruby-signature/bin/annotate-with-rdoc +0 -157
  28. data/vendor/ruby-signature/bin/console +0 -14
  29. data/vendor/ruby-signature/bin/query-rdoc +0 -103
  30. data/vendor/ruby-signature/bin/setup +0 -10
  31. data/vendor/ruby-signature/bin/sort +0 -89
  32. data/vendor/ruby-signature/bin/test_runner.rb +0 -16
  33. data/vendor/ruby-signature/docs/CONTRIBUTING.md +0 -97
  34. data/vendor/ruby-signature/docs/sigs.md +0 -148
  35. data/vendor/ruby-signature/docs/stdlib.md +0 -152
  36. data/vendor/ruby-signature/docs/syntax.md +0 -528
  37. data/vendor/ruby-signature/exe/rbs +0 -7
  38. data/vendor/ruby-signature/lib/rbs.rb +0 -64
  39. data/vendor/ruby-signature/lib/rbs/ast/annotation.rb +0 -27
  40. data/vendor/ruby-signature/lib/rbs/ast/comment.rb +0 -27
  41. data/vendor/ruby-signature/lib/rbs/ast/declarations.rb +0 -395
  42. data/vendor/ruby-signature/lib/rbs/ast/members.rb +0 -362
  43. data/vendor/ruby-signature/lib/rbs/buffer.rb +0 -50
  44. data/vendor/ruby-signature/lib/rbs/builtin_names.rb +0 -55
  45. data/vendor/ruby-signature/lib/rbs/cli.rb +0 -558
  46. data/vendor/ruby-signature/lib/rbs/constant.rb +0 -26
  47. data/vendor/ruby-signature/lib/rbs/constant_table.rb +0 -150
  48. data/vendor/ruby-signature/lib/rbs/definition.rb +0 -170
  49. data/vendor/ruby-signature/lib/rbs/definition_builder.rb +0 -919
  50. data/vendor/ruby-signature/lib/rbs/environment.rb +0 -281
  51. data/vendor/ruby-signature/lib/rbs/environment_loader.rb +0 -136
  52. data/vendor/ruby-signature/lib/rbs/environment_walker.rb +0 -124
  53. data/vendor/ruby-signature/lib/rbs/errors.rb +0 -187
  54. data/vendor/ruby-signature/lib/rbs/location.rb +0 -102
  55. data/vendor/ruby-signature/lib/rbs/method_type.rb +0 -123
  56. data/vendor/ruby-signature/lib/rbs/namespace.rb +0 -91
  57. data/vendor/ruby-signature/lib/rbs/parser.y +0 -1344
  58. data/vendor/ruby-signature/lib/rbs/prototype/rb.rb +0 -553
  59. data/vendor/ruby-signature/lib/rbs/prototype/rbi.rb +0 -587
  60. data/vendor/ruby-signature/lib/rbs/prototype/runtime.rb +0 -381
  61. data/vendor/ruby-signature/lib/rbs/substitution.rb +0 -46
  62. data/vendor/ruby-signature/lib/rbs/test.rb +0 -26
  63. data/vendor/ruby-signature/lib/rbs/test/errors.rb +0 -61
  64. data/vendor/ruby-signature/lib/rbs/test/hook.rb +0 -294
  65. data/vendor/ruby-signature/lib/rbs/test/setup.rb +0 -58
  66. data/vendor/ruby-signature/lib/rbs/test/spy.rb +0 -325
  67. data/vendor/ruby-signature/lib/rbs/test/test_helper.rb +0 -183
  68. data/vendor/ruby-signature/lib/rbs/test/type_check.rb +0 -254
  69. data/vendor/ruby-signature/lib/rbs/type_name.rb +0 -70
  70. data/vendor/ruby-signature/lib/rbs/types.rb +0 -936
  71. data/vendor/ruby-signature/lib/rbs/variance_calculator.rb +0 -138
  72. data/vendor/ruby-signature/lib/rbs/vendorer.rb +0 -47
  73. data/vendor/ruby-signature/lib/rbs/version.rb +0 -3
  74. data/vendor/ruby-signature/lib/rbs/writer.rb +0 -269
  75. data/vendor/ruby-signature/lib/ruby/signature.rb +0 -7
  76. data/vendor/ruby-signature/rbs.gemspec +0 -46
  77. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +0 -60
  78. data/vendor/ruby-signature/stdlib/base64/base64.rbs +0 -71
  79. data/vendor/ruby-signature/stdlib/benchmark/benchmark.rbs +0 -372
  80. data/vendor/ruby-signature/stdlib/builtin/array.rbs +0 -1997
  81. data/vendor/ruby-signature/stdlib/builtin/basic_object.rbs +0 -280
  82. data/vendor/ruby-signature/stdlib/builtin/binding.rbs +0 -177
  83. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +0 -45
  84. data/vendor/ruby-signature/stdlib/builtin/class.rbs +0 -145
  85. data/vendor/ruby-signature/stdlib/builtin/comparable.rbs +0 -116
  86. data/vendor/ruby-signature/stdlib/builtin/complex.rbs +0 -400
  87. data/vendor/ruby-signature/stdlib/builtin/constants.rbs +0 -37
  88. data/vendor/ruby-signature/stdlib/builtin/data.rbs +0 -5
  89. data/vendor/ruby-signature/stdlib/builtin/deprecated.rbs +0 -2
  90. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +0 -413
  91. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +0 -607
  92. data/vendor/ruby-signature/stdlib/builtin/enumerable.rbs +0 -404
  93. data/vendor/ruby-signature/stdlib/builtin/enumerator.rbs +0 -260
  94. data/vendor/ruby-signature/stdlib/builtin/errno.rbs +0 -781
  95. data/vendor/ruby-signature/stdlib/builtin/errors.rbs +0 -582
  96. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +0 -194
  97. data/vendor/ruby-signature/stdlib/builtin/false_class.rbs +0 -40
  98. data/vendor/ruby-signature/stdlib/builtin/fiber.rbs +0 -68
  99. data/vendor/ruby-signature/stdlib/builtin/fiber_error.rbs +0 -12
  100. data/vendor/ruby-signature/stdlib/builtin/file.rbs +0 -1076
  101. data/vendor/ruby-signature/stdlib/builtin/file_test.rbs +0 -59
  102. data/vendor/ruby-signature/stdlib/builtin/float.rbs +0 -696
  103. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +0 -243
  104. data/vendor/ruby-signature/stdlib/builtin/hash.rbs +0 -1029
  105. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +0 -707
  106. data/vendor/ruby-signature/stdlib/builtin/io.rbs +0 -683
  107. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +0 -576
  108. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +0 -161
  109. data/vendor/ruby-signature/stdlib/builtin/match_data.rbs +0 -271
  110. data/vendor/ruby-signature/stdlib/builtin/math.rbs +0 -369
  111. data/vendor/ruby-signature/stdlib/builtin/method.rbs +0 -185
  112. data/vendor/ruby-signature/stdlib/builtin/module.rbs +0 -1104
  113. data/vendor/ruby-signature/stdlib/builtin/nil_class.rbs +0 -82
  114. data/vendor/ruby-signature/stdlib/builtin/numeric.rbs +0 -409
  115. data/vendor/ruby-signature/stdlib/builtin/object.rbs +0 -824
  116. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +0 -429
  117. data/vendor/ruby-signature/stdlib/builtin/process.rbs +0 -1227
  118. data/vendor/ruby-signature/stdlib/builtin/random.rbs +0 -267
  119. data/vendor/ruby-signature/stdlib/builtin/range.rbs +0 -226
  120. data/vendor/ruby-signature/stdlib/builtin/rational.rbs +0 -424
  121. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +0 -57
  122. data/vendor/ruby-signature/stdlib/builtin/regexp.rbs +0 -1083
  123. data/vendor/ruby-signature/stdlib/builtin/ruby_vm.rbs +0 -14
  124. data/vendor/ruby-signature/stdlib/builtin/signal.rbs +0 -55
  125. data/vendor/ruby-signature/stdlib/builtin/string.rbs +0 -1901
  126. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +0 -284
  127. data/vendor/ruby-signature/stdlib/builtin/struct.rbs +0 -40
  128. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +0 -228
  129. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +0 -1108
  130. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +0 -23
  131. data/vendor/ruby-signature/stdlib/builtin/time.rbs +0 -1047
  132. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +0 -290
  133. data/vendor/ruby-signature/stdlib/builtin/true_class.rbs +0 -46
  134. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +0 -153
  135. data/vendor/ruby-signature/stdlib/builtin/warning.rbs +0 -17
  136. data/vendor/ruby-signature/stdlib/coverage/coverage.rbs +0 -62
  137. data/vendor/ruby-signature/stdlib/csv/csv.rbs +0 -773
  138. data/vendor/ruby-signature/stdlib/erb/erb.rbs +0 -392
  139. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -40
  140. data/vendor/ruby-signature/stdlib/ipaddr/ipaddr.rbs +0 -247
  141. data/vendor/ruby-signature/stdlib/json/json.rbs +0 -335
  142. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +0 -1093
  143. data/vendor/ruby-signature/stdlib/prime/integer-extension.rbs +0 -23
  144. data/vendor/ruby-signature/stdlib/prime/prime.rbs +0 -188
  145. data/vendor/ruby-signature/stdlib/securerandom/securerandom.rbs +0 -9
  146. data/vendor/ruby-signature/stdlib/set/set.rbs +0 -301
  147. data/vendor/ruby-signature/stdlib/tmpdir/tmpdir.rbs +0 -53
@@ -1,26 +0,0 @@
1
- module RBS
2
- class Constant
3
- attr_reader :name
4
- attr_reader :type
5
- attr_reader :declaration
6
-
7
- def initialize(name:, type:, declaration:)
8
- @name = name
9
- @type = type
10
- @declaration = declaration
11
- end
12
-
13
- def ==(other)
14
- other.is_a?(Constant) &&
15
- other.name == name &&
16
- other.type == type &&
17
- other.declaration == declaration
18
- end
19
-
20
- alias eql? ==
21
-
22
- def hash
23
- self.class.hash ^ name.hash ^ type.hash ^ declaration.hash
24
- end
25
- end
26
- end
@@ -1,150 +0,0 @@
1
- module RBS
2
- class ConstantTable
3
- attr_reader :definition_builder
4
- attr_reader :constant_scopes_cache
5
-
6
- def env
7
- definition_builder.env
8
- end
9
-
10
- def initialize(builder:)
11
- @definition_builder = builder
12
- @constant_scopes_cache = {}
13
- end
14
-
15
- def name_to_constant(name)
16
- case
17
- when env.name_to_constant.key?(name)
18
- decl = env.name_to_constant[name]
19
- type = env.absolute_type(decl.type, namespace: name.namespace) {|type| type.name.absolute! }
20
- Constant.new(name: name, type: type, declaration: decl)
21
- when env.class?(name)
22
- decl = env.name_to_decl[name]
23
- type = Types::ClassSingleton.new(name: name, location: nil)
24
- Constant.new(name: name, type: type, declaration: decl)
25
- end
26
- end
27
-
28
- def split_name(name)
29
- name.namespace.path + [name.name]
30
- end
31
-
32
- def resolve_constant_reference(name, context:)
33
- head, *tail = split_name(name)
34
-
35
- head_constant = case
36
- when name.absolute?
37
- name_to_constant(TypeName.new(name: head, namespace: Namespace.root))
38
- when !context || context.empty?
39
- name_to_constant(TypeName.new(name: head, namespace: Namespace.root))
40
- else
41
- resolve_constant_reference_context(head, context: context) ||
42
- resolve_constant_reference_inherit(head,
43
- scopes: constant_scopes(context.to_type_name))
44
- end
45
-
46
- if head_constant
47
- tail.inject(head_constant) do |constant, name|
48
- resolve_constant_reference_inherit name,
49
- scopes: constant_scopes(constant.name),
50
- no_object: constant.name != BuiltinNames::Object.name
51
- end
52
- end
53
- end
54
-
55
- def resolve_constant_reference_context(name, context:)
56
- if context.empty?
57
- nil
58
- else
59
- name_to_constant(TypeName.new(name: name, namespace: context)) ||
60
- resolve_constant_reference_context(name, context: context.parent)
61
- end
62
- end
63
-
64
- def resolve_constant_reference_inherit(name, scopes:, no_object: false)
65
- scopes.each do |context|
66
- if context.path == [:Object]
67
- unless no_object
68
- constant = name_to_constant(TypeName.new(name: name, namespace: context)) ||
69
- name_to_constant(TypeName.new(name: name, namespace: Namespace.root))
70
- end
71
- else
72
- constant = name_to_constant(TypeName.new(name: name, namespace: context))
73
- end
74
-
75
- return constant if constant
76
- end
77
-
78
- nil
79
- end
80
-
81
- def constant_scopes(name)
82
- constant_scopes_cache[name] ||= constant_scopes0(name, scopes: [])
83
- end
84
-
85
- def constant_scopes_module(name, scopes:)
86
- decl = env.find_class(name)
87
- namespace = name.to_namespace
88
-
89
- decl.members.each do |member|
90
- case member
91
- when AST::Members::Include
92
- constant_scopes_module absolute_type_name(member.name, namespace: namespace),
93
- scopes: scopes
94
- end
95
- end
96
-
97
- scopes.unshift namespace
98
- end
99
-
100
- def constant_scopes0(name, scopes: [])
101
- decl = env.find_class(name)
102
- namespace = name.to_namespace
103
-
104
- case decl
105
- when AST::Declarations::Module
106
- constant_scopes0 BuiltinNames::Module.name, scopes: scopes
107
- constant_scopes_module name, scopes: scopes
108
-
109
- when AST::Declarations::Class
110
- unless name == BuiltinNames::BasicObject.name
111
- super_name = decl.super_class&.yield_self {|super_class|
112
- absolute_type_name(super_class.name, namespace: namespace)
113
- } || BuiltinNames::Object.name
114
-
115
- constant_scopes0 super_name, scopes: scopes
116
- end
117
-
118
- decl.members.each do |member|
119
- case member
120
- when AST::Members::Include
121
- constant_scopes_module absolute_type_name(member.name, namespace: namespace),
122
- scopes: scopes
123
- end
124
- end
125
-
126
- scopes.unshift namespace
127
- else
128
- raise "Unexpected declaration: #{name}"
129
- end
130
-
131
- env.each_extension(name).sort_by {|e| e.extension_name.to_s }.each do |extension|
132
- extension.members.each do |member|
133
- case member
134
- when AST::Members::Include
135
- constant_scopes_module absolute_type_name(member.name, namespace: namespace),
136
- scopes: []
137
- end
138
- end
139
- end
140
-
141
- scopes
142
- end
143
-
144
- def absolute_type_name(name, namespace:)
145
- env.absolute_type_name(name, namespace: namespace) do
146
- raise
147
- end
148
- end
149
- end
150
- end
@@ -1,170 +0,0 @@
1
- module RBS
2
- class Definition
3
- class Variable
4
- attr_reader :parent_variable
5
- attr_reader :type
6
- attr_reader :declared_in
7
-
8
- def initialize(parent_variable:, type:, declared_in:)
9
- @parent_variable = parent_variable
10
- @type = type
11
- @declared_in = declared_in
12
- end
13
- end
14
-
15
- class Method
16
- attr_reader :super_method
17
- attr_reader :method_types
18
- attr_reader :defined_in
19
- attr_reader :implemented_in
20
- attr_reader :accessibility
21
- attr_reader :attributes
22
- attr_reader :annotations
23
- attr_reader :comment
24
-
25
- def initialize(super_method:, method_types:, defined_in:, implemented_in:, accessibility:, attributes:, annotations:, comment:)
26
- @super_method = super_method
27
- @method_types = method_types
28
- @defined_in = defined_in
29
- @implemented_in = implemented_in
30
- @accessibility = accessibility
31
- @attributes = attributes
32
- @annotations = annotations
33
- @comment = comment
34
- end
35
-
36
- def public?
37
- @accessibility == :public
38
- end
39
-
40
- def private?
41
- @accessibility == :private
42
- end
43
-
44
- def sub(s)
45
- self.class.new(
46
- super_method: super_method&.sub(s),
47
- method_types: method_types.map {|ty| ty.sub(s) },
48
- defined_in: defined_in,
49
- implemented_in: implemented_in,
50
- accessibility: @accessibility,
51
- attributes: attributes,
52
- annotations: annotations,
53
- comment: comment
54
- )
55
- end
56
-
57
- def map_type(&block)
58
- self.class.new(
59
- super_method: super_method&.map_type(&block),
60
- method_types: method_types.map do |ty|
61
- ty.map_type(&block)
62
- end,
63
- defined_in: defined_in,
64
- implemented_in: implemented_in,
65
- accessibility: @accessibility,
66
- attributes: attributes,
67
- annotations: annotations,
68
- comment: comment
69
- )
70
- end
71
- end
72
-
73
- module Ancestor
74
- Instance = Struct.new(:name, :args, keyword_init: true)
75
- Singleton = Struct.new(:name, keyword_init: true)
76
- ExtensionInstance = Struct.new(:name, :extension_name, :args, keyword_init: true)
77
- ExtensionSingleton = Struct.new(:name, :extension_name, keyword_init: true)
78
- end
79
-
80
- attr_reader :declaration
81
- attr_reader :self_type
82
- attr_reader :methods
83
- attr_reader :instance_variables
84
- attr_reader :class_variables
85
- attr_reader :ancestors
86
-
87
- def initialize(declaration:, self_type:, ancestors:)
88
- unless declaration.is_a?(AST::Declarations::Class) ||
89
- declaration.is_a?(AST::Declarations::Module) ||
90
- declaration.is_a?(AST::Declarations::Interface) ||
91
- declaration.is_a?(AST::Declarations::Extension)
92
- raise "Declaration should be a class, module, or interface: #{declaration.name}"
93
- end
94
-
95
- unless (self_type.is_a?(Types::ClassSingleton) || self_type.is_a?(Types::Interface) || self_type.is_a?(Types::ClassInstance)) && self_type.name == declaration.name.absolute!
96
- raise "self_type should be the type of declaration: #{self_type}"
97
- end
98
-
99
- @self_type = self_type
100
- @declaration = declaration
101
- @methods = {}
102
- @instance_variables = {}
103
- @class_variables = {}
104
- @ancestors = ancestors
105
- end
106
-
107
- def name
108
- declaration.name
109
- end
110
-
111
- def class?
112
- declaration.is_a?(AST::Declarations::Class)
113
- end
114
-
115
- def module?
116
- declaration.is_a?(AST::Declarations::Module)
117
- end
118
-
119
- def class_type?
120
- @self_type.is_a?(Types::ClassSingleton)
121
- end
122
-
123
- def instance_type?
124
- @self_type.is_a?(Types::ClassInstance)
125
- end
126
-
127
- def interface_type?
128
- @self_type.is_a?(Types::Interface)
129
- end
130
-
131
- def type_params
132
- @self_type.args.map(&:name)
133
- end
134
-
135
- def type_params_decl
136
- case declaration
137
- when AST::Declarations::Extension
138
- nil
139
- else
140
- declaration.type_params
141
- end
142
- end
143
-
144
- def each_type(&block)
145
- if block_given?
146
- methods.each_value do |method|
147
- if method.defined_in == self.declaration
148
- method.method_types.each do |method_type|
149
- method_type.each_type(&block)
150
- end
151
- end
152
- end
153
-
154
- instance_variables.each_value do |var|
155
- if var.declared_in == self.declaration
156
- yield var.type
157
- end
158
- end
159
-
160
- class_variables.each_value do |var|
161
- if var.declared_in == self.declaration
162
- yield var.type
163
- end
164
- end
165
- else
166
- enum_for :each_type
167
- end
168
- end
169
- end
170
- end
@@ -1,919 +0,0 @@
1
- module RBS
2
- class DefinitionBuilder
3
- attr_reader :env
4
- attr_reader :instance_cache
5
- attr_reader :singleton_cache
6
-
7
- def initialize(env:)
8
- @env = env
9
- @instance_cache = {}
10
- @singleton_cache = {}
11
- end
12
-
13
- def build_ancestors(self_ancestor, ancestors: [], building_ancestors: [], location: nil)
14
- decl = env.find_class(self_ancestor.name)
15
- namespace = self_ancestor.name.absolute!.to_namespace
16
-
17
- RecursiveAncestorError.check!(self_ancestor,
18
- ancestors: building_ancestors,
19
- location: location || decl.location)
20
- building_ancestors.push self_ancestor
21
-
22
- case self_ancestor
23
- when Definition::Ancestor::Instance
24
- args = self_ancestor.args
25
- param_names = decl.type_params.each.map(&:name)
26
-
27
- InvalidTypeApplicationError.check!(
28
- type_name: self_ancestor.name,
29
- args: args,
30
- params: decl.type_params,
31
- location: location || decl.location
32
- )
33
-
34
- sub = Substitution.build(param_names, args)
35
-
36
- case decl
37
- when AST::Declarations::Class
38
- unless self_ancestor.name == BuiltinNames::BasicObject.name
39
- super_ancestor = decl.super_class&.yield_self do |super_class|
40
- Definition::Ancestor::Instance.new(
41
- name: absolute_type_name(super_class.name, namespace: namespace, location: location || decl.location),
42
- args: super_class.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
43
- )
44
- end || Definition::Ancestor::Instance.new(name: BuiltinNames::Object.name, args: [])
45
-
46
- build_ancestors(super_ancestor, ancestors: ancestors, building_ancestors: building_ancestors)
47
- end
48
- end
49
-
50
- decl.members.each do |member|
51
- case member
52
- when AST::Members::Include
53
- if member.name.class?
54
- ancestor = Definition::Ancestor::Instance.new(
55
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
56
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
57
- )
58
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
59
- end
60
- end
61
- end
62
-
63
- ancestors.unshift(self_ancestor)
64
-
65
- env.each_extension(self_ancestor.name).sort_by {|e| e.extension_name.to_s }.each do |extension|
66
- InvalidExtensionParameterError.check!(
67
- type_name: self_ancestor.name,
68
- extension_name: extension.extension_name,
69
- extension_params: extension.type_params,
70
- class_params: self_ancestor.args.map(&:name),
71
- location: extension.location
72
- )
73
-
74
- sub = Substitution.build(extension.type_params, self_ancestor.args)
75
-
76
- extension.members.each do |member|
77
- case member
78
- when AST::Members::Include
79
- if member.name.class?
80
- ancestor = Definition::Ancestor::Instance.new(
81
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
82
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
83
- )
84
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
85
- end
86
- end
87
- end
88
-
89
- extension_ancestor = Definition::Ancestor::ExtensionInstance.new(
90
- name: extension.name.absolute!,
91
- extension_name: extension.extension_name,
92
- args: self_ancestor.args,
93
- )
94
- ancestors.unshift(extension_ancestor)
95
-
96
- extension.members.each do |member|
97
- case member
98
- when AST::Members::Prepend
99
- if member.name.class?
100
- ancestor = Definition::Ancestor::Instance.new(
101
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
102
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
103
- )
104
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
105
- end
106
- end
107
- end
108
- end
109
-
110
- decl.members.each do |member|
111
- case member
112
- when AST::Members::Prepend
113
- ancestor = Definition::Ancestor::Instance.new(
114
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
115
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
116
- )
117
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
118
- end
119
- end
120
- when Definition::Ancestor::Singleton
121
- case decl
122
- when AST::Declarations::Class
123
- if self_ancestor.name == BuiltinNames::BasicObject.name
124
- class_ancestor = Definition::Ancestor::Instance.new(
125
- name: BuiltinNames::Class.name,
126
- args: []
127
- )
128
- build_ancestors class_ancestor, ancestors: ancestors, building_ancestors: building_ancestors
129
- else
130
- super_ancestor = decl.super_class&.yield_self do |super_class|
131
- Definition::Ancestor::Singleton.new(
132
- name: absolute_type_name(super_class.name, namespace: namespace, location: location || decl.location)
133
- )
134
- end || Definition::Ancestor::Singleton.new(name: BuiltinNames::Object.name)
135
-
136
- build_ancestors(super_ancestor, ancestors: ancestors, building_ancestors: building_ancestors)
137
- end
138
- when AST::Declarations::Module
139
- module_ancestor = Definition::Ancestor::Instance.new(
140
- name: BuiltinNames::Module.name,
141
- args: []
142
- )
143
- build_ancestors module_ancestor, ancestors: ancestors, building_ancestors: building_ancestors
144
- end
145
-
146
- decl.members.each do |member|
147
- case member
148
- when AST::Members::Extend
149
- if member.name.class?
150
- ancestor = Definition::Ancestor::Instance.new(
151
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
152
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
153
- )
154
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
155
- end
156
- end
157
- end
158
-
159
- ancestors.unshift(self_ancestor)
160
-
161
- env.each_extension(self_ancestor.name).sort_by {|e| e.extension_name.to_s }.each do |extension|
162
- extension.members.each do |member|
163
- case member
164
- when AST::Members::Extend
165
- if member.name.class?
166
- ancestor = Definition::Ancestor::Instance.new(
167
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
168
- args: member.args.map {|ty| absolute_type(ty, namespace: namespace) }
169
- )
170
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
171
- end
172
- end
173
- end
174
-
175
- extension_ancestor = Definition::Ancestor::ExtensionSingleton.new(
176
- name: extension.name.absolute!,
177
- extension_name: extension.extension_name
178
- )
179
- ancestors.unshift(extension_ancestor)
180
- end
181
- end
182
-
183
- building_ancestors.pop
184
-
185
- ancestors
186
- end
187
-
188
- def each_member_with_accessibility(members, accessibility: :public)
189
- members.each do |member|
190
- case member
191
- when AST::Members::Public
192
- accessibility = :public
193
- when AST::Members::Private
194
- accessibility = :private
195
- else
196
- yield member, accessibility
197
- end
198
- end
199
- end
200
-
201
- def build_instance(type_name)
202
- try_cache type_name, cache: instance_cache do
203
- decl = env.find_class(type_name)
204
- self_ancestor = Definition::Ancestor::Instance.new(name: type_name,
205
- args: Types::Variable.build(decl.type_params.each.map(&:name)))
206
- self_type = Types::ClassInstance.new(name: type_name, args: self_ancestor.args, location: nil)
207
-
208
- case decl
209
- when AST::Declarations::Class, AST::Declarations::Module
210
- ancestors = build_ancestors(self_ancestor)
211
- definition_pairs = ancestors.map do |ancestor|
212
- case ancestor
213
- when Definition::Ancestor::Instance
214
- [ancestor, build_one_instance(ancestor.name)]
215
- when Definition::Ancestor::Singleton
216
- [ancestor, build_one_singleton(ancestor.name)]
217
- when Definition::Ancestor::ExtensionInstance
218
- [ancestor, build_one_instance(ancestor.name, extension_name: ancestor.extension_name)]
219
- when Definition::Ancestor::ExtensionSingleton
220
- [ancestor, build_one_extension_singleton(ancestor.name, extension_name: ancestor.extension_name)]
221
- end
222
- end
223
-
224
- if decl.is_a?(AST::Declarations::Module)
225
- if decl.self_type
226
- self_interface = absolute_type(decl.self_type, namespace: type_name.to_namespace)
227
- ancestor = Definition::Ancestor::Instance.new(name: self_interface.name,
228
- args: self_interface.args)
229
-
230
- definition_pairs.push [ancestor, build_one_instance(ancestor.name)]
231
- end
232
- end
233
-
234
- merge_definitions(definition_pairs, decl: decl, self_type: self_type, ancestors: ancestors)
235
- end
236
- end
237
- end
238
-
239
- def build_singleton(type_name)
240
- try_cache type_name, cache: singleton_cache do
241
- decl = env.find_class(type_name)
242
- self_ancestor = Definition::Ancestor::Singleton.new(name: type_name)
243
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
244
-
245
- case decl
246
- when AST::Declarations::Class, AST::Declarations::Module
247
- ancestors = build_ancestors(self_ancestor)
248
- definition_pairs = ancestors.map do |ancestor|
249
- case ancestor
250
- when Definition::Ancestor::Instance
251
- [ancestor, build_one_instance(ancestor.name)]
252
- when Definition::Ancestor::Singleton
253
- [ancestor, build_one_singleton(ancestor.name)]
254
- when Definition::Ancestor::ExtensionInstance
255
- [ancestor, build_one_instance(ancestor.name, extension_name: ancestor.extension_name)]
256
- when Definition::Ancestor::ExtensionSingleton
257
- [ancestor, build_one_singleton(ancestor.name, extension_name: ancestor.extension_name)]
258
- end
259
- end
260
-
261
- if decl.is_a?(AST::Declarations::Class)
262
- definition_pairs.find {|ancestor, _| ancestor == self_ancestor }.tap do |_, definition|
263
- unless definition.methods[:new]&.implemented_in == decl
264
- instance_definition = build_instance(type_name)
265
- class_params = decl.type_params.each.map(&:name)
266
- initialize_method = instance_definition.methods[:initialize]
267
- method_types = initialize_method.method_types.map do |method_type|
268
- case method_type
269
- when MethodType
270
- fvs = method_type.free_variables + class_params
271
- unless fvs.empty?
272
- param_name_set = Set.new(class_params)
273
- bound_variables = method_type.type_params
274
- renamed_types = bound_variables.map do |x|
275
- if param_name_set.member?(x)
276
- Types::Variable.fresh(x)
277
- else
278
- Types::Variable.new(name: x, location: nil)
279
- end
280
- end
281
- sub = Substitution.build(bound_variables, renamed_types)
282
- method_type_params = renamed_types.unshift(*class_params)
283
- else
284
- sub = Substitution.build([], [])
285
- method_type_params = method_type.type_params
286
- end
287
-
288
- MethodType.new(
289
- type_params: method_type_params,
290
- type: method_type.type.sub(sub).with_return_type(instance_definition.self_type),
291
- block: method_type.block&.yield_self {|ty| ty.sub(sub) },
292
- location: method_type.location
293
- )
294
- end
295
- end.compact
296
-
297
- definition.methods[:new] = Definition::Method.new(
298
- super_method: nil,
299
- defined_in: nil,
300
- implemented_in: env.find_class(RBS::BuiltinNames::Class.name),
301
- method_types: method_types,
302
- accessibility: :public,
303
- attributes: [:incompatible],
304
- annotations: [],
305
- comment: nil
306
- )
307
- end
308
- end
309
- end
310
-
311
- merge_definitions(definition_pairs, decl: decl, self_type: self_type, ancestors: ancestors)
312
- end
313
- end
314
- end
315
-
316
- def build_one_instance(type_name, extension_name: nil)
317
- decl = if extension_name
318
- env.each_extension(type_name).find {|ext| ext.extension_name == extension_name } or
319
- raise "Unknown extension: #{type_name} (#{extension_name})"
320
- else
321
- env.find_class(type_name)
322
- end
323
-
324
- case decl
325
- when AST::Declarations::Interface
326
- build_interface type_name, decl
327
- else
328
- namespace = type_name.to_namespace
329
-
330
- case decl
331
- when AST::Declarations::Class, AST::Declarations::Module
332
- self_type = Types::ClassInstance.new(name: type_name,
333
- args: Types::Variable.build(decl.type_params.each.map(&:name)),
334
- location: nil)
335
- ancestors = [Definition::Ancestor::Instance.new(name: type_name, args: self_type.args)]
336
- when AST::Declarations::Extension
337
- self_type = Types::ClassInstance.new(name: type_name, args: Types::Variable.build(decl.type_params), location: nil)
338
- ancestors = [Definition::Ancestor::ExtensionInstance.new(name: type_name,
339
- extension_name: extension_name,
340
- args: self_type.args)]
341
- end
342
-
343
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
344
- alias_members = []
345
-
346
- each_member_with_accessibility(decl.members) do |member, accessibility|
347
- case member
348
- when AST::Members::MethodDefinition
349
- if member.instance?
350
- name = member.name
351
- method_types = member.types.map do |method_type|
352
- case method_type
353
- when MethodType
354
- method_type.map_type do |type|
355
- absolute_type(type, namespace: namespace)
356
- end
357
- when :super
358
- :super
359
- end
360
- end
361
-
362
- DuplicatedMethodDefinitionError.check!(
363
- decl: decl,
364
- methods: definition.methods,
365
- name: name,
366
- location: member.location
367
- )
368
-
369
- attrs = if name == :initialize
370
- (member.attributes + [:incompatible]).uniq
371
- else
372
- member.attributes
373
- end
374
-
375
- definition.methods[name] = Definition::Method.new(super_method: nil,
376
- method_types: method_types,
377
- defined_in: decl,
378
- implemented_in: decl,
379
- accessibility: accessibility,
380
- attributes: attrs,
381
- annotations: member.annotations,
382
- comment: member.comment)
383
- end
384
- when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
385
- name = member.name
386
- type = absolute_type(member.type, namespace: namespace)
387
- ivar_name = case member.ivar_name
388
- when false
389
- nil
390
- else
391
- member.ivar_name || :"@#{member.name}"
392
- end
393
-
394
- if member.is_a?(AST::Members::AttrReader) || member.is_a?(AST::Members::AttrAccessor)
395
- definition.methods[name] = Definition::Method.new(
396
- super_method: nil,
397
- method_types: [
398
- MethodType.new(
399
- type_params: [],
400
- type: Types::Function.empty(type),
401
- block: nil,
402
- location: nil
403
- )
404
- ],
405
- defined_in: decl,
406
- implemented_in: decl,
407
- accessibility: accessibility,
408
- attributes: [],
409
- annotations: member.annotations,
410
- comment: member.comment
411
- )
412
- end
413
-
414
- if member.is_a?(AST::Members::AttrWriter) || member.is_a?(AST::Members::AttrAccessor)
415
- definition.methods[:"#{name}="] = Definition::Method.new(
416
- super_method: nil,
417
- method_types: [
418
- MethodType.new(
419
- type_params: [],
420
- type: Types::Function.new(required_positionals: [Types::Function::Param.new(name: name, type: type)],
421
- optional_positionals: [],
422
- rest_positionals: nil,
423
- trailing_positionals: [],
424
- required_keywords: {},
425
- optional_keywords: {},
426
- rest_keywords: nil,
427
- return_type: type),
428
- block: nil,
429
- location: nil
430
- )
431
- ],
432
- defined_in: decl,
433
- implemented_in: decl,
434
- accessibility: accessibility,
435
- attributes: [],
436
- annotations: member.annotations,
437
- comment: member.comment
438
- )
439
- end
440
-
441
- if ivar_name
442
- definition.instance_variables[ivar_name] = Definition::Variable.new(
443
- parent_variable: nil,
444
- type: type,
445
- declared_in: decl
446
- )
447
- end
448
-
449
- when AST::Members::Alias
450
- if member.instance?
451
- alias_members << member
452
- end
453
- when AST::Members::Include
454
- if member.name.interface?
455
- absolute_name = absolute_type_name(member.name, namespace: namespace, location: member.location)
456
- interface_definition = build_one_instance(absolute_name)
457
- absolute_args = member.args.map {|ty| absolute_type(ty, namespace: namespace) }
458
-
459
- InvalidTypeApplicationError.check!(
460
- type_name: absolute_name,
461
- args: absolute_args,
462
- params: interface_definition.type_params_decl,
463
- location: member.location
464
- )
465
-
466
- sub = Substitution.build(interface_definition.type_params, absolute_args)
467
- interface_definition.methods.each do |name, method|
468
- method_types = method.method_types.map do |method_type|
469
- method_type.sub(sub).map_type do |type|
470
- absolute_type(type, namespace: namespace)
471
- end
472
- end
473
-
474
- DuplicatedMethodDefinitionError.check!(
475
- decl: decl,
476
- methods: definition.methods,
477
- name: name,
478
- location: member.location
479
- )
480
-
481
- definition.methods[name] = Definition::Method.new(
482
- super_method: nil,
483
- method_types: method_types,
484
- defined_in: method.defined_in,
485
- implemented_in: decl,
486
- accessibility: method.accessibility,
487
- attributes: [],
488
- annotations: method.annotations,
489
- comment: member.comment
490
- )
491
- end
492
- end
493
- when AST::Members::InstanceVariable
494
- definition.instance_variables[member.name] = Definition::Variable.new(
495
- type: absolute_type(member.type, namespace: namespace),
496
- parent_variable: nil,
497
- declared_in: decl
498
- )
499
- when AST::Members::ClassVariable
500
- definition.class_variables[member.name] = Definition::Variable.new(
501
- type: absolute_type(member.type, namespace: namespace),
502
- parent_variable: nil,
503
- declared_in: decl
504
- )
505
- end
506
- end
507
-
508
- alias_members.each do |member|
509
- UnknownMethodAliasError.check!(
510
- methods: definition.methods,
511
- original_name: member.old_name,
512
- aliased_name: member.new_name,
513
- location: member.location
514
- )
515
-
516
- DuplicatedMethodDefinitionError.check!(
517
- decl: decl,
518
- methods: definition.methods,
519
- name: member.new_name,
520
- location: member.location
521
- )
522
-
523
- # FIXME: may cause a problem if #old_name has super type
524
- definition.methods[member.new_name] = definition.methods[member.old_name]
525
- end
526
-
527
- validate_parameter_variance(
528
- decl: decl,
529
- methods: definition.methods
530
- )
531
- end
532
- end
533
- end
534
-
535
- def validate_params_with(type_params, result:)
536
- type_params.each do |param|
537
- unless param.skip_validation
538
- unless result.compatible?(param.name, with_annotation: param.variance)
539
- yield param
540
- end
541
- end
542
- end
543
- end
544
-
545
- def validate_parameter_variance(decl:, methods:)
546
- type_params = case decl
547
- when AST::Declarations::Extension
548
- env.find_class(decl.name.absolute!).type_params.rename_to(decl.type_params)
549
- else
550
- decl.type_params
551
- end
552
-
553
- namespace = decl.name.absolute!.to_namespace
554
- calculator = VarianceCalculator.new(builder: self)
555
- param_names = type_params.each.map(&:name)
556
-
557
- errors = []
558
-
559
- if decl.is_a?(AST::Declarations::Class)
560
- if decl.super_class
561
- absolute_super_name = absolute_type_name(decl.super_class.name, namespace: namespace, location: decl.location)
562
- absolute_args = decl.super_class.args.map {|type| absolute_type(type, namespace: namespace) }
563
- result = calculator.in_inherit(name: absolute_super_name, args: absolute_args, variables: param_names)
564
-
565
- validate_params_with type_params, result: result do |param|
566
- errors.push InvalidVarianceAnnotationError::InheritanceError.new(
567
- param: param
568
- )
569
- end
570
- end
571
- end
572
-
573
- decl.members.each do |member|
574
- case member
575
- when AST::Members::Include
576
- if member.name.class?
577
- absolute_module_name = absolute_type_name(member.name, namespace: namespace, location: decl.location)
578
- absolute_args = member.args.map {|type| absolute_type(type, namespace: namespace) }
579
- result = calculator.in_inherit(name: absolute_module_name, args: absolute_args, variables: param_names)
580
-
581
- validate_params_with type_params, result: result do |param|
582
- errors.push InvalidVarianceAnnotationError::MixinError.new(
583
- include_member: member,
584
- param: param
585
- )
586
- end
587
- end
588
- end
589
- end
590
-
591
- methods.each do |name, method|
592
- method.method_types.each do |method_type|
593
- case method_type
594
- when MethodType
595
- result = calculator.in_method_type(method_type: method_type, variables: param_names)
596
-
597
- validate_params_with type_params, result: result do |param|
598
- errors.push InvalidVarianceAnnotationError::MethodTypeError.new(
599
- method_name: name,
600
- method_type: method_type,
601
- param: param
602
- )
603
- end
604
- end
605
- end
606
- end
607
-
608
- unless errors.empty?
609
- raise InvalidVarianceAnnotationError.new(decl: decl, errors: errors)
610
- end
611
- end
612
-
613
- def build_one_singleton(type_name, extension_name: nil)
614
- decl = if extension_name
615
- env.each_extension(type_name).find {|ext| ext.extension_name == extension_name } or
616
- raise "Unknown extension: #{type_name} (#{extension_name})"
617
- else
618
- env.find_class(type_name)
619
- end
620
-
621
- namespace = type_name.to_namespace
622
-
623
- case decl
624
- when AST::Declarations::Module, AST::Declarations::Class
625
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
626
- ancestors = [Definition::Ancestor::Singleton.new(name: type_name)]
627
- when AST::Declarations::Extension
628
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
629
- ancestors = [Definition::Ancestor::ExtensionSingleton.new(name: type_name, extension_name: extension_name)]
630
- end
631
-
632
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
633
- alias_members = []
634
-
635
- each_member_with_accessibility(decl.members) do |member, accessibility|
636
- case member
637
- when AST::Members::MethodDefinition
638
- if member.singleton?
639
- name = member.name
640
- method_types = member.types.map do |method_type|
641
- method_type.map_type do |type|
642
- absolute_type(type, namespace: namespace)
643
- end
644
- end
645
-
646
- DuplicatedMethodDefinitionError.check!(
647
- decl: decl,
648
- methods: definition.methods,
649
- name: name,
650
- location: member.location
651
- )
652
-
653
- definition.methods[name] = Definition::Method.new(super_method: nil,
654
- method_types: method_types,
655
- defined_in: decl,
656
- implemented_in: decl,
657
- accessibility: accessibility,
658
- attributes: member.attributes,
659
- annotations: member.annotations,
660
- comment: member.comment)
661
- end
662
- when AST::Members::Alias
663
- if member.singleton?
664
- alias_members << member
665
- end
666
- when AST::Members::Extend
667
- if member.name.interface?
668
- absolute_name = absolute_type_name(member.name, namespace: namespace, location: member.location)
669
- interface_definition = build_one_instance(absolute_name)
670
- absolute_args = member.args.map {|ty| absolute_type(ty, namespace: namespace) }
671
-
672
- InvalidTypeApplicationError.check!(
673
- type_name: absolute_name,
674
- args: absolute_args,
675
- params: interface_definition.type_params_decl,
676
- location: member.location
677
- )
678
-
679
- sub = Substitution.build(interface_definition.type_params, absolute_args)
680
- interface_definition.methods.each do |name, method|
681
- method_types = method.method_types.map do |method_type|
682
- method_type.sub(sub).map_type do |type|
683
- absolute_type(type, namespace: namespace)
684
- end
685
- end
686
-
687
- DuplicatedMethodDefinitionError.check!(
688
- decl: decl,
689
- methods: definition.methods,
690
- name: name,
691
- location: member.location
692
- )
693
-
694
- definition.methods[name] = Definition::Method.new(
695
- super_method: nil,
696
- method_types: method_types,
697
- defined_in: method.defined_in,
698
- implemented_in: decl,
699
- accessibility: method.accessibility,
700
- attributes: method.attributes,
701
- annotations: method.annotations,
702
- comment: member.comment
703
- )
704
- end
705
- end
706
- when AST::Members::ClassInstanceVariable
707
- definition.instance_variables[member.name] = Definition::Variable.new(
708
- type: absolute_type(member.type, namespace: namespace),
709
- parent_variable: nil,
710
- declared_in: decl
711
- )
712
- when AST::Members::ClassVariable
713
- definition.class_variables[member.name] = Definition::Variable.new(
714
- type: absolute_type(member.type, namespace: namespace),
715
- parent_variable: nil,
716
- declared_in: decl
717
- )
718
- end
719
- end
720
-
721
- alias_members.each do |member|
722
- UnknownMethodAliasError.check!(
723
- methods: definition.methods,
724
- original_name: member.old_name,
725
- aliased_name: member.new_name,
726
- location: member.location
727
- )
728
-
729
- DuplicatedMethodDefinitionError.check!(
730
- decl: decl,
731
- methods: definition.methods,
732
- name: member.new_name,
733
- location: member.location
734
- )
735
-
736
- # FIXME: may cause a problem if #old_name has super type
737
- definition.methods[member.new_name] = definition.methods[member.old_name]
738
- end
739
- end
740
- end
741
-
742
- def merge_definitions(pairs, decl:, self_type:, ancestors:)
743
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
744
- pairs.reverse_each do |(ancestor, current_definition)|
745
- sub = case ancestor
746
- when Definition::Ancestor::Instance, Definition::Ancestor::ExtensionInstance
747
- Substitution.build(current_definition.type_params, ancestor.args)
748
- when Definition::Ancestor::Singleton, Definition::Ancestor::ExtensionSingleton
749
- Substitution.build([], [])
750
- end
751
- namespace = current_definition.name.absolute!.to_namespace
752
-
753
- current_definition.methods.each do |name, method|
754
- merge_method definition.methods, name, method, sub, namespace
755
- end
756
-
757
- current_definition.instance_variables.each do |name, variable|
758
- merge_variable definition.instance_variables, name, variable
759
- end
760
-
761
- current_definition.class_variables.each do |name, variable|
762
- merge_variable definition.class_variables, name, variable
763
- end
764
- end
765
- end
766
- end
767
-
768
- def merge_variable(variables, name, variable)
769
- super_variable = variables[name]
770
-
771
- variables[name] = Definition::Variable.new(
772
- parent_variable: super_variable,
773
- type: variable.type,
774
- declared_in: variable.declared_in
775
- )
776
- end
777
-
778
- def merge_method(methods, name, method, sub, namespace)
779
- super_method = methods[name]
780
-
781
- methods[name] = Definition::Method.new(
782
- method_types: method.method_types.flat_map do |method_type|
783
- case method_type
784
- when MethodType
785
- [absolute_type(method_type.sub(sub), namespace: namespace)]
786
- when :super
787
- super_method.method_types
788
- end
789
- end,
790
- super_method: super_method,
791
- defined_in: method.defined_in,
792
- implemented_in: method.implemented_in,
793
- accessibility: method.accessibility,
794
- attributes: method.attributes,
795
- annotations: method.annotations,
796
- comment: method.comment
797
- )
798
- end
799
-
800
- def try_cache(type_name, cache:)
801
- cached = cache[type_name]
802
-
803
- case cached
804
- when Definition
805
- cached
806
- when false
807
- raise
808
- when nil
809
- cache[type_name] = false
810
- begin
811
- cache[type_name] = yield
812
- rescue => ex
813
- cache[type_name] = nil
814
- raise ex
815
- end
816
- end
817
- end
818
-
819
- def build_interface(type_name, declaration = env.find_class(type_name))
820
- self_type = Types::Interface.new(
821
- name: type_name,
822
- args: declaration.type_params.each.map {|p| Types::Variable.new(name: p.name, location: nil) },
823
- location: nil
824
- )
825
-
826
- namespace = type_name.to_namespace
827
-
828
- Definition.new(declaration: declaration, self_type: self_type, ancestors: []).tap do |definition|
829
- alias_members = []
830
-
831
- declaration.members.each do |member|
832
- case member
833
- when AST::Members::Include
834
- mixin_name = env.absolute_interface_name(member.name, namespace: namespace) || member.name.absolute!
835
- mixin = build_one_instance(mixin_name)
836
-
837
- args = member.args.map {|type| absolute_type(type, namespace: namespace) }
838
- type_params = mixin.declaration.type_params
839
-
840
- InvalidTypeApplicationError.check!(
841
- type_name: type_name,
842
- args: args,
843
- params: type_params,
844
- location: member.location
845
- )
846
-
847
- sub = Substitution.build(type_params.each.map(&:name), args)
848
- mixin.methods.each do |name, method|
849
- definition.methods[name] = method.sub(sub)
850
- end
851
- end
852
- end
853
-
854
- declaration.members.each do |member|
855
- case member
856
- when AST::Members::MethodDefinition
857
- DuplicatedMethodDefinitionError.check!(
858
- decl: declaration,
859
- methods: definition.methods,
860
- name: member.name,
861
- location: member.location
862
- )
863
-
864
- method = Definition::Method.new(
865
- super_method: nil,
866
- method_types: member.types.map do |method_type|
867
- method_type.map_type {|ty| absolute_type(ty, namespace: namespace) }
868
- end,
869
- defined_in: declaration,
870
- implemented_in: nil,
871
- accessibility: :public,
872
- attributes: member.attributes,
873
- annotations: member.annotations,
874
- comment: member.comment
875
- )
876
- definition.methods[member.name] = method
877
- when AST::Members::Alias
878
- alias_members << member
879
- end
880
- end
881
-
882
- alias_members.each do |member|
883
- UnknownMethodAliasError.check!(
884
- methods: definition.methods,
885
- original_name: member.old_name,
886
- aliased_name: member.new_name,
887
- location: member.location
888
- )
889
-
890
- DuplicatedMethodDefinitionError.check!(
891
- decl: declaration,
892
- methods: definition.methods,
893
- name: member.new_name,
894
- location: member.location
895
- )
896
-
897
- # FIXME: may cause a problem if #old_name has super type
898
- definition.methods[member.new_name] = definition.methods[member.old_name]
899
- end
900
- end
901
- end
902
-
903
- def absolute_type(type, namespace:)
904
- env.absolute_type(type, namespace: namespace) do |type|
905
- NoTypeFoundError.check!(type.name.absolute!, env: env, location: type.location)
906
- end
907
- end
908
-
909
- def absolute_type_name(type_name, namespace:, location:)
910
- env.absolute_type_name(type_name, namespace: namespace) do |type_name|
911
- NoTypeFoundError.check!(type_name.absolute!, env: env, location: location)
912
- end
913
- end
914
-
915
- def expand_alias(type_name)
916
- absolute_type(env.find_alias(type_name).type, namespace: type_name.namespace)
917
- end
918
- end
919
- end