steep 1.6.0 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (453) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/CHANGELOG.md +49 -0
  4. data/README.md +18 -0
  5. data/Rakefile +5 -0
  6. data/bin/output_test.rb +1 -0
  7. data/doc/narrowing.md +195 -0
  8. data/doc/shape.md +194 -0
  9. data/guides/src/gem-rbs-collection/gem-rbs-collection.md +7 -24
  10. data/guides/src/getting-started/getting-started.md +10 -11
  11. data/lib/steep/ast/ignore.rb +148 -0
  12. data/lib/steep/ast/types/factory.rb +27 -18
  13. data/lib/steep/ast/types/helper.rb +4 -0
  14. data/lib/steep/ast/types/intersection.rb +7 -0
  15. data/lib/steep/ast/types/proc.rb +14 -9
  16. data/lib/steep/ast/types/record.rb +7 -0
  17. data/lib/steep/ast/types/tuple.rb +7 -0
  18. data/lib/steep/ast/types/union.rb +7 -0
  19. data/lib/steep/cli.rb +6 -1
  20. data/lib/steep/diagnostic/ruby.rb +16 -0
  21. data/lib/steep/drivers/stats.rb +2 -2
  22. data/lib/steep/drivers/utils/driver_helper.rb +22 -11
  23. data/lib/steep/drivers/validate.rb +4 -2
  24. data/lib/steep/expectations.rb +2 -2
  25. data/lib/steep/interface/block.rb +1 -1
  26. data/lib/steep/interface/builder.rb +342 -358
  27. data/lib/steep/interface/function.rb +82 -11
  28. data/lib/steep/interface/method_type.rb +18 -10
  29. data/lib/steep/interface/shape.rb +69 -18
  30. data/lib/steep/interface/substitution.rb +4 -0
  31. data/lib/steep/node_helper.rb +30 -1
  32. data/lib/steep/project/dsl.rb +18 -21
  33. data/lib/steep/project/options.rb +39 -2
  34. data/lib/steep/project/pattern.rb +1 -2
  35. data/lib/steep/project.rb +11 -7
  36. data/lib/steep/rake_task.rb +132 -0
  37. data/lib/steep/server/change_buffer.rb +2 -2
  38. data/lib/steep/server/interaction_worker.rb +67 -11
  39. data/lib/steep/server/lsp_formatter.rb +2 -0
  40. data/lib/steep/server/worker_process.rb +3 -1
  41. data/lib/steep/services/completion_provider.rb +59 -26
  42. data/lib/steep/services/file_loader.rb +15 -19
  43. data/lib/steep/services/signature_help_provider.rb +37 -35
  44. data/lib/steep/services/type_check_service.rb +36 -8
  45. data/lib/steep/signature/validator.rb +185 -133
  46. data/lib/steep/source/ignore_ranges.rb +69 -0
  47. data/lib/steep/source.rb +10 -4
  48. data/lib/steep/subtyping/check.rb +50 -43
  49. data/lib/steep/subtyping/result.rb +6 -0
  50. data/lib/steep/subtyping/variable_variance.rb +3 -3
  51. data/lib/steep/test.rb +9 -0
  52. data/lib/steep/type_construction.rb +205 -309
  53. data/lib/steep/type_inference/block_params.rb +12 -4
  54. data/lib/steep/type_inference/case_when.rb +301 -0
  55. data/lib/steep/type_inference/context.rb +1 -1
  56. data/lib/steep/type_inference/logic_type_interpreter.rb +3 -2
  57. data/lib/steep/type_inference/method_params.rb +16 -0
  58. data/lib/steep/type_inference/send_args.rb +5 -2
  59. data/lib/steep/version.rb +1 -1
  60. data/lib/steep.rb +25 -8
  61. data/steep.gemspec +5 -2
  62. metadata +12 -396
  63. data/.github/dependabot.yml +0 -22
  64. data/.github/workflows/ruby-windows.yml +0 -34
  65. data/.github/workflows/ruby.yml +0 -33
  66. data/.vscode/steep-shared.code-snippets +0 -41
  67. data/Gemfile +0 -14
  68. data/Gemfile.lock +0 -104
  69. data/Gemfile.steep +0 -0
  70. data/gemfile_steep/Gemfile +0 -3
  71. data/gemfile_steep/Gemfile.lock +0 -64
  72. data/rbs_collection.steep.lock.yaml +0 -106
  73. data/rbs_collection.steep.yaml +0 -23
  74. data/sig/shims/bundler.rbs +0 -3
  75. data/sig/shims/concurrent-ruby.rbs +0 -39
  76. data/sig/shims/exception.rbs +0 -4
  77. data/sig/shims/language-server_protocol.rbs +0 -450
  78. data/sig/shims/parser/comment.rbs +0 -33
  79. data/sig/shims/parser/nodes.rbs +0 -252
  80. data/sig/shims/parser/source/map.rbs +0 -146
  81. data/sig/shims/parser/source/range.rbs +0 -237
  82. data/sig/shims/parser.rbs +0 -59
  83. data/sig/shims/string.rbs +0 -4
  84. data/sig/shims/tagged_logging.rbs +0 -6
  85. data/sig/steep/annotation_parser.rbs +0 -60
  86. data/sig/steep/ast/annotation/collection.rbs +0 -78
  87. data/sig/steep/ast/annotation.rbs +0 -121
  88. data/sig/steep/ast/builtin.rbs +0 -69
  89. data/sig/steep/ast/node/type_application.rbs +0 -31
  90. data/sig/steep/ast/node/type_assertion.rbs +0 -32
  91. data/sig/steep/ast/types/any.rbs +0 -29
  92. data/sig/steep/ast/types/boolean.rbs +0 -31
  93. data/sig/steep/ast/types/bot.rbs +0 -29
  94. data/sig/steep/ast/types/class.rbs +0 -33
  95. data/sig/steep/ast/types/factory.rbs +0 -110
  96. data/sig/steep/ast/types/helper.rbs +0 -22
  97. data/sig/steep/ast/types/instance.rbs +0 -33
  98. data/sig/steep/ast/types/intersection.rbs +0 -38
  99. data/sig/steep/ast/types/literal.rbs +0 -35
  100. data/sig/steep/ast/types/logic.rbs +0 -83
  101. data/sig/steep/ast/types/name.rbs +0 -80
  102. data/sig/steep/ast/types/nil.rbs +0 -31
  103. data/sig/steep/ast/types/proc.rbs +0 -53
  104. data/sig/steep/ast/types/record.rbs +0 -37
  105. data/sig/steep/ast/types/self.rbs +0 -33
  106. data/sig/steep/ast/types/top.rbs +0 -29
  107. data/sig/steep/ast/types/tuple.rbs +0 -35
  108. data/sig/steep/ast/types/union.rbs +0 -38
  109. data/sig/steep/ast/types/var.rbs +0 -42
  110. data/sig/steep/ast/types/void.rbs +0 -29
  111. data/sig/steep/ast/types.rbs +0 -16
  112. data/sig/steep/cli.rbs +0 -55
  113. data/sig/steep/diagnostic/deprecated/else_on_exhaustive_case.rbs +0 -13
  114. data/sig/steep/diagnostic/deprecated/unknown_constant_assigned.rbs +0 -15
  115. data/sig/steep/diagnostic/helper.rbs +0 -15
  116. data/sig/steep/diagnostic/lsp_formatter.rbs +0 -36
  117. data/sig/steep/diagnostic/ruby.rbs +0 -695
  118. data/sig/steep/diagnostic/signature.rbs +0 -252
  119. data/sig/steep/drivers/annotations.rbs +0 -17
  120. data/sig/steep/drivers/check.rbs +0 -33
  121. data/sig/steep/drivers/checkfile.rbs +0 -27
  122. data/sig/steep/drivers/diagnostic_printer.rbs +0 -25
  123. data/sig/steep/drivers/init.rbs +0 -19
  124. data/sig/steep/drivers/langserver.rbs +0 -36
  125. data/sig/steep/drivers/print_project.rbs +0 -15
  126. data/sig/steep/drivers/stats.rbs +0 -47
  127. data/sig/steep/drivers/utils/driver_helper.rbs +0 -25
  128. data/sig/steep/drivers/utils/jobs_option.rbs +0 -19
  129. data/sig/steep/drivers/validate.rbs +0 -15
  130. data/sig/steep/drivers/vendor.rbs +0 -19
  131. data/sig/steep/drivers/watch.rbs +0 -27
  132. data/sig/steep/drivers/worker.rbs +0 -29
  133. data/sig/steep/equatable.rbs +0 -11
  134. data/sig/steep/expectations.rbs +0 -72
  135. data/sig/steep/index/rbs_index.rbs +0 -141
  136. data/sig/steep/index/signature_symbol_provider.rbs +0 -41
  137. data/sig/steep/index/source_index.rbs +0 -63
  138. data/sig/steep/interface/block.rbs +0 -41
  139. data/sig/steep/interface/builder.rbs +0 -166
  140. data/sig/steep/interface/function.rbs +0 -265
  141. data/sig/steep/interface/method_type.rbs +0 -105
  142. data/sig/steep/interface/shape.rbs +0 -61
  143. data/sig/steep/interface/substitution.rbs +0 -49
  144. data/sig/steep/interface/type_param.rbs +0 -43
  145. data/sig/steep/method_name.rbs +0 -30
  146. data/sig/steep/module_helper.rbs +0 -16
  147. data/sig/steep/node_helper.rbs +0 -78
  148. data/sig/steep/path_helper.rbs +0 -15
  149. data/sig/steep/project/dsl.rbs +0 -104
  150. data/sig/steep/project/options.rbs +0 -27
  151. data/sig/steep/project/pattern.rbs +0 -47
  152. data/sig/steep/project/target.rbs +0 -25
  153. data/sig/steep/project.rbs +0 -26
  154. data/sig/steep/range_extension.rbs +0 -7
  155. data/sig/steep/server/base_worker.rbs +0 -49
  156. data/sig/steep/server/change_buffer.rbs +0 -36
  157. data/sig/steep/server/delay_queue.rbs +0 -37
  158. data/sig/steep/server/interaction_worker.rbs +0 -80
  159. data/sig/steep/server/lsp_formatter.rbs +0 -63
  160. data/sig/steep/server/master.rbs +0 -299
  161. data/sig/steep/server/type_check_worker.rbs +0 -141
  162. data/sig/steep/server/worker_process.rbs +0 -97
  163. data/sig/steep/services/completion_provider.rbs +0 -251
  164. data/sig/steep/services/content_change.rbs +0 -37
  165. data/sig/steep/services/file_loader.rbs +0 -21
  166. data/sig/steep/services/goto_service.rbs +0 -106
  167. data/sig/steep/services/hover_provider/rbs.rbs +0 -47
  168. data/sig/steep/services/hover_provider/ruby.rbs +0 -127
  169. data/sig/steep/services/hover_provider/singleton_methods.rbs +0 -11
  170. data/sig/steep/services/path_assignment.rbs +0 -21
  171. data/sig/steep/services/signature_help_provider.rbs +0 -49
  172. data/sig/steep/services/signature_service.rbs +0 -156
  173. data/sig/steep/services/stats_calculator.rbs +0 -41
  174. data/sig/steep/services/type_check_service.rbs +0 -107
  175. data/sig/steep/services/type_name_completion.rbs +0 -135
  176. data/sig/steep/signature/validator.rbs +0 -85
  177. data/sig/steep/source.rbs +0 -102
  178. data/sig/steep/subtyping/cache.rbs +0 -17
  179. data/sig/steep/subtyping/check.rbs +0 -129
  180. data/sig/steep/subtyping/constraints.rbs +0 -111
  181. data/sig/steep/subtyping/relation.rbs +0 -63
  182. data/sig/steep/subtyping/result.rbs +0 -175
  183. data/sig/steep/subtyping/variable_variance.rbs +0 -25
  184. data/sig/steep/thread_waiter.rbs +0 -13
  185. data/sig/steep/type_construction.rbs +0 -567
  186. data/sig/steep/type_inference/block_params.rbs +0 -170
  187. data/sig/steep/type_inference/constant_env.rbs +0 -29
  188. data/sig/steep/type_inference/context.rbs +0 -214
  189. data/sig/steep/type_inference/context_array.rbs +0 -38
  190. data/sig/steep/type_inference/logic_type_interpreter.rbs +0 -108
  191. data/sig/steep/type_inference/method_call.rbs +0 -124
  192. data/sig/steep/type_inference/method_params.rbs +0 -127
  193. data/sig/steep/type_inference/multiple_assignment.rbs +0 -76
  194. data/sig/steep/type_inference/send_args.rbs +0 -243
  195. data/sig/steep/type_inference/type_env.rbs +0 -160
  196. data/sig/steep/type_inference/type_env_builder.rbs +0 -81
  197. data/sig/steep/typing.rbs +0 -75
  198. data/sig/steep.rbs +0 -36
  199. data/smoke/alias/Steepfile +0 -6
  200. data/smoke/alias/a.rb +0 -16
  201. data/smoke/alias/a.rbs +0 -10
  202. data/smoke/alias/b.rb +0 -6
  203. data/smoke/alias/c.rb +0 -8
  204. data/smoke/alias/test_expectations.yml +0 -96
  205. data/smoke/and/Steepfile +0 -6
  206. data/smoke/and/a.rb +0 -8
  207. data/smoke/and/test_expectations.yml +0 -29
  208. data/smoke/array/Steepfile +0 -6
  209. data/smoke/array/a.rb +0 -18
  210. data/smoke/array/b.rb +0 -12
  211. data/smoke/array/c.rb +0 -6
  212. data/smoke/array/test_expectations.yml +0 -103
  213. data/smoke/block/Steepfile +0 -6
  214. data/smoke/block/a.rb +0 -10
  215. data/smoke/block/a.rbs +0 -6
  216. data/smoke/block/b.rb +0 -13
  217. data/smoke/block/c.rb +0 -9
  218. data/smoke/block/c.rbs +0 -3
  219. data/smoke/block/d.rb +0 -11
  220. data/smoke/block/e.rb +0 -12
  221. data/smoke/block/e.rbs +0 -4
  222. data/smoke/block/test_expectations.yml +0 -133
  223. data/smoke/case/Steepfile +0 -6
  224. data/smoke/case/a.rb +0 -18
  225. data/smoke/case/test_expectations.yml +0 -47
  226. data/smoke/class/Steepfile +0 -6
  227. data/smoke/class/a.rb +0 -25
  228. data/smoke/class/a.rbs +0 -23
  229. data/smoke/class/b.rb +0 -5
  230. data/smoke/class/c.rb +0 -9
  231. data/smoke/class/f.rb +0 -10
  232. data/smoke/class/g.rb +0 -6
  233. data/smoke/class/h.rb +0 -19
  234. data/smoke/class/h.rbs +0 -6
  235. data/smoke/class/i.rb +0 -14
  236. data/smoke/class/i.rbs +0 -9
  237. data/smoke/class/test_expectations.yml +0 -117
  238. data/smoke/compact/Steepfile +0 -6
  239. data/smoke/compact/a.rb +0 -2
  240. data/smoke/compact/a.rbs +0 -5
  241. data/smoke/compact/b.rb +0 -2
  242. data/smoke/compact/test_expectations.yml +0 -18
  243. data/smoke/const/Steepfile +0 -6
  244. data/smoke/const/a.rb +0 -27
  245. data/smoke/const/b.rb +0 -7
  246. data/smoke/const/b.rbs +0 -5
  247. data/smoke/const/test_expectations.yml +0 -134
  248. data/smoke/diagnostics/Steepfile +0 -6
  249. data/smoke/diagnostics/a.rbs +0 -22
  250. data/smoke/diagnostics/argument_type_mismatch.rb +0 -1
  251. data/smoke/diagnostics/block_body_type_mismatch.rb +0 -1
  252. data/smoke/diagnostics/block_type_mismatch.rb +0 -3
  253. data/smoke/diagnostics/break_type_mismatch.rb +0 -1
  254. data/smoke/diagnostics/different_method_parameter_kind.rb +0 -9
  255. data/smoke/diagnostics/else_on_exhaustive_case.rb +0 -12
  256. data/smoke/diagnostics/incompatible_annotation.rb +0 -6
  257. data/smoke/diagnostics/incompatible_argument.rb +0 -1
  258. data/smoke/diagnostics/incompatible_assignment.rb +0 -8
  259. data/smoke/diagnostics/method_arity_mismatch.rb +0 -11
  260. data/smoke/diagnostics/method_body_type_mismatch.rb +0 -6
  261. data/smoke/diagnostics/method_definition_missing.rb +0 -2
  262. data/smoke/diagnostics/method_parameter_mismatch.rb +0 -10
  263. data/smoke/diagnostics/method_return_type_annotation_mismatch.rb +0 -7
  264. data/smoke/diagnostics/missing_keyword.rb +0 -1
  265. data/smoke/diagnostics/no_method.rb +0 -1
  266. data/smoke/diagnostics/proc_type_expected.rb +0 -3
  267. data/smoke/diagnostics/required_block_missing.rb +0 -1
  268. data/smoke/diagnostics/return_type_mismatch.rb +0 -6
  269. data/smoke/diagnostics/test_expectations.yml +0 -591
  270. data/smoke/diagnostics/unexpected_block_given.rb +0 -1
  271. data/smoke/diagnostics/unexpected_dynamic_method.rb +0 -3
  272. data/smoke/diagnostics/unexpected_jump.rb +0 -4
  273. data/smoke/diagnostics/unexpected_jump_value.rb +0 -3
  274. data/smoke/diagnostics/unexpected_keyword.rb +0 -1
  275. data/smoke/diagnostics/unexpected_splat.rb +0 -1
  276. data/smoke/diagnostics/unexpected_yield.rb +0 -6
  277. data/smoke/diagnostics/unknown_constant_assigned.rb +0 -7
  278. data/smoke/diagnostics/unresolved_overloading.rb +0 -1
  279. data/smoke/diagnostics/unsupported_syntax.rb +0 -2
  280. data/smoke/diagnostics-rbs/Steepfile +0 -8
  281. data/smoke/diagnostics-rbs/duplicated-method-definition.rbs +0 -20
  282. data/smoke/diagnostics-rbs/generic-parameter-mismatch.rbs +0 -7
  283. data/smoke/diagnostics-rbs/inherit-module.rbs +0 -2
  284. data/smoke/diagnostics-rbs/invalid-method-overload.rbs +0 -3
  285. data/smoke/diagnostics-rbs/invalid-type-application.rbs +0 -7
  286. data/smoke/diagnostics-rbs/invalid_variance_annotation.rbs +0 -3
  287. data/smoke/diagnostics-rbs/mixin-class-error.rbs +0 -6
  288. data/smoke/diagnostics-rbs/nonregular-type-alias.rbs +0 -3
  289. data/smoke/diagnostics-rbs/recursive-alias.rbs +0 -5
  290. data/smoke/diagnostics-rbs/recursive-class.rbs +0 -8
  291. data/smoke/diagnostics-rbs/recursive-type-alias.rbs +0 -3
  292. data/smoke/diagnostics-rbs/superclass-mismatch.rbs +0 -7
  293. data/smoke/diagnostics-rbs/test_expectations.yml +0 -300
  294. data/smoke/diagnostics-rbs/unknown-method-alias.rbs +0 -3
  295. data/smoke/diagnostics-rbs/unknown-type-name-2.rbs +0 -5
  296. data/smoke/diagnostics-rbs/unknown-type-name.rbs +0 -13
  297. data/smoke/diagnostics-rbs-duplicated/Steepfile +0 -6
  298. data/smoke/diagnostics-rbs-duplicated/a.rbs +0 -5
  299. data/smoke/diagnostics-rbs-duplicated/test_expectations.yml +0 -13
  300. data/smoke/diagnostics-ruby-unsat/Steepfile +0 -6
  301. data/smoke/diagnostics-ruby-unsat/a.rbs +0 -3
  302. data/smoke/diagnostics-ruby-unsat/test_expectations.yml +0 -27
  303. data/smoke/diagnostics-ruby-unsat/unsatisfiable_constraint.rb +0 -6
  304. data/smoke/dstr/Steepfile +0 -6
  305. data/smoke/dstr/a.rb +0 -5
  306. data/smoke/dstr/test_expectations.yml +0 -13
  307. data/smoke/ensure/Steepfile +0 -6
  308. data/smoke/ensure/a.rb +0 -18
  309. data/smoke/ensure/test_expectations.yml +0 -62
  310. data/smoke/enumerator/Steepfile +0 -6
  311. data/smoke/enumerator/a.rb +0 -6
  312. data/smoke/enumerator/b.rb +0 -17
  313. data/smoke/enumerator/test_expectations.yml +0 -47
  314. data/smoke/extension/Steepfile +0 -6
  315. data/smoke/extension/a.rb +0 -10
  316. data/smoke/extension/a.rbs +0 -13
  317. data/smoke/extension/b.rb +0 -10
  318. data/smoke/extension/c.rb +0 -9
  319. data/smoke/extension/d.rb +0 -2
  320. data/smoke/extension/e.rb +0 -2
  321. data/smoke/extension/e.rbs +0 -7
  322. data/smoke/extension/f.rb +0 -2
  323. data/smoke/extension/f.rbs +0 -3
  324. data/smoke/extension/test_expectations.yml +0 -73
  325. data/smoke/hash/Steepfile +0 -6
  326. data/smoke/hash/a.rb +0 -17
  327. data/smoke/hash/a.rbs +0 -8
  328. data/smoke/hash/b.rb +0 -6
  329. data/smoke/hash/c.rb +0 -15
  330. data/smoke/hash/d.rb +0 -5
  331. data/smoke/hash/e.rb +0 -1
  332. data/smoke/hash/e.rbs +0 -3
  333. data/smoke/hash/f.rb +0 -11
  334. data/smoke/hash/test_expectations.yml +0 -81
  335. data/smoke/hello/Steepfile +0 -6
  336. data/smoke/hello/hello.rb +0 -11
  337. data/smoke/hello/hello.rbs +0 -7
  338. data/smoke/hello/test_expectations.yml +0 -25
  339. data/smoke/if/Steepfile +0 -6
  340. data/smoke/if/a.rb +0 -20
  341. data/smoke/if/test_expectations.yml +0 -34
  342. data/smoke/implements/Steepfile +0 -6
  343. data/smoke/implements/a.rb +0 -12
  344. data/smoke/implements/a.rbs +0 -6
  345. data/smoke/implements/b.rb +0 -13
  346. data/smoke/implements/b.rbs +0 -12
  347. data/smoke/implements/test_expectations.yml +0 -23
  348. data/smoke/initialize/Steepfile +0 -6
  349. data/smoke/initialize/a.rb +0 -12
  350. data/smoke/initialize/a.rbs +0 -3
  351. data/smoke/initialize/test_expectations.yml +0 -1
  352. data/smoke/integer/Steepfile +0 -6
  353. data/smoke/integer/a.rb +0 -26
  354. data/smoke/integer/test_expectations.yml +0 -110
  355. data/smoke/interface/Steepfile +0 -6
  356. data/smoke/interface/a.rb +0 -12
  357. data/smoke/interface/a.rbs +0 -12
  358. data/smoke/interface/test_expectations.yml +0 -23
  359. data/smoke/kwbegin/Steepfile +0 -6
  360. data/smoke/kwbegin/a.rb +0 -7
  361. data/smoke/kwbegin/test_expectations.yml +0 -17
  362. data/smoke/lambda/Steepfile +0 -6
  363. data/smoke/lambda/a.rb +0 -10
  364. data/smoke/lambda/test_expectations.yml +0 -17
  365. data/smoke/literal/Steepfile +0 -6
  366. data/smoke/literal/a.rb +0 -11
  367. data/smoke/literal/b.rb +0 -7
  368. data/smoke/literal/literal_methods.rbs +0 -4
  369. data/smoke/literal/test_expectations.yml +0 -106
  370. data/smoke/map/Steepfile +0 -6
  371. data/smoke/map/a.rb +0 -5
  372. data/smoke/map/test_expectations.yml +0 -1
  373. data/smoke/method/Steepfile +0 -6
  374. data/smoke/method/a.rb +0 -21
  375. data/smoke/method/a.rbs +0 -4
  376. data/smoke/method/b.rb +0 -25
  377. data/smoke/method/c.rb +0 -5
  378. data/smoke/method/d.rb +0 -1
  379. data/smoke/method/d.rbs +0 -3
  380. data/smoke/method/test_expectations.yml +0 -121
  381. data/smoke/module/Steepfile +0 -6
  382. data/smoke/module/a.rb +0 -19
  383. data/smoke/module/a.rbs +0 -16
  384. data/smoke/module/b.rb +0 -6
  385. data/smoke/module/c.rb +0 -22
  386. data/smoke/module/d.rb +0 -4
  387. data/smoke/module/e.rb +0 -13
  388. data/smoke/module/f.rb +0 -11
  389. data/smoke/module/test_expectations.yml +0 -75
  390. data/smoke/regexp/Steepfile +0 -6
  391. data/smoke/regexp/a.rb +0 -109
  392. data/smoke/regexp/b.rb +0 -79
  393. data/smoke/regexp/test_expectations.yml +0 -615
  394. data/smoke/regression/Steepfile +0 -6
  395. data/smoke/regression/array.rb +0 -7
  396. data/smoke/regression/block_param_split.rb +0 -7
  397. data/smoke/regression/block_param_split.rbs +0 -3
  398. data/smoke/regression/empty_yield.rb +0 -5
  399. data/smoke/regression/empty_yield.rbs +0 -3
  400. data/smoke/regression/enumerator_product.rb +0 -1
  401. data/smoke/regression/fun.rb +0 -8
  402. data/smoke/regression/fun.rbs +0 -4
  403. data/smoke/regression/hash.rb +0 -7
  404. data/smoke/regression/hello world.rb +0 -1
  405. data/smoke/regression/issue_328.rb +0 -1
  406. data/smoke/regression/issue_328.rbs +0 -0
  407. data/smoke/regression/issue_332.rb +0 -11
  408. data/smoke/regression/issue_332.rbs +0 -19
  409. data/smoke/regression/issue_372.rb +0 -8
  410. data/smoke/regression/issue_372.rbs +0 -4
  411. data/smoke/regression/lambda.rb +0 -3
  412. data/smoke/regression/masgn.rb +0 -4
  413. data/smoke/regression/poly_new.rb +0 -2
  414. data/smoke/regression/poly_new.rbs +0 -4
  415. data/smoke/regression/range.rb +0 -5
  416. data/smoke/regression/set_divide.rb +0 -12
  417. data/smoke/regression/test_expectations.yml +0 -120
  418. data/smoke/regression/thread.rb +0 -7
  419. data/smoke/rescue/Steepfile +0 -6
  420. data/smoke/rescue/a.rb +0 -48
  421. data/smoke/rescue/test_expectations.yml +0 -79
  422. data/smoke/self/Steepfile +0 -6
  423. data/smoke/self/a.rb +0 -21
  424. data/smoke/self/a.rbs +0 -4
  425. data/smoke/self/test_expectations.yml +0 -23
  426. data/smoke/skip/Steepfile +0 -6
  427. data/smoke/skip/skip.rb +0 -13
  428. data/smoke/skip/test_expectations.yml +0 -23
  429. data/smoke/stdout/Steepfile +0 -6
  430. data/smoke/stdout/a.rb +0 -8
  431. data/smoke/stdout/a.rbs +0 -7
  432. data/smoke/stdout/test_expectations.yml +0 -1
  433. data/smoke/super/Steepfile +0 -6
  434. data/smoke/super/a.rb +0 -30
  435. data/smoke/super/a.rbs +0 -10
  436. data/smoke/super/test_expectations.yml +0 -69
  437. data/smoke/toplevel/Steepfile +0 -6
  438. data/smoke/toplevel/a.rb +0 -3
  439. data/smoke/toplevel/a.rbs +0 -3
  440. data/smoke/toplevel/test_expectations.yml +0 -15
  441. data/smoke/tsort/Steepfile +0 -7
  442. data/smoke/tsort/a.rb +0 -12
  443. data/smoke/tsort/test_expectations.yml +0 -1
  444. data/smoke/type_case/Steepfile +0 -6
  445. data/smoke/type_case/a.rb +0 -24
  446. data/smoke/type_case/test_expectations.yml +0 -58
  447. data/smoke/unexpected/Steepfile +0 -6
  448. data/smoke/unexpected/test_expectations.yml +0 -13
  449. data/smoke/unexpected/unexpected.rbs +0 -3
  450. data/smoke/yield/Steepfile +0 -6
  451. data/smoke/yield/a.rb +0 -15
  452. data/smoke/yield/b.rb +0 -6
  453. data/smoke/yield/test_expectations.yml +0 -88
