steep 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/exe/rbs +1 -1
  4. data/lib/steep/annotation_parser.rb +4 -4
  5. data/lib/steep/ast/buffer.rb +11 -7
  6. data/lib/steep/ast/builtin.rb +8 -0
  7. data/lib/steep/ast/types/factory.rb +55 -55
  8. data/lib/steep/drivers/check.rb +20 -4
  9. data/lib/steep/drivers/langserver.rb +6 -1
  10. data/lib/steep/drivers/vendor.rb +2 -2
  11. data/lib/steep/project/completion_provider.rb +5 -11
  12. data/lib/steep/project/dsl.rb +14 -0
  13. data/lib/steep/project/file.rb +42 -46
  14. data/lib/steep/project/hover_content.rb +11 -5
  15. data/lib/steep/project/options.rb +25 -3
  16. data/lib/steep/project/target.rb +10 -4
  17. data/lib/steep/signature/errors.rb +1 -1
  18. data/lib/steep/signature/validator.rb +8 -8
  19. data/lib/steep/source.rb +1 -1
  20. data/lib/steep/type_construction.rb +987 -711
  21. data/lib/steep/type_inference/constant_env.rb +1 -1
  22. data/lib/steep/type_inference/context.rb +7 -3
  23. data/lib/steep/type_inference/context_array.rb +111 -0
  24. data/lib/steep/type_inference/local_variable_type_env.rb +226 -0
  25. data/lib/steep/type_inference/logic.rb +130 -0
  26. data/lib/steep/type_inference/type_env.rb +5 -69
  27. data/lib/steep/typing.rb +79 -22
  28. data/lib/steep/version.rb +1 -1
  29. data/lib/steep.rb +6 -1
  30. data/smoke/alias/Steepfile +1 -0
  31. data/smoke/and/Steepfile +1 -0
  32. data/smoke/array/Steepfile +1 -0
  33. data/smoke/array/b.rb +0 -2
  34. data/smoke/block/Steepfile +1 -0
  35. data/smoke/case/Steepfile +1 -0
  36. data/smoke/class/Steepfile +1 -0
  37. data/smoke/const/Steepfile +1 -0
  38. data/smoke/dstr/Steepfile +1 -0
  39. data/smoke/ensure/Steepfile +1 -0
  40. data/smoke/enumerator/Steepfile +1 -0
  41. data/smoke/extension/Steepfile +1 -0
  42. data/smoke/extension/c.rb +1 -0
  43. data/smoke/hash/Steepfile +1 -0
  44. data/smoke/hello/Steepfile +1 -0
  45. data/smoke/if/Steepfile +1 -0
  46. data/smoke/if/a.rb +1 -1
  47. data/smoke/implements/Steepfile +1 -0
  48. data/smoke/initialize/Steepfile +1 -0
  49. data/smoke/integer/Steepfile +1 -0
  50. data/smoke/interface/Steepfile +1 -0
  51. data/smoke/kwbegin/Steepfile +1 -0
  52. data/smoke/lambda/Steepfile +1 -0
  53. data/smoke/literal/Steepfile +1 -0
  54. data/smoke/map/Steepfile +1 -0
  55. data/smoke/method/Steepfile +1 -0
  56. data/smoke/module/Steepfile +1 -0
  57. data/smoke/regexp/Steepfile +1 -0
  58. data/smoke/regression/Steepfile +1 -0
  59. data/smoke/rescue/Steepfile +1 -0
  60. data/smoke/rescue/a.rb +1 -1
  61. data/smoke/self/Steepfile +1 -0
  62. data/smoke/skip/Steepfile +1 -0
  63. data/smoke/stdout/Steepfile +1 -0
  64. data/smoke/super/Steepfile +1 -0
  65. data/smoke/type_case/Steepfile +1 -0
  66. data/smoke/yield/Steepfile +1 -0
  67. data/steep.gemspec +1 -1
  68. data/vendor/ruby-signature/.gitignore +2 -2
  69. data/vendor/ruby-signature/README.md +2 -2
  70. data/vendor/ruby-signature/Rakefile +2 -2
  71. data/vendor/ruby-signature/bin/annotate-with-rdoc +14 -13
  72. data/vendor/ruby-signature/bin/console +1 -1
  73. data/vendor/ruby-signature/bin/sort +7 -6
  74. data/vendor/ruby-signature/bin/test_runner.rb +0 -1
  75. data/vendor/ruby-signature/docs/CONTRIBUTING.md +1 -1
  76. data/vendor/ruby-signature/docs/sigs.md +3 -3
  77. data/vendor/ruby-signature/docs/stdlib.md +1 -1
  78. data/vendor/ruby-signature/docs/syntax.md +9 -9
  79. data/vendor/ruby-signature/exe/rbs +5 -1
  80. data/vendor/ruby-signature/lib/rbs/ast/annotation.rb +27 -0
  81. data/vendor/ruby-signature/lib/rbs/ast/comment.rb +27 -0
  82. data/vendor/ruby-signature/lib/rbs/ast/declarations.rb +395 -0
  83. data/vendor/ruby-signature/lib/rbs/ast/members.rb +362 -0
  84. data/vendor/ruby-signature/lib/rbs/buffer.rb +50 -0
  85. data/vendor/ruby-signature/lib/rbs/builtin_names.rb +55 -0
  86. data/vendor/ruby-signature/lib/rbs/cli.rb +558 -0
  87. data/vendor/ruby-signature/lib/rbs/constant.rb +26 -0
  88. data/vendor/ruby-signature/lib/rbs/constant_table.rb +150 -0
  89. data/vendor/ruby-signature/lib/rbs/definition.rb +170 -0
  90. data/vendor/ruby-signature/lib/rbs/definition_builder.rb +919 -0
  91. data/vendor/ruby-signature/lib/rbs/environment.rb +281 -0
  92. data/vendor/ruby-signature/lib/rbs/environment_loader.rb +136 -0
  93. data/vendor/ruby-signature/lib/rbs/environment_walker.rb +124 -0
  94. data/vendor/ruby-signature/lib/rbs/errors.rb +187 -0
  95. data/vendor/ruby-signature/lib/rbs/location.rb +102 -0
  96. data/vendor/ruby-signature/lib/rbs/method_type.rb +123 -0
  97. data/vendor/ruby-signature/lib/rbs/namespace.rb +91 -0
  98. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/parser.rb +21 -23
  99. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/parser.y +18 -18
  100. data/vendor/ruby-signature/lib/rbs/prototype/rb.rb +553 -0
  101. data/vendor/ruby-signature/lib/rbs/prototype/rbi.rb +587 -0
  102. data/vendor/ruby-signature/lib/rbs/prototype/runtime.rb +381 -0
  103. data/vendor/ruby-signature/lib/rbs/substitution.rb +46 -0
  104. data/vendor/ruby-signature/lib/rbs/test/errors.rb +61 -0
  105. data/vendor/ruby-signature/lib/rbs/test/hook.rb +294 -0
  106. data/vendor/ruby-signature/lib/{ruby/signature → rbs}/test/setup.rb +7 -7
  107. data/vendor/ruby-signature/lib/rbs/test/spy.rb +325 -0
  108. data/vendor/ruby-signature/lib/rbs/test/test_helper.rb +183 -0
  109. data/vendor/ruby-signature/lib/rbs/test/type_check.rb +254 -0
  110. data/vendor/ruby-signature/lib/rbs/test.rb +26 -0
  111. data/vendor/ruby-signature/lib/rbs/type_name.rb +70 -0
  112. data/vendor/ruby-signature/lib/rbs/types.rb +936 -0
  113. data/vendor/ruby-signature/lib/rbs/variance_calculator.rb +138 -0
  114. data/vendor/ruby-signature/lib/rbs/vendorer.rb +47 -0
  115. data/vendor/ruby-signature/lib/rbs/version.rb +3 -0
  116. data/vendor/ruby-signature/lib/rbs/writer.rb +269 -0
  117. data/vendor/ruby-signature/lib/rbs.rb +64 -0
  118. data/vendor/ruby-signature/lib/ruby/signature.rb +4 -61
  119. data/vendor/ruby-signature/{ruby-signature.gemspec → rbs.gemspec} +4 -4
  120. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +58 -1
  121. data/vendor/ruby-signature/stdlib/base64/base64.rbs +69 -13
  122. data/vendor/ruby-signature/stdlib/benchmark/benchmark.rbs +372 -0
  123. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +9 -0
  124. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +1 -7
  125. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +2 -1
  126. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +3 -2
  127. data/vendor/ruby-signature/stdlib/builtin/file.rbs +902 -302
  128. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +190 -68
  129. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +3 -6
  130. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +6 -4
  131. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +146 -120
  132. data/vendor/ruby-signature/stdlib/builtin/math.rbs +310 -7
  133. data/vendor/ruby-signature/stdlib/builtin/method.rbs +11 -8
  134. data/vendor/ruby-signature/stdlib/builtin/module.rbs +959 -103
  135. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +3 -0
  136. data/vendor/ruby-signature/stdlib/builtin/process.rbs +981 -108
  137. data/vendor/ruby-signature/stdlib/builtin/random.rbs +215 -41
  138. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +47 -0
  139. data/vendor/ruby-signature/stdlib/builtin/string.rbs +9 -2
  140. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +282 -11
  141. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +11 -13
  142. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +25 -29
  143. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +1 -1
  144. data/vendor/ruby-signature/stdlib/builtin/time.rbs +875 -567
  145. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +243 -44
  146. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +103 -109
  147. data/vendor/ruby-signature/stdlib/coverage/coverage.rbs +62 -0
  148. data/vendor/ruby-signature/stdlib/csv/csv.rbs +773 -0
  149. data/vendor/ruby-signature/stdlib/erb/erb.rbs +375 -1
  150. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -4
  151. data/vendor/ruby-signature/stdlib/ipaddr/ipaddr.rbs +247 -0
  152. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +1088 -16
  153. data/vendor/ruby-signature/stdlib/set/set.rbs +251 -27
  154. metadata +49 -44
  155. data/exe/ruby-signature +0 -3
  156. data/vendor/ruby-signature/exe/ruby-signature +0 -7
  157. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +0 -29
  158. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +0 -29
  159. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +0 -391
  160. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +0 -364
  161. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +0 -52
  162. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +0 -54
  163. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +0 -555
  164. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +0 -28
  165. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +0 -152
  166. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +0 -172
  167. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +0 -921
  168. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +0 -283
  169. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +0 -138
  170. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +0 -126
  171. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +0 -189
  172. data/vendor/ruby-signature/lib/ruby/signature/location.rb +0 -104
  173. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +0 -125
  174. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +0 -93
  175. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +0 -444
  176. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +0 -579
  177. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +0 -383
  178. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +0 -48
  179. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +0 -63
  180. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +0 -290
  181. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +0 -327
  182. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +0 -185
  183. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +0 -256
  184. data/vendor/ruby-signature/lib/ruby/signature/test.rb +0 -28
  185. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +0 -72
  186. data/vendor/ruby-signature/lib/ruby/signature/types.rb +0 -932
  187. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +0 -140
  188. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +0 -49
  189. data/vendor/ruby-signature/lib/ruby/signature/version.rb +0 -5
  190. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +0 -271
