steep 0.11.1 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (299) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +27 -0
  3. data/.gitmodules +3 -0
  4. data/CHANGELOG.md +5 -0
  5. data/README.md +48 -90
  6. data/Rakefile +10 -6
  7. data/Steepfile +1 -0
  8. data/bin/setup +1 -0
  9. data/bin/smoke_runner.rb +9 -14
  10. data/exe/rbs +3 -0
  11. data/exe/ruby-signature +3 -0
  12. data/exe/steep +1 -0
  13. data/lib/steep.rb +32 -26
  14. data/lib/steep/annotation_parser.rb +167 -0
  15. data/lib/steep/ast/annotation/collection.rb +7 -7
  16. data/lib/steep/ast/types.rb +60 -0
  17. data/lib/steep/ast/types/any.rb +1 -1
  18. data/lib/steep/ast/types/factory.rb +535 -0
  19. data/lib/steep/ast/types/name.rb +3 -3
  20. data/lib/steep/ast/types/var.rb +1 -1
  21. data/lib/steep/cli.rb +56 -240
  22. data/lib/steep/drivers/annotations.rb +36 -19
  23. data/lib/steep/drivers/check.rb +55 -91
  24. data/lib/steep/drivers/init.rb +54 -0
  25. data/lib/steep/drivers/langserver.rb +241 -150
  26. data/lib/steep/drivers/print_project.rb +56 -0
  27. data/lib/steep/drivers/signature_error_printer.rb +25 -0
  28. data/lib/steep/drivers/trace_printer.rb +25 -0
  29. data/lib/steep/drivers/utils/driver_helper.rb +26 -0
  30. data/lib/steep/drivers/validate.rb +18 -38
  31. data/lib/steep/drivers/vendor.rb +46 -0
  32. data/lib/steep/drivers/watch.rb +78 -140
  33. data/lib/steep/errors.rb +22 -13
  34. data/lib/steep/interface/interface.rb +91 -0
  35. data/lib/steep/interface/method.rb +0 -4
  36. data/lib/steep/interface/method_type.rb +362 -2
  37. data/lib/steep/interface/substitution.rb +22 -0
  38. data/lib/steep/project.rb +25 -233
  39. data/lib/steep/project/dsl.rb +132 -0
  40. data/lib/steep/project/file.rb +93 -76
  41. data/lib/steep/project/file_loader.rb +63 -0
  42. data/lib/steep/project/options.rb +7 -0
  43. data/lib/steep/project/target.rb +190 -0
  44. data/lib/steep/signature/errors.rb +25 -77
  45. data/lib/steep/signature/validator.rb +122 -0
  46. data/lib/steep/source.rb +12 -7
  47. data/lib/steep/subtyping/check.rb +357 -633
  48. data/lib/steep/subtyping/constraints.rb +2 -2
  49. data/lib/steep/subtyping/trace.rb +23 -0
  50. data/lib/steep/type_construction.rb +509 -455
  51. data/lib/steep/type_inference/constant_env.rb +16 -24
  52. data/lib/steep/type_inference/type_env.rb +26 -18
  53. data/lib/steep/version.rb +1 -1
  54. data/sample/Steepfile +6 -0
  55. data/sample/lib/conference.rb +12 -0
  56. data/sample/sig/conference.rbs +6 -0
  57. data/smoke/alias/Steepfile +4 -0
  58. data/smoke/alias/a.rb +2 -2
  59. data/smoke/alias/{a.rbi → a.rbs} +1 -1
  60. data/smoke/and/Steepfile +4 -0
  61. data/smoke/array/Steepfile +4 -0
  62. data/smoke/array/a.rb +2 -2
  63. data/smoke/array/b.rb +4 -4
  64. data/smoke/array/c.rb +2 -2
  65. data/smoke/block/Steepfile +5 -0
  66. data/smoke/block/{a.rbi → a.rbs} +1 -1
  67. data/smoke/block/{c.rbi → c.rbs} +0 -0
  68. data/smoke/block/d.rb +6 -6
  69. data/smoke/case/Steepfile +4 -0
  70. data/smoke/case/a.rb +4 -3
  71. data/smoke/class/Steepfile +4 -0
  72. data/smoke/class/a.rb +1 -4
  73. data/smoke/class/a.rbs +24 -0
  74. data/smoke/class/h.rb +6 -2
  75. data/smoke/class/{h.rbi → h.rbs} +1 -2
  76. data/smoke/class/i.rb +1 -2
  77. data/smoke/class/i.rbs +9 -0
  78. data/smoke/const/Steepfile +4 -0
  79. data/smoke/dstr/Steepfile +4 -0
  80. data/smoke/ensure/Steepfile +4 -0
  81. data/smoke/ensure/a.rb +1 -1
  82. data/smoke/enumerator/Steepfile +4 -0
  83. data/smoke/enumerator/a.rb +7 -7
  84. data/smoke/enumerator/b.rb +6 -6
  85. data/smoke/extension/Steepfile +4 -0
  86. data/smoke/extension/{a.rbi → a.rbs} +2 -2
  87. data/smoke/extension/{e.rbi → e.rbs} +2 -2
  88. data/smoke/hash/Steepfile +4 -0
  89. data/smoke/hash/{a.rbi → a.rbs} +0 -0
  90. data/smoke/hash/b.rb +2 -2
  91. data/smoke/hash/c.rb +1 -1
  92. data/smoke/hash/e.rbs +3 -0
  93. data/smoke/hash/f.rb +1 -1
  94. data/smoke/hello/Steepfile +4 -0
  95. data/smoke/hello/hello.rbs +7 -0
  96. data/smoke/if/Steepfile +4 -0
  97. data/smoke/implements/Steepfile +4 -0
  98. data/smoke/implements/a.rbs +6 -0
  99. data/smoke/initialize/Steepfile +4 -0
  100. data/smoke/initialize/a.rbs +3 -0
  101. data/smoke/integer/Steepfile +4 -0
  102. data/smoke/integer/a.rb +5 -3
  103. data/smoke/interface/Steepfile +4 -0
  104. data/smoke/interface/{a.rbi → a.rbs} +0 -0
  105. data/smoke/kwbegin/Steepfile +4 -0
  106. data/smoke/lambda/Steepfile +4 -0
  107. data/smoke/lambda/a.rb +9 -2
  108. data/smoke/literal/Steepfile +4 -0
  109. data/smoke/literal/{literal_methods.rbi → literal_methods.rbs} +0 -0
  110. data/smoke/map/Steepfile +4 -0
  111. data/smoke/map/a.rb +1 -1
  112. data/smoke/method/Steepfile +4 -0
  113. data/smoke/method/{a.rbi → a.rbs} +0 -0
  114. data/smoke/method/b.rb +1 -4
  115. data/smoke/method/d.rb +1 -0
  116. data/smoke/method/d.rbs +3 -0
  117. data/smoke/module/Steepfile +4 -0
  118. data/smoke/module/a.rb +1 -1
  119. data/smoke/module/a.rbs +16 -0
  120. data/smoke/module/c.rb +1 -1
  121. data/smoke/regexp/Steepfile +4 -0
  122. data/smoke/regexp/a.rb +2 -2
  123. data/smoke/regexp/b.rb +16 -16
  124. data/smoke/regression/Steepfile +5 -0
  125. data/smoke/regression/array.rb +2 -2
  126. data/smoke/regression/hash.rb +2 -2
  127. data/smoke/regression/poly_new.rb +2 -0
  128. data/smoke/regression/poly_new.rbs +4 -0
  129. data/smoke/regression/set_divide.rb +2 -2
  130. data/smoke/rescue/Steepfile +4 -0
  131. data/smoke/rescue/a.rb +1 -1
  132. data/smoke/self/Steepfile +4 -0
  133. data/smoke/self/a.rbs +4 -0
  134. data/smoke/skip/Steepfile +4 -0
  135. data/smoke/stdout/Steepfile +4 -0
  136. data/smoke/stdout/{a.rbi → a.rbs} +1 -1
  137. data/smoke/super/Steepfile +4 -0
  138. data/smoke/super/a.rbs +10 -0
  139. data/smoke/type_case/Steepfile +4 -0
  140. data/smoke/type_case/a.rb +1 -1
  141. data/smoke/yield/Steepfile +4 -0
  142. data/smoke/yield/a.rb +2 -2
  143. data/steep.gemspec +14 -7
  144. data/vendor/ruby-signature/.github/workflows/ruby.yml +27 -0
  145. data/vendor/ruby-signature/.gitignore +12 -0
  146. data/vendor/ruby-signature/.rubocop.yml +15 -0
  147. data/vendor/ruby-signature/BSDL +22 -0
  148. data/vendor/ruby-signature/COPYING +56 -0
  149. data/vendor/ruby-signature/Gemfile +6 -0
  150. data/vendor/ruby-signature/README.md +93 -0
  151. data/vendor/ruby-signature/Rakefile +66 -0
  152. data/vendor/ruby-signature/bin/annotate-with-rdoc +156 -0
  153. data/vendor/ruby-signature/bin/console +14 -0
  154. data/vendor/ruby-signature/bin/query-rdoc +103 -0
  155. data/vendor/ruby-signature/bin/setup +10 -0
  156. data/vendor/ruby-signature/bin/sort +88 -0
  157. data/vendor/ruby-signature/bin/test_runner.rb +17 -0
  158. data/vendor/ruby-signature/docs/CONTRIBUTING.md +97 -0
  159. data/vendor/ruby-signature/docs/sigs.md +148 -0
  160. data/vendor/ruby-signature/docs/stdlib.md +152 -0
  161. data/vendor/ruby-signature/docs/syntax.md +528 -0
  162. data/vendor/ruby-signature/exe/rbs +3 -0
  163. data/vendor/ruby-signature/exe/ruby-signature +7 -0
  164. data/vendor/ruby-signature/lib/ruby/signature.rb +64 -0
  165. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +29 -0
  166. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +29 -0
  167. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +391 -0
  168. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +364 -0
  169. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +52 -0
  170. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +54 -0
  171. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +534 -0
  172. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +28 -0
  173. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +152 -0
  174. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +172 -0
  175. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +921 -0
  176. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +283 -0
  177. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +138 -0
  178. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +126 -0
  179. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +189 -0
  180. data/vendor/ruby-signature/lib/ruby/signature/location.rb +104 -0
  181. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +125 -0
  182. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +93 -0
  183. data/vendor/ruby-signature/lib/ruby/signature/parser.y +1343 -0
  184. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +441 -0
  185. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +579 -0
  186. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +383 -0
  187. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +48 -0
  188. data/vendor/ruby-signature/lib/ruby/signature/test.rb +28 -0
  189. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +63 -0
  190. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +290 -0
  191. data/vendor/ruby-signature/lib/ruby/signature/test/setup.rb +58 -0
  192. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +324 -0
  193. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +185 -0
  194. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +256 -0
  195. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +72 -0
  196. data/vendor/ruby-signature/lib/ruby/signature/types.rb +932 -0
  197. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +140 -0
  198. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +49 -0
  199. data/vendor/ruby-signature/lib/ruby/signature/version.rb +5 -0
  200. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +271 -0
  201. data/vendor/ruby-signature/ruby-signature.gemspec +45 -0
  202. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +3 -0
  203. data/vendor/ruby-signature/stdlib/base64/base64.rbs +15 -0
  204. data/vendor/ruby-signature/stdlib/builtin/array.rbs +1997 -0
  205. data/vendor/ruby-signature/stdlib/builtin/basic_object.rbs +280 -0
  206. data/vendor/ruby-signature/stdlib/builtin/binding.rbs +177 -0
  207. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +35 -0
  208. data/vendor/ruby-signature/stdlib/builtin/class.rbs +145 -0
  209. data/vendor/ruby-signature/stdlib/builtin/comparable.rbs +116 -0
  210. data/vendor/ruby-signature/stdlib/builtin/complex.rbs +400 -0
  211. data/vendor/ruby-signature/stdlib/builtin/constants.rbs +37 -0
  212. data/vendor/ruby-signature/stdlib/builtin/data.rbs +5 -0
  213. data/vendor/ruby-signature/stdlib/builtin/deprecated.rbs +2 -0
  214. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +419 -0
  215. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +606 -0
  216. data/vendor/ruby-signature/stdlib/builtin/enumerable.rbs +404 -0
  217. data/vendor/ruby-signature/stdlib/builtin/enumerator.rbs +260 -0
  218. data/vendor/ruby-signature/stdlib/builtin/errno.rbs +781 -0
  219. data/vendor/ruby-signature/stdlib/builtin/errors.rbs +582 -0
  220. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +193 -0
  221. data/vendor/ruby-signature/stdlib/builtin/false_class.rbs +40 -0
  222. data/vendor/ruby-signature/stdlib/builtin/fiber.rbs +68 -0
  223. data/vendor/ruby-signature/stdlib/builtin/fiber_error.rbs +12 -0
  224. data/vendor/ruby-signature/stdlib/builtin/file.rbs +476 -0
  225. data/vendor/ruby-signature/stdlib/builtin/file_test.rbs +59 -0
  226. data/vendor/ruby-signature/stdlib/builtin/float.rbs +696 -0
  227. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +121 -0
  228. data/vendor/ruby-signature/stdlib/builtin/hash.rbs +1029 -0
  229. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +710 -0
  230. data/vendor/ruby-signature/stdlib/builtin/io.rbs +683 -0
  231. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +574 -0
  232. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +135 -0
  233. data/vendor/ruby-signature/stdlib/builtin/match_data.rbs +141 -0
  234. data/vendor/ruby-signature/stdlib/builtin/math.rbs +66 -0
  235. data/vendor/ruby-signature/stdlib/builtin/method.rbs +182 -0
  236. data/vendor/ruby-signature/stdlib/builtin/module.rbs +248 -0
  237. data/vendor/ruby-signature/stdlib/builtin/nil_class.rbs +82 -0
  238. data/vendor/ruby-signature/stdlib/builtin/numeric.rbs +409 -0
  239. data/vendor/ruby-signature/stdlib/builtin/object.rbs +824 -0
  240. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +426 -0
  241. data/vendor/ruby-signature/stdlib/builtin/process.rbs +354 -0
  242. data/vendor/ruby-signature/stdlib/builtin/random.rbs +93 -0
  243. data/vendor/ruby-signature/stdlib/builtin/range.rbs +226 -0
  244. data/vendor/ruby-signature/stdlib/builtin/rational.rbs +424 -0
  245. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +10 -0
  246. data/vendor/ruby-signature/stdlib/builtin/regexp.rbs +131 -0
  247. data/vendor/ruby-signature/stdlib/builtin/ruby_vm.rbs +14 -0
  248. data/vendor/ruby-signature/stdlib/builtin/signal.rbs +55 -0
  249. data/vendor/ruby-signature/stdlib/builtin/string.rbs +770 -0
  250. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +13 -0
  251. data/vendor/ruby-signature/stdlib/builtin/struct.rbs +40 -0
  252. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +230 -0
  253. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +1112 -0
  254. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +23 -0
  255. data/vendor/ruby-signature/stdlib/builtin/time.rbs +739 -0
  256. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +91 -0
  257. data/vendor/ruby-signature/stdlib/builtin/true_class.rbs +46 -0
  258. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +159 -0
  259. data/vendor/ruby-signature/stdlib/builtin/warning.rbs +17 -0
  260. data/vendor/ruby-signature/stdlib/erb/erb.rbs +18 -0
  261. data/vendor/ruby-signature/stdlib/find/find.rbs +44 -0
  262. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +21 -0
  263. data/vendor/ruby-signature/stdlib/prime/integer-extension.rbs +23 -0
  264. data/vendor/ruby-signature/stdlib/prime/prime.rbs +188 -0
  265. data/vendor/ruby-signature/stdlib/securerandom/securerandom.rbs +9 -0
  266. data/vendor/ruby-signature/stdlib/set/set.rbs +77 -0
  267. data/vendor/ruby-signature/stdlib/tmpdir/tmpdir.rbs +53 -0
  268. metadata +244 -54
  269. data/.travis.yml +0 -7
  270. data/lib/steep/ast/signature/alias.rb +0 -19
  271. data/lib/steep/ast/signature/class.rb +0 -33
  272. data/lib/steep/ast/signature/const.rb +0 -17
  273. data/lib/steep/ast/signature/env.rb +0 -138
  274. data/lib/steep/ast/signature/extension.rb +0 -21
  275. data/lib/steep/ast/signature/gvar.rb +0 -17
  276. data/lib/steep/ast/signature/interface.rb +0 -31
  277. data/lib/steep/ast/signature/members.rb +0 -115
  278. data/lib/steep/ast/signature/module.rb +0 -21
  279. data/lib/steep/drivers/print_interface.rb +0 -94
  280. data/lib/steep/drivers/scaffold.rb +0 -321
  281. data/lib/steep/drivers/utils/each_signature.rb +0 -31
  282. data/lib/steep/interface/abstract.rb +0 -68
  283. data/lib/steep/interface/builder.rb +0 -637
  284. data/lib/steep/interface/instantiated.rb +0 -163
  285. data/lib/steep/interface/ivar_chain.rb +0 -26
  286. data/lib/steep/parser.y +0 -1278
  287. data/lib/steep/project/listener.rb +0 -53
  288. data/smoke/class/a.rbi +0 -24
  289. data/smoke/class/d.rb +0 -9
  290. data/smoke/class/e.rb +0 -12
  291. data/smoke/class/i.rbi +0 -9
  292. data/smoke/hash/e.rbi +0 -3
  293. data/smoke/hello/hello.rbi +0 -7
  294. data/smoke/implements/a.rbi +0 -6
  295. data/smoke/initialize/a.rbi +0 -3
  296. data/smoke/module/a.rbi +0 -16
  297. data/smoke/self/a.rbi +0 -4
  298. data/smoke/super/a.rbi +0 -10
  299. data/stdlib/builtin.rbi +0 -787