@@ -3,7 +3,7 @@ module Steep
3
3
  class Options
4
4
  PathOptions = _ = Struct.new(:core_root, :stdlib_root, :repo_paths, keyword_init: true) do
5
5
  # @implements PathOptions
6
-
6
+
7
7
  def customized_stdlib?
8
8
  stdlib_root != nil
9
9
  end
@@ -15,12 +15,49 @@ module Steep
15
15
 
16
16
  attr_reader :libraries
17
17
  attr_accessor :paths
18
- attr_accessor :collection_lock
18
+ attr_accessor :collection_config_path
19
19
 
20
20
  def initialize
21
21
  @paths = PathOptions.new(repo_paths: [])
22
22
  @libraries = []
23
23
  end
24
+
25
+ def collection_lock_path
26
+ if collection_config_path
27
+ RBS::Collection::Config.to_lockfile_path(collection_config_path)
28
+ end
29
+ end
30
+
31
+ def load_collection_lock(force: false)
32
+ @collection_lock = nil if force
33
+ @collection_lock ||=
34
+ if collection_config_path && collection_lock_path
35
+ case
36
+ when !collection_config_path.file?
37
+ collection_config_path
38
+ when !collection_lock_path.file?
39
+ collection_lock_path
40
+ else
41
+ begin
42
+ content = YAML.load_file(collection_lock_path)
43
+ lock_file = RBS::Collection::Config::Lockfile.from_lockfile(lockfile_path: collection_lock_path, data: content)
44
+ lock_file.check_rbs_availability!
45
+ lock_file
46
+ rescue YAML::SyntaxError, RBS::Collection::Config::CollectionNotAvailable => exn
47
+ exn
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def collection_lock
54
+ case config = load_collection_lock()
55
+ when RBS::Collection::Config::Lockfile
56
+ config
57
+ else
58
+ nil
59
+ end
60
+ end
24
61
  end
