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
@@ -0,0 +1,187 @@
1
+ module RBS
2
+ class InvalidTypeApplicationError < StandardError
3
+ attr_reader :type_name
4
+ attr_reader :args
5
+ attr_reader :params
6
+ attr_reader :location
7
+
8
+ def initialize(type_name:, args:, params:, location:)
9
+ @type_name = type_name
10
+ @args = args
11
+ @params = params
12
+ @location = location
13
+ super "#{Location.to_string location}: #{type_name} expects parameters [#{params.each.map(&:name).join(", ")}], but given args [#{args.join(", ")}]"
14
+ end
15
+
16
+ def self.check!(type_name:, args:, params:, location:)
17
+ unless args.size == params.size
18
+ raise new(type_name: type_name, args: args, params: params, location: location)
19
+ end
20
+ end
21
+ end
22
+
23
+ class InvalidExtensionParameterError < StandardError
24
+ attr_reader :type_name
25
+ attr_reader :extension_name
26
+ attr_reader :location
27
+ attr_reader :extension_params
28
+ attr_reader :class_params
29
+
30
+ def initialize(type_name:, extension_name:, extension_params:, class_params:, location:)
31
+ @type_name = type_name
32
+ @extension_name = extension_name
33
+ @extension_params = extension_params
34
+ @class_params = class_params
35
+ @location = location
36
+
37
+ super "#{Location.to_string location}: Expected #{class_params.size} parameters to #{type_name} (#{extension_name}) but has #{extension_params.size} parameters"
38
+ end
39
+
40
+ def self.check!(type_name:, extension_name:, extension_params:, class_params:, location:)
41
+ unless extension_params.size == class_params.size
42
+ raise new(type_name: type_name,
43
+ extension_name: extension_name,
44
+ extension_params: extension_params,
45
+ class_params: class_params,
46
+ location: location)
47
+ end
48
+ end
49
+ end
50
+
51
+ class RecursiveAncestorError < StandardError
52
+ attr_reader :ancestors
53
+ attr_reader :location
54
+
55
+ def initialize(ancestors:, location:)
56
+ last = case last = ancestors.last
57
+ when Definition::Ancestor::Singleton
58
+ "singleton(#{last.name})"
59
+ when Definition::Ancestor::Instance
60
+ if last.args.empty?
61
+ last.name.to_s
62
+ else
63
+ "#{last.name}[#{last.args.join(", ")}]"
64
+ end
65
+ end
66
+
67
+ super "#{Location.to_string location}: Detected recursive ancestors: #{last}"
68
+ end
69
+
70
+ def self.check!(self_ancestor, ancestors:, location:)
71
+ case self_ancestor
72
+ when Definition::Ancestor::Instance
73
+ if ancestors.any? {|a| a.is_a?(Definition::Ancestor::Instance) && a.name == self_ancestor.name }
74
+ raise new(ancestors: ancestors + [self_ancestor], location: location)
75
+ end
76
+ when Definition::Ancestor::Singleton
77
+ if ancestors.include?(self_ancestor)
78
+ raise new(ancestors: ancestors + [self_ancestor], location: location)
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ class NoTypeFoundError < StandardError
85
+ attr_reader :type_name
86
+ attr_reader :location
87
+
88
+ def initialize(type_name:, location:)
89
+ @type_name = type_name
90
+ @location = location
91
+
92
+ super "#{Location.to_string location}: Could not find #{type_name}"
93
+ end
94
+
95
+ def self.check!(type_name, env:, location:)
96
+ env.find_type_decl(type_name) or
97
+ raise new(type_name: type_name, location: location)
98
+
99
+ type_name
100
+ end
101
+ end
102
+
103
+ class DuplicatedMethodDefinitionError < StandardError
104
+ attr_reader :decl
105
+ attr_reader :location
106
+
107
+ def initialize(decl:, name:, location:)
108
+ decl_str = case decl
109
+ when AST::Declarations::Interface, AST::Declarations::Class, AST::Declarations::Module
110
+ decl.name.to_s
111
+ when AST::Declarations::Extension
112
+ "#{decl.name} (#{decl.extension_name})"
113
+ end
114
+
115
+ super "#{Location.to_string location}: #{decl_str} has duplicated method definition: #{name}"
116
+ end
117
+
118
+ def self.check!(decl:, methods:, name:, location:)
119
+ if methods.key?(name)
120
+ raise new(decl: decl, name: name, location: location)
121
+ end
122
+ end
123
+ end
124
+
125
+ class UnknownMethodAliasError < StandardError
126
+ attr_reader :original_name
127
+ attr_reader :aliased_name
128
+ attr_reader :location
129
+
130
+ def initialize(original_name:, aliased_name:, location:)
131
+ @original_name = original_name
132
+ @aliased_name = aliased_name
133
+ @location = location
134
+
135
+ super "#{Location.to_string location}: Unknown method alias name: #{original_name} => #{aliased_name}"
136
+ end
137
+
138
+ def self.check!(methods:, original_name:, aliased_name:, location:)
139
+ unless methods.key?(original_name)
140
+ raise new(original_name: original_name, aliased_name: aliased_name, location: location)
141
+ end
142
+ end
143
+ end
144
+
145
+ class DuplicatedDeclarationError < StandardError
146
+ attr_reader :name
147
+ attr_reader :decls
148
+
149
+ def initialize(name, *decls)
150
+ @name = name
151
+ @decls = decls
152
+
153
+ super "#{Location.to_string decls.last.location}: Duplicated declaration: #{name}"
154
+ end
155
+ end
156
+
157
+ class InvalidVarianceAnnotationError < StandardError
158
+ MethodTypeError = Struct.new(:method_name, :method_type, :param, keyword_init: true)
159
+ InheritanceError = Struct.new(:super_class, :param, keyword_init: true)
160
+ MixinError = Struct.new(:include_member, :param, keyword_init: true)
161
+
162
+ attr_reader :decl
163
+ attr_reader :errors
164
+
165
+ def initialize(decl:, errors:)
166
+ @decl = decl
167
+ @errors = errors
168
+
169
+ message = [
170
+ "#{Location.to_string decl.location}: Invalid variance annotation: #{decl.name}"
171
+ ]
172
+
173
+ errors.each do |error|
174
+ case error
175
+ when MethodTypeError
176
+ message << " MethodTypeError (#{error.param.name}): on `#{error.method_name}` #{error.method_type.to_s} (#{error.method_type.location&.start_line})"
177
+ when InheritanceError
178
+ message << " InheritanceError: #{error.super_class}"
179
+ when MixinError
180
+ message << " MixinError: #{error.include_member.name} (#{error.include_member.location&.start_line})"
181
+ end
182
+ end
183
+
184
+ super message.join("\n")
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,102 @@
1
+ module RBS
2
+ class Location
3
+ attr_reader :buffer
4
+ attr_reader :start_pos
5
+ attr_reader :end_pos
6
+
7
+ def initialize(buffer:, start_pos:, end_pos:)
8
+ @buffer = buffer
9
+ @start_pos = start_pos
10
+ @end_pos = end_pos
11
+ end
12
+
13
+ def inspect
14
+ "#<#{self.class}:#{self.__id__} @buffer=#{buffer.name}, @pos=#{start_pos}...#{end_pos}, source='#{source.lines.first}', start_line=#{start_line}, start_column=#{start_column}>"
15
+ end
16
+
17
+ def name
18
+ buffer.name
19
+ end
20
+
21
+ def start_line
22
+ start_loc[0]
23
+ end
24
+
25
+ def start_column
26
+ start_loc[1]
27
+ end
28
+
29
+ def end_line
30
+ end_loc[0]
31
+ end
32
+
33
+ def end_column
34
+ end_loc[1]
35
+ end
36
+
37
+ def start_loc
38
+ @start_loc ||= buffer.pos_to_loc(start_pos)
39
+ end
40
+
41
+ def end_loc
42
+ @end_loc ||= buffer.pos_to_loc(end_pos)
43
+ end
44
+
45
+ def source
46
+ @source ||= buffer.content[start_pos...end_pos]
47
+ end
48
+
49
+ def to_s
50
+ "#{name || "-"}:#{start_line}:#{start_column}...#{end_line}:#{end_column}"
51
+ end
52
+
53
+ def self.to_string(location, default: "*:*:*...*:*")
54
+ location&.to_s || default
55
+ end
56
+
57
+ def ==(other)
58
+ other.is_a?(Location) &&
59
+ other.buffer == buffer &&
60
+ other.start_pos == start_pos &&
61
+ other.end_pos == end_pos
62
+ end
63
+
64
+ def +(other)
65
+ if other
66
+ raise "Invalid concat: buffer=#{buffer.name}, other.buffer=#{other.buffer.name}" unless other.buffer == buffer
67
+
68
+ self.class.new(buffer: buffer,
69
+ start_pos: start_pos,
70
+ end_pos: other.end_pos)
71
+ else
72
+ self
73
+ end
74
+ end
75
+
76
+ def self.concat(*locations)
77
+ locations.inject {|l1, l2| l1 + l2 }
78
+ end
79
+
80
+ def pred?(loc)
81
+ loc.is_a?(Location) &&
82
+ loc.name == name &&
83
+ loc.start_pos == end_pos
84
+ end
85
+
86
+ def to_json(*args)
87
+ {
88
+ start: {
89
+ line: start_line,
90
+ column: start_column
91
+ },
92
+ end: {
93
+ line: end_line,
94
+ column: end_column
95
+ },
96
+ buffer: {
97
+ name: name&.to_s
98
+ }
99
+ }.to_json(*args)
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,123 @@
1
+ module RBS
2
+ class MethodType
3
+ class Block
4
+ attr_reader :type
5
+ attr_reader :required
6
+
7
+ def initialize(type:, required:)
8
+ @type = type
9
+ @required = required
10
+ end
11
+
12
+ def ==(other)
13
+ other.is_a?(Block) &&
14
+ other.type == type &&
15
+ other.required == required
16
+ end
17
+
18
+ def to_json(*a)
19
+ {
20
+ type: type,
21
+ required: required
22
+ }.to_json(*a)
23
+ end
24
+
25
+ def sub(s)
26
+ self.class.new(
27
+ type: type.sub(s),
28
+ required: required
29
+ )
30
+ end
31
+ end
32
+
33
+ attr_reader :type_params
34
+ attr_reader :type
35
+ attr_reader :block
36
+ attr_reader :location
37
+
38
+ def initialize(type_params:, type:, block:, location:)
39
+ @type_params = type_params
40
+ @type = type
41
+ @block = block
42
+ @location = location
43
+ end
44
+
45
+ def ==(other)
46
+ other.is_a?(MethodType) &&
47
+ other.type_params == type_params &&
48
+ other.type == type &&
49
+ other.block == block
50
+ end
51
+
52
+ def to_json(*a)
53
+ {
54
+ type_params: type_params,
55
+ type: type,
56
+ block: block,
57
+ location: location
58
+ }.to_json(*a)
59
+ end
60
+
61
+ def sub(s)
62
+ s.without(*type_params).yield_self do |sub|
63
+ map_type do |ty|
64
+ ty.sub(sub)
65
+ end
66
+ end
67
+ end
68
+
69
+ def update(type_params: self.type_params, type: self.type, block: self.block, location: self.location)
70
+ self.class.new(
71
+ type_params: type_params,
72
+ type: type,
73
+ block: block,
74
+ location: location
75
+ )
76
+ end
77
+
78
+ def free_variables(set = Set.new)
79
+ type.free_variables(set)
80
+ block&.type&.free_variables(set)
81
+ set.subtract(type_params)
82
+ end
83
+
84
+ def map_type(&block)
85
+ self.class.new(
86
+ type_params: type_params,
87
+ type: type.map_type(&block),
88
+ block: self.block&.yield_self do |b|
89
+ Block.new(type: b.type.map_type(&block), required: b.required)
90
+ end,
91
+ location: location
92
+ )
93
+ end
94
+
95
+ def each_type(&block)
96
+ if block_given?
97
+ type.each_type(&block)
98
+ self.block&.yield_self do |b|
99
+ b.type.each_type(&block)
100
+ end
101
+ else
102
+ enum_for :each_type
103
+ end
104
+ end
105
+
106
+ def to_s
107
+ s = case
108
+ when block && block.required
109
+ "(#{type.param_to_s}) { (#{block.type.param_to_s}) -> #{block.type.return_to_s} } -> #{type.return_to_s}"
110
+ when block
111
+ "(#{type.param_to_s}) ?{ (#{block.type.param_to_s}) -> #{block.type.return_to_s} } -> #{type.return_to_s}"
112
+ else
113
+ "(#{type.param_to_s}) -> #{type.return_to_s}"
114
+ end
115
+
116
+ if type_params.empty?
117
+ s
118
+ else
119
+ "[#{type_params.join(", ")}] #{s}"
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,91 @@
1
+ module RBS
2
+ class Namespace
3
+ attr_reader :path
4
+
5
+ def initialize(path:, absolute:)
6
+ @path = path
7
+ @absolute = absolute
8
+ end
9
+
10
+ def self.empty
11
+ new(path: [], absolute: false)
12
+ end
13
+
14
+ def self.root
15
+ new(path: [], absolute: true)
16
+ end
17
+
18
+ def +(other)
19
+ if other.absolute?
20
+ other
21
+ else
22
+ self.class.new(path: path + other.path, absolute: absolute?)
23
+ end
24
+ end
25
+
26
+ def append(component)
27
+ self.class.new(path: path + [component], absolute: absolute?)
28
+ end
29
+
30
+ def parent
31
+ raise "Parent with empty namespace" if empty?
32
+ self.class.new(path: path.take(path.size - 1), absolute: absolute?)
33
+ end
34
+
35
+ def absolute?
36
+ @absolute
37
+ end
38
+
39
+ def relative?
40
+ !absolute?
41
+ end
42
+
43
+ def absolute!
44
+ self.class.new(path: path, absolute: true)
45
+ end
46
+
47
+ def relative!
48
+ self.class.new(path: path, absolute: false)
49
+ end
50
+
51
+ def empty?
52
+ path.empty?
53
+ end
54
+
55
+ def ==(other)
56
+ other.is_a?(Namespace) && other.path == path && other.absolute? == absolute?
57
+ end
58
+
59
+ alias eql? ==
60
+
61
+ def hash
62
+ self.class.hash ^ path.hash ^ absolute?.hash
63
+ end
64
+
65
+ def split
66
+ [parent, path.last]
67
+ end
68
+
69
+ def to_s
70
+ if empty?
71
+ absolute? ? "::" : ""
72
+ else
73
+ s = path.join("::")
74
+ absolute? ? "::#{s}::" : "#{s}::"
75
+ end
76
+ end
77
+
78
+ def to_type_name
79
+ parent, name = split
80
+ TypeName.new(name: name, namespace: parent)
81
+ end
82
+
83
+ def self.parse(string)
84
+ if string.start_with?("::")
85
+ new(path: string.split("::").drop(1).map(&:to_sym), absolute: true)
86
+ else
87
+ new(path: string.split("::").map(&:to_sym), absolute: false)
88
+ end
89
+ end
90
+ end
91
+ end
@@ -5,19 +5,18 @@
5
5
  #
