jade-lang 0.1.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 (326) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +23 -0
  3. data/LICENSE +21 -0
  4. data/README.md +386 -0
  5. data/exe/jade +6 -0
  6. data/lib/jade/ast/node.rb +44 -0
  7. data/lib/jade/ast/nodes.rb +35 -0
  8. data/lib/jade/ast/pretty_printer.rb +50 -0
  9. data/lib/jade/ast.rb +723 -0
  10. data/lib/jade/calendar/runtime.rb +15 -0
  11. data/lib/jade/cli/fmt.rb +96 -0
  12. data/lib/jade/cli/lsp.rb +13 -0
  13. data/lib/jade/cli/q.rb +113 -0
  14. data/lib/jade/cli.rb +43 -0
  15. data/lib/jade/clock/runtime.rb +13 -0
  16. data/lib/jade/codegen/boundary/cache.rb +94 -0
  17. data/lib/jade/codegen/boundary/specialized/list.rb +65 -0
  18. data/lib/jade/codegen/boundary/specialized/maybe.rb +40 -0
  19. data/lib/jade/codegen/boundary/specialized/record.rb +165 -0
  20. data/lib/jade/codegen/boundary/specialized/scalar.rb +67 -0
  21. data/lib/jade/codegen/boundary/specialized.rb +106 -0
  22. data/lib/jade/codegen/boundary.rb +189 -0
  23. data/lib/jade/codegen/constructor_reference.rb +18 -0
  24. data/lib/jade/codegen/context.rb +96 -0
  25. data/lib/jade/codegen/emitter.rb +81 -0
  26. data/lib/jade/codegen/function_call.rb +367 -0
  27. data/lib/jade/codegen/function_declaration.rb +199 -0
  28. data/lib/jade/codegen/helpers.rb +103 -0
  29. data/lib/jade/codegen/implementation.rb +178 -0
  30. data/lib/jade/codegen/inline.rb +89 -0
  31. data/lib/jade/codegen/inlines.rb +326 -0
  32. data/lib/jade/codegen/method_names.rb +54 -0
  33. data/lib/jade/codegen/pattern/constructor.rb +57 -0
  34. data/lib/jade/codegen/port_decoder.rb +77 -0
  35. data/lib/jade/codegen/pretty.rb +53 -0
  36. data/lib/jade/codegen/transforms/fold_shape.rb +222 -0
  37. data/lib/jade/codegen/transforms/self_call.rb +80 -0
  38. data/lib/jade/codegen/transforms/tail_call.rb +120 -0
  39. data/lib/jade/codegen/variant_declaration.rb +41 -0
  40. data/lib/jade/codegen.rb +400 -0
  41. data/lib/jade/compiler.rb +69 -0
  42. data/lib/jade/decode.rb +320 -0
  43. data/lib/jade/diagnostics/renderer.rb +121 -0
  44. data/lib/jade/diagnostics.rb +77 -0
  45. data/lib/jade/did_you_mean.rb +16 -0
  46. data/lib/jade/entry.rb +177 -0
  47. data/lib/jade/error.rb +72 -0
  48. data/lib/jade/formatter/accesses.rb +37 -0
  49. data/lib/jade/formatter/bindings.rb +29 -0
  50. data/lib/jade/formatter/body.rb +50 -0
  51. data/lib/jade/formatter/calls.rb +51 -0
  52. data/lib/jade/formatter/case_of.rb +31 -0
  53. data/lib/jade/formatter/case_of_branch.rb +59 -0
  54. data/lib/jade/formatter/collections.rb +78 -0
  55. data/lib/jade/formatter/declarations.rb +178 -0
  56. data/lib/jade/formatter/exposing.rb +48 -0
  57. data/lib/jade/formatter/function_declaration.rb +72 -0
  58. data/lib/jade/formatter/helper.rb +122 -0
  59. data/lib/jade/formatter/if_then_else.rb +64 -0
  60. data/lib/jade/formatter/infix_application.rb +69 -0
  61. data/lib/jade/formatter/lambda.rb +50 -0
  62. data/lib/jade/formatter/leaves.rb +111 -0
  63. data/lib/jade/formatter/module_node.rb +26 -0
  64. data/lib/jade/formatter/pattern.rb +61 -0
  65. data/lib/jade/formatter/type.rb +67 -0
  66. data/lib/jade/formatter.rb +38 -0
  67. data/lib/jade/frontend/comment_attacher.rb +121 -0
  68. data/lib/jade/frontend/desugaring/placeholder.rb +39 -0
  69. data/lib/jade/frontend/desugaring/resolved.rb +63 -0
  70. data/lib/jade/frontend/desugaring.rb +217 -0
  71. data/lib/jade/frontend/fixity_fixer.rb +209 -0
  72. data/lib/jade/frontend/forward_declaration/body.rb +30 -0
  73. data/lib/jade/frontend/forward_declaration/error/bad_import.rb +19 -0
  74. data/lib/jade/frontend/forward_declaration/error/exposed_type_not_found.rb +18 -0
  75. data/lib/jade/frontend/forward_declaration/error/exposed_value_not_found.rb +18 -0
  76. data/lib/jade/frontend/forward_declaration/error/module_not_found.rb +18 -0
  77. data/lib/jade/frontend/forward_declaration/error/private_type_expansion.rb +19 -0
  78. data/lib/jade/frontend/forward_declaration/error/tuple_arity_overflow.rb +25 -0
  79. data/lib/jade/frontend/forward_declaration/error/type_not_found.rb +29 -0
  80. data/lib/jade/frontend/forward_declaration/error/type_not_lowerable.rb +16 -0
  81. data/lib/jade/frontend/forward_declaration/error/unknown_extends_interface.rb +18 -0
  82. data/lib/jade/frontend/forward_declaration/error.rb +11 -0
  83. data/lib/jade/frontend/forward_declaration/function_declaration.rb +32 -0
  84. data/lib/jade/frontend/forward_declaration/helper.rb +91 -0
  85. data/lib/jade/frontend/forward_declaration/implementation.rb +63 -0
  86. data/lib/jade/frontend/forward_declaration/implementation_function.rb +39 -0
  87. data/lib/jade/frontend/forward_declaration/import_declaration.rb +115 -0
  88. data/lib/jade/frontend/forward_declaration/interface_declaration.rb +66 -0
  89. data/lib/jade/frontend/forward_declaration/interop_import_declaration.rb +99 -0
  90. data/lib/jade/frontend/forward_declaration/module.rb +98 -0
  91. data/lib/jade/frontend/forward_declaration/struct_declaration.rb +42 -0
  92. data/lib/jade/frontend/forward_declaration/type_declaration.rb +42 -0
  93. data/lib/jade/frontend/forward_declaration.rb +71 -0
  94. data/lib/jade/frontend/pattern_analysis/exhaustiveness.rb +65 -0
  95. data/lib/jade/frontend/pattern_analysis/matrix.rb +235 -0
  96. data/lib/jade/frontend/pattern_analysis.rb +40 -0
  97. data/lib/jade/frontend/semantic_analysis/assign.rb +20 -0
  98. data/lib/jade/frontend/semantic_analysis/body.rb +33 -0
  99. data/lib/jade/frontend/semantic_analysis/case_of.rb +19 -0
  100. data/lib/jade/frontend/semantic_analysis/case_of_branch.rb +20 -0
  101. data/lib/jade/frontend/semantic_analysis/char_literal.rb +14 -0
  102. data/lib/jade/frontend/semantic_analysis/constructor_reference.rb +64 -0
  103. data/lib/jade/frontend/semantic_analysis/error/circular_extends.rb +19 -0
  104. data/lib/jade/frontend/semantic_analysis/error/constant_not_callable.rb +24 -0
  105. data/lib/jade/frontend/semantic_analysis/error/constructor_not_found.rb +34 -0
  106. data/lib/jade/frontend/semantic_analysis/error/constructor_pattern_arity_mismatch.rb +24 -0
  107. data/lib/jade/frontend/semantic_analysis/error/duplicate_field.rb +18 -0
  108. data/lib/jade/frontend/semantic_analysis/error/duplicate_function_declaration.rb +25 -0
  109. data/lib/jade/frontend/semantic_analysis/error/duplicate_record_field.rb +19 -0
  110. data/lib/jade/frontend/semantic_analysis/error/invalid_list_rest_pattern.rb +21 -0
  111. data/lib/jade/frontend/semantic_analysis/error/kwargs_on_non_constructor.rb +17 -0
  112. data/lib/jade/frontend/semantic_analysis/error/missing_exposing_clause.rb +17 -0
  113. data/lib/jade/frontend/semantic_analysis/error/missing_extends_implementation.rb +21 -0
  114. data/lib/jade/frontend/semantic_analysis/error/missing_field.rb +20 -0
  115. data/lib/jade/frontend/semantic_analysis/error/missing_implementation_function.rb +19 -0
  116. data/lib/jade/frontend/semantic_analysis/error/module_not_found.rb +22 -0
  117. data/lib/jade/frontend/semantic_analysis/error/nested_task_port.rb +19 -0
  118. data/lib/jade/frontend/semantic_analysis/error/non_task_port.rb +22 -0
  119. data/lib/jade/frontend/semantic_analysis/error/orphan_implementation.rb +20 -0
  120. data/lib/jade/frontend/semantic_analysis/error/predicate_must_return_bool.rb +22 -0
  121. data/lib/jade/frontend/semantic_analysis/error/predicate_name_not_allowed.rb +25 -0
  122. data/lib/jade/frontend/semantic_analysis/error/shadowing_error.rb +22 -0
  123. data/lib/jade/frontend/semantic_analysis/error/type_args_mismatch.rb +25 -0
  124. data/lib/jade/frontend/semantic_analysis/error/type_param_required.rb +19 -0
  125. data/lib/jade/frontend/semantic_analysis/error/unbound_type_variable.rb +22 -0
  126. data/lib/jade/frontend/semantic_analysis/error/undefined_variable.rb +29 -0
  127. data/lib/jade/frontend/semantic_analysis/error/unknown_field.rb +20 -0
  128. data/lib/jade/frontend/semantic_analysis/error/unknown_implementation_function.rb +19 -0
  129. data/lib/jade/frontend/semantic_analysis/error/unused_interface_type_param.rb +24 -0
  130. data/lib/jade/frontend/semantic_analysis/error/value_not_exposed.rb +23 -0
  131. data/lib/jade/frontend/semantic_analysis/error/variable_not_found.rb +25 -0
  132. data/lib/jade/frontend/semantic_analysis/error.rb +40 -0
  133. data/lib/jade/frontend/semantic_analysis/function_call.rb +60 -0
  134. data/lib/jade/frontend/semantic_analysis/function_declaration.rb +58 -0
  135. data/lib/jade/frontend/semantic_analysis/grouping.rb +17 -0
  136. data/lib/jade/frontend/semantic_analysis/helper.rb +152 -0
  137. data/lib/jade/frontend/semantic_analysis/if_then_else.rb +20 -0
  138. data/lib/jade/frontend/semantic_analysis/implementation.rb +143 -0
  139. data/lib/jade/frontend/semantic_analysis/implementation_function.rb +16 -0
  140. data/lib/jade/frontend/semantic_analysis/import_declaration.rb +14 -0
  141. data/lib/jade/frontend/semantic_analysis/interface_declaration.rb +45 -0
  142. data/lib/jade/frontend/semantic_analysis/interop_import_declaration.rb +69 -0
  143. data/lib/jade/frontend/semantic_analysis/keyed_call/validation.rb +109 -0
  144. data/lib/jade/frontend/semantic_analysis/keyed_call.rb +88 -0
  145. data/lib/jade/frontend/semantic_analysis/lambda.rb +23 -0
  146. data/lib/jade/frontend/semantic_analysis/list.rb +17 -0
  147. data/lib/jade/frontend/semantic_analysis/literal.rb +23 -0
  148. data/lib/jade/frontend/semantic_analysis/member_access.rb +87 -0
  149. data/lib/jade/frontend/semantic_analysis/module_node.rb +27 -0
  150. data/lib/jade/frontend/semantic_analysis/pattern_binding.rb +27 -0
  151. data/lib/jade/frontend/semantic_analysis/pattern_constructor.rb +47 -0
  152. data/lib/jade/frontend/semantic_analysis/pattern_list.rb +33 -0
  153. data/lib/jade/frontend/semantic_analysis/pattern_literal.rb +17 -0
  154. data/lib/jade/frontend/semantic_analysis/pattern_record.rb +25 -0
  155. data/lib/jade/frontend/semantic_analysis/pattern_wildcard.rb +14 -0
  156. data/lib/jade/frontend/semantic_analysis/qualified_access.rb +14 -0
  157. data/lib/jade/frontend/semantic_analysis/record_access.rb +14 -0
  158. data/lib/jade/frontend/semantic_analysis/record_field.rb +17 -0
  159. data/lib/jade/frontend/semantic_analysis/record_literal.rb +21 -0
  160. data/lib/jade/frontend/semantic_analysis/record_update.rb +21 -0
  161. data/lib/jade/frontend/semantic_analysis/struct_declaration.rb +44 -0
  162. data/lib/jade/frontend/semantic_analysis/tuple.rb +17 -0
  163. data/lib/jade/frontend/semantic_analysis/type_declaration.rb +69 -0
  164. data/lib/jade/frontend/semantic_analysis/variable_reference.rb +27 -0
  165. data/lib/jade/frontend/semantic_analysis/variant_declaration.rb +18 -0
  166. data/lib/jade/frontend/semantic_analysis.rb +161 -0
  167. data/lib/jade/frontend/type_checking/canonicalize.rb +97 -0
  168. data/lib/jade/frontend/type_checking/constraints/deriving/decodable.rb +144 -0
  169. data/lib/jade/frontend/type_checking/constraints/deriving/encodable.rb +144 -0
  170. data/lib/jade/frontend/type_checking/constraints/deriving/eq.rb +265 -0
  171. data/lib/jade/frontend/type_checking/constraints/deriving/helpers.rb +59 -0
  172. data/lib/jade/frontend/type_checking/constraints/deriving.rb +28 -0
  173. data/lib/jade/frontend/type_checking/constraints.rb +101 -0
  174. data/lib/jade/frontend/type_checking/definition.rb +71 -0
  175. data/lib/jade/frontend/type_checking/env.rb +79 -0
  176. data/lib/jade/frontend/type_checking/error/case_of_branches_type_mismatch.rb +19 -0
  177. data/lib/jade/frontend/type_checking/error/derivation_failed.rb +21 -0
  178. data/lib/jade/frontend/type_checking/error/function_body_type_mismatch.rb +23 -0
  179. data/lib/jade/frontend/type_checking/error/function_call_type_mismatch.rb +37 -0
  180. data/lib/jade/frontend/type_checking/error/if_branch_type_mismatch.rb +19 -0
  181. data/lib/jade/frontend/type_checking/error/if_branches_type_mismatch.rb +18 -0
  182. data/lib/jade/frontend/type_checking/error/if_condition_type_mismatch.rb +17 -0
  183. data/lib/jade/frontend/type_checking/error/implementation_type_mismatch.rb +20 -0
  184. data/lib/jade/frontend/type_checking/error/list_item_type_mismatch.rb +19 -0
  185. data/lib/jade/frontend/type_checking/error/missing_implementation.rb +20 -0
  186. data/lib/jade/frontend/type_checking/error/missing_patterns.rb +26 -0
  187. data/lib/jade/frontend/type_checking/error/pattern_type_mismatch.rb +13 -0
  188. data/lib/jade/frontend/type_checking/error/port_not_decodable.rb +38 -0
  189. data/lib/jade/frontend/type_checking/error/record_access_type_mismatch.rb +14 -0
  190. data/lib/jade/frontend/type_checking/error/type_mismatch.rb +23 -0
  191. data/lib/jade/frontend/type_checking/error/unresolved_constraint.rb +20 -0
  192. data/lib/jade/frontend/type_checking/error.rb +18 -0
  193. data/lib/jade/frontend/type_checking/expected.rb +23 -0
  194. data/lib/jade/frontend/type_checking/generalization.rb +17 -0
  195. data/lib/jade/frontend/type_checking/generalizer.rb +38 -0
  196. data/lib/jade/frontend/type_checking/inference/assign.rb +58 -0
  197. data/lib/jade/frontend/type_checking/inference/body.rb +45 -0
  198. data/lib/jade/frontend/type_checking/inference/case_of.rb +102 -0
  199. data/lib/jade/frontend/type_checking/inference/constructor_reference.rb +21 -0
  200. data/lib/jade/frontend/type_checking/inference/function_call.rb +132 -0
  201. data/lib/jade/frontend/type_checking/inference/function_declaration.rb +70 -0
  202. data/lib/jade/frontend/type_checking/inference/grouping.rb +18 -0
  203. data/lib/jade/frontend/type_checking/inference/helpers.rb +34 -0
  204. data/lib/jade/frontend/type_checking/inference/if_then_else.rb +46 -0
  205. data/lib/jade/frontend/type_checking/inference/implementation.rb +150 -0
  206. data/lib/jade/frontend/type_checking/inference/import_declaration.rb +19 -0
  207. data/lib/jade/frontend/type_checking/inference/interface_declaration.rb +18 -0
  208. data/lib/jade/frontend/type_checking/inference/interop_import_declaration.rb +18 -0
  209. data/lib/jade/frontend/type_checking/inference/lambda.rb +87 -0
  210. data/lib/jade/frontend/type_checking/inference/list.rb +52 -0
  211. data/lib/jade/frontend/type_checking/inference/literal.rb +24 -0
  212. data/lib/jade/frontend/type_checking/inference/module.rb +18 -0
  213. data/lib/jade/frontend/type_checking/inference/pattern.rb +135 -0
  214. data/lib/jade/frontend/type_checking/inference/qualified_access.rb +23 -0
  215. data/lib/jade/frontend/type_checking/inference/record_access.rb +35 -0
  216. data/lib/jade/frontend/type_checking/inference/record_field.rb +19 -0
  217. data/lib/jade/frontend/type_checking/inference/record_literal.rb +24 -0
  218. data/lib/jade/frontend/type_checking/inference/record_update.rb +37 -0
  219. data/lib/jade/frontend/type_checking/inference/struct_declaration.rb +18 -0
  220. data/lib/jade/frontend/type_checking/inference/type_declaration.rb +18 -0
  221. data/lib/jade/frontend/type_checking/inference/variable_reference.rb +27 -0
  222. data/lib/jade/frontend/type_checking/inference.rb +27 -0
  223. data/lib/jade/frontend/type_checking/instantiation.rb +24 -0
  224. data/lib/jade/frontend/type_checking/loader.rb +80 -0
  225. data/lib/jade/frontend/type_checking/placeholder.rb +12 -0
  226. data/lib/jade/frontend/type_checking/port_resolution.rb +123 -0
  227. data/lib/jade/frontend/type_checking/result.rb +41 -0
  228. data/lib/jade/frontend/type_checking/scheme.rb +20 -0
  229. data/lib/jade/frontend/type_checking/state.rb +52 -0
  230. data/lib/jade/frontend/type_checking/substitution.rb +93 -0
  231. data/lib/jade/frontend/type_checking/unification.rb +282 -0
  232. data/lib/jade/frontend/type_checking/var_gen.rb +33 -0
  233. data/lib/jade/frontend/type_checking.rb +129 -0
  234. data/lib/jade/frontend/unused_analysis.rb +41 -0
  235. data/lib/jade/frontend/usage_analysis/reference_index.rb +53 -0
  236. data/lib/jade/frontend/usage_analysis.rb +195 -0
  237. data/lib/jade/frontend.rb +101 -0
  238. data/lib/jade/interop/boundary.rb +68 -0
  239. data/lib/jade/interop/error.rb +84 -0
  240. data/lib/jade/interop/lowering/error.rb +32 -0
  241. data/lib/jade/interop/lowering.rb +53 -0
  242. data/lib/jade/interop/runtime.rb +24 -0
  243. data/lib/jade/interop.rb +1 -0
  244. data/lib/jade/lexer.rb +189 -0
  245. data/lib/jade/lsp/converters.rb +542 -0
  246. data/lib/jade/lsp/handlers.rb +340 -0
  247. data/lib/jade/lsp/server.rb +63 -0
  248. data/lib/jade/lsp/snippets.rb +100 -0
  249. data/lib/jade/lsp/state.rb +25 -0
  250. data/lib/jade/lsp.rb +16 -0
  251. data/lib/jade/module_loader/cache.rb +56 -0
  252. data/lib/jade/module_loader/dependency_graph.rb +23 -0
  253. data/lib/jade/module_loader/dependency_resolver.rb +48 -0
  254. data/lib/jade/module_loader/normalize.rb +34 -0
  255. data/lib/jade/module_loader/topological_sort.rb +41 -0
  256. data/lib/jade/module_loader.rb +127 -0
  257. data/lib/jade/parsing/combinators.rb +291 -0
  258. data/lib/jade/parsing/error.rb +154 -0
  259. data/lib/jade/parsing/token.rb +12 -0
  260. data/lib/jade/parsing/type.rb +92 -0
  261. data/lib/jade/parsing.rb +674 -0
  262. data/lib/jade/port.rb +1 -0
  263. data/lib/jade/registry.rb +79 -0
  264. data/lib/jade/result.rb +121 -0
  265. data/lib/jade/runtime.rb +127 -0
  266. data/lib/jade/source.rb +62 -0
  267. data/lib/jade/stdlib/basics.rb +214 -0
  268. data/lib/jade/stdlib/bytes.rb +70 -0
  269. data/lib/jade/stdlib/calendar.rb +405 -0
  270. data/lib/jade/stdlib/char.rb +27 -0
  271. data/lib/jade/stdlib/clock.rb +342 -0
  272. data/lib/jade/stdlib/compiled.rb +48 -0
  273. data/lib/jade/stdlib/decode/params.rb +154 -0
  274. data/lib/jade/stdlib/decode.rb +315 -0
  275. data/lib/jade/stdlib/dict.rb +134 -0
  276. data/lib/jade/stdlib/encode.rb +143 -0
  277. data/lib/jade/stdlib/intrinsics.rb +280 -0
  278. data/lib/jade/stdlib/list.rb +214 -0
  279. data/lib/jade/stdlib/maybe.rb +73 -0
  280. data/lib/jade/stdlib/result.rb +131 -0
  281. data/lib/jade/stdlib/set.rb +123 -0
  282. data/lib/jade/stdlib/string.rb +65 -0
  283. data/lib/jade/stdlib/task.rb +55 -0
  284. data/lib/jade/stdlib/tuple.rb +21 -0
  285. data/lib/jade/stdlib.rb +112 -0
  286. data/lib/jade/symbol/anonymous_record.rb +7 -0
  287. data/lib/jade/symbol/base.rb +15 -0
  288. data/lib/jade/symbol/constructor.rb +11 -0
  289. data/lib/jade/symbol/derived_function.rb +5 -0
  290. data/lib/jade/symbol/function.rb +15 -0
  291. data/lib/jade/symbol/function_type.rb +7 -0
  292. data/lib/jade/symbol/implementation.rb +17 -0
  293. data/lib/jade/symbol/implementation_template.rb +13 -0
  294. data/lib/jade/symbol/interface.rb +11 -0
  295. data/lib/jade/symbol/interface_function.rb +18 -0
  296. data/lib/jade/symbol/interop_function.rb +22 -0
  297. data/lib/jade/symbol/lambda.rb +7 -0
  298. data/lib/jade/symbol/parser.rb +79 -0
  299. data/lib/jade/symbol/partial_application.rb +7 -0
  300. data/lib/jade/symbol/record_type.rb +8 -0
  301. data/lib/jade/symbol/stdlib_function.rb +15 -0
  302. data/lib/jade/symbol/stdlib_implementation.rb +7 -0
  303. data/lib/jade/symbol/struct.rb +15 -0
  304. data/lib/jade/symbol/type_application.rb +8 -0
  305. data/lib/jade/symbol/type_ref.rb +11 -0
  306. data/lib/jade/symbol/union.rb +15 -0
  307. data/lib/jade/symbol/value_ref.rb +15 -0
  308. data/lib/jade/symbol/variable.rb +7 -0
  309. data/lib/jade/symbol/variant.rb +11 -0
  310. data/lib/jade/symbol.rb +162 -0
  311. data/lib/jade/task.rb +103 -0
  312. data/lib/jade/tasks/rspec.rb +266 -0
  313. data/lib/jade/tasks.rb +70 -0
  314. data/lib/jade/type/anonymous_record.rb +33 -0
  315. data/lib/jade/type/application.rb +21 -0
  316. data/lib/jade/type/base.rb +9 -0
  317. data/lib/jade/type/constraint.rb +17 -0
  318. data/lib/jade/type/constructor.rb +19 -0
  319. data/lib/jade/type/function.rb +18 -0
  320. data/lib/jade/type/partial_application.rb +17 -0
  321. data/lib/jade/type/unit.rb +15 -0
  322. data/lib/jade/type/var.rb +21 -0
  323. data/lib/jade/type.rb +259 -0
  324. data/lib/jade/version.rb +3 -0
  325. data/lib/jade.rb +55 -0
  326. metadata +387 -0