25
62
  end
26
63
  end
@@ -46,10 +46,9 @@ module Steep
46
46
 
47
47
  def test_string(path, patterns, prefixes)
48
48
  string = path.to_s
49
- extension = path.extname
50
49
 
51
50
  patterns.any? {|pat| File.fnmatch(pat, string, File::FNM_PATHNAME) } ||
52
- prefixes.any? {|prefix| string.start_with?(prefix) && extension == ext }
51
+ prefixes.any? {|prefix| File.fnmatch("#{prefix}**/*#{ext}", string, File::FNM_PATHNAME) }
53
52
  end
54
53
  end
55
54
  end
data/lib/steep/project.rb CHANGED
@@ -2,18 +2,22 @@ module Steep
2
2
  class Project
3
3
  attr_reader :targets
4
4
  attr_reader :steepfile_path
5
+ attr_reader :base_dir
5
6
 
6
- def initialize(steepfile_path:)
7
+ def initialize(steepfile_path:, base_dir: nil)
7
8
  @targets = []
8
9
  @steepfile_path = steepfile_path
9
-
10
- unless steepfile_path.absolute?
11
- raise "Project#initialize(steepfile_path:): steepfile_path should be absolute path"
10
+ @base_dir = if base_dir
11
+ base_dir
12
+ elsif steepfile_path
13
+ steepfile_path.parent
14
+ else
15
+ raise ArgumentError, "Project#initialize(base_dir:): neither base_dir nor steepfile_path given"
12
16
  end