6
6
 
7
7
  require 'racc/parser.rb'
8
- module Ruby
9
- module Signature
10
- class Parser < Racc::Parser
8
+ module RBS
9
+ class Parser < Racc::Parser
11
10
 
12
11
  module_eval(<<'...end parser.y/module_eval...', 'parser.y', 995)
13
12
 
14
- Types = Ruby::Signature::Types
15
- Namespace = Ruby::Signature::Namespace
16
- TypeName = Ruby::Signature::TypeName
17
- Declarations = Ruby::Signature::AST::Declarations
18
- Members = Ruby::Signature::AST::Members
19
- MethodType = Ruby::Signature::MethodType
20
- Annotation = Ruby::Signature::AST::Annotation
13
+ Types = RBS::Types
14
+ Namespace = RBS::Namespace
15
+ TypeName = RBS::TypeName
16
+ Declarations = RBS::AST::Declarations
17
+ Members = RBS::AST::Members
18
+ MethodType = RBS::MethodType
19
+ Annotation = RBS::AST::Annotation
21
20
 
22
21
  class LocatedValue
23
22
  attr_reader :location
@@ -69,10 +68,10 @@ end
69
68
 
70
69
  def self.parse_signature(input, eof_re: nil)
71
70
  case input
72
- when Ruby::Signature::Buffer
71
+ when RBS::Buffer
73
72
  buffer = input