@@ -0,0 +1,18 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Error
5
+ class ExposedTypeNotFound < Jade::Error
6
+ def initialize(entry, span, name:)
7
+ @name = name
8
+ super(entry:, span:)
9
+ end
10
+
11
+ def message
12
+ "Your are trying to expose a type named `#{@name}` but I cannot find its definition"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Error
5
+ class ExposedValueNotFound < Jade::Error
6
+ def initialize(entry, span, name:)
7
+ @name = name
8
+ super(entry:, span:)
9
+ end
10
+
11
+ def message
12
+ "Your are trying to expose a value named `#{@name}` but I cannot find its definition"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Error
5
+ class ModuleNotFound < Jade::Error
6
+ def initialize(entry, span, name:)
7
+ @name = name
8
+ super(entry:, span:)
9
+ end
10
+
11
+ def message
12
+ "Your are trying to import a module named `#{@name}` but I cannot find it"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Error
5
+ class PrivateTypeExpansion < Jade::Error
6
+ def initialize(entry, span, name:, module_name:)
7
+ @name = name
8
+ @module_name = module_name
9
+ super(entry:, span:)
10
+ end
11
+
12
+ def message
13
+ "#{@module_name}'s `#{@name}` type does not allow `(..)` because its constructors are private"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Error
5
+ class TupleArityOverflow < Jade::Error
6
+ MAX_ARITY = 4
7
+
8
+ def initialize(entry, span, arity:)
9
+ super(entry:, span:)
10
+ @arity = arity
11
+ end
12
+
13
+ def message
14
+ "Tuple of #{@arity} items is too big — tuples cap at #{MAX_ARITY}. " \
15
+ "Use a record or a struct."
16
+ end
17
+
18
+ def label
19
+ "#{@arity}-tuple"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Error
5
+ class TypeNotFound < Jade::Error
6
+ attr_reader :candidates
7
+
8
+ def initialize(entry, span, name:, candidates: [])
9
+ @name = name
10
+ @candidates = candidates
11
+ super(entry:, span:)
12
+ end
13
+
14
+ def message
15
+ "Type `#{@name}` is not defined"
16
+ end
17
+
18
+ def label
19
+ "not found"
20
+ end
21
+
22
+ def queried_name
23
+ @name
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Error
5
+ class TypeNotLowerable < Jade::Error
6
+ attr_reader :message
7
+
8
+ def initialize(entry, span, message:)
9
+ super(entry:, span:)
10
+ @message = message
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Error
5
+ class UnknownExtendsInterface < Jade::Error
6
+ def initialize(entry, span, interface:)
7
+ @interface = interface
8
+ super(entry:, span:)
9
+ end
10
+
11
+ def message
12
+ "I cannot find an interface named `#{@interface}`"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ require 'jade/error'
2
+
3
+ require 'jade/frontend/forward_declaration/error/bad_import'
4
+ require 'jade/frontend/forward_declaration/error/exposed_type_not_found'
5
+ require 'jade/frontend/forward_declaration/error/exposed_value_not_found'
6
+ require 'jade/frontend/forward_declaration/error/module_not_found'
7
+ require 'jade/frontend/forward_declaration/error/private_type_expansion'
8
+ require 'jade/frontend/forward_declaration/error/type_not_lowerable'
9
+ require 'jade/frontend/forward_declaration/error/unknown_extends_interface'
10
+ require 'jade/frontend/forward_declaration/error/type_not_found'
11
+ require 'jade/frontend/forward_declaration/error/tuple_arity_overflow'
@@ -0,0 +1,32 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module FunctionDeclaration
5
+ extend self
6
+ extend Helper
7
+
8
+ def shallow(node, registry, entry)
9
+ node => AST::FunctionDeclaration(name:, range:)
10
+
11
+ Symbol
12
+ .predeclared_function(name, range)
13
+ .then { entry.define(it) }
14
+ .then { Result[it, []] }
15
+ end
16
+
17
+ def deep(node, entry, _)
18
+ node => AST::FunctionDeclaration(name:, params:, return_type:, range:)
19
+
20
+ params
21
+ .map { |param| param.type.then { figure_out_type(entry, it) }.map { [param.name, it] } }
22
+ .then { Results.sequence(it) }
23
+ .map(&:to_h)
24
+ .and_then { |params_types| figure_out_type(entry, return_type).map { [params_types, it] } }
25
+ .map { |params_types, return_type_type| Symbol.function(name, params_types, return_type_type, range) }
26
+ .map { entry.define(it) }
27
+ .then { to_declaration_result(entry, it) }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,91 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Helper
5
+ def shallow_declare_node(ast, registry, entry)
6
+ ForwardDeclaration.shallow_declare_node(ast, registry, entry)
7
+ end
8
+
9
+ def deep_declare_node(ast, entry, registry)
10
+ ForwardDeclaration.deep_declare_node(ast, entry, registry)
11
+ end
12
+
13
+ def figure_out_type(entry, node)
14
+ case node
15
+ in AST::TypeVar(type:)
16
+ Ok[Symbol.var(type, node.range)]
17
+
18
+ in AST::TypeName(type:)
19
+ require_type(entry, type, node.range)
20
+ .map { Symbol.type_application(it.to_ref, []) }
21
+
22
+ in AST::TypeApplication(constructor:, args:)
23
+ constructor_r =
24
+ case constructor
25
+ in AST::TypeName
26
+ require_type(entry, constructor.type, constructor.range)
27
+
28
+ in AST::QualifiedTypeName(path:)
29
+ *module_parts, type_name = path
30
+ require_qualified_type(entry, module_parts.join('.'), type_name, constructor.range)
31
+ end
32
+
33
+ args
34
+ .map { figure_out_type(entry, it) }
35
+ .then { Results.sequence(it) }
36
+ .and_then { |resolved_args| constructor_r.map { Symbol.type_application(it.to_ref, resolved_args, node.range) } }
37
+
38
+ in AST::TypeFunction(params:, return_type:)
39
+ params
40
+ .map { figure_out_type(entry, it) }
41
+ .then { Results.sequence(it) }
42
+ .and_then { |resolved_params| figure_out_type(entry, return_type).map { Symbol.function_type(resolved_params, it) } }
43
+
44
+ in AST::TypeTuple(items:) if items.length > Error::TupleArityOverflow::MAX_ARITY
45
+ Err[Error::TupleArityOverflow.new(entry&.name, node.range, arity: items.length)]
46
+
47
+ in AST::TypeTuple(items:)
48
+ type_name = Stdlib::Tuple.constructor_by_arity(items.length)
49
+
50
+ items
51
+ .map { figure_out_type(entry, it) }
52
+ .then { Results.sequence(it) }
53
+ .map { Symbol.type_application(Symbol.type_ref(*type_name.split('.')), it, node.range) }
54
+
55
+ in AST::TypeRecord(fields:, row_var:)
56
+ row = row_var&.then { |row| Symbol.var(row.name, row.range) }
57
+
58
+ fields
59
+ .map { |k, v| figure_out_type(entry, v).map { [k, it] } }
60
+ .then { Results.sequence(it) }
61
+ .map { Symbol.record_type(it.to_h, row) }
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def require_type(entry, name, span)
68
+ entry.lookup_type(name)
69
+ &.then { Ok[it] } ||
70
+ Err[Error::TypeNotFound.new(
71
+ entry.name, span, name:,
72
+ candidates: entry.types.keys,
73
+ )]
74
+ end
75
+
76
+ def require_qualified_type(entry, module_path, type_name, span)
77
+ entry.lookup_qualified_type(module_path, type_name)
78
+ &.then { Ok[it] } ||
79
+ Err[Error::TypeNotFound.new(entry.name, span, name: "#{module_path}.#{type_name}")]
80
+ end
81
+
82
+ def to_declaration_result(entry, r)
83
+ case r
84
+ in Ok[sym] then Result[sym, []]
85
+ in Err[e] then Result[entry, [e]]
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,63 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module Implementation
5
+ extend self
6
+ extend Helper
7
+
8
+ def shallow(_node, _registry, entry)
9
+ Result[entry, []]
10
+ end
11
+
12
+ def deep(node, entry, _registry)
13
+ node => AST::Implementation(interface:, applied_type:, extends:, functions:)
14
+
15
+ interface_r = require_type(entry, interface, node.range)
16
+
17
+ extends_errors = extends
18
+ .filter_map do |iface_name|
19
+ next if entry.lookup_type(iface_name)
20
+
21
+ Error::UnknownExtendsInterface.new(entry.name, node.range, interface: iface_name)
22
+ end
23
+
24
+ return Result[entry, extends_errors] if extends_errors.any?
25
+
26
+ interface_r
27
+ .and_then do |interface_sym|
28
+ figure_out_type(entry, applied_type).map { [interface_sym, it] }
29
+ end
30
+ .map do |interface_sym, applied_type_sym|
31
+ type_name =
32
+ case applied_type.constructor
33
+ in AST::TypeName(type:) then type
34
+ in AST::QualifiedTypeName(path:) then path.last
35
+ end
36
+ extends_refs = extends.map { entry.lookup_type(it).to_ref }
37
+
38
+ entry_with_fns, fn_map = functions
39
+ .reduce([entry, {}]) do |(acc_entry, acc_map), impl_fn|
40
+ ImplementationFunction
41
+ .declare(impl_fn, acc_entry, interface, type_name)
42
+ .then { |e, ref| [e, acc_map.merge(impl_fn.name => ref)] }
43
+ end
44
+
45
+ Symbol
46
+ .implementation(
47
+ interface_sym.to_ref,
48
+ applied_type_sym.constructor,
49
+ [],
50
+ [],
51
+ fn_map,
52
+ [],
53
+ node.range,
54
+ extends: extends_refs,
55
+ )
56
+ .then { entry_with_fns.define(it) }
57
+ end
58
+ .then { to_declaration_result(entry, it) }
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,39 @@
1
+ require 'jade/codegen/helpers'
2
+
3
+ module Jade
4
+ module Frontend
5
+ module ForwardDeclaration
6
+ module ImplementationFunction
7
+ extend self
8
+ extend Codegen::Helpers
9
+
10
+ def declare(impl_fn, entry, interface, type_name)
11
+ impl_fn => AST::ImplementationFunction(name: fn_name, fn:)
12
+
13
+ case fn
14
+ in AST::Lambda(params: lambda_params)
15
+ synth_name = impl_synthetic_name(interface, type_name, fn_name)
16
+
17
+ stub_params, stub_return = [
18
+ lambda_params
19
+ .zip(0..)
20
+ .to_h { |_, i| [param_synthetic_name(i), Symbol.var(param_synthetic_name(i), nil)] },
21
+ Symbol.var("r", nil),
22
+ ]
23
+
24
+ Symbol
25
+ .function(synth_name, stub_params, stub_return)
26
+ .then { [entry.define(it), Symbol.value_ref(entry.name, synth_name)] }
27
+
28
+
29
+ in AST::VariableReference
30
+ [
31
+ entry,
32
+ Symbol.value_ref(entry.name, fn.name),
33
+ ]
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,115 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module ImportDeclaration
5
+ extend self
6
+
7
+ # TODO: This does a lot, so It could just be import registration.
8
+ # everything else doesn't need the registry at all
9
+ def shallow(ast, registry, entry)
10
+ ast => AST::ImportDeclaration(module_name:, as:, exposing:)
11
+
12
+ importing_module = registry.get(module_name)
13
+
14
+ unless importing_module
15
+ return [
16
+ entry,
17
+ [ModuleNotFound.new(entry, ast.range, name: module_name)],
18
+ ]
19
+ end
20
+
21
+ exposing_to_symbol(exposing, entry, importing_module)
22
+ .map { ImportEntry[module_name, as&.as || module_name, it, importing_module.exposes] }
23
+ .on_err { return Result[entry, it] } => Ok(import_entry)
24
+
25
+ Result[entry.import(import_entry), []]
26
+ end
27
+
28
+ def deep(_, entry, _)
29
+ Result[entry, []]
30
+ end
31
+
32
+ private
33
+
34
+ def exposing_to_symbol(exposing, current_entry, importing_module)
35
+ case exposing
36
+ in AST::ExposeNone then Ok[[]]
37
+ in AST::ExposeAll then Ok[importing_module.exposed]
38
+ in AST::ExposeList(items:) then handle_exposing_list(items, current_entry, importing_module)
39
+ end
40
+ end
41
+
42
+ def bad_import(current_entry, span, module_name, name)
43
+ Err[Error::BadImport.new(current_entry.name, span, module_name:, name:)]
44
+ end
45
+
46
+ def handle_exposing_list(items, current_entry, importing_module)
47
+ items
48
+ .map do |item|
49
+ case item
50
+ in AST::ExposeValue(name:, range:)
51
+ handle_exposing_value(name, range, current_entry, importing_module)
52
+
53
+ in AST::ExposeType(name:, range:)
54
+ handle_exposing_type(name, range, current_entry, importing_module)
55
+
56
+ in AST::ExposeTypeExpand(name:, range:)
57
+ handle_exposing_type(name, range, current_entry, importing_module)
58
+ .and_then do |type|
59
+ handling_exposing_type_expansion(
60
+ type, name, range, current_entry, importing_module
61
+ )
62
+ end
63
+ end
64
+ end
65
+ .then { combine_results(it) }
66
+ .map(&:flatten)
67
+ end
68
+
69
+ def handle_exposing_value(name, span, current_entry, importing_module)
70
+ importing_module
71
+ .exposed_value(name)
72
+ .then do
73
+ it ? Ok[it] : bad_import(current_entry, span, importing_module.name, name)
74
+ end
75
+ end
76
+
77
+ def handle_exposing_type(name, span, current_entry, importing_module)
78
+ importing_module
79
+ .exposed_type(name)
80
+ .then do
81
+ it ? Ok[it] : bad_import(current_entry, span, importing_module.name, name)
82
+ end
83
+ end
84
+
85
+ def handling_exposing_type_expansion(type, name, span, current_entry, importing_module)
86
+ importing_module
87
+ .exposed_type_variants(name)
88
+ .then do |variants|
89
+ if variants
90
+ Ok[variants + [type]]
91
+ else
92
+ Error::PrivateTypeExpansion
93
+ .new(current_entry.name, span, name:, module_name: importing_module.name)
94
+ .then { Err[it] }
95
+ end
96
+ end
97
+ end
98
+
99
+ def combine_results(results)
100
+ oks, errs = results.partition(&:ok?)
101
+
102
+ if errs.empty?
103
+ oks
104
+ .map { it => Ok(ok); ok }
105
+ .then { Ok[it] }
106
+ else
107
+ errs
108
+ .map { it => Err(err); err }
109
+ .then { Err[it] }
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,66 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module InterfaceDeclaration
5
+ extend self
6
+ extend Helper
7
+
8
+ def shallow(node, _registry, entry)
9
+ node => AST::InterfaceDeclaration(name:, type_param:, functions:)
10
+
11
+ interface_ref = Symbol.type_ref(entry.name, name)
12
+ type_var = Symbol.var(type_param.name, type_param.range)
13
+
14
+ functions
15
+ .map do |fn|
16
+ Symbol
17
+ .interface_function(fn.name, interface_ref, [], nil, fn.range)
18
+ end
19
+ .then do |fn_symbols|
20
+ Symbol.interface(name, type_var, fn_symbols, {}, node.range)
21
+ .then { entry.define(it) }
22
+ .then { fn_symbols.reduce(it) { |acc, fn| acc.define(fn) } }
23
+ end
24
+ .then { Result[it, []] }
25
+ end
26
+
27
+ def deep(node, entry, _registry)
28
+ node => AST::InterfaceDeclaration(name:, functions:)
29
+
30
+ symbol = entry.lookup_type(name)
31
+ interface_ref = symbol.to_ref
32
+
33
+ functions
34
+ .map { build_interface_function(entry, interface_ref, it) }
35
+ .then { Results.sequence(it) }
36
+ .map do |fn_symbols|
37
+ fn_symbols
38
+ .reduce(entry) { |acc, fn| acc.define(fn) }
39
+ .then { it.define(symbol.with(functions: fn_symbols)) }
40
+ end
41
+ .then { to_declaration_result(entry, it) }
42
+ end
43
+
44
+ private
45
+
46
+ def build_interface_function(entry, interface_ref, fn_decl)
47
+ fn_decl => AST::InterfaceFunctionDecl(name:, type:, range:)
48
+
49
+ figure_out_type(entry, type)
50
+ .map do |type_symbol|
51
+ params, return_type =
52
+ case type_symbol
53
+ in Symbol::FunctionType(params:, return_type:)
54
+ [params, return_type]
55
+ else
56
+ [[], type_symbol]
57
+ end
58
+
59
+ Symbol
60
+ .interface_function(name, interface_ref, params, return_type, range)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,99 @@
1
+ module Jade
2
+ module Frontend
3
+ module ForwardDeclaration
4
+ module InteropImportDeclaration
5
+ extend self
6
+ extend Helper
7
+
8
+ def shallow(node, registry, entry)
9
+ node => AST::InteropImportDeclaration(functions:)
10
+
11
+ functions
12
+ .reduce(entry) do |acc, fn|
13
+ Symbol
14
+ .predeclared_interop_function(fn.name)
15
+ .then { entry.define(it) }
16
+ end
17
+ .then { Result[it, []] }
18
+ end
19
+
20
+ def deep(node, entry, registry)
21
+ node => AST::InteropImportDeclaration(module: mod_name, functions:)
22
+
23
+ functions
24
+ .reduce([entry, []]) do |(acc, errors), fn|
25
+ case figure_out_type(entry, fn.type)
26
+ in Err[e]
27
+ [acc, errors + [e]]
28
+
29
+ in Ok[type_sym]
30
+ wrap_in_fn_type(type_sym)
31
+ .then { fn_type_to_interop(mod_name, fn, it, entry, registry) }
32
+ .then { |(sym, interop_errors)| [acc.define(sym), errors + interop_errors] }
33
+ end
34
+ end
35
+ .then { Result[*it] }
36
+ end
37
+
38
+ private
39
+
40
+ def wrap_in_fn_type(symbol)
41
+ case symbol
42
+ in Symbol::Function | Symbol::FunctionType
43
+ symbol
44
+ else
45
+ Symbol.function_type([], symbol)
46
+ end
47
+ end
48
+
49
+ def fn_type_to_interop(interop_mod_name, function_node, symbol, entry, registry)
50
+ lifted_errors = Interop::Lowering
51
+ .validate(symbol.return_type, registry, entry)
52
+ .map { Error::TypeNotLowerable.new(entry, function_node.range, message: it.message) }
53
+
54
+ Symbol
55
+ .interop_function(
56
+ function_node.name,
57
+ symbol.params,
58
+ symbol.return_type,
59
+ interop_mod_name.name,
60
+ constraints: implicit_decodable_constraints(symbol.return_type),
61
+ )
62
+ .then { [it, lifted_errors] }
63
+ end
64
+
65
+ # Free type variables anywhere under the return TypeApplication's
66
+ # arms get an implicit Decodable constraint. Ports resolve these
67
+ # to dict markers (bare arms) or partial impls (nested arms) in
68
+ # port_resolution.rb. Non-port shapes yield [].
69
+ def implicit_decodable_constraints(return_type)
70
+ case return_type
71
+ in Symbol::TypeApplication(args:)
72
+ args
73
+ .flat_map { collect_var_names(it) }
74
+ .uniq
75
+ .map { ['Decode.Decodable', it] }
76
+ else
77
+ []
78
+ end
79
+ end
80
+
81
+ def collect_var_names(type_sym)
82
+ case type_sym
83
+ in Symbol::Variable(name:)
84
+ [name]
85
+
86
+ in Symbol::TypeApplication(args:)
87
+ args.flat_map { collect_var_names(it) }
88
+
89
+ in Symbol::RecordType(fields:)
90
+ fields.values.flat_map { collect_var_names(it) }
91
+
92
+ else
93
+ []
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end