13
- end
14
17
 
15
- def base_dir
16
- steepfile_path.parent
18
+ if steepfile_path and !steepfile_path.absolute?
19
+ raise ArgumentError, "Project#initialize(steepfile_path:): steepfile_path should be absolute path"
20
+ end
17
21
  end
18
22
 
19
23
  def relative_path(path)
@@ -0,0 +1,132 @@
1
+ require "rake"
2
+ require "rake/tasklib"
3
+ require "steep/cli"
4
+
5
+ module Steep
6
+ # Provides Rake tasks for running Steep commands.
7
+ #
8
+ # require "steep/rake_task"
9
+ # Steep::RakeTask.new do |t|
10
+ # t.check.severity_level = :error
11
+ # t.watch.verbose
12
+ # t.stats << "--format=table"
13
+ # end
14
+ class RakeTask < Rake::TaskLib # steep:ignore UnknownConstant
15
+ attr_accessor :name
16
+
17
+ def self.available_commands
18
+ %i(init check stats binstub project watch)
19
+ end
20
+
21
+ def initialize(name = :steep, cli_runner = default_cli_runner)
22
+ super()
23
+
24
+ @name = name
25
+
26
+ configuration = TaskConfiguration.new
27
+
28
+ yield configuration if block_given?
29
+
30
+ define_tasks(configuration, cli_runner)
31
+ end
32
+
33
+ private
34
+
35
+ # :nodoc:
36
+ class TaskConfiguration
37
+ def initialize
38
+ @commands = {}
39
+ end
40
+
41
+ def method_missing(command)
42
+ if respond_to?(command)
43
+ @commands[command] ||= CommandConfiguration.new
44
+ else
45
+ super
46
+ end
47
+ end
48
+
49
+ def respond_to_missing?(name, include_private = false)
50
+ RakeTask.available_commands.include?(name) || super
51
+ end
52
+
53
+ def options(command)
54
+ @commands[command]&.to_a || []
55
+ end
56
+ end
57
+
58
+ # :nodoc:
59
+ class CommandConfiguration
60
+ def initialize
61
+ @options = []
62
+ end
63
+
64
+ def method_missing(name, value = nil)
65
+ option = "--#{name.to_s.gsub(/_/, '-').gsub(/=/, '')}"
66
+ option << "=#{value}" if value
67
+
68
+ self << option
69
+ end
70
+
71
+ def respond_to_missing?(_name)
72
+ true
73
+ end
74
+
75
+ def <<(value)
76
+ @options << value
77
+ self
78
+ end
79
+
80
+ def to_a
81
+ @options
82
+ end
83
+ end
84
+
85
+ def default_cli_runner
86
+ lambda do |arguments|
87
+ require "steep"
88
+
89
+ cli = Steep::CLI.new(
90
+ stdout: $stdout,
91
+ stdin: $stdin,
92
+ stderr: $stderr,
93
+ argv: arguments
94
+ )
95
+
96
+ cli.run
97
+ end
98
+ end
99
+
100
+ def define_tasks(configuration, cli_runner)
101
+ namespace name do
102
+ RakeTask.available_commands.each do |command|
103
+ desc "Run steep #{command}"
104
+ task command do |_, args|
105
+ configured_options = configuration.options(command)
106
+
107
+ argv = [
108
+ command.to_s,
109
+ *configured_options,
110
+ *args.extras
111
+ ]
112
+
113
+ result = cli_runner[argv]
114
+
115
+ raise "Steep failed" if result.nonzero?
116
+ end
117
+ end
118
+
119
+ desc "Run steep help"
120
+ task "help" do
121
+ arguments = ["--help"]
122
+
123
+ cli_runner[arguments]
124
+ end
125
+ end
126
+
127
+ # Default steep task to steep:check
128
+ desc "Run steep check" unless ::Rake.application.last_description # steep:ignore UnknownConstant
129
+ task name => ["#{name}:check"]
130
+ end
131
+ end
132
+ end
@@ -5,13 +5,13 @@ module Steep
5
5
  attr_reader :buffered_changes