@@ -1,189 +0,0 @@
1
- module Ruby
2
- module Signature
3
- class InvalidTypeApplicationError < StandardError
4
- attr_reader :type_name
5
- attr_reader :args
6
- attr_reader :params
7
- attr_reader :location
8
-
9
- def initialize(type_name:, args:, params:, location:)
10
- @type_name = type_name
11
- @args = args
12
- @params = params
13
- @location = location
14
- super "#{Location.to_string location}: #{type_name} expects parameters [#{params.each.map(&:name).join(", ")}], but given args [#{args.join(", ")}]"
15
- end
16
-
17
- def self.check!(type_name:, args:, params:, location:)
18
- unless args.size == params.size
19
- raise new(type_name: type_name, args: args, params: params, location: location)
20
- end
21
- end
22
- end
23
-
24
- class InvalidExtensionParameterError < StandardError
25
- attr_reader :type_name
26
- attr_reader :extension_name
27
- attr_reader :location
28
- attr_reader :extension_params
29
- attr_reader :class_params
30
-
31
- def initialize(type_name:, extension_name:, extension_params:, class_params:, location:)
32
- @type_name = type_name
33
- @extension_name = extension_name
34
- @extension_params = extension_params
35
- @class_params = class_params
36
- @location = location
37
-
38
- super "#{Location.to_string location}: Expected #{class_params.size} parameters to #{type_name} (#{extension_name}) but has #{extension_params.size} parameters"
39
- end
40
-
41
- def self.check!(type_name:, extension_name:, extension_params:, class_params:, location:)
42
- unless extension_params.size == class_params.size
43
- raise new(type_name: type_name,
44
- extension_name: extension_name,
45
- extension_params: extension_params,
46
- class_params: class_params,
47
- location: location)
48
- end
49
- end
50
- end
51
-
52
- class RecursiveAncestorError < StandardError
53
- attr_reader :ancestors
54
- attr_reader :location
55
-
56
- def initialize(ancestors:, location:)
57
- last = case last = ancestors.last
58
- when Definition::Ancestor::Singleton
59
- "singleton(#{last.name})"
60
- when Definition::Ancestor::Instance
61
- if last.args.empty?
62
- last.name.to_s
63
- else
64
- "#{last.name}[#{last.args.join(", ")}]"
65
- end
66
- end
67
-
68
- super "#{Location.to_string location}: Detected recursive ancestors: #{last}"
69
- end
70
-
71
- def self.check!(self_ancestor, ancestors:, location:)
72
- case self_ancestor
73
- when Definition::Ancestor::Instance
74
- if ancestors.any? {|a| a.is_a?(Definition::Ancestor::Instance) && a.name == self_ancestor.name }
75
- raise new(ancestors: ancestors + [self_ancestor], location: location)
76
- end
77
- when Definition::Ancestor::Singleton
78
- if ancestors.include?(self_ancestor)
79
- raise new(ancestors: ancestors + [self_ancestor], location: location)
80
- end
81
- end
82
- end
83
- end
84
-
85
- class NoTypeFoundError < StandardError
86
- attr_reader :type_name
87
- attr_reader :location
88
-
89
- def initialize(type_name:, location:)
90
- @type_name = type_name
91
- @location = location
92
-
93
- super "#{Location.to_string location}: Could not find #{type_name}"
94
- end
95
-
96
- def self.check!(type_name, env:, location:)
97
- env.find_type_decl(type_name) or
98
- raise new(type_name: type_name, location: location)
99
-
100
- type_name
101
- end
102
- end
103
-
104
- class DuplicatedMethodDefinitionError < StandardError
105
- attr_reader :decl
106
- attr_reader :location
107
-
108
- def initialize(decl:, name:, location:)
109
- decl_str = case decl
110
- when AST::Declarations::Interface, AST::Declarations::Class, AST::Declarations::Module
111
- decl.name.to_s
112
- when AST::Declarations::Extension
113
- "#{decl.name} (#{decl.extension_name})"
114
- end
115
-
116
- super "#{Location.to_string location}: #{decl_str} has duplicated method definition: #{name}"
117
- end
118
-
119
- def self.check!(decl:, methods:, name:, location:)
120
- if methods.key?(name)
121
- raise new(decl: decl, name: name, location: location)
122
- end
123
- end
124
- end
125
-
126
- class UnknownMethodAliasError < StandardError
127
- attr_reader :original_name
128
- attr_reader :aliased_name
129
- attr_reader :location
130
-
131
- def initialize(original_name:, aliased_name:, location:)
132
- @original_name = original_name
133
- @aliased_name = aliased_name
134
- @location = location
135
-
136
- super "#{Location.to_string location}: Unknown method alias name: #{original_name} => #{aliased_name}"
137
- end
138
-
139
- def self.check!(methods:, original_name:, aliased_name:, location:)
140
- unless methods.key?(original_name)
141
- raise new(original_name: original_name, aliased_name: aliased_name, location: location)
142
- end
143
- end
144
- end
145
-
146
- class DuplicatedDeclarationError < StandardError
147
- attr_reader :name
148
- attr_reader :decls
149
-
150
- def initialize(name, *decls)
151
- @name = name
152
- @decls = decls
153
-
154
- super "#{Location.to_string decls.last.location}: Duplicated declaration: #{name}"
155
- end
156
- end
157
-
158
- class InvalidVarianceAnnotationError < StandardError
159
- MethodTypeError = Struct.new(:method_name, :method_type, :param, keyword_init: true)
160
- InheritanceError = Struct.new(:super_class, :param, keyword_init: true)
161
- MixinError = Struct.new(:include_member, :param, keyword_init: true)
162
-
163
- attr_reader :decl
164
- attr_reader :errors
165
-
166
- def initialize(decl:, errors:)
167
- @decl = decl
168
- @errors = errors
169
-
170
- message = [
171
- "#{Location.to_string decl.location}: Invalid variance annotation: #{decl.name}"
172
- ]
173
-
174
- errors.each do |error|
175
- case error
176
- when MethodTypeError
177
- message << " MethodTypeError (#{error.param.name}): on `#{error.method_name}` #{error.method_type.to_s} (#{error.method_type.location&.start_line})"
178
- when InheritanceError
179
- message << " InheritanceError: #{error.super_class}"
180
- when MixinError
181
- message << " MixinError: #{error.include_member.name} (#{error.include_member.location&.start_line})"
182
- end
183
- end
184
-
185
- super message.join("\n")
186
- end
187
- end
188
- end
189
- end
@@ -1,104 +0,0 @@
1
- module Ruby
2
- module Signature
3
- class Location
4
- attr_reader :buffer
5
- attr_reader :start_pos
6
- attr_reader :end_pos
7
-
8
- def initialize(buffer:, start_pos:, end_pos:)
9
- @buffer = buffer
10
- @start_pos = start_pos
11
- @end_pos = end_pos
12
- end
13
-
14
- def inspect
15
- "#<#{self.class}:#{self.__id__} @buffer=#{buffer.name}, @pos=#{start_pos}...#{end_pos}, source='#{source.lines.first}', start_line=#{start_line}, start_column=#{start_column}>"
16
- end
17
-
18
- def name
19
- buffer.name
20
- end
21
-
22
- def start_line
23
- start_loc[0]
24
- end
25
-
26
- def start_column
27
- start_loc[1]
28
- end
29
-
30
- def end_line
31
- end_loc[0]
32
- end
33
-
34
- def end_column
35
- end_loc[1]
36
- end
37
-
38
- def start_loc
39
- @start_loc ||= buffer.pos_to_loc(start_pos)
40
- end
41
-
42
- def end_loc
43
- @end_loc ||= buffer.pos_to_loc(end_pos)
44
- end
45
-
46
- def source
47
- @source ||= buffer.content[start_pos...end_pos]
48
- end
49
-
50
- def to_s
51
- "#{name || "-"}:#{start_line}:#{start_column}...#{end_line}:#{end_column}"
52
- end
53
-
54
- def self.to_string(location, default: "*:*:*...*:*")
55
- location&.to_s || default
56
- end
57
-
58
- def ==(other)
59
- other.is_a?(Location) &&
60
- other.buffer == buffer &&
61
- other.start_pos == start_pos &&
62
- other.end_pos == end_pos
63
- end
64
-
65
- def +(other)
66
- if other
67
- raise "Invalid concat: buffer=#{buffer.name}, other.buffer=#{other.buffer.name}" unless other.buffer == buffer
68
-
69
- self.class.new(buffer: buffer,
70
- start_pos: start_pos,
71
- end_pos: other.end_pos)
72
- else
73
- self
74
- end
75
- end
76
-
77
- def self.concat(*locations)
78
- locations.inject {|l1, l2| l1 + l2 }
79
- end
80
-
81
- def pred?(loc)
82
- loc.is_a?(Location) &&
83
- loc.name == name &&
84
- loc.start_pos == end_pos
85
- end
86
-
87
- def to_json(*args)
88
- {
89
- start: {
90
- line: start_line,
91
- column: start_column
92
- },
93
- end: {
94
- line: end_line,
95
- column: end_column
96
- },
97
- buffer: {
98
- name: name&.to_s
99
- }
100
- }.to_json(*args)
101
- end
102
- end
103
- end
104
- end
@@ -1,125 +0,0 @@
1
- module Ruby
2
- module Signature
3
- class MethodType
4
- class Block
5
- attr_reader :type
6
- attr_reader :required
7
-
8
- def initialize(type:, required:)
9
- @type = type
10
- @required = required
11
- end
12
-
13
- def ==(other)
14
- other.is_a?(Block) &&
15
- other.type == type &&
16
- other.required == required
17
- end
18
-
19
- def to_json(*a)
20
- {
21
- type: type,
22
- required: required
23
- }.to_json(*a)
24
- end
25
-
26
- def sub(s)
27
- self.class.new(
28
- type: type.sub(s),
29
- required: required
30
- )
31
- end
32
- end
33
-
34
- attr_reader :type_params
35
- attr_reader :type
36
- attr_reader :block
37
- attr_reader :location
38
-
39
- def initialize(type_params:, type:, block:, location:)
40
- @type_params = type_params
41
- @type = type
42
- @block = block
43
- @location = location
44
- end
45
-
46
- def ==(other)
47
- other.is_a?(MethodType) &&
48
- other.type_params == type_params &&
49
- other.type == type &&
50
- other.block == block
51
- end
52
-
53
- def to_json(*a)
54
- {
55
- type_params: type_params,
56
- type: type,
57
- block: block,
58
- location: location
59
- }.to_json(*a)
60
- end
61
-
62
- def sub(s)
63
- s.without(*type_params).yield_self do |sub|
64
- map_type do |ty|
65
- ty.sub(sub)
66
- end
67
- end
68
- end
69
-
70
- def update(type_params: self.type_params, type: self.type, block: self.block, location: self.location)
71
- self.class.new(
72
- type_params: type_params,
73
- type: type,
74
- block: block,
75
- location: location
76
- )
77
- end
78
-
79
- def free_variables(set = Set.new)
80
- type.free_variables(set)
81
- block&.type&.free_variables(set)
82
- set.subtract(type_params)
83
- end
84
-
85
- def map_type(&block)
86
- self.class.new(
87
- type_params: type_params,
88
- type: type.map_type(&block),
89
- block: self.block&.yield_self do |b|
90
- Block.new(type: b.type.map_type(&block), required: b.required)
91
- end,
92
- location: location
93
- )
94
- end
95
-
96
- def each_type(&block)
97
- if block_given?
98
- type.each_type(&block)
99
- self.block&.yield_self do |b|
100
- b.type.each_type(&block)
101
- end
102
- else
103
- enum_for :each_type
104
- end
105
- end
106
-
107
- def to_s
108
- s = case
109
- when block && block.required
110
- "(#{type.param_to_s}) { (#{block.type.param_to_s}) -> #{block.type.return_to_s} } -> #{type.return_to_s}"
111
- when block
112
- "(#{type.param_to_s}) ?{ (#{block.type.param_to_s}) -> #{block.type.return_to_s} } -> #{type.return_to_s}"
113
- else
114
- "(#{type.param_to_s}) -> #{type.return_to_s}"
115
- end
116
-
117
- if type_params.empty?
118
- s
119
- else
120
- "[#{type_params.join(", ")}] #{s}"
121
- end
122
- end
123
- end
124
- end
125
- end
@@ -1,93 +0,0 @@
1
- module Ruby
2
- module Signature
3
- class Namespace
4
- attr_reader :path
5
-
6
- def initialize(path:, absolute:)
7
- @path = path
8
- @absolute = absolute
9
- end
10
-
11
- def self.empty
12
- new(path: [], absolute: false)
13
- end
14
-
15
- def self.root
16
- new(path: [], absolute: true)
17
- end
18
-
19
- def +(other)
20
- if other.absolute?
21
- other
22
- else
23
- self.class.new(path: path + other.path, absolute: absolute?)
24
- end
25
- end
26
-
27
- def append(component)
28
- self.class.new(path: path + [component], absolute: absolute?)
29
- end
30
-
31
- def parent
32
- raise "Parent with empty namespace" if empty?
33
- self.class.new(path: path.take(path.size - 1), absolute: absolute?)
34
- end
35
-
36
- def absolute?
37
- @absolute
38
- end
39
-
40
- def relative?
41
- !absolute?
42
- end
43
-
44
- def absolute!
45
- self.class.new(path: path, absolute: true)
46
- end
47
-
48
- def relative!
49
- self.class.new(path: path, absolute: false)
50
- end
51
-
52
- def empty?
53
- path.empty?
54
- end
55
-
56
- def ==(other)
57
- other.is_a?(Namespace) && other.path == path && other.absolute? == absolute?
58
- end
59
-
60
- alias eql? ==
61
-
62
- def hash
63
- self.class.hash ^ path.hash ^ absolute?.hash
64
- end
65
-
66
- def split
67
- [parent, path.last]
68
- end
69
-
70
- def to_s
71
- if empty?
72
- absolute? ? "::" : ""
73
- else
74
- s = path.join("::")
75
- absolute? ? "::#{s}::" : "#{s}::"
76
- end
77
- end
78
-
79
- def to_type_name
80
- parent, name = split
81
- TypeName.new(name: name, namespace: parent)
82
- end
83
-
84
- def self.parse(string)
85
- if string.start_with?("::")
86
- new(path: string.split("::").drop(1).map(&:to_sym), absolute: true)
87
- else
88
- new(path: string.split("::").map(&:to_sym), absolute: false)
89
- end
90
- end
91
- end
92
- end
93
- end