steep 0.13.0 → 0.16.2

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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/CHANGELOG.md +28 -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.rb +33 -1
  9. data/lib/steep/annotation_parser.rb +4 -4
  10. data/lib/steep/ast/buffer.rb +11 -7
  11. data/lib/steep/ast/builtin.rb +8 -0
  12. data/lib/steep/ast/types/factory.rb +124 -89
  13. data/lib/steep/cli.rb +16 -1
  14. data/lib/steep/drivers/annotations.rb +1 -1
  15. data/lib/steep/drivers/check.rb +20 -4
  16. data/lib/steep/drivers/init.rb +5 -5
  17. data/lib/steep/drivers/langserver.rb +13 -287
  18. data/lib/steep/drivers/utils/driver_helper.rb +1 -1
  19. data/lib/steep/drivers/vendor.rb +2 -2
  20. data/lib/steep/drivers/watch.rb +97 -85
  21. data/lib/steep/drivers/worker.rb +51 -0
  22. data/lib/steep/project.rb +9 -5
  23. data/lib/steep/project/completion_provider.rb +298 -0
  24. data/lib/steep/project/dsl.rb +14 -0
  25. data/lib/steep/project/file.rb +54 -47
  26. data/lib/steep/project/hover_content.rb +17 -8
  27. data/lib/steep/project/options.rb +25 -3
  28. data/lib/steep/project/target.rb +40 -24
  29. data/lib/steep/server/base_worker.rb +56 -0
  30. data/lib/steep/server/code_worker.rb +151 -0
  31. data/lib/steep/server/interaction_worker.rb +281 -0
  32. data/lib/steep/server/master.rb +196 -0
  33. data/lib/steep/server/signature_worker.rb +148 -0
  34. data/lib/steep/server/utils.rb +36 -0
  35. data/lib/steep/server/worker_process.rb +62 -0
  36. data/lib/steep/signature/errors.rb +1 -1
  37. data/lib/steep/signature/validator.rb +13 -13
  38. data/lib/steep/source.rb +1 -1
  39. data/lib/steep/type_construction.rb +1004 -727
  40. data/lib/steep/type_inference/constant_env.rb +3 -11
  41. data/lib/steep/type_inference/context.rb +8 -3
  42. data/lib/steep/type_inference/context_array.rb +111 -0
  43. data/lib/steep/type_inference/local_variable_type_env.rb +226 -0
  44. data/lib/steep/type_inference/logic.rb +130 -0
  45. data/lib/steep/type_inference/type_env.rb +5 -69
  46. data/lib/steep/typing.rb +91 -23
  47. data/lib/steep/version.rb +1 -1
  48. data/smoke/alias/Steepfile +1 -0
  49. data/smoke/alias/a.rb +1 -1
  50. data/smoke/and/Steepfile +1 -0
  51. data/smoke/array/Steepfile +1 -0
  52. data/smoke/array/b.rb +0 -2
  53. data/smoke/block/Steepfile +1 -0
  54. data/smoke/case/Steepfile +1 -0
  55. data/smoke/class/Steepfile +1 -0
  56. data/smoke/const/Steepfile +1 -0
  57. data/smoke/dstr/Steepfile +1 -0
  58. data/smoke/ensure/Steepfile +1 -0
  59. data/smoke/enumerator/Steepfile +1 -0
  60. data/smoke/extension/Steepfile +1 -0
  61. data/smoke/extension/c.rb +1 -0
  62. data/smoke/hash/Steepfile +1 -0
  63. data/smoke/hello/Steepfile +1 -0
  64. data/smoke/if/Steepfile +1 -0
  65. data/smoke/if/a.rb +1 -1
  66. data/smoke/implements/Steepfile +1 -0
  67. data/smoke/initialize/Steepfile +1 -0
  68. data/smoke/integer/Steepfile +1 -0
  69. data/smoke/interface/Steepfile +1 -0
  70. data/smoke/kwbegin/Steepfile +1 -0
  71. data/smoke/lambda/Steepfile +1 -0
  72. data/smoke/literal/Steepfile +1 -0
  73. data/smoke/map/Steepfile +1 -0
  74. data/smoke/method/Steepfile +1 -0
  75. data/smoke/module/Steepfile +1 -0
  76. data/smoke/regexp/Steepfile +1 -0
  77. data/smoke/regexp/b.rb +4 -4
  78. data/smoke/regression/Steepfile +1 -0
  79. data/smoke/rescue/Steepfile +1 -0
  80. data/smoke/rescue/a.rb +1 -1
  81. data/smoke/self/Steepfile +1 -0
  82. data/smoke/skip/Steepfile +1 -0
  83. data/smoke/stdout/Steepfile +1 -0
  84. data/smoke/super/Steepfile +1 -0
  85. data/smoke/type_case/Steepfile +1 -0
  86. data/smoke/yield/Steepfile +1 -0
  87. data/steep.gemspec +8 -8
  88. metadata +38 -138
  89. data/exe/rbs +0 -3
  90. data/exe/ruby-signature +0 -3
  91. data/vendor/ruby-signature/.github/workflows/ruby.yml +0 -27
  92. data/vendor/ruby-signature/.gitignore +0 -12
  93. data/vendor/ruby-signature/.rubocop.yml +0 -15
  94. data/vendor/ruby-signature/BSDL +0 -22
  95. data/vendor/ruby-signature/COPYING +0 -56
  96. data/vendor/ruby-signature/Gemfile +0 -6
  97. data/vendor/ruby-signature/README.md +0 -93
  98. data/vendor/ruby-signature/Rakefile +0 -66
  99. data/vendor/ruby-signature/bin/annotate-with-rdoc +0 -156
  100. data/vendor/ruby-signature/bin/console +0 -14
  101. data/vendor/ruby-signature/bin/query-rdoc +0 -103
  102. data/vendor/ruby-signature/bin/setup +0 -10
  103. data/vendor/ruby-signature/bin/sort +0 -88
  104. data/vendor/ruby-signature/bin/test_runner.rb +0 -17
  105. data/vendor/ruby-signature/docs/CONTRIBUTING.md +0 -97
  106. data/vendor/ruby-signature/docs/sigs.md +0 -148
  107. data/vendor/ruby-signature/docs/stdlib.md +0 -152
  108. data/vendor/ruby-signature/docs/syntax.md +0 -528
  109. data/vendor/ruby-signature/exe/rbs +0 -3
  110. data/vendor/ruby-signature/exe/ruby-signature +0 -7
  111. data/vendor/ruby-signature/lib/ruby/signature.rb +0 -64
  112. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +0 -29
  113. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +0 -29
  114. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +0 -391
  115. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +0 -364
  116. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +0 -52
  117. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +0 -54
  118. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +0 -534
  119. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +0 -28
  120. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +0 -152
  121. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +0 -172
  122. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +0 -921
  123. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +0 -283
  124. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +0 -138
  125. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +0 -126
  126. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +0 -189
  127. data/vendor/ruby-signature/lib/ruby/signature/location.rb +0 -104
  128. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +0 -125
  129. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +0 -93
  130. data/vendor/ruby-signature/lib/ruby/signature/parser.y +0 -1343
  131. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +0 -441
  132. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +0 -579
  133. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +0 -383
  134. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +0 -48
  135. data/vendor/ruby-signature/lib/ruby/signature/test.rb +0 -28
  136. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +0 -63
  137. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +0 -290
  138. data/vendor/ruby-signature/lib/ruby/signature/test/setup.rb +0 -58
  139. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +0 -324
  140. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +0 -185
  141. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +0 -256
  142. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +0 -72
  143. data/vendor/ruby-signature/lib/ruby/signature/types.rb +0 -932
  144. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +0 -140
  145. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +0 -49
  146. data/vendor/ruby-signature/lib/ruby/signature/version.rb +0 -5
  147. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +0 -271
  148. data/vendor/ruby-signature/ruby-signature.gemspec +0 -45
  149. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +0 -3
  150. data/vendor/ruby-signature/stdlib/base64/base64.rbs +0 -15
  151. data/vendor/ruby-signature/stdlib/builtin/array.rbs +0 -1997
  152. data/vendor/ruby-signature/stdlib/builtin/basic_object.rbs +0 -280
  153. data/vendor/ruby-signature/stdlib/builtin/binding.rbs +0 -177
  154. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +0 -35
  155. data/vendor/ruby-signature/stdlib/builtin/class.rbs +0 -145
  156. data/vendor/ruby-signature/stdlib/builtin/comparable.rbs +0 -116
  157. data/vendor/ruby-signature/stdlib/builtin/complex.rbs +0 -400
  158. data/vendor/ruby-signature/stdlib/builtin/constants.rbs +0 -37
  159. data/vendor/ruby-signature/stdlib/builtin/data.rbs +0 -5
  160. data/vendor/ruby-signature/stdlib/builtin/deprecated.rbs +0 -2
  161. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +0 -419
  162. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +0 -606
  163. data/vendor/ruby-signature/stdlib/builtin/enumerable.rbs +0 -404
  164. data/vendor/ruby-signature/stdlib/builtin/enumerator.rbs +0 -260
  165. data/vendor/ruby-signature/stdlib/builtin/errno.rbs +0 -781
  166. data/vendor/ruby-signature/stdlib/builtin/errors.rbs +0 -582
  167. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +0 -193
  168. data/vendor/ruby-signature/stdlib/builtin/false_class.rbs +0 -40
  169. data/vendor/ruby-signature/stdlib/builtin/fiber.rbs +0 -68
  170. data/vendor/ruby-signature/stdlib/builtin/fiber_error.rbs +0 -12
  171. data/vendor/ruby-signature/stdlib/builtin/file.rbs +0 -476
  172. data/vendor/ruby-signature/stdlib/builtin/file_test.rbs +0 -59
  173. data/vendor/ruby-signature/stdlib/builtin/float.rbs +0 -696
  174. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +0 -121
  175. data/vendor/ruby-signature/stdlib/builtin/hash.rbs +0 -1029
  176. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +0 -710
  177. data/vendor/ruby-signature/stdlib/builtin/io.rbs +0 -683
  178. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +0 -574
  179. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +0 -135
  180. data/vendor/ruby-signature/stdlib/builtin/match_data.rbs +0 -141
  181. data/vendor/ruby-signature/stdlib/builtin/math.rbs +0 -66
  182. data/vendor/ruby-signature/stdlib/builtin/method.rbs +0 -182
  183. data/vendor/ruby-signature/stdlib/builtin/module.rbs +0 -248
  184. data/vendor/ruby-signature/stdlib/builtin/nil_class.rbs +0 -82
  185. data/vendor/ruby-signature/stdlib/builtin/numeric.rbs +0 -409
  186. data/vendor/ruby-signature/stdlib/builtin/object.rbs +0 -824
  187. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +0 -426
  188. data/vendor/ruby-signature/stdlib/builtin/process.rbs +0 -354
  189. data/vendor/ruby-signature/stdlib/builtin/random.rbs +0 -93
  190. data/vendor/ruby-signature/stdlib/builtin/range.rbs +0 -226
  191. data/vendor/ruby-signature/stdlib/builtin/rational.rbs +0 -424
  192. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +0 -10
  193. data/vendor/ruby-signature/stdlib/builtin/regexp.rbs +0 -131
  194. data/vendor/ruby-signature/stdlib/builtin/ruby_vm.rbs +0 -14
  195. data/vendor/ruby-signature/stdlib/builtin/signal.rbs +0 -55
  196. data/vendor/ruby-signature/stdlib/builtin/string.rbs +0 -770
  197. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +0 -13
  198. data/vendor/ruby-signature/stdlib/builtin/struct.rbs +0 -40
  199. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +0 -230
  200. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +0 -1112
  201. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +0 -23
  202. data/vendor/ruby-signature/stdlib/builtin/time.rbs +0 -739
  203. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +0 -91
  204. data/vendor/ruby-signature/stdlib/builtin/true_class.rbs +0 -46
  205. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +0 -159
  206. data/vendor/ruby-signature/stdlib/builtin/warning.rbs +0 -17
  207. data/vendor/ruby-signature/stdlib/erb/erb.rbs +0 -18
  208. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -44
  209. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +0 -21
  210. data/vendor/ruby-signature/stdlib/prime/integer-extension.rbs +0 -23
  211. data/vendor/ruby-signature/stdlib/prime/prime.rbs +0 -188
  212. data/vendor/ruby-signature/stdlib/securerandom/securerandom.rbs +0 -9
  213. data/vendor/ruby-signature/stdlib/set/set.rbs +0 -77
  214. data/vendor/ruby-signature/stdlib/tmpdir/tmpdir.rbs +0 -53
@@ -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