6
6
 
7
7
  def push_buffer
8
- @mutex.synchronize do
8
+ mutex.synchronize do
9
9
  yield buffered_changes
10
10
  end
11
11
  end
12
12
 
13
13
  def pop_buffer
14
- changes = @mutex.synchronize do
14
+ changes = mutex.synchronize do
15
15
  copy = buffered_changes.dup
16
16
  buffered_changes.clear
17
17
  copy
@@ -10,14 +10,15 @@ module Steep
10
10
 
11
11
  LSP = LanguageServer::Protocol
12
12
 
13
- attr_reader :service
13
+ attr_reader :service, :mutex
14
14
 
15
15
  def initialize(project:, reader:, writer:, queue: Queue.new)
16
16
  super(project: project, reader: reader, writer: writer)
17
17
  @queue = queue
18
- @service = Services::TypeCheckService.new(project: project)
19
18
  @mutex = Mutex.new
19
+ @service = Services::TypeCheckService.new(project: project)
20
20
  @buffered_changes = {}
21
+ @last_job_mutex = Mutex.new
21
22
  end
22
23
 
23
24
  def handle_job(job)
@@ -33,25 +34,67 @@ module Steep
33
34
  when ApplyChangeJob
34
35
  # nop
35
36
  when HoverJob
36
- writer.write({ id: job.id, result: process_hover(job) })
37
+ writer.write(
38
+ {
39
+ id: job.id,
40
+ result: process_latest_job(job) { process_hover(job) }
41
+ }
42
+ )
37
43
  when CompletionJob
