steep 0.11.1 → 0.12.0

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 (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
@@ -0,0 +1,364 @@
1
+ module Ruby
2
+ module Signature
3
+ module AST
4
+ module Members
5
+ class MethodDefinition
6
+ attr_reader :name
7
+ attr_reader :kind
8
+ attr_reader :types
9
+ attr_reader :annotations
10
+ attr_reader :location
11
+ attr_reader :comment
12
+ attr_reader :attributes
13
+
14
+ def initialize(name:, kind:, types:, annotations:, location:, comment:, attributes:)
15
+ @name = name
16
+ @kind = kind
17
+ @types = types
18
+ @annotations = annotations
19
+ @location = location
20
+ @comment = comment
21
+ @attributes = attributes
22
+ end
23
+
24
+ def ==(other)
25
+ other.is_a?(MethodDefinition) &&
26
+ other.name == name &&
27
+ other.kind == kind &&
28
+ other.types == types &&
29
+ other.attributes == attributes
30
+ end
31
+
32
+ alias eql? ==
33
+
34
+ def hash
35
+ self.class.hash ^ name.hash ^ kind.hash ^ types.hash ^ attributes.hash
36
+ end
37
+
38
+ def instance?
39
+ kind == :instance || kind == :singleton_instance
40
+ end
41
+
42
+ def singleton?
43
+ kind == :singleton || kind == :singleton_instance
44
+ end
45
+
46
+ def to_json(*a)
47
+ {
48
+ member: :method_definition,
49
+ kind: kind,
50
+ types: types,
51
+ annotations: annotations,
52
+ location: location,
53
+ comment: comment,
54
+ attributes: attributes
55
+ }.to_json(*a)
56
+ end
57
+ end
58
+
59
+ module Var
60
+ attr_reader :name
61
+ attr_reader :type
62
+ attr_reader :location
63
+ attr_reader :comment
64
+
65
+ def initialize(name:, type:, location:, comment:)
66
+ @name = name
67
+ @type = type
68
+ @location = location
69
+ @comment = comment
70
+ end
71
+
72
+ def ==(other)
73
+ other.is_a?(self.class) && other.name == name && other.type == type
74
+ end
75
+
76
+ alias eql? ==
77
+
78
+ def hash
79
+ self.class.hash ^ name.hash ^ type.hash
80
+ end
81
+ end
82
+
83
+ class InstanceVariable
84
+ include Var
85
+
86
+ def to_json(*a)
87
+ {
88
+ member: :instance_variable,
89
+ name: name,
90
+ type: type,
91
+ location: location,
92
+ comment: comment
93
+ }.to_json(*a)
94
+ end
95
+ end
96
+
97
+ class ClassInstanceVariable
98
+ include Var
99
+
100
+ def to_json(*a)
101
+ {
102
+ member: :class_instance_variable,
103
+ name: name,
104
+ type: type,
105
+ location: location,
106
+ comment: comment
107
+ }.to_json(*a)
108
+ end
109
+ end
110
+
111
+ class ClassVariable
112
+ include Var
113
+
114
+ def to_json(*a)
115
+ {
116
+ member: :class_variable,
117
+ name: name,
118
+ type: type,
119
+ location: location,
120
+ comment: comment
121
+ }.to_json(*a)
122
+ end
123
+ end
124
+
125
+ module Mixin
126
+ attr_reader :name
127
+ attr_reader :args
128
+ attr_reader :annotations
129
+ attr_reader :location
130
+ attr_reader :comment
131
+
132
+ def initialize(name:, args:, annotations:, location:, comment:)
133
+ @name = name
134
+ @args = args
135
+ @annotations = annotations
136
+ @location = location
137
+ @comment = comment
138
+ end
139
+
140
+ def ==(other)
141
+ other.is_a?(self.class) && other.name == name && other.args == args
142
+ end
143
+
144
+ def eql?(other)
145
+ self == other
146
+ end
147
+
148
+ def hash
149
+ self.class.hash ^ name.hash ^ args.hash
150
+ end
151
+ end
152
+
153
+ class Include
154
+ include Mixin
155
+
156
+ def to_json(*a)
157
+ {
158
+ member: :include,
159
+ name: name,
160
+ args: args,
161
+ annotations: annotations,
162
+ location: location,
163
+ comment: comment
164
+ }.to_json(*a)
165
+ end
166
+ end
167
+
168
+ class Extend
169
+ include Mixin
170
+
171
+ def to_json(*a)
172
+ {
173
+ member: :extend,
174
+ name: name,
175
+ args: args,
176
+ annotations: annotations,
177
+ location: location,
178
+ comment: comment
179
+ }.to_json(*a)
180
+ end
181
+ end
182
+
183
+ class Prepend
184
+ include Mixin
185
+
186
+ def to_json(*a)
187
+ {
188
+ member: :prepend,
189
+ name: name,
190
+ args: args,
191
+ annotations: annotations,
192
+ location: location,
193
+ comment: comment
194
+ }.to_json(*a)
195
+ end
196
+ end
197
+
198
+ module Attribute
199
+ attr_reader :name
200
+ attr_reader :type
201
+ attr_reader :ivar_name
202
+ attr_reader :annotations
203
+ attr_reader :location
204
+ attr_reader :comment
205
+
206
+ def initialize(name:, type:, ivar_name:, annotations:, location:, comment:)
207
+ @name = name
208
+ @type = type
209
+ @ivar_name = ivar_name
210
+ @annotations = annotations
211
+ @location = location
212
+ @comment = comment
213
+ end
214
+
215
+ def ==(other)
216
+ other.is_a?(self.class) &&
217
+ other.name == name &&
218
+ other.type == type &&
219
+ other.ivar_name == ivar_name
220
+ end
221
+
222
+ alias eql? ==
223
+
224
+ def hash
225
+ self.class.hash ^ name.hash ^ type.hash ^ ivar_name.hash
226
+ end
227
+ end
228
+
229
+ class AttrReader
230
+ include Attribute
231
+
232
+ def to_json(*a)
233
+ {
234
+ member: :attr_reader,
235
+ name: name,
236
+ type: type,
237
+ ivar_name: ivar_name,
238
+ annotations: annotations,
239
+ location: location,
240
+ comment: comment
241
+ }.to_json(*a)
242
+ end
243
+ end
244
+
245
+ class AttrAccessor
246
+ include Attribute
247
+
248
+ def to_json(*a)
249
+ {
250
+ member: :attr_accessor,
251
+ name: name,
252
+ type: type,
253
+ ivar_name: ivar_name,
254
+ annotations: annotations,
255
+ location: location,
256
+ comment: comment
257
+ }.to_json(*a)
258
+ end
259
+ end
260
+
261
+ class AttrWriter
262
+ include Attribute
263
+
264
+ def to_json(*a)
265
+ {
266
+ member: :attr_writer,
267
+ name: name,
268
+ type: type,
269
+ ivar_name: ivar_name,
270
+ annotations: annotations,
271
+ location: location,
272
+ comment: comment
273
+ }.to_json(*a)
274
+ end
275
+ end
276
+
277
+ module LocationOnly
278
+ attr_reader :location
279
+
280
+ def initialize(location:)
281
+ @location = location
282
+ end
283
+
284
+ def ==(other)
285
+ other.is_a?(self.class)
286
+ end
287
+
288
+ alias eql? ==
289
+
290
+ def hash
291
+ self.class.hash
292
+ end
293
+ end
294
+
295
+ class Public
296
+ include LocationOnly
297
+
298
+ def to_json(*a)
299
+ { member: :public, location: location }.to_json(*a)
300
+ end
301
+ end
302
+
303
+ class Private
304
+ include LocationOnly
305
+
306
+ def to_json(*a)
307
+ { member: :private, location: location }.to_json(*a)
308
+ end
309
+ end
310
+
311
+ class Alias
312
+ attr_reader :new_name
313
+ attr_reader :old_name
314
+ attr_reader :kind
315
+ attr_reader :annotations
316
+ attr_reader :location
317
+ attr_reader :comment
318
+
319
+ def initialize(new_name:, old_name:, kind:, annotations:, location:, comment:)
320
+ @new_name = new_name
321
+ @old_name = old_name
322
+ @kind = kind
323
+ @annotations = annotations
324
+ @location = location
325
+ @comment = comment
326
+ end
327
+
328
+ def ==(other)
329
+ other.is_a?(self.class) &&
330
+ other.new_name == new_name &&
331
+ other.old_name == old_name &&
332
+ other.kind == kind
333
+ end
334
+
335
+ alias eql? ==
336
+
337
+ def hash
338
+ self.class.hash ^ new_name.hash ^ old_name.hash ^ kind.hash
339
+ end
340
+
341
+ def to_json(*a)
342
+ {
343
+ member: :alias,
344
+ new_name: new_name,
345
+ old_name: old_name,
346
+ kind: kind,
347
+ annotations: annotations,
348
+ location: location,
349
+ comment: comment
350
+ }.to_json(*a)
351
+ end
352
+
353
+ def instance?
354
+ kind == :instance
355
+ end
356
+
357
+ def singleton?
358
+ kind == :singleton
359
+ end
360
+ end
361
+ end
362
+ end
363
+ end
364
+ end
@@ -0,0 +1,52 @@
1
+ module Ruby
2
+ module Signature
3
+ class Buffer
4
+ attr_reader :name
5
+ attr_reader :content
6
+ attr_reader :lines
7
+ attr_reader :ranges
8
+
9
+ def initialize(name:, content:)
10
+ @name = name
11
+ @content = content
12
+
13
+ @lines = content.lines
14
+
15
+ @ranges = []
16
+ offset = 0
17
+ lines.each do |line|
18
+ size = line.size
19
+ range = offset...(offset+size)
20
+ ranges << range
21
+ offset += size
22
+ end
23
+ end
24
+
25
+ def pos_to_loc(pos)
26
+ index = ranges.bsearch_index do |range|
27
+ pos < range.end
28
+ end
29
+
30
+ if index
31
+ [index + 1, pos - ranges[index].begin]
32
+ else
33
+ [ranges.size + 1, 0]
34
+ end
35
+ end
36
+
37
+ def loc_to_pos(loc)
38
+ line, column = loc
39
+
40
+ if range = ranges[line - 1]
41
+ range.begin + column
42
+ else
43
+ last_position
44
+ end
45
+ end
46
+
47
+ def last_position
48
+ content.size
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,54 @@
1
+ module Ruby
2
+ module Signature
3
+ module BuiltinNames
4
+ class Name
5
+ attr_reader :name
6
+
7
+ def initialize(name:)
8
+ @name = name
9
+ end
10
+
11
+ def to_s
12
+ name.to_s
13
+ end
14
+
15
+ def instance_type(*args)
16
+ Types::ClassInstance.new(name: name, args: args, location: nil)
17
+ end
18
+
19
+ def instance_type?(type)
20
+ type.is_a?(Types::ClassInstance) && type.name == name
21
+ end
22
+
23
+ def singleton_type
24
+ @singleton_type ||= Types::ClassSingleton.new(name: name, location: nil)
25
+ end
26
+
27
+ def singleton_type?(type)
28
+ type.is_a?(Types::ClassSingleton) && type.name == name
29
+ end
30
+
31
+ def self.define(name, namespace: Namespace.root)
32
+ new(name: TypeName.new(name: name, namespace: namespace))
33
+ end
34
+ end
35
+
36
+ BasicObject = Name.new(name: TypeName.new(name: :BasicObject, namespace: Namespace.root))
37
+ Object = Name.new(name: TypeName.new(name: :Object, namespace: Namespace.root))
38
+ Kernel = Name.new(name: TypeName.new(name: :Kernel, namespace: Namespace.root))
39
+ String = Name.define(:String)
40
+ Comparable = Name.define(:Comparable)
41
+ Enumerable = Name.define(:Enumerable)
42
+ Class = Name.define(:Class)
43
+ Module = Name.define(:Module)
44
+ Array = Name.define(:Array)
45
+ Hash = Name.define(:Hash)
46
+ Range = Name.define(:Range)
47
+ Enumerator = Name.define(:Enumerator)
48
+ Set = Name.define(:Set)
49
+ Symbol = Name.define(:Symbol)
50
+ Integer = Name.define(:Integer)
51
+ Float = Name.define(:Float)
52
+ end
53
+ end
54
+ end