@@ -1,163 +0,0 @@
1
- module Steep
2
- module Interface
3
- class Instantiated
4
- attr_reader :type
5
- attr_reader :methods
6
- attr_reader :ivar_chains
7
-
8
- def initialize(type:, methods:, ivar_chains:)
9
- @type = type
10
- @methods = methods
11
- @ivar_chains = ivar_chains
12
- end
13
-
14
- def ivars
15
- @ivars ||= ivar_chains.transform_values(&:type)
16
- end
17
-
18
- def ==(other)
19
- other.is_a?(self.class) && other.type == type && other.params == params && other.methods == methods && other.ivars == ivars
20
- end
21
-
22
- def subst(s)
23
- self.class.new(
24
- type: type,
25
- methods: methods.transform_values {|type| type.subst(s) },
26
- ivar_chains: ivar_chains.transform_values {|chain| chain.subst(s) }
27
- )
28
- end
29
-
30
- class InvalidMethodOverrideError < StandardError
31
- attr_reader :type
32
- attr_reader :current_method
33
- attr_reader :super_method
34
- attr_reader :result
35
-
36
- def initialize(type:, current_method:, super_method:, result:)
37
- @type = type
38
- @current_method = current_method
39
- @super_method = super_method
40
- @result = result
41
-
42
- super "Invalid override of `#{current_method.name}` in #{type}: definition in #{current_method.type_name} is not compatible with its super (#{super_method.type_name})"
43
- end
44
- end
45
-
46
- class InvalidIvarOverrideError < StandardError
47
- attr_reader :type
48
- attr_reader :ivar_name
49
- attr_reader :current_ivar_type
50
- attr_reader :super_ivar_type
51
-
52
- def initialize(type:, ivar_name:, current_ivar_type:, super_ivar_type:)
53
- @type = type
54
- @ivar_name = ivar_name
55
- @current_ivar_type = current_ivar_type
56
- @super_ivar_type = super_ivar_type
57
-
58
- super "Invalid override of `#{ivar_name}` in #{type}: #{current_ivar_type} is not compatible with #{super_ivar_type}"
59
- end
60
- end
61
-
62
- class PrivateOverrideError < StandardError
63
- attr_reader :child_type
64
- attr_reader :super_type
65
- attr_reader :method_name
66
-
67
- def initialize(child_type:, super_type:, method_name:)
68
- @child_type = child_type
69
- @super_type = super_type
70
- @method_name = method_name
71
-
72
- super "Public method `#{method_name}` cannot overriden to private: #{child_type} <: #{super_type}"
73
- end
74
- end
75
-
76
- def validate(check)
77
- methods.each do |_, method|
78
- validate_method_type(check, method)
79
- validate_method_visibility method
80
- end
81
-
82
- ivar_chains.each do |name, chain|
83
- validate_chain(check, name, chain)
84
- end
85
- end
86
-
87
- def validate_chain(check, name, chain)
88
- return unless chain.parent
89
-
90
- this_type = chain.type
91
- super_type = chain.parent.type
92
-
93
- case
94
- when this_type.is_a?(AST::Types::Any) && super_type.is_a?(AST::Types::Any)
95
- # ok
96
- else
97
- relation = Subtyping::Relation.new(sub_type: this_type, super_type: super_type)
98
-
99
- result1 = check.check(relation, constraints: Subtyping::Constraints.empty)
100
- result2 = check.check(relation.flip, constraints: Subtyping::Constraints.empty)
101
-
102
- if result1.failure? || result2.failure? || this_type.is_a?(AST::Types::Any) || super_type.is_a?(AST::Types::Any)
103
- raise InvalidIvarOverrideError.new(type: self.type, ivar_name: name, current_ivar_type: this_type, super_ivar_type: super_type)
104
- end
105
- end
106
-
107
- validate_chain(check, name, chain.parent)
108
- end
109
-
110
- def validate_method_type(check, method)
111
- if method.super_method && !method.incompatible?
112
- result = check.check_method(method.name,
113
- method,
114
- method.super_method,
115
- assumption: Set.new,
116
- trace: Subtyping::Trace.new,
117
- constraints: Subtyping::Constraints.empty)
118
-
119
- if result.success?
120
- validate_method_type(check, method.super_method)
121
- else
122
- raise InvalidMethodOverrideError.new(type: type,
123
- current_method: method,
124
- super_method: method.super_method,
125
- result: result)
126
- end
127
- end
128
- end
129
-
130
- def validate_method_visibility(method)
131
- if (super_method = method.super_method)
132
- if method.private? && !super_method.private?
133
- raise PrivateOverrideError.new(
134
- child_type: method.type_name,
135
- super_type: super_method.type_name,
136
- method_name: method.name
137
- )
138
- end
139
-
140
- validate_method_visibility(super_method)
141
- end
142
- end
143
-
144
- def select_method_type(&block)
145
- self.class.new(
146
- type: type,
147
- methods: methods.each.with_object({}) do |(name, method), methods|
148
- methods[name] = Method.new(
149
- type_name: method.type_name,
150
- name: method.name,
151
- types: method.types.select(&block),
152
- super_method: method.super_method,
153
- attributes: method.attributes,
154
- )
155
- end.reject do |_, method|
156
- method.types.empty?
157
- end,
158
- ivar_chains: ivar_chains
159
- )
160
- end
161
- end
162
- end
163
- end
@@ -1,26 +0,0 @@
1
- module Steep
2
- module Interface
3
- class IvarChain
4
- attr_reader :type
5
- attr_reader :parent
6
-
7
- def initialize(type:, parent: nil)
8
- @type = type
9
- @parent = parent
10
- end
11
-
12
- def ==(other)
13
- other.is_a?(IvarChain) &&
14
- type == type &&
15
- parent == parent
16
- end
17
-
18
- def subst(s)
19
- self.class.new(
20
- type: type.subst(s),
21
- parent: parent&.subst(s)
22
- )
23
- end
24
- end
25
- end
26
- end
data/lib/steep/parser.y DELETED
@@ -1,1278 +0,0 @@
1
- class Steep::Parser
2
-
3
- token kCLASS kMODULE kINTERFACE kDEF kEND kNIL kBOOL kANY kVOID kTYPE
4
- kINCOMPATIBLE kAT_TYPE kAT_IMPLEMENTS kAT_DYNAMIC kCONST kVAR kRETURN
5
- kBLOCK kBREAK kMETHOD kSELF kSELFQ kATTR_READER kATTR_ACCESSOR kINSTANCE
6
- kINCLUDE kEXTEND kINSTANCE kIVAR kCONSTRUCTOR kNOCONSTRUCTOR kEXTENSION kPRIVATE kALIAS
7
- kSUPER
8
- tARROW tBANG tBAR tCOLON tCOMMA tDOT tEQ tGT tGVAR tHAT tINT
9
- tINTERFACE_NAME tIVAR_NAME tLBRACE tLBRACKET tIDENT tLPAREN tLT tROCKET
10
- tMINUS tOPERATOR tPERCENT tPLUS tQUESTION tRBRACE tRBRACKET
11
- tRPAREN tSTAR tSTAR2 tSTRING tSYMBOL tUIDENT tUMINUS tVAR
12
- type_METHOD type_SIGNATURE type_ANNOTATION type_TYPE
13
- tQUALIFIED_MODULE_NAME tQUALIFIED_INTERFACE_NAME tQUALIFIED_ALIAS_NAME
14
-
15
- expect 3
16
-
17
- rule
18
-
19
- target: type_METHOD method_type
20
- {
21
- result = val[1]
22
- }
23
- | type_SIGNATURE signatures
24
- {
25
- result = val[1]
26
- }
27
- | type_ANNOTATION annotation
28
- {
29
- result = val[1]
30
- }
31
- | type_TYPE type
32
- {
33
- result = val[1]
34
- }
35
-
36
- method_type: type_params params block_opt tARROW return_type
37
- {
38
- result = AST::MethodType.new(location: AST::Location.concat(*val.compact.map(&:location)),
39
- type_params: val[0],
40
- params: val[1]&.value,
41
- block: val[2],
42
- return_type: val[4])
43
- }
44
-
45
- return_type: paren_type
46
-
47
- params: # nothing
48
- {
49
- result = nil
50
- }
51
- | tLPAREN params0 tRPAREN
52
- {
53
- result = LocatedValue.new(location: val[0].location + val[2].location,
54
- value: val[1])
55
- }
56
- | simple_type
57
- {
58
- result = LocatedValue.new(location: val[0].location,
59
- value: AST::MethodType::Params::Required.new(location: val[0].location, type: val[0]))
60
- }
61
-
62
- params0: required_param
63
- {
64
- result = AST::MethodType::Params::Required.new(location: val[0].location, type: val[0])
65
- }
66
- | required_param tCOMMA params0
67
- {
68
- location = val[0].location
69
- result = AST::MethodType::Params::Required.new(location: location,
70
- type: val[0],
71
- next_params: val[2])
72
- }
73
- | params1
74
- {
75
- result = val[0]
76
- }
77
-
78
- params1: optional_param
79
- {
80
- result = AST::MethodType::Params::Optional.new(location: val[0].first, type: val[0].last)
81
- }
82
- | optional_param tCOMMA params1
83
- {
84
- location = val[0].first
85
- result = AST::MethodType::Params::Optional.new(type: val[0].last, location: location, next_params: val[2])
86
- }
87
- | params2
88
- {
89
- result = val[0]
90
- }
91
-
92
- params2: rest_param
93
- {
94
- result = AST::MethodType::Params::Rest.new(location: val[0].first, type: val[0].last)
95
- }
96
- | rest_param tCOMMA params3
97
- {
98
- loc = val[0].first
99
- result = AST::MethodType::Params::Rest.new(location: loc, type: val[0].last, next_params: val[2])
100
- }
101
- | params3
102
- {
103
- result = val[0]
104
- }
105
-
106
- params3: required_keyword
107
- {
108
- location, name, type = val[0]
109
- result = AST::MethodType::Params::RequiredKeyword.new(location: location, name: name, type: type)
110
- }
111
- | optional_keyword
112
- {
113
- location, name, type = val[0]
114
- result = AST::MethodType::Params::OptionalKeyword.new(location: location, name: name, type: type)
115
- }
116
- | required_keyword tCOMMA params3
117
- {
118
- location, name, type = val[0]
119
- result = AST::MethodType::Params::RequiredKeyword.new(location: location,
120
- name: name,
121
- type: type,
122
- next_params: val[2])
123
- }
124
- | optional_keyword tCOMMA params3
125
- {
126
- location, name, type = val[0]
127
- result = AST::MethodType::Params::OptionalKeyword.new(location: location,
128
- name: name,
129
- type: type,
130
- next_params: val[2])
131
- }
132
- | params4
133
- {
134
- result = val[0]
135
- }
136
-
137
- params4: # nothing
138
- {
139
- result = nil
140
- }
141
- | tSTAR2 type
142
- {
143
- result = AST::MethodType::Params::RestKeyword.new(location: val[0].location + val[1].location,
144
- type: val[1])
145
- }
146
-
147
- required_param: type
148
- {
149
- result = val[0]
150
- }
151
-
152
- optional_param: tQUESTION type
153
- {
154
- result = [
155
- val[0].location + val[1].location,
156
- val[1]
157
- ]
158
- }
159
-
160
- rest_param: tSTAR type
161
- {
162
- result = [
163
- val[0].location + val[1].location,
164
- val[1]
165
- ]
166
- }
167
-
168
- required_keyword: keyword tCOLON type
169
- {
170
- result = [
171
- val[0].location + val[2].location,
172
- val[0].value,
173
- val[2]
174
- ]
175
- }
176
-
177
- optional_keyword: tQUESTION keyword tCOLON type
178
- {
179
- result = [
180
- val[0].location + val[3].location,
181
- val[1].value,
182
- val[3]
183
- ]
184
- }
185
-
186
- block_opt: # nothing
187
- {
188
- result = nil
189
- }
190
- | block_optional tLBRACE tRBRACE
191
- {
192
- result = AST::MethodType::Block.new(params: nil,
193
- return_type: nil,
194
- location: (val[0] || val[1]).location + val[2].location,
195
- optional: val[0]&.value || false)
196
- }
197
- | block_optional tLBRACE block_params tARROW type tRBRACE
198
- {
199
- result = AST::MethodType::Block.new(params: val[2],
200
- return_type: val[4],
201
- location: (val[0] || val[1]).location + val[5].location,
202
- optional: val[0]&.value || false)
203
- }
204
-
205
- block_optional: # nothing
206
- {
207
- result = nil
208
- }
209
- | tQUESTION
210
- {
211
- result = LocatedValue.new(location: val[0].location, value: true)
212
- }
213
-
214
- block_params: # nothing
215
- {
216
- result = nil
217
- }
218
- | tLPAREN block_params0 tRPAREN
219
- {
220
- result = val[1]
221
- }
222
-
223
- block_params0: required_param
224
- {
225
- result = AST::MethodType::Params::Required.new(location: val[0].location,
226
- type: val[0])
227
- }
228
- | required_param tCOMMA block_params0 {
229
- result = AST::MethodType::Params::Required.new(location: val[0].location,
230
- type: val[0],
231
- next_params: val[2])
232
- }
233
- | block_params1
234
- {
235
- result = val[0]
236
- }
237
-
238
- block_params1: optional_param
239
- {
240
- result = AST::MethodType::Params::Optional.new(location: val[0].first,
241
- type: val[0].last)
242
- }
243
- | optional_param tCOMMA block_params1
244
- {
245
- loc = val.first[0] + (val[2] || val[1]).location
246
- type = val.first[1]
247
- next_params = val[2]
248
- result = AST::MethodType::Params::Optional.new(location: loc, type: type, next_params: next_params)
249
- }
250
- | block_params2
251
- {
252
- result = val[0]
253
- }
254
-
255
- block_params2: # nothing
256
- {
257
- result = nil
258
- }
259
- | rest_param
260
- {
261
- result = AST::MethodType::Params::Rest.new(location: val[0].first, type: val[0].last)
262
- }
263
-
264
- application_args: # nothing
265
- {
266
- result = nil
267
- }
268
- | tLT type_seq tGT
269
- {
270
- result = LocatedValue.new(location: val[0].location + val[2].location,
271
- value: val[1])
272
- }
273
-
274
- simple_type: module_name tDOT kCLASS constructor
275
- {
276
- loc = val[0].location + (val[3] || val[2]).location
277
- result = AST::Types::Name::Class.new(name: val[0].value,
278
- constructor: val[3]&.value,
279
- location: loc)
280
- }
281
- | module_name tDOT kMODULE
282
- {
283
- loc = val[0].location + val[2].location
284
- result = AST::Types::Name::Module.new(name: val[0].value, location: loc)
285
- }
286
- | module_name application_args
287
- {
288
- loc = val[0].location + val[1]&.location
289
- result = AST::Types::Name::Instance.new(name: val[0].value,
290
- location: loc,
291
- args: val[1]&.value || [])
292
- }
293
- | interface_name application_args
294
- {
295
- loc = val[0].location + val[1]&.location
296
- result = AST::Types::Name::Interface.new(name: val[0].value,
297
- location: loc,
298
- args: val[1]&.value || [])
299
- }
300
- | alias_name application_args
301
- {
302
- loc = val[0].location + val[1]&.location
303
- result = AST::Types::Name::Alias.new(name: val[0].value,
304
- location: loc,
305
- args: val[1]&.value || [])
306
- }
307
- | kANY
308
- {
309
- result = AST::Types::Any.new(location: val[0].location)
310
- }
311
- | tVAR
312
- {
313
- result = AST::Types::Var.new(location: val[0].location, name: val[0].value)
314
- }
315
- | kCLASS
316
- {
317
- result = AST::Types::Class.new(location: val[0].location)
318
- }
319
- | kMODULE
320
- {
321
- result = AST::Types::Class.new(location: val[0].location)
322
- }
323
- | kINSTANCE
324
- {
325
- result = AST::Types::Instance.new(location: val[0].location)
326
- }
327
- | kSELF
328
- {
329
- result = AST::Types::Self.new(location: val[0].location)
330
- }
331
- | kVOID
332
- {
333
- result = AST::Types::Void.new(location: val[0].location)
334
- }
335
- | kNIL
336
- {
337
- result = AST::Types::Nil.new(location: val[0].location)
338
- }
339
- | kBOOL
340
- {
341
- result = AST::Types::Boolean.new(location: val[0].location)
342
- }
343
- | simple_type tQUESTION
344
- {
345
- type = val[0]
346
- nil_type = AST::Types::Nil.new(location: val[1].location)
347
- result = AST::Types::Union.build(types: [type, nil_type], location: val[0].location + val[1].location)
348
- }
349
- | kSELFQ
350
- {
351
- type = AST::Types::Self.new(location: val[0].location)
352
- nil_type = AST::Types::Nil.new(location: val[0].location)
353
- result = AST::Types::Union.build(types: [type, nil_type], location: val[0].location)
354
- }
355
- | tINT
356
- {
357
- result = AST::Types::Literal.new(value: val[0].value, location: val[0].location)
358
- }
359
- | tSTRING
360
- {
361
- result = AST::Types::Literal.new(value: val[0].value, location: val[0].location)
362
- }
363
- | tSYMBOL
364
- {
365
- result = AST::Types::Literal.new(value: val[0].value, location: val[0].location)
366
- }
367
- | tLBRACKET type_seq tRBRACKET
368
- {
369
- loc = val[0].location + val[2].location
370
- result = AST::Types::Tuple.new(types: val[1], location: loc)
371
- }
372
-
373
- hash_elements: # nothing
374
- {
375
- result = {}
376
- }
377
- | hash_element tCOMMA hash_elements
378
- {
379
- result = val[0].merge(val[2])
380
- }
381
- | hash_element
382
- hash_element: tINT tROCKET type
383
- {
384
- result = { val[0].value => val[2] }
385
- }
386
- | tSTRING tROCKET type
387
- {
388
- result = { val[0].value => val[2] }
389
- }
390
- | tSYMBOL tROCKET type
391
- {
392
- result = { val[0].value => val[2] }
393
- }
394
- | keyword tCOLON type
395
- {
396
- result = { val[0].value => val[2] }
397
- }
398
-
399
- paren_type: tLPAREN type tRPAREN
400
- {
401
- result = val[1].with_location(val[0].location + val[2].location)
402
- }
403
- | tLBRACE hash_elements tRBRACE
404
- {
405
- location = val[0].location + val[2].location
406
- result = AST::Types::Record.new(elements: val[1], location: location)
407
- }
408
- | simple_type
409
-
410
- constructor: # nothing
411
- {
412
- result = nil
413
- }
414
- | kCONSTRUCTOR
415
- {
416
- result = LocatedValue.new(location: val[0].location, value: true)
417
- }
418
- | kNOCONSTRUCTOR
419
- {
420
- result = LocatedValue.new(location: val[0].location, value: false)
421
- }
422
-
423
- type: paren_type
424
- | union_seq
425
- {
426
- loc = val[0].first.location + val[0].last.location
427
- result = AST::Types::Union.build(types: val[0], location: loc)
428
- }
429
- | tHAT tLPAREN lambda_params tRPAREN tARROW paren_type
430
- {
431
- loc = val[0].location + val[5].location
432
- result = AST::Types::Proc.new(params: val[2], return_type: val[5], location: loc)
433
- }
434
-
435
- lambda_params: lambda_params1
436
- | paren_type
437
- {
438
- result = Interface::Params.empty.update(required: [val[0]])
439
- }
440
- | paren_type tCOMMA lambda_params
441
- {
442
- result = val[2].update(required: [val[0]] + val[2].required)
443
- }
444
-
445
- lambda_params1: # nothing
446
- {
447
- result = Interface::Params.empty
448
- }
449
- | tSTAR paren_type
450
- {
451
- result = Interface::Params.empty.update(rest: val[1])
452
- }
453
- | tQUESTION paren_type
454
- {
455
- result = Interface::Params.empty.update(optional: [val[1]])
456
- }
457
- | tQUESTION paren_type tCOMMA lambda_params1
458
- {
459
- result = val[3].update(optional: [val[1]] + val[3].optional)
460
- }
461
-
462
-
463
- type_seq: type
464
- {
465
- result = [val[0]]
466
- }
467
- | type tCOMMA type_seq
468
- {
469
- result = [val[0]] + val[2]
470
- }
471
-
472
- union_seq: simple_type tBAR simple_type
473
- {
474
- result = [val[0], val[2]]
475
- }
476
- | simple_type tBAR union_seq
477
- {
478
- result = [val[0]] + val[2]
479
- }
480
-
481
- keyword: tIDENT
482
- | tINTERFACE_NAME
483
- | kANY
484
- | kCLASS
485
- | kMODULE
486
- | kINSTANCE
487
- | kBLOCK
488
- | kINCLUDE
489
- | kIVAR
490
- | kSELF
491
- | kTYPE
492
-
493
- signatures: # nothing
494
- {
495
- result = []
496
- }
497
- | interface signatures
498
- {
499
- result = [val[0]] + val[1]
500
- }
501
- | class_decl signatures
502
- {
503
- result = [val[0]] + val[1]
504
- }
505
- | module_decl signatures
506
- {
507
- result = [val[0]] + val[1]
508
- }
509
- | extension_decl signatures
510
- {
511
- result = [val[0]] + val[1]
512
- }
513
- | const_decl signatures
514
- {
515
- result = [val[0]] + val[1]
516
- }
517
- | gvar_decl signatures
518
- {
519
- result = [val[0]] + val[1]
520
- }
521
- | alias_decl signatures
522
- {
523
- result = [val[0]] + val[1]
524
- }
525
-
526
- gvar_decl: tGVAR tCOLON type
527
- {
528
- loc = val.first.location + val.last.location
529
- result = AST::Signature::Gvar.new(
530
- location: loc,
531
- name: val[0].value,
532
- type: val[2]
533
- )
534
- }
535
-
536
- const_decl: module_name tCOLON type
537
- {
538
- loc = val.first.location + val.last.location
539
- result = AST::Signature::Const.new(
540
- location: loc,
541
- name: val[0].value.absolute!,
542
- type: val[2]
543
- )
544
- }
545
-
546
- interface: kINTERFACE interface_name type_params interface_members kEND
547
- {
548
- loc = val.first.location + val.last.location
549
- result = AST::Signature::Interface.new(
550
- location: loc,
551
- name: val[1].value.absolute!,
552
- params: val[2],
553
- methods: val[3]
554
- )
555
- }
556
-
557
- class_decl: kCLASS module_name class_params_super class_members kEND
558
- {
559
- loc = val.first.location + val.last.location
560
- result = AST::Signature::Class.new(name: val[1].value.absolute!,
561
- params: val[2][0],
562
- super_class: val[2][1],
563
- members: val[3],
564
- location: loc)
565
- }
566
-
567
- class_params_super: # nothing
568
- {
569
- result = [nil, nil]
570
- }
571
- | tLT super_class
572
- {
573
- result = [nil, val[1]]
574
- }
575
- | tLT type_param_seq tGT
576
- {
577
- location = val[0].location + val[2].location
578
- params = AST::TypeParams.new(location: location, variables: val[1])
579
- result = [params, nil]
580
- }
581
- | tLT type_param_seq tGT tLT super_class
582
- {
583
- location = val[0].location + val[2].location
584
- params = AST::TypeParams.new(location: location, variables: val[1])
585
- result = [params, val[4]]
586
- }
587
-
588
- module_decl: kMODULE module_name type_params self_type_opt class_members kEND
589
- {
590
- loc = val.first.location + val.last.location
591
- result = AST::Signature::Module.new(name: val[1].value.absolute!,
592
- location: loc,
593
- params: val[2],
594
- self_type: val[3],
595
- members: val[4])
596
- }
597
-
598
- extension_decl: kEXTENSION module_name type_params tLPAREN tUIDENT tRPAREN class_members kEND
599
- {
600
- loc = val.first.location + val.last.location
601
- result = AST::Signature::Extension.new(module_name: val[1].value.absolute!,
602
- name: val[4].value,
603
- location: loc,
604
- params: val[2],
605
- members: val[6])
606
- }
607
-
608
- alias_decl: kTYPE alias_name type_params tEQ type
609
- {
610
- loc = val[0].location + val[4].location
611
- result = AST::Signature::Alias.new(location: loc,
612
- name: val[1].value.absolute!,
613
- params: val[2],
614
- type: val[4])
615
- }
616
-
617
- self_type_opt: # nothing
618
- {
619
- result = nil
620
- }
621
- | tCOLON type
622
- {
623
- result = val[1]
624
- }
625
-
626
- interface_name: tQUALIFIED_INTERFACE_NAME
627
- | tINTERFACE_NAME {
628
- name = Names::Interface.new(name: val[0].value, namespace: AST::Namespace.empty)
629
- result = LocatedValue.new(location: val[0].location, value: name)
630
- }
631
-
632
- module_name: tQUALIFIED_MODULE_NAME
633
- | tUIDENT {
634
- name = Names::Module.new(name: val[0].value, namespace: AST::Namespace.empty)
635
- result = LocatedValue.new(location: val[0].location, value: name)
636
- }
637
-
638
- alias_name: tQUALIFIED_ALIAS_NAME
639
- | tIDENT {
640
- name = Names::Alias.new(name: val[0].value, namespace: AST::Namespace.empty)
641
- result = LocatedValue.new(location: val[0].location, value: name)
642
- }
643
-
644
- class_members: # nothing
645
- {
646
- result = []
647
- }
648
- | class_member class_members
649
- {
650
- result = [val[0]] + val[1]
651
- }
652
-
653
- class_member: instance_method_member
654
- | module_method_member
655
- | module_instance_method_member
656
- | include_member
657
- | extend_member
658
- | ivar_member
659
- | attr_reader_member
660
- | attr_accessor_member
661
- | alias_member
662
-
663
- ivar_member: tIVAR_NAME tCOLON type
664
- {
665
- loc = val.first.location + val.last.location
666
- result = AST::Signature::Members::Ivar.new(
667
- location: loc,
668
- name: val[0].value,
669
- type: val[2]
670
- )
671
- }
672
- | kAT_TYPE tCOLON type
673
- {
674
- loc = val.first.location + val.last.location
675
- result = AST::Signature::Members::Ivar.new(
676
- location: loc,
677
- name: :"@type",
678
- type: val[2]
679
- )
680
- }
681
-
682
- instance_method_member: kDEF method_annotations method_name tCOLON method_type_union
683
- {
684
- loc = val.first.location + val.last.last.location
685
- result = AST::Signature::Members::Method.new(
686
- name: val[2].value,
687
- types: val[4],
688
- kind: :instance,
689
- location: loc,
690
- attributes: val[1] || []
691
- )
692
- }
693
-
694
- module_method_member: kDEF method_annotations kSELF tDOT method_name tCOLON method_type_union
695
- {
696
- loc = val.first.location + val.last.last.location
697
- result = AST::Signature::Members::Method.new(
698
- name: val[4].value,
699
- types: val[6],
700
- kind: :module,
701
- location: loc,
702
- attributes: val[1] || []
703
- )
704
- }
705
-
706
- module_instance_method_member: kDEF method_annotations kSELFQ tDOT method_name tCOLON method_type_union
707
- {
708
- loc = val.first.location + val.last.last.location
709
- result = AST::Signature::Members::Method.new(
710
- name: val[4].value,
711
- types: val[6],
712
- kind: :module_instance,
713
- location: loc,
714
- attributes: val[1] || []
715
- )
716
- }
717
-
718
- include_member: kINCLUDE module_name
719
- {
720
- loc = val[0].location + val[1].location
721
- name = val[1].value
722
- result = AST::Signature::Members::Include.new(name: name, location: loc, args: [])
723
- }
724
- | kINCLUDE module_name tLT type_seq tGT
725
- {
726
- loc = val[0].location + val[4].location
727
- name = val[1].value
728
- result = AST::Signature::Members::Include.new(name: name, location: loc, args: val[3])
729
- }
730
-
731
- extend_member: kEXTEND module_name
732
- {
733
- loc = val[0].location + val[1].location
734
- name = val[1].value
735
- result = AST::Signature::Members::Extend.new(name: name, location: loc, args: [])
736
- }
737
- | kEXTEND module_name tLT type_seq tGT
738
- {
739
- loc = val[0].location + val[4].location
740
- name = val[1].value
741
- result = AST::Signature::Members::Extend.new(name: name, location: loc, args: val[3])
742
- }
743
-
744
- attr_reader_member: kATTR_READER method_name attr_ivar_opt tCOLON type
745
- {
746
- loc = val.first.location + val.last.location
747
- result = AST::Signature::Members::Attr.new(location: loc, name: val[1].value, kind: :reader, ivar: val[2], type: val[4])
748
- }
749
-
750
- attr_accessor_member: kATTR_ACCESSOR method_name attr_ivar_opt tCOLON type
751
- {
752
- loc = val.first.location + val.last.location
753
- result = AST::Signature::Members::Attr.new(location: loc, name: val[1].value, kind: :accessor, ivar: val[2], type: val[4])
754
- }
755
-
756
- alias_member: kALIAS method_name method_name {
757
- loc = val[0].location + val[2].location
758
- result = AST::Signature::Members::MethodAlias.new(
759
- location: loc,
760
- new_name: val[1].value,
761
- original_name: val[2].value
762
- )
763
- }
764
-
765
- attr_ivar_opt: # nothing
766
- {
767
- result = nil
768
- }
769
- | tLPAREN tRPAREN
770
- {
771
- result = false
772
- }
773
- | tLPAREN tIVAR_NAME tRPAREN
774
- {
775
- result = val[1].value
776
- }
777
-
778
- method_annotations: # nothing
779
- {
780
- result = nil
781
- }
782
- | tLPAREN method_annotation_seq tRPAREN
783
- {
784
- result = val[1]
785
- }
786
-
787
- method_annotation_seq: method_annotation_keyword
788
- {
789
- result = [val[0]]
790
- }
791
- | method_annotation_keyword tCOMMA method_annotation_seq
792
- {
793
- result = [val[0]] + val[2]
794
- }
795
-
796
- method_annotation_keyword: kCONSTRUCTOR
797
- {
798
- result = val[0].value
799
- }
800
- | kINCOMPATIBLE
801
- {
802
- result = val[0].value
803
- }
804
- | kPRIVATE
805
- {
806
- result = val[0].value
807
- }
808
-
809
- super_class: module_name
810
- {
811
- result = AST::Signature::SuperClass.new(location: val[0].location, name: val[0].value, args: [])
812
- }
813
- | module_name tLT type_seq tGT
814
- {
815
- loc = val[0].location + val[3].location
816
- name = val[0].value
817
- result = AST::Signature::SuperClass.new(location: loc, name: name, args: val[2])
818
- }
819
-
820
- type_params: # nothing
821
- {
822
- result = nil
823
- }
824
- | tLT type_param_seq tGT
825
- {
826
- location = val[0].location + val[2].location
827
- result = AST::TypeParams.new(location: location, variables: val[1])
828
- }
829
-
830
- type_param_seq: tVAR
831
- {
832
- result = [val[0].value]
833
- }
834
- | tVAR tCOMMA type_param_seq
835
- {
836
- result = [val[0].value] + val[2]
837
- }
838
-
839
- interface_members: # nothing
840
- {
841
- result = []
842
- }
843
- | interface_method interface_members
844
- {
845
- result = val[1].unshift(val[0])
846
- }
847
-
848
- interface_method: kDEF method_name tCOLON method_type_union
849
- {
850
- loc = val[0].location + val[3].last.location
851
- result = AST::Signature::Interface::Method.new(location: loc, name: val[1].value, types: val[3])
852
- }
853
-
854
- method_type_union: method_type
855
- {
856
- result = [val[0]]
857
- }
858
- | kSUPER
859
- {
860
- result = [AST::MethodType::Super.new(location: val[0].location)]
861
- }
862
- | method_type tBAR method_type_union
863
- {
864
- result = [val[0]] + val[2]
865
- }
866
-
867
- method_name: method_name0
868
- | tSTAR
869
- | tSTAR2
870
- | tPERCENT
871
- | tMINUS
872
- | tLT
873
- | tGT
874
- | tUMINUS
875
- | tBAR
876
- {
877
- result = LocatedValue.new(location: val[0].location, value: :|)
878
- }
879
- | method_name0 tEQ
880
- {
881
- raise ParseError, "\nunexpected method name #{val[0].to_s} =" unless val[0].location.pred?(val[1].location)
882
- result = LocatedValue.new(location: val[0].location + val[1].location,
883
- value: :"#{val[0].value}=")
884
- }
885
- | method_name0 tQUESTION
886
- {
887
- raise ParseError, "\nunexpected method name #{val[0].to_s} ?" unless val[0].location.pred?(val[1].location)
888
- result = LocatedValue.new(location: val[0].location + val[1].location,
889
- value: :"#{val[0].value}?")
890
- }
891
- | method_name0 tBANG
892
- {
893
- raise ParseError, "\nunexpected method name #{val[0].to_s} !" unless val[0].location.pred?(val[1].location)
894
- result = LocatedValue.new(location: val[0].location + val[1].location,
895
- value: :"#{val[0].value}!")
896
- }
897
- | tGT tGT
898
- {
899
- raise ParseError, "\nunexpected method name > >" unless val[0].location.pred?(val[1].location)
900
- result = LocatedValue.new(location: val[0].location + val[1].location, value: :>>)
901
- }
902
- | kNIL tQUESTION
903
- {
904
- raise ParseError, "\nunexpected method name #{val[0].to_s} ?" unless val[0].location.pred?(val[1].location)
905
- result = LocatedValue.new(location: val[0].location + val[1].location,
906
- value: :"nil?")
907
- }
908
-
909
- method_name0: tIDENT
910
- | tUIDENT
911
- | tINTERFACE_NAME
912
- | kANY
913
- | kVOID
914
- | kINTERFACE
915
- | kEND
916
- | tPLUS
917
- | kCLASS
918
- | kMODULE
919
- | kINSTANCE
920
- | kEXTEND
921
- | kINCLUDE
922
- | tOPERATOR
923
- | tHAT
924
- | tBANG
925
- | kBLOCK
926
- | kBREAK
927
- | kMETHOD
928
- | kBOOL
929
- | kTYPE
930
- | kALIAS
931
- | kCONSTRUCTOR
932
- {
933
- result = LocatedValue.new(location: val[0].location, value: :constructor)
934
- }
935
- | kNOCONSTRUCTOR
936
- {
937
- result = LocatedValue.new(location: val[0].location, value: :noconstructor)
938
- }
939
- | kATTR_READER
940
- | kATTR_ACCESSOR
941
- | kINCOMPATIBLE
942
- | kPRIVATE
943
-
944
- annotation: kAT_TYPE kVAR subject tCOLON type
945
- {
946
- loc = val.first.location + val.last.location
947
- result = AST::Annotation::VarType.new(location: loc,
948
- name: val[2].value,
949
- type: val[4])
950
- }
951
- | kAT_TYPE kMETHOD method_name tCOLON method_type
952
- {
953
- loc = val.first.location + val.last.location
954
- result = AST::Annotation::MethodType.new(location: loc,
955
- name: val[2].value,
956
- type: val[4])
957
- }
958
- | kAT_TYPE kRETURN tCOLON type
959
- {
960
- loc = val.first.location + val.last.location
961
- result = AST::Annotation::ReturnType.new(type: val[3], location: loc)
962
- }
963
- | kAT_TYPE kBLOCK tCOLON type
964
- {
965
- loc = val.first.location + val.last.location
966
- result = AST::Annotation::BlockType.new(type: val[3], location: loc)
967
- }
968
- | kAT_TYPE kSELF tCOLON type
969
- {
970
- loc = val.first.location + val.last.location
971
- result = AST::Annotation::SelfType.new(type: val[3], location: loc)
972
- }
973
- | kAT_TYPE kCONST module_name tCOLON type
974
- {
975
- loc = val[0].location + val[4].location
976
- result = AST::Annotation::ConstType.new(name: val[2].value,
977
- type: val[4],
978
- location: loc)
979
- }
980
- | kAT_TYPE kINSTANCE tCOLON type
981
- {
982
- loc = val.first.location + val.last.location
983
- result = AST::Annotation::InstanceType.new(type: val[3], location: loc)
984
- }
985
- | kAT_TYPE kMODULE tCOLON type
986
- {
987
- loc = val.first.location + val.last.location
988
- result = AST::Annotation::ModuleType.new(type: val[3], location: loc)
989
- }
990
- | kAT_TYPE kIVAR tIVAR_NAME tCOLON type
991
- {
992
- loc = val.first.location + val.last.location
993
- result = AST::Annotation::IvarType.new(name: val[2].value, type: val[4], location: loc)
994
- }
995
- | kAT_IMPLEMENTS module_name type_params
996
- {
997
- loc = val[0].location + (val[2]&.location || val[1].location)
998
- args = val[2]&.variables || []
999
- name = AST::Annotation::Implements::Module.new(name: val[1].value, args: args)
1000
- result = AST::Annotation::Implements.new(name: name, location: loc)
1001
- }
1002
- | kAT_DYNAMIC dynamic_names
1003
- {
1004
- loc = val[0].location + val[1].last.location
1005
- result = AST::Annotation::Dynamic.new(names: val[1], location: loc)
1006
- }
1007
- | kAT_TYPE kBREAK tCOLON type
1008
- {
1009
- loc = val.first.location + val.last.location
1010
- result = AST::Annotation::BreakType.new(type: val[3], location: loc)
1011
- }
1012
-
1013
- dynamic_names: dynamic_name tCOMMA dynamic_names
1014
- {
1015
- result = [val[0]] + val[2]
1016
- }
1017
- | dynamic_name
1018
- {
1019
- result = val
1020
- }
1021
-
1022
- dynamic_name: method_name
1023
- {
1024
- result = AST::Annotation::Dynamic::Name.new(name: val[0].value, location: val[0].location, kind: :instance)
1025
- }
1026
- | kSELF tDOT method_name
1027
- {
1028
- loc = val.first.location + val.last.location
1029
- result = AST::Annotation::Dynamic::Name.new(name: val[2].value, location: loc, kind: :module)
1030
- }
1031
- | kSELFQ tDOT method_name
1032
- {
1033
- loc = val.first.location + val.last.location
1034
- result = AST::Annotation::Dynamic::Name.new(name: val[2].value, location: loc, kind: :module_instance)
1035
- }
1036
-
1037
- subject: tIDENT
1038
- {
1039
- result = val[0]
1040
- }
1041
- end
1042
-
1043
- ---- inner
1044
-
1045
- require "strscan"
1046
-
1047
- attr_reader :input
1048
- attr_reader :buffer
1049
- attr_reader :offset
1050
-
1051
- def initialize(type, buffer:, offset:, input: nil)
1052
- super()
1053
- @type = type
1054
- @buffer = buffer
1055
- @input = StringScanner.new(input || buffer.content)
1056
- @offset = offset
1057
- end
1058
-
1059
- def self.parse_method(input, name: nil)
1060
- new(:METHOD, buffer: AST::Buffer.new(name: name, content: input), offset: 0).do_parse
1061
- end
1062
-
1063
- def self.parse_signature(input, name: nil)
1064
- new(:SIGNATURE, buffer: AST::Buffer.new(name: name, content: input), offset: 0).do_parse
1065
- end
1066
-
1067
- def self.parse_annotation_opt(input, buffer:, offset: 0)
1068
- new(:ANNOTATION, input: input, buffer: buffer, offset: offset).do_parse
1069
- rescue => exn
1070
- Steep.logger.debug "Parsing comment failed: #{exn.inspect}"
1071
- nil
1072
- end
1073
-
1074
- def self.parse_type(input, name: nil)
1075
- new(:TYPE, buffer: AST::Buffer.new(name: name, content: input), offset: 0).do_parse
1076
- end
1077
-
1078
- class LocatedValue
1079
- attr_reader :location
1080
- attr_reader :value
1081
-
1082
- def initialize(location:, value:)
1083
- @location = location
1084
- @value = value
1085
- end
1086
- end
1087
-
1088
- def new_token(type, value = nil)
1089
- start_index = offset + input.pos - input.matched.bytesize
1090
- end_index = offset + input.pos
1091
-
1092
- location = AST::Location.new(buffer: buffer,
1093
- start_pos: start_index,
1094
- end_pos: end_index)
1095
-
1096
- [type, LocatedValue.new(location: location, value: value)]
1097
- end
1098
-
1099
- def next_token
1100
- if @type
1101
- type = @type
1102
- @type = nil
1103
- return [:"type_#{type}", nil]
1104
- end
1105
-
1106
- case
1107
- when input.scan(/\s+/)
1108
- next_token
1109
- when input.scan(/#.*/)
1110
- next_token
1111
- when input.eos?
1112
- [false, false]
1113
- when input.scan(/->/)
1114
- new_token(:tARROW)
1115
- when input.scan(/\?/)
1116
- new_token(:tQUESTION)
1117
- when input.scan(/!/)
1118
- new_token(:tBANG, :!)
1119
- when input.scan(/\(/)
1120
- new_token(:tLPAREN, nil)
1121
- when input.scan(/\)/)
1122
- new_token(:tRPAREN, nil)
1123
- when input.scan(/{/)
1124
- new_token(:tLBRACE, nil)
1125
- when input.scan(/}/)
1126
- new_token(:tRBRACE, nil)
1127
- when input.scan(/,/)
1128
- new_token(:tCOMMA, nil)
1129
- when input.scan(/:\w+/)
1130
- new_token(:tSYMBOL, input.matched[1..-1].to_sym)
1131
- when input.scan(/\*\*/)
1132
- new_token(:tSTAR2, :**)
1133
- when input.scan(/\*/)
1134
- new_token(:tSTAR, :*)
1135
- when input.scan(/\+/)
1136
- new_token(:tPLUS, :+)
1137
- when input.scan(/\./)
1138
- new_token(:tDOT)
1139
- when input.scan(/<:(?!:)/)
1140
- loc = new_token("<:")[1].location
1141
- Steep.logger.warn("`<:` syntax for super class is deprecated. Use `<` instead. (#{loc.buffer.name}:#{loc})")
1142
- new_token(:tLT)
1143
- when input.scan(/\^/)
1144
- new_token(:tHAT, :"^")
1145
- when input.scan(/=>/)
1146
- new_token(:tROCKET, :"=>")
1147
- when input.scan(/(\[\]=)|(\[\])|===|==|!=|<<|=~/)
1148
- new_token(:tOPERATOR, input.matched.to_sym)
1149
- when input.scan(/\[/)
1150
- new_token(:tLBRACKET, nil)
1151
- when input.scan(/\]/)
1152
- new_token(:tRBRACKET, nil)
1153
- when input.scan(/<=/)
1154
- new_token(:tOPERATOR, :<=)
1155
- when input.scan(/>=/)
1156
- new_token(:tOPERATOR, :>=)
1157
- when input.scan(/=/)
1158
- new_token(:tEQ, :"=")
1159
- when input.scan(/</)
1160
- new_token(:tLT, :<)
1161
- when input.scan(/>/)
1162
- new_token(:tGT, :>)
1163
- when input.scan(/nil\b/)
1164
- new_token(:kNIL, :nil)
1165
- when input.scan(/bool\b/)
1166
- new_token(:kBOOL, :bool)
1167
- when input.scan(/any\b/)
1168
- new_token(:kANY, :any)
1169
- when input.scan(/void\b/)
1170
- new_token(:kVOID, :void)
1171
- when input.scan(/type\b/)
1172
- new_token(:kTYPE, :type)
1173
- when input.scan(/interface\b/)
1174
- new_token(:kINTERFACE, :interface)
1175
- when input.scan(/incompatible\b/)
1176
- new_token(:kINCOMPATIBLE, :incompatible)
1177
- when input.scan(/end\b/)
1178
- new_token(:kEND, :end)
1179
- when input.scan(/\|/)
1180
- new_token(:tBAR, :bar)
1181
- when input.scan(/-@/)
1182
- new_token(:tUMINUS, :"-@")
1183
- when input.scan(/def\b/)
1184
- new_token(:kDEF)
1185
- when input.scan(/@type\b/)
1186
- new_token(:kAT_TYPE)
1187
- when input.scan(/@implements\b/)
1188
- new_token(:kAT_IMPLEMENTS)
1189
- when input.scan(/@dynamic\b/)
1190
- new_token(:kAT_DYNAMIC)
1191
- when input.scan(/const\b/)
1192
- new_token(:kCONST, :const)
1193
- when input.scan(/var\b/)
1194
- new_token(:kVAR, :var)
1195
- when input.scan(/return\b/)
1196
- new_token(:kRETURN)
1197
- when input.scan(/block\b/)
1198
- new_token(:kBLOCK, :block)
1199
- when input.scan(/break\b/)
1200
- new_token(:kBREAK, :break)
1201
- when input.scan(/method\b/)
1202
- new_token(:kMETHOD, :method)
1203
- when input.scan(/self\?/)
1204
- new_token(:kSELFQ)
1205
- when input.scan(/self\b/)
1206
- new_token(:kSELF, :self)
1207
- when input.scan(/'\w+/)
1208
- new_token(:tVAR, input.matched.gsub(/\A'/, '').to_sym)
1209
- when input.scan(/attr_reader\b/)
1210
- new_token(:kATTR_READER, :attr_reader)
1211
- when input.scan(/attr_accessor\b/)
1212
- new_token(:kATTR_ACCESSOR, :attr_accessor)
1213
- when input.scan(/instance\b/)
1214
- new_token(:kINSTANCE, :instance)
1215
- when input.scan(/class\b/)
1216
- new_token(:kCLASS, :class)
1217
- when input.scan(/module\b/)
1218
- new_token(:kMODULE, :module)
1219
- when input.scan(/include\b/)
1220
- new_token(:kINCLUDE, :include)
1221
- when input.scan(/extend\b/)
1222
- new_token(:kEXTEND, :extend)
1223
- when input.scan(/instance\b/)
1224
- new_token(:kINSTANCE, :instance)
1225
- when input.scan(/ivar\b/)
1226
- new_token(:kIVAR, :ivar)
1227
- when input.scan(/private\b/)
1228
- new_token(:kPRIVATE, :private)
1229
- when input.scan(/alias\b/)
1230
- new_token(:kALIAS, :alias)
1231
- when input.scan(/super\b/)
1232
- new_token(:kSUPER, :super)
1233
- when input.scan(/%/)
1234
- new_token(:tPERCENT, :%)
1235
- when input.scan(/-/)
1236
- new_token(:tMINUS, :-)
1237
- when input.scan(/&/)
1238
- new_token(:tOPERATOR, :&)
1239
- when input.scan(/~/)
1240
- new_token(:tOPERATOR, :~)
1241
- when input.scan(/\//)
1242
- new_token(:tOPERATOR, :/)
1243
- when input.scan(/extension\b/)
1244
- new_token(:kEXTENSION, :extension)
1245
- when input.scan(/constructor\b/)
1246
- new_token(:kCONSTRUCTOR, :constructor)
1247
- when input.scan(/noconstructor\b/)
1248
- new_token(:kNOCONSTRUCTOR, :noconstructor)
1249
- when input.scan(/\$\w+\b/)
1250
- new_token(:tGVAR, input.matched.to_sym)
1251
- when input.scan(/::([A-Z]\w*::)*_\w+/)
1252
- new_token(:tQUALIFIED_INTERFACE_NAME, Names::Interface.parse(input.matched))
1253
- when input.scan(/([A-Z]\w*::)+_\w+/)
1254
- new_token(:tQUALIFIED_INTERFACE_NAME, Names::Interface.parse(input.matched))
1255
- when input.scan(/::([A-Z]\w*::)*[a-z]\w*/)
1256
- new_token(:tQUALIFIED_ALIAS_NAME, Names::Alias.parse(input.matched))
1257
- when input.scan(/([A-Z]\w*::)+[a-z]\w*/)
1258
- new_token(:tQUALIFIED_ALIAS_NAME, Names::Alias.parse(input.matched))
1259
- when input.scan(/::([A-Z]\w*::)*[A-Z]\w*/)
1260
- new_token(:tQUALIFIED_MODULE_NAME, Names::Module.parse(input.matched))
1261
- when input.scan(/([A-Z]\w*::)+[A-Z]\w*/)
1262
- new_token(:tQUALIFIED_MODULE_NAME, Names::Module.parse(input.matched))
1263
- when input.scan(/[A-Z]\w*/)
1264
- new_token(:tUIDENT, input.matched.to_sym)
1265
- when input.scan(/_\w+/)
1266
- new_token(:tINTERFACE_NAME, input.matched.to_sym)
1267
- when input.scan(/@\w+/)
1268
- new_token(:tIVAR_NAME, input.matched.to_sym)
1269
- when input.scan(/\d+/)
1270
- new_token(:tINT, input.matched.to_i)
1271
- when input.scan(/\"[^\"]*\"/)
1272
- new_token(:tSTRING, input.matched[1...-1])
1273
- when input.scan(/[a-z]\w*/)
1274
- new_token(:tIDENT, input.matched.to_sym)
1275
- when input.scan(/:/)
1276
- new_token(:tCOLON)
1277
- end
1278
- end