38
- writer.write({ id: job.id, result: process_completion(job) })
44
+ writer.write(
45
+ {
46
+ id: job.id,
47
+ result: process_latest_job(job) { process_completion(job) }
48
+ }
49
+ )
39
50
  when SignatureHelpJob
40
- writer.write({ id: job.id, result: process_signature_help(job) })
51
+ writer.write(
52
+ {
53
+ id: job.id,
54
+ result: process_latest_job(job) { process_signature_help(job) }
55
+ }
56
+ )
41
57
  end
42
58
  end
43
59
  end
44
60
 
61
+ def process_latest_job(job)
62
+ @last_job_mutex.synchronize do
63
+ unless job.equal?(@last_job)
64
+ Steep.logger.debug { "Skipping interaction job: latest_job=#{@last_job.class}, skipped_job#{job.class}" }
65
+ return
66
+ end
67
+ @last_job = nil
68
+ end
69
+
70
+ yield
71
+ end
72
+
73
+ def queue_job(job)
74
+ @last_job_mutex.synchronize do
75
+ unless job.is_a?(ApplyChangeJob)
76
+ @last_job = job
77
+ end
78
+ end
79
+ queue << job
80
+ end
81
+
45
82
  def handle_request(request)
46
83
  case request[:method]
47
84
  when "initialize"