74
73
  else
75
- buffer = Ruby::Signature::Buffer.new(name: nil, content: input.to_s)
74
+ buffer = RBS::Buffer.new(name: nil, content: input.to_s)
76
75
  end
77
76
 
78
77
  self.new(:SIGNATURE, buffer: buffer, eof_re: eof_re).do_parse
@@ -80,10 +79,10 @@ end
80
79
 
81
80
  def self.parse_type(input, variables: [], eof_re: nil)
82
81
  case input
83
- when Ruby::Signature::Buffer
82
+ when RBS::Buffer
84
83
  buffer = input
85
84
  else
86
- buffer = Ruby::Signature::Buffer.new(name: nil, content: input.to_s)
85
+ buffer = RBS::Buffer.new(name: nil, content: input.to_s)
87
86
  end
88
87
 
89
88
  self.new(:TYPE, buffer: buffer, eof_re: eof_re).yield_self do |parser|
@@ -101,10 +100,10 @@ end
101
100
 
102
101
  def self.parse_method_type(input, variables: [], eof_re: nil)
103
102
  case input
104
- when Ruby::Signature::Buffer
103
+ when RBS::Buffer
105
104
  buffer = input
106
105
  else
107
- buffer = Ruby::Signature::Buffer.new(name: nil, content: input.to_s)
106
+ buffer = RBS::Buffer.new(name: nil, content: input.to_s)
108
107
  end
