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
data/lib/jade/ast.rb ADDED
@@ -0,0 +1,723 @@
1
+ require 'jade/ast/pretty_printer'
2
+ require 'jade/ast/nodes'
3
+
4
+ module Jade
5
+ module AST
6
+ extend self
7
+ extend Nodes
8
+
9
+ define(:Literal, :value)
10
+ define(:CharLiteral, :value)
11
+ define(:List, :items)
12
+ define(:RecordLiteral, :fields)
13
+ define(:RecordField, :key, :value)
14
+
15
+ define(:RecordUpdate, :base, :fields)
16
+ define(:RecordUpdateSugar, :field_key)
17
+ define(:RecordAccessSugar, :field_key)
18
+
19
+ define(:Assign, :pattern, :expression)
20
+ define(:Bind, :pattern, :expression)
21
+ define(:VariableReference, :name)
22
+ define(:ConstructorReference, :name)
23
+
24
+ define(:Module, :name, :exposing, :body)
25
+ define(:Body, :expressions)
26
+
27
+ define(:FunctionDeclaration, :name, :params, :return_type, :body)
28
+ define(:FunctionDeclarationParam, :name, :type)
29
+ define(:TypeDeclaration, :name, :type_params, :variants)
30
+ define(:VariantDeclaration, :name, :args)
31
+ define(:TypeParam, :name)
32
+ define(:ImportDeclaration, :module_name, :as, :exposing)
33
+ define(:StructDeclaration, :name, :type_params, :record_type)
34
+
35
+ define(:ExposeAll)
36
+ define(:ExposeNone)
37
+ define(:ExposeList, :items)
38
+ define(:ExposeValue, :name)
39
+ define(:ExposeAs, :as)
40
+ define(:ExposeType, :name)
41
+ define(:ExposeTypeExpand, :name)
42
+
43
+ define(:Lambda, :params, :body)
44
+
45
+ define(:Grouping, :expression)
46
+ define(:Tuple, :items)
47
+ define(:InfixApplication, :left, :operator, :right)
48
+ define(:InfixOperator, :value)
49
+
50
+ define(:FunctionCall, :callee, :args, :infix)
51
+ define(:KeyedCall, :callee, :fields)
52
+ define(:Placeholder)
53
+ define(:MemberAccess, :target, :name)
54
+ define(:QualifiedAccess, :target, :name)
55
+ define(:RecordAccess, :target, :name)
56
+
57
+ define(:TypeName, :type)
58
+ define(:QualifiedTypeName, :path)
59
+ define(:TypeVar, :type)
60
+ define(:TypeApplication, :constructor, :args)
61
+ define(:TypeFunction, :params, :return_type)
62
+ define(:TypeRecord, :fields, :row_var)
63
+ define(:TypeTuple, :items)
64
+ define(:TypeUnit)
65
+
66
+ define(:IfThenElse, :condition, :if_branch, :else_branch)
67
+ define(:CaseOf, :expression, :branches)
68
+ define(:CaseOfBranch, :pattern, :body)
69
+
70
+ define(:InteropImportDeclaration, :module, :functions)
71
+ define(:InteropModule, :name)
72
+ define(:InteropFunction, :name, :type)
73
+
74
+ define(:Implementation, :interface, :applied_type, :extends, :functions)
75
+ define(:ImplementationFunction, :name, :fn)
76
+
77
+ define(:InterfaceDeclaration, :name, :type_param, :functions)
78
+ define(:InterfaceFunctionDecl, :name, :type)
79
+
80
+ module Pattern
81
+ extend self
82
+ extend Nodes
83
+
84
+ define(:Wildcard)
85
+ define(:Literal, :literal)
86
+ define(:Binding, :name)
87
+ define(:Constructor, :constructor, :patterns)
88
+ define(:Record, :fields)
89
+ define(:RecordField, :name, :pattern)
90
+ define(:Tuple, :patterns)
91
+ define(:List, :patterns, :rest)
92
+ end
93
+
94
+ def string_literal
95
+ ->(tokens) do
96
+ tokens => [open, token, close]
97
+
98
+ Literal[token.value, token.range.begin...close.range.end]
99
+ end
100
+ end
101
+
102
+ def char_literal
103
+ ->(token) { CharLiteral[token.value, token.range] }
104
+ end
105
+
106
+ def literal
107
+ ->(token) do
108
+ value =
109
+ case token.type
110
+ in :int then token.value.to_i
111
+ in :float then token.value.to_f
112
+ in :bool then token.value == 'True'
113
+ end
114
+
115
+ Literal[value, token.range]
116
+ end
117
+ end
118
+
119
+ def assign
120
+ ->((pattern_node, _assignment, expression_node)) do
121
+ Assign[
122
+ pattern_node,
123
+ expression_node,
124
+ pattern_node.range.begin...expression_node.range.end,
125
+ ]
126
+ end
127
+ end
128
+
129
+ def bind
130
+ ->((pattern_node, _bind, expression_node)) do
131
+ Bind[
132
+ pattern_node,
133
+ expression_node,
134
+ pattern_node.range.begin...expression_node.range.end,
135
+ ]
136
+ end
137
+ end
138
+
139
+ def variable_reference
140
+ ->(identifier) do
141
+ VariableReference[
142
+ identifier.value,
143
+ identifier.range,
144
+ ]
145
+ end
146
+ end
147
+
148
+
149
+ def constructor_reference
150
+ ->(constant) do
151
+ ConstructorReference[
152
+ constant.value,
153
+ constant.range,
154
+ ]
155
+ end
156
+ end
157
+
158
+ def body
159
+ ->(expressions) do
160
+ if expressions.empty?
161
+ Body[[], nil]
162
+
163
+ else
164
+ Body[
165
+ expressions,
166
+ expressions.first.range.begin...expressions.last.range.end,
167
+ ]
168
+ end
169
+ end
170
+ end
171
+
172
+ def function_declaration
173
+ ->(tokens) do
174
+ tokens => [def_token, name, params_list, return_type, body, end_token]
175
+
176
+ FunctionDeclaration.new(
177
+ name: name.value,
178
+ params: params_list.items,
179
+ return_type:,
180
+ body:,
181
+ trailing_comma: params_list.trailing_comma,
182
+ range: def_token.range.begin...end_token.range.end,
183
+ )
184
+ end
185
+ end
186
+
187
+ def function_declaration_param
188
+ ->(tokens) do
189
+ tokens => [name, type]
190
+
191
+ FunctionDeclarationParam[
192
+ name.value,
193
+ type,
194
+ name.range.begin...type.range.end,
195
+ ]
196
+ end
197
+ end
198
+
199
+ def type_name
200
+ ->(token) do
201
+ TypeName[token.value, token.range]
202
+ end
203
+ end
204
+
205
+ def type_record
206
+ ->((lbrace, row_var, fields_list, rbrace)) do
207
+ TypeRecord.new(
208
+ fields: fields_list.items.map { |(identifier, type)| [identifier.value, type] }.to_h,
209
+ row_var:,
210
+ trailing_comma: fields_list.trailing_comma,
211
+ range: lbrace.range.begin...rbrace.range.end,
212
+ )
213
+ end
214
+ end
215
+
216
+ def qualified_type_name
217
+ ->((first, *rest)) do
218
+ constants = [first] + rest
219
+ QualifiedTypeName[constants.map(&:value), constants.first.range.begin...constants.last.range.end]
220
+ end
221
+ end
222
+
223
+ def type_var
224
+ ->(token) do
225
+ TypeVar[token.value, token.range]
226
+ end
227
+ end
228
+
229
+ def type_application
230
+ ->((constructor, args_list, rparen)) do
231
+ TypeApplication.new(
232
+ constructor:,
233
+ args: args_list.items,
234
+ trailing_comma: args_list.trailing_comma,
235
+ range: constructor.range.begin...(rparen || constructor).range.end,
236
+ )
237
+ end
238
+ end
239
+
240
+ def type_function
241
+ ->((params, return_type)) do
242
+ case params
243
+ in [TypeUnit => unit]
244
+ TypeFunction[[], return_type, unit.range.begin...return_type.range.end]
245
+ else
246
+ TypeFunction[params, return_type, params.first.range.begin...return_type.range.end]
247
+ end
248
+ end
249
+ end
250
+
251
+ def infix_application
252
+ ->(left, token_op, right) do
253
+ InfixApplication[
254
+ left,
255
+ InfixOperator[token_op.value, token_op.range],
256
+ right,
257
+ left.range.begin...right.range.end,
258
+ ]
259
+ end
260
+ end
261
+
262
+ def function_call
263
+ ->(callee, _lparen, args_list, rparen) do
264
+ FunctionCall.new(
265
+ callee:,
266
+ args: args_list.items,
267
+ infix: false,
268
+ dictionaries: [],
269
+ trailing_comma: args_list.trailing_comma,
270
+ range: callee.range.begin...rparen.range.end,
271
+ )
272
+ end
273
+ end
274
+
275
+ def member_access
276
+ ->(target, _dot, name) do
277
+ MemberAccess[
278
+ target,
279
+ name,
280
+ target.range.begin...name.range.end,
281
+ ]
282
+ end
283
+ end
284
+
285
+ def type_declaration
286
+ ->((type_token, name, type_params_list, variants)) do
287
+ TypeDeclaration.new(
288
+ name: name.value,
289
+ type_params: type_params_list.items,
290
+ variants:,
291
+ trailing_comma: type_params_list.trailing_comma,
292
+ range: type_token.range.begin...variants.last.range.end,
293
+ )
294
+ end
295
+ end
296
+
297
+ def type_param
298
+ ->(identifier) do
299
+ TypeParam[identifier.value, identifier.range]
300
+ end
301
+ end
302
+
303
+ def variant_declaration
304
+ ->((name, args_list)) do
305
+ VariantDeclaration.new(
306
+ name: name.value,
307
+ args: args_list.items,
308
+ trailing_comma: args_list.trailing_comma,
309
+ range: name.range.begin...(args_list.items.last || name).range.end,
310
+ )
311
+ end
312
+ end
313
+
314
+ def keyed_variant
315
+ ->((lparen, fields, rparen)) do
316
+ type_record.call([lparen, nil, fields, rparen])
317
+ .then { Parsing::Combinators::CommaList.new(items: [it], trailing_comma: false) }
318
+ end
319
+ end
320
+
321
+ def keyed_call
322
+ ->(callee, lparen, fields_list, rparen) do
323
+ KeyedCall.new(
324
+ callee:,
325
+ fields: fields_list.items,
326
+ trailing_comma: fields_list.trailing_comma,
327
+ range: lparen.range.begin...rparen.range.end,
328
+ )
329
+ end
330
+ end
331
+
332
+ def keyed_pattern
333
+ ->(fields) do
334
+ fields_list = Parsing::Combinators::CommaList.new(items: fields, trailing_comma: false)
335
+ record_pattern.call([fields.first, fields_list, fields.last])
336
+ .then { Parsing::Combinators::CommaList.new(items: [it], trailing_comma: false) }
337
+ end
338
+ end
339
+
340
+ def import_declaration
341
+ ->((import, module_parts, as, exposing)) do
342
+ ImportDeclaration[
343
+ module_parts.map(&:value).join('.'),
344
+ as,
345
+ exposing,
346
+ import.range.begin...(module_parts.last.range.end),
347
+ ]
348
+ end
349
+ end
350
+
351
+ def module_
352
+ ->((module_parts, exposing, body)) do
353
+ Module[
354
+ module_parts.map(&:value).join('.'),
355
+ exposing,
356
+ body,
357
+ module_parts.first.range.begin...(body.expressions.last.range.end),
358
+ ]
359
+ end
360
+ end
361
+
362
+ def if_then_else
363
+ ->((if_token, condition, if_branch, else_branch, end_token)) do
364
+ IfThenElse[
365
+ condition,
366
+ if_branch,
367
+ else_branch,
368
+ if_token.range.begin...end_token.range.end,
369
+ ]
370
+ end
371
+ end
372
+
373
+ # `cond ? a : b` desugars to IfThenElse with single-expression bodies.
374
+ # The block form (`if cond then BODY else BODY end`) builds the same
375
+ # AST shape, so downstream passes don't need to distinguish.
376
+ def maybe_ternary
377
+ ->((cond, if_expr, else_expr)) do
378
+ next cond if if_expr.nil?
379
+
380
+ IfThenElse[
381
+ cond,
382
+ Body.new(expressions: [if_expr], range: if_expr.range),
383
+ Body.new(expressions: [else_expr], range: else_expr.range),
384
+ cond.range.begin...else_expr.range.end,
385
+ ]
386
+ end
387
+ end
388
+
389
+ def case_of
390
+ ->((case_token, expression, branches, else_branch, end_token)) do
391
+ CaseOf[
392
+ expression,
393
+ else_branch ? [*branches, else_branch] : branches,
394
+ case_token.range.begin...end_token.range.end,
395
+ ]
396
+ end
397
+ end
398
+
399
+ def case_of_branch
400
+ ->((in_token, pattern, body)) do
401
+ CaseOfBranch[
402
+ pattern,
403
+ body,
404
+ in_token.range.begin...body.range.end,
405
+ ]
406
+ end
407
+ end
408
+
409
+ def case_else_branch
410
+ ->((else_token, body)) do
411
+ CaseOfBranch[
412
+ Pattern::Wildcard.new(range: else_token.range),
413
+ body,
414
+ else_token.range.begin...body.range.end,
415
+ ]
416
+ end
417
+ end
418
+
419
+ def wildcard_pattern
420
+ ->(token) do
421
+ Pattern::Wildcard[token.range]
422
+ end
423
+ end
424
+
425
+ def placeholder
426
+ ->(token) { Placeholder[token.range] }
427
+ end
428
+
429
+ def literal_pattern
430
+ ->(literal) do
431
+ Pattern::Literal[literal, literal.range]
432
+ end
433
+ end
434
+
435
+ def binding_pattern
436
+ ->(identifier) do
437
+ Pattern::Binding[identifier.value, identifier.range]
438
+ end
439
+ end
440
+
441
+ def constructor_pattern
442
+ ->((constructor, patterns_list)) do
443
+ Pattern::Constructor.new(
444
+ constructor:,
445
+ patterns: patterns_list.items,
446
+ trailing_comma: patterns_list.trailing_comma,
447
+ range: constructor.range.begin...(patterns_list.items.last&.range&.end || constructor.range.end),
448
+ )
449
+ end
450
+ end
451
+
452
+ def record_pattern
453
+ ->((lbrace, fields_list, r_brace)) do
454
+ Pattern::Record.new(
455
+ fields: fields_list.items,
456
+ trailing_comma: fields_list.trailing_comma,
457
+ range: lbrace.range.begin...r_brace.range.end,
458
+ )
459
+ end
460
+ end
461
+
462
+ def record_field_pattern
463
+ ->((identifier, _, pattern)) do
464
+ Pattern::RecordField[
465
+ identifier.value,
466
+ pattern,
467
+ identifier.range.begin...pattern.range.end,
468
+ ]
469
+ end
470
+ end
471
+
472
+ def tuple_pattern
473
+ ->((lparen_token, first, rest_list, rparen_token)) do
474
+ Pattern::Tuple.new(
475
+ patterns: [first, *rest_list.items],
476
+ trailing_comma: rest_list.trailing_comma,
477
+ range: lparen_token.range.begin...rparen_token.range.end,
478
+ )
479
+ end
480
+ end
481
+
482
+ def list_pattern
483
+ ->((lbrack, (patterns_list, tail), rbrack)) do
484
+ Pattern::List.new(
485
+ patterns: patterns_list.items,
486
+ rest: tail,
487
+ trailing_comma: patterns_list.trailing_comma,
488
+ range: lbrack.range.begin...rbrack.range.end,
489
+ )
490
+ end
491
+ end
492
+
493
+ def grouping
494
+ ->((lparen_token, expression, rparen_token)) do
495
+ Grouping[
496
+ expression,
497
+ lparen_token.range.begin...rparen_token.range.end
498
+ ]
499
+ end
500
+ end
501
+
502
+ def tuple
503
+ ->((lparen_token, first, rest_list, rparen_token)) do
504
+ Tuple.new(
505
+ items: [first, *rest_list.items],
506
+ trailing_comma: rest_list.trailing_comma,
507
+ range: lparen_token.range.begin...rparen_token.range.end,
508
+ )
509
+ end
510
+ end
511
+
512
+ def type_tuple
513
+ ->((lparen_token, first, rest_list, rparen_token)) do
514
+ TypeTuple.new(
515
+ items: [first, *rest_list.items],
516
+ trailing_comma: rest_list.trailing_comma,
517
+ range: lparen_token.range.begin...rparen_token.range.end,
518
+ )
519
+ end
520
+ end
521
+
522
+ def lambda
523
+ ->((lead_token, params_list, body, rbrace_token)) do
524
+ Lambda.new(
525
+ params: params_list.items,
526
+ body:,
527
+ trailing_comma: params_list.trailing_comma,
528
+ range: lead_token.range.begin...rbrace_token.range.end,
529
+ )
530
+ end
531
+ end
532
+
533
+ def expose_none
534
+ ->(_) do
535
+ ExposeNone[nil]
536
+ end
537
+ end
538
+
539
+ def expose_all
540
+ ->(dot_dot) do
541
+ ExposeAll[dot_dot.range]
542
+ end
543
+ end
544
+
545
+ def expose_list
546
+ ->(comma_list) do
547
+ ExposeList.new(
548
+ items: comma_list.items,
549
+ trailing_comma: comma_list.trailing_comma,
550
+ range: comma_list.items.first.range.begin...comma_list.items.last.range.end,
551
+ )
552
+ end
553
+ end
554
+
555
+ def expose_value
556
+ ->((identifier)) do
557
+ ExposeValue[identifier.value, identifier.range]
558
+ end
559
+ end
560
+
561
+ def expose_type
562
+ ->((constant)) do
563
+ ExposeType[constant.value, constant.range]
564
+ end
565
+ end
566
+
567
+ def expose_type_expand
568
+ ->((constant)) do
569
+ ExposeTypeExpand[constant.value, constant.range]
570
+ end
571
+ end
572
+
573
+ def expose_as
574
+ ->((constant)) do
575
+ ExposeAs[constant.value, constant.range]
576
+ end
577
+ end
578
+
579
+ def list
580
+ ->((lbrack, items_list, rbrack)) do
581
+ List.new(
582
+ items: items_list.items,
583
+ trailing_comma: items_list.trailing_comma,
584
+ range: lbrack.range.begin...rbrack.range.end,
585
+ )
586
+ end
587
+ end
588
+
589
+ def record_literal
590
+ ->((lbrace, fields_list, rbrace)) do
591
+ RecordLiteral.new(
592
+ fields: fields_list.items,
593
+ trailing_comma: fields_list.trailing_comma,
594
+ range: lbrace.range.begin...rbrace.range.end,
595
+ )
596
+ end
597
+ end
598
+
599
+ def record_field
600
+ ->((key, value)) do
601
+ RecordField[key.value, value, key.range.begin...value.range.end]
602
+ end
603
+ end
604
+
605
+ def record_update
606
+ ->((lbrace, variable_reference, _pipe, fields_list, rbrace)) do
607
+ RecordUpdate.new(
608
+ base: variable_reference,
609
+ fields: fields_list.items,
610
+ trailing_comma: fields_list.trailing_comma,
611
+ range: lbrace.range.begin...rbrace.range.end,
612
+ )
613
+ end
614
+ end
615
+
616
+ def record_update_sugar
617
+ ->((dot, key, _assign)) do
618
+ RecordUpdateSugar[key.value, dot.range.begin...key.range.end]
619
+ end
620
+ end
621
+
622
+ def record_access_sugar
623
+ ->((dot, key)) do
624
+ RecordAccessSugar[key.value, dot.range.begin...key.range.end]
625
+ end
626
+ end
627
+
628
+ def interop_import_declaration
629
+ ->((uses_token, interop_module, _with_token, interop_functions, end_token)) do
630
+ InteropImportDeclaration[
631
+ interop_module,
632
+ interop_functions,
633
+ uses_token.range.begin...end_token.range.end,
634
+ ]
635
+ end
636
+ end
637
+
638
+ def interop_module
639
+ ->(parts) do
640
+ InteropModule[
641
+ parts.map(&:value).join('::'),
642
+ parts.first.range.begin...parts.last.range.end,
643
+ ]
644
+ end
645
+ end
646
+
647
+ def interop_function
648
+ ->((name, type_expression)) do
649
+ InteropFunction[
650
+ name.value,
651
+ type_expression,
652
+ name.range.begin...type_expression.range.end,
653
+ ]
654
+ end
655
+ end
656
+
657
+ def struct_declaration
658
+ ->((struct_token, name, type_params_list, record_type)) do
659
+ StructDeclaration.new(
660
+ name: name.value,
661
+ type_params: type_params_list.items,
662
+ record_type:,
663
+ trailing_comma: type_params_list.trailing_comma,
664
+ range: struct_token.range.begin...record_type.range.end,
665
+ )
666
+ end
667
+ end
668
+
669
+ def implementation
670
+ ->((implements_token, interface, applied_type, extends, functions, end_token)) do
671
+ Implementation[
672
+ interface.value,
673
+ applied_type,
674
+ extends.map(&:value),
675
+ functions,
676
+ implements_token.range.begin...end_token.range.end,
677
+ ]
678
+ end
679
+ end
680
+
681
+ def implementation_function
682
+ ->((name, fn)) do
683
+ canonical_name = case name.type
684
+ in :identifier then name.value
685
+ else "(#{name.value})"
686
+ end
687
+
688
+ ImplementationFunction[
689
+ canonical_name,
690
+ fn,
691
+ name.range.begin...fn.range.end,
692
+ ]
693
+ end
694
+ end
695
+
696
+ def interface_declaration
697
+ ->((interface_token, name, type_param, functions, end_token)) do
698
+ InterfaceDeclaration[
699
+ name.value,
700
+ type_param,
701
+ functions,
702
+ interface_token.range.begin...end_token.range.end,
703
+ ]
704
+ end
705
+ end
706
+
707
+ def interface_function_decl
708
+ ->((name, type)) do
709
+ canonical_name =
710
+ case name.type
711
+ in :identifier then name.value
712
+ else "(#{name.value})"
713
+ end
714
+
715
+ InterfaceFunctionDecl[
716
+ canonical_name,
717
+ type,
718
+ name.range.begin...type.range.end,
719
+ ]
720
+ end
721
+ end
722
+ end
723
+ end