48
85
  load_files(project: project, commandline_args: [])
49
- queue << ApplyChangeJob.new
86
+ queue_job ApplyChangeJob.new
50
87
  writer.write({ id: request[:id], result: nil })
51
88
 
52
89
  when "textDocument/didChange"
53
90
  collect_changes(request)
54
- queue << ApplyChangeJob.new
91
+ queue_job ApplyChangeJob.new
92
+
93
+ when "$/file/reset"
94
+ uri = request[:params][:uri]
95
+ text = request[:params][:content]
96
+ reset_change(uri: uri, text: text)
97
+ queue_job ApplyChangeJob.new
55
98
 
56
99
  when "textDocument/hover"
57
100
  id = request[:id]
@@ -60,7 +103,7 @@ module Steep
60
103
  line = request[:params][:position][:line]+1
61
104
  column = request[:params][:position][:character]
62
105
 
63
- queue << HoverJob.new(id: id, path: path, line: line, column: column)
106
+ queue_job HoverJob.new(id: id, path: path, line: line, column: column)
64
107
 
65
108
  when "textDocument/completion"
66
109
  id = request[:id]
@@ -71,14 +114,14 @@ module Steep
71
114
  line, column = params[:position].yield_self {|hash| [hash[:line]+1, hash[:character]] }
72
115
  trigger = params.dig(:context, :triggerCharacter)
73
116
 
74
- queue << CompletionJob.new(id: id, path: path, line: line, column: column, trigger: trigger)
117
+ queue_job CompletionJob.new(id: id, path: path, line: line, column: column, trigger: trigger)
75
118
  when "textDocument/signatureHelp"
76
119
  id = request[:id]
77
120
  params = request[:params]
78
121
  path = project.relative_path(PathHelper.to_pathname!(params[:textDocument][:uri]))
79
122
  line, column = params[:position].yield_self {|hash| [hash[:line]+1, hash[:character]] }
80
123
 
81
- queue << SignatureHelpJob.new(id: id, path: path, line: line, column: column)
124
+ queue_job SignatureHelpJob.new(id: id, path: path, line: line, column: column)
82
125
  end
83
126
  end
84
127
 
@@ -394,6 +437,17 @@ module Steep
394
437
  new_text: item.relative_type_name.to_s
395
438
  )
396
439
  )
440
+ when Services::CompletionProvider::TextItem
441
+ LSP::Interface::CompletionItem.new(
442
+ label: item.label,
443
+ label_details: item.help_text && LSP::Interface::CompletionItemLabelDetails.new(description: item.help_text),
444
+ kind: LSP::Constant::CompletionItemKind::SNIPPET,
445
+ insert_text_format: LSP::Constant::InsertTextFormat::SNIPPET,
446
+ text_edit: LSP::Interface::TextEdit.new(
447
+ range: range,
448
+ new_text: item.text
449
+ )
450
+ )
397
451
  end
398
452
  end
399
453
 
@@ -402,7 +456,9 @@ module Steep
402
456
  if target = project.target_for_source_path(job.path)
403
457
  file = service.source_files[job.path] or return
404
458
  subtyping = service.signature_services[target.name].current_subtyping or return
405
- source = Source.parse(file.content, path: file.path, factory: subtyping.factory)
459
+ source =
460
+ Source.parse(file.content, path: file.path, factory: subtyping.factory)
461
+ .without_unrelated_defs(line: job.line, column: job.column)
406
462
 
407
463
  provider = Services::SignatureHelpProvider.new(source: source, subtyping: subtyping)
408
464
 
@@ -263,6 +263,8 @@ module Steep
263
263
  <<~MD
264
264
  **Keyword argument**: `#{item.identifier}`
265
265
  MD
266
+ else
267
+ raise
266
268
  end
267
269
  end
268
270
 
@@ -64,6 +64,7 @@ module Steep
64
64
 
65
65
  pid = fork do
66
66
  Process.setpgid(0, 0)
67
+ Steep.ui_logger.level = :fatal
67
68
  stdin_out.close
68
69
  stdout_in.close
69
70
  worker.run()
@@ -92,7 +93,8 @@ module Steep
92
93
  end
93
94
 
94
95
  def self.spawn_worker(type, name:, steepfile:, steep_command:, index:, delay_shutdown:, patterns:)
95
- args = ["--name=#{name}", "--steepfile=#{steepfile}"]
96
+ args = ["--name=#{name}"]
97
+ args << "--steepfile=#{steepfile}" if steepfile
96
98
  args << (%w(debug info warn error fatal unknown)[Steep.logger.level].yield_self {|log_level| "--log-level=#{log_level}" })
97
99
 
98
100
  if Steep.log_output.is_a?(String)
@@ -157,6 +157,9 @@ module Steep
157
157
  end
158
158
  end
159
159
 
160
+ class TextItem < Struct.new(:text, :help_text, :range, :label, keyword_init: true)
161
+ end
162
+
160
163
  attr_reader :source_text
161
164
  attr_reader :path
162
165
  attr_reader :subtyping
@@ -205,7 +208,7 @@ module Steep
205
208
  end
206
209
  end
207
210
 
208
- if at_comment?(position)
211
+ if comment = at_comment?(position)
209
212
  node, *parents = source.find_nodes(line: position.line, column: position.column)
210
213
 
211
214
  case
@@ -232,9 +235,41 @@ module Steep
232
235
  if annotation
233
236
  annotation.location or raise
234
237
  return items_for_rbs(position: position, buffer: annotation.location.buffer)