109
108
 
110
109
  self.new(:METHODTYPE, buffer: buffer, eof_re: eof_re).yield_self do |parser|
@@ -140,7 +139,7 @@ def new_token(type, value = input.matched)
140
139
  start_index = input.charpos - input.matched.size
141
140
  end_index = input.charpos
142
141
 
143
- location = Ruby::Signature::Location.new(buffer: buffer,
142
+ location = RBS::Location.new(buffer: buffer,
144
143
  start_pos: start_index,
145
144
  end_pos: end_index)
146
145
 
@@ -262,11 +261,11 @@ def next_token
262
261
  case
263
262
  when input.scan(/\s+/)
264
263
  # skip
265
- when input.scan(/#(( *)|( (?<string>.*)))\n/)
264
+ when input.scan(/#(( *)|( ?(?<string>.*)))\n/)
266
265
  start_index = input.charpos - input.matched.size
267
266
  end_index = input.charpos-1
268
267
 
269
- location = Ruby::Signature::Location.new(buffer: buffer,
268
+ location = RBS::Location.new(buffer: buffer,
270
269
  start_pos: start_index,
271
270
  end_pos: end_index)
272
271
 
@@ -2369,7 +2368,7 @@ module_eval(<<'.,.,', 'parser.y', 646)
2369
2368
 
2370
2369
  module_eval(<<'.,.,', 'parser.y', 649)
2371
2370
  def _reduce_153(val, _values, result)
2372
- Ruby::Signature.logger.warn "`any` type is deprecated. Use `untyped` instead. (#{val[0].location.to_s})"
2371
+ RBS.logger.warn "`any` type is deprecated. Use `untyped` instead. (#{val[0].location.to_s})"
2373
2372
  result = Types::Bases::Any.new(location: val[0].location)
2374
2373
 
2375
2374
  result
@@ -2998,8 +2997,7 @@ def _reduce_none(val, _values, result)
2998
2997
  val[0]
2999
2998
  end
3000
2999
 
3001
- end # class Parser
3002
- end # module Signature
3003
- end # module Ruby
3000
+ end # class Parser
3001
+ end # module RBS
3004
3002
 
3005
3003
 
@@ -1,4 +1,4 @@
1
- class Ruby::Signature::Parser
1
+ class RBS::Parser
2
2
  token tUIDENT tLIDENT tNAMESPACE tINTERFACEIDENT tLKEYWORD tUKEYWORD tGLOBALIDENT
3
3
  tIVAR tCLASSVAR
4
4
  tANNOTATION
@@ -647,7 +647,7 @@ rule
647
647
  result = Types::Bases::Void.new(location: val[0].location)
648
648
  }
649
649
  | kANY {
650
- Ruby::Signature.logger.warn "`any` type is deprecated. Use `untyped` instead. (#{val[0].location.to_s})"
650
+ RBS.logger.warn "`any` type is deprecated. Use `untyped` instead. (#{val[0].location.to_s})"
651
651
  result = Types::Bases::Any.new(location: val[0].location)
652
652
  }
653
653
  | kUNTYPED {
@@ -993,13 +993,13 @@ end
993
993
 
994
994
  ---- inner
995
995
 
996
- Types = Ruby::Signature::Types
997
- Namespace = Ruby::Signature::Namespace
998
- TypeName = Ruby::Signature::TypeName
999
- Declarations = Ruby::Signature::AST::Declarations
1000
- Members = Ruby::Signature::AST::Members
1001
- MethodType = Ruby::Signature::MethodType
1002
- Annotation = Ruby::Signature::AST::Annotation
996
+ Types = RBS::Types
997
+ Namespace = RBS::Namespace
998
+ TypeName = RBS::TypeName
999
+ Declarations = RBS::AST::Declarations
1000
+ Members = RBS::AST::Members
1001
+ MethodType = RBS::MethodType
1002
+ Annotation = RBS::AST::Annotation
1003
1003
 
1004
1004
  class LocatedValue
1005
1005
  attr_reader :location
@@ -1051,10 +1051,10 @@ end
1051
1051
 
1052
1052
  def self.parse_signature(input, eof_re: nil)
1053
1053
  case input
1054
- when Ruby::Signature::Buffer
1054
+ when RBS::Buffer
1055
1055
  buffer = input
1056
1056
  else
1057
- buffer = Ruby::Signature::Buffer.new(name: nil, content: input.to_s)
1057
+ buffer = RBS::Buffer.new(name: nil, content: input.to_s)
1058
1058
  end
1059
1059
 
1060
1060
  self.new(:SIGNATURE, buffer: buffer, eof_re: eof_re).do_parse
@@ -1062,10 +1062,10 @@ end
1062
1062
 
1063
1063
  def self.parse_type(input, variables: [], eof_re: nil)
1064
1064
  case input
1065
- when Ruby::Signature::Buffer
1065
+ when RBS::Buffer
1066
1066
  buffer = input
1067
1067
  else
1068
- buffer = Ruby::Signature::Buffer.new(name: nil, content: input.to_s)
1068
+ buffer = RBS::Buffer.new(name: nil, content: input.to_s)
1069
1069
  end
1070
1070
 
1071
1071
  self.new(:TYPE, buffer: buffer, eof_re: eof_re).yield_self do |parser|
@@ -1083,10 +1083,10 @@ end
1083
1083
 
1084
1084
  def self.parse_method_type(input, variables: [], eof_re: nil)
1085
1085
  case input
1086
- when Ruby::Signature::Buffer
1086
+ when RBS::Buffer
1087
1087
  buffer = input
1088
1088
  else
1089
- buffer = Ruby::Signature::Buffer.new(name: nil, content: input.to_s)
1089
+ buffer = RBS::Buffer.new(name: nil, content: input.to_s)
1090
1090
  end
1091
1091
 
1092
1092
  self.new(:METHODTYPE, buffer: buffer, eof_re: eof_re).yield_self do |parser|
@@ -1122,7 +1122,7 @@ def new_token(type, value = input.matched)
1122
1122
  start_index = input.charpos - input.matched.size
1123
1123
  end_index = input.charpos
1124
1124
 
1125
- location = Ruby::Signature::Location.new(buffer: buffer,
1125
+ location = RBS::Location.new(buffer: buffer,
1126
1126
  start_pos: start_index,
1127
1127
  end_pos: end_index)
1128
1128
 
@@ -1244,11 +1244,11 @@ def next_token
1244
1244
  case
1245
1245
  when input.scan(/\s+/)
1246
1246
  # skip
1247
- when input.scan(/#(( *)|( (?<string>.*)))\n/)
1247
+ when input.scan(/#(( *)|( ?(?<string>.*)))\n/)
1248
1248
  start_index = input.charpos - input.matched.size
1249
1249
  end_index = input.charpos-1
1250
1250
 
1251
- location = Ruby::Signature::Location.new(buffer: buffer,
1251
+ location = RBS::Location.new(buffer: buffer,
1252
1252
  start_pos: start_index,
1253
1253
  end_pos: end_index)
1254
1254