235
- else
236
- return []
237
238
  end
239
+
240
+ comment_content = comment.text[1..] || ""
241
+ comment_content.strip!
242
+
243
+ range = Range.new(
244
+ start: Position.new(line: line, column: column),
245
+ end: Position.new(line: line, column: column)
246
+ )
247
+
248
+ items = [
249
+ TextItem.new(label: "steep:ignore:start", text: "steep:ignore:start", help_text: "Open ignore block", range: range),
250
+ TextItem.new(label: "steep:ignore:end", text: "steep:ignore:end", help_text: "Close ignore block", range: range),
251
+ TextItem.new(label: "steep:ignore", text: "steep:ignore ${1:optional diagnostics}", help_text: "Ignore line", range: range),
252
+ TextItem.new(label: "@type var x: T", text: "@type var ${1:variable}: ${2:var type}", help_text: "Type of local variable", range: range),
253
+ TextItem.new(label: "@type self: T", text: "@type self: ${1:self type}", help_text: "Type of `self`", range: range),
254
+ TextItem.new(label: "@type block: T", text: "@type block: ${1:block type}", help_text: "Type of `block`", range: range),
255
+ TextItem.new(label: "@type break: T", text: "@type break: ${1:break type}", help_text: "Type of `block`", range: range),
256
+ ]
257
+
258
+ items = items.filter_map do |item|
259
+ if item.text.start_with?(comment_content)
260
+ TextItem.new(
261
+ label: item.label,
262
+ text: item.text,
263
+ help_text: item.help_text,
264
+ range: Range.new(
265
+ start: Position.new(line: item.range.start.line, column: item.range.start.column - comment_content.size),
266
+ end: item.range.end
267
+ )
268
+ )
269
+ end
270
+ end
271
+
272
+ return items
238
273
  end
239
274
  end
240
275
 
@@ -294,11 +329,7 @@ module Steep
294
329
  end
295
330
 
296
331
  def at_comment?(position)
297
- if source.find_comment(line: position.line, column: position.column)
298
- true
299
- else
300
- false
301
- end
332
+ source.find_comment(line: position.line, column: position.column)
302
333
  end
303
334
 
304
335
  def range_for(position, prefix: "")
@@ -580,18 +611,21 @@ module Steep
580
611
  range = range_for(position, prefix: prefix)
581
612
  context = typing.context_at(line: position.line, column: position.column)
582
613
 
583
- shape = subtyping.builder.shape(
584
- type,
585
- public_only: !include_private,
586
- config: Interface::Builder::Config.new(
587
- self_type: context.self_type,
588
- class_type: context.module_context&.module_type,
589
- instance_type: context.module_context&.instance_type,
590
- variable_bounds: context.variable_context.upper_bounds
591
- )
592
- )
614
+ config =
615
+ if (module_type = context.module_context&.module_type) && (instance_type = context.module_context&.instance_type)
616
+ Interface::Builder::Config.new(
617
+ self_type: context.self_type,
618
+ class_type: module_type,
619
+ instance_type: instance_type,
620
+ variable_bounds: context.variable_context.upper_bounds
621
+ )
622
+ else
623
+ Interface::Builder::Config.new(self_type: context.self_type, variable_bounds: context.variable_context.upper_bounds)
624
+ end
625
+
626
+ if shape = subtyping.builder.shape(type, config)
627
+ shape = shape.public_shape unless include_private
593
628
 
594
- if shape
595
629
  shape.methods.each do |name, method_entry|
596
630
  next if disallowed_method?(name)
597
631
 
@@ -697,17 +731,16 @@ module Steep
697
731
 
698
732
  case call
699
733
  when TypeInference::MethodCall::Typed, TypeInference::MethodCall::Error
734
+ context = typing.context_at(line: position.line, column: position.column)
700
735
  type = call.receiver_type
701
- shape = subtyping.builder.shape(
702
- type,
703
- public_only: !!receiver_node,
704
- config: Interface::Builder::Config.new(self_type: type, class_type: nil, instance_type: nil, variable_bounds: {})
705
- )
706
- if shape
736
+
737
+ config = Interface::Builder::Config.new(self_type: type, variable_bounds: context.variable_context.upper_bounds)
738
+ if shape = subtyping.builder.shape(type, config)
739
+ shape = shape.public_shape if private_send?(call_node)
707
740
  if method = shape.methods[call.method_name]
708
741
  method.method_types.each.with_index do |method_type, i|
709
742
  defn = method_type.method_decls.to_a[0]&.method_def
710
- if defn
743
+ if defn && defn.type.type
711
744
  range = range_for(position, prefix: prefix)
712
745
  kwargs = argument_nodes.find { |arg| arg.type == :kwargs }&.children || []
713
746
  used_kwargs = kwargs.filter_map { |arg| arg.type == :pair && arg.children.first.children.first }
@@ -12,29 +12,25 @@ module Steep
12
12
  pats = commandline_patterns.empty? ? pattern.patterns : commandline_patterns
13
13
 
14
14
  pats.each do |path|
15
- absolute_path = base_dir + path
16
-
17
- if absolute_path.file?
18
- if pattern =~ path
19
- yield absolute_path.relative_path_from(base_dir)
20
- end
21
- else
22
- files = if absolute_path.directory?
23
- Pathname.glob("#{absolute_path}/**/*#{pattern.ext}")
24
- else
25
- Pathname.glob(absolute_path.to_s)
26
- end
27
-
28
- files.sort.each do |source_path|
29
- if source_path.file?
30
- relative_path = source_path.relative_path_from(base_dir)
31
- unless pattern.ignore?(relative_path)
32
- yield relative_path
15
+ Pathname.glob((base_dir + path).to_s).each do |absolute_path|
16
+ if absolute_path.file?
17
+ relative_path = absolute_path.relative_path_from(base_dir)
18
+ if pattern =~ relative_path
19
+ yield relative_path
20
+ end
21
+ else
22
+ files = Pathname.glob("#{absolute_path}/**/*#{pattern.ext}")
23
+
24
+ files.sort.each do |source_path|
25
+ if source_path.file?
26
+ relative_path = source_path.relative_path_from(base_dir)
27
+ unless pattern.ignore?(relative_path)
28
+ yield relative_path
29
+ end
33
30
  end
34
31
  end
35
32
  end
36
33
  end
37
-
38
34
  end
39
35
  else
40
36
  enum_for :each_path_in_patterns, pattern, commandline_patterns