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,320 @@
1
+ require 'json'
2
+
3
+ module Jade
4
+ module Decode
5
+ MissingField = Data.define(:_1)
6
+ WrongType = Data.define(:_1, :_2)
7
+ AtField = Data.define(:_1, :_2)
8
+ AtIndex = Data.define(:_1, :_2)
9
+ Multiple = Data.define(:_1)
10
+ Custom = Data.define(:_1)
11
+
12
+ Decoder = Data.define(:desc)
13
+
14
+ module Desc
15
+ Str = Data.define()
16
+ Int = Data.define()
17
+ Flt = Data.define()
18
+ Bool = Data.define()
19
+ Pass = Data.define()
20
+ Nullable = Data.define(:inner)
21
+ Field = Data.define(:key, :inner)
22
+ OptField = Data.define(:key, :inner)
23
+ Optional = Data.define(:key, :inner, :default)
24
+ Idx = Data.define(:index, :inner)
25
+ Lst = Data.define(:inner)
26
+ Dct = Data.define(:k_inner, :v_inner)
27
+ Map = Data.define(:fn, :d)
28
+ Succeed = Data.define(:value)
29
+ AndMap = Data.define(:wrapped, :value_d)
30
+ Sequence = Data.define(:decoders)
31
+ OneOf = Data.define(:decoders)
32
+ AndThen = Data.define(:fn, :d)
33
+ Fail = Data.define(:msg)
34
+ Variant = Data.define(:cases)
35
+ end
36
+
37
+ module Runner
38
+ extend self
39
+
40
+ def from_json(decoder, json_string)
41
+ begin
42
+ parsed = JSON.parse(json_string)
43
+ rescue JSON::ParserError => e
44
+ return err(Jade::Decode::WrongType["valid JSON", e.message])
45
+ end
46
+ run(decoder, parsed)
47
+ end
48
+
49
+ def run(decoder, value)
50
+ interp(decoder.desc, value)
51
+ end
52
+
53
+ private
54
+
55
+ def interp(desc, value)
56
+ case desc
57
+ in Desc::Str[]
58
+ value.is_a?(::String) ? ok(value.dup) : type_err("String", value)
59
+
60
+ in Desc::Int[]
61
+ value.is_a?(::Integer) && !value.is_a?(::Float) ? ok(value) : type_err("Int", value)
62
+
63
+ in Desc::Flt[]
64
+ value.is_a?(::Numeric) ? ok(value.to_f) : type_err("Float", value)
65
+
66
+ in Desc::Bool[]
67
+ value == true || value == false ? ok(value) : type_err("Bool", value)
68
+
69
+ in Desc::Pass[]
70
+ ok(value)
71
+
72
+ in Desc::Nullable[inner]
73
+ if value.nil?
74
+ ok(nothing)
75
+ else
76
+ case interp(inner, value)
77
+ in Jade::Result::Ok[v] then ok(just(v))
78
+ in Jade::Result::Err => e then e
79
+ end
80
+ end
81
+
82
+ in Desc::Field[key, inner]
83
+ h = coerce_hash(value)
84
+ return type_err("Object", value) unless h
85
+
86
+ sym = key.to_sym
87
+ if h.key?(sym)
88
+ wrap_at_field(key, interp(inner, h[sym]))
89
+ elsif h.key?(key)
90
+ wrap_at_field(key, interp(inner, h[key]))
91
+ else
92
+ err(Jade::Decode::MissingField[key.to_s])
93
+ end
94
+
95
+ in Desc::OptField[key, inner]
96
+ h = coerce_hash(value)
97
+ return type_err("Object", value) unless h
98
+
99
+ sym = key.to_sym
100
+ if h.key?(sym)
101
+ wrap_opt_at_field(key, interp(inner, h[sym]))
102
+ elsif h.key?(key)
103
+ wrap_opt_at_field(key, interp(inner, h[key]))
104
+ else
105
+ ok(nothing)
106
+ end
107
+
108
+ in Desc::Optional[key, inner, default]
109
+ h = coerce_hash(value)
110
+ return type_err("Object", value) unless h
111
+
112
+ sym = key.to_sym
113
+ raw = h.fetch(sym) { h.fetch(key) { :__absent__ } }
114
+
115
+ if raw == :__absent__ || raw.nil?
116
+ ok(default)
117
+ else
118
+ case interp(inner, raw)
119
+ in Jade::Result::Ok => r then r
120
+ in Jade::Result::Err[e] then err(Jade::Decode::AtField[key.to_s, e])
121
+ end
122
+ end
123
+
124
+ in Desc::Idx[index, inner]
125
+ arr = coerce_array(value)
126
+ return type_err("Array", value) unless arr
127
+ return err(Jade::Decode::MissingField["[#{index}]"]) if index >= arr.length
128
+
129
+ case interp(inner, arr[index])
130
+ in Jade::Result::Ok => r then r
131
+ in Jade::Result::Err[e] then err(Jade::Decode::AtIndex[index, e])
132
+ end
133
+
134
+ in Desc::Lst[inner]
135
+ arr = coerce_array(value)
136
+ return type_err("Array", value) unless arr
137
+
138
+ values = []
139
+ errors = []
140
+ arr.each_with_index do |v, i|
141
+ case interp(inner, v)
142
+ in Jade::Result::Ok[decoded] then values << decoded
143
+ in Jade::Result::Err[e] then errors << Jade::Decode::AtIndex[i, e]
144
+ end
145
+ end
146
+ errors.empty? ? ok(values) : err(wrap_errors(errors))
147
+
148
+ in Desc::Dct[k_inner, v_inner]
149
+ interp_dict(k_inner, v_inner, value)
150
+
151
+ in Desc::Map[fn, d]
152
+ case interp(d, value)
153
+ in Jade::Result::Ok[v] then ok(fn.call(v))
154
+ in Jade::Result::Err => e then e
155
+ end
156
+
157
+ in Desc::Succeed[v]
158
+ ok(v)
159
+
160
+ in Desc::AndMap[wrapped, value_d]
161
+ combine([interp(wrapped, value), interp(value_d, value)]) { |fn_and_a|
162
+ fn, a = fn_and_a
163
+ fn.call(a)
164
+ }
165
+
166
+ in Desc::Sequence[ds]
167
+ combine(ds.map { interp(it, value) }) { it }
168
+
169
+ in Desc::OneOf[ds]
170
+ errors = []
171
+ ds.each do |d|
172
+ case interp(d, value)
173
+ in Jade::Result::Ok => r then return r
174
+ in Jade::Result::Err[e] then errors << e
175
+ end
176
+ end
177
+ err(wrap_errors(errors))
178
+
179
+ in Desc::AndThen[fn, d]
180
+ case interp(d, value)
181
+ in Jade::Result::Ok[v] then interp(fn.call(v).desc, value)
182
+ in Jade::Result::Err => e then e
183
+ end
184
+
185
+ in Desc::Fail[msg]
186
+ err(Jade::Decode::Custom[msg])
187
+
188
+ in Desc::Variant[cases]
189
+ interp_variant(cases, value)
190
+ end
191
+ end
192
+
193
+ def interp_variant(cases, value)
194
+ return type_err('Array', value) unless value.is_a?(::Array)
195
+ return err(Custom["empty variant array"]) if value.empty?
196
+
197
+ tag = value.first
198
+ return type_err('String tag at index 0', tag) unless tag.is_a?(::String)
199
+
200
+ inner = cases[tag]
201
+ return err(Custom["unknown variant: #{tag.inspect}"]) unless inner
202
+
203
+ interp(inner, value)
204
+ end
205
+
206
+ def ok(v) = Jade::Result::Ok[v]
207
+ def err(e) = Jade::Result::Err[e]
208
+ def nothing = Jade::Maybe::Nothing[]
209
+ def just(v) = Jade::Maybe::Just[v]
210
+
211
+ def type_err(expected, got)
212
+ err(Jade::Decode::WrongType[expected, ruby_type_name(got)])
213
+ end
214
+
215
+ def wrap_at_field(key, result)
216
+ case result
217
+ in Jade::Result::Ok => r then r
218
+ in Jade::Result::Err[e] then err(Jade::Decode::AtField[key.to_s, e])
219
+ end
220
+ end
221
+
222
+ def wrap_opt_at_field(key, result)
223
+ case result
224
+ in Jade::Result::Ok[v] then ok(just(v))
225
+ in Jade::Result::Err[e] then err(Jade::Decode::AtField[key.to_s, e])
226
+ end
227
+ end
228
+
229
+ def combine(results, &block)
230
+ values = []
231
+ errors = []
232
+ results.each do |r|
233
+ case r
234
+ in Jade::Result::Ok[v] then values << v
235
+ in Jade::Result::Err[e] then errors << e
236
+ end
237
+ end
238
+ errors.empty? ? ok(block.call(values)) : err(wrap_errors(errors))
239
+ end
240
+
241
+ def wrap_errors(errors)
242
+ errors.length == 1 ? errors.first : Jade::Decode::Multiple[errors]
243
+ end
244
+
245
+ # Two accepted wire shapes for Dict: a Hash (the natural Ruby form
246
+ # and what String-keyed JSON parses to) and an Array of [k, v] pairs
247
+ # (the form Encode.dict emits — survives non-String keys).
248
+ def interp_dict(k_inner, v_inner, value)
249
+ if (h = coerce_hash(value))
250
+ h.each_pair.map { |k, v| [[k, v], k.to_s] }
251
+ .then { decode_dict_entries(k_inner, v_inner, it, :at_field) }
252
+ elsif (arr = coerce_array(value))
253
+ arr.each_with_index.map { |pair, i| [pair, i] }
254
+ .then { decode_dict_entries(k_inner, v_inner, it, :at_index) }
255
+ else
256
+ type_err("Object or Array", value)
257
+ end
258
+ end
259
+
260
+ def decode_dict_entries(k_inner, v_inner, entries, position)
261
+ h = {}
262
+ errors = []
263
+ entries.each do |pair, pos|
264
+ case pair
265
+ in [k_raw, v_raw]
266
+ k_res = interp(k_inner, k_raw)
267
+ v_res = interp(v_inner, v_raw)
268
+ if k_res.is_a?(Jade::Result::Ok) && v_res.is_a?(Jade::Result::Ok)
269
+ h[k_res._1] = v_res._1
270
+ else
271
+ [k_res, v_res].each do |r|
272
+ errors << wrap_pos(position, pos, r._1) if r.is_a?(Jade::Result::Err)
273
+ end
274
+ end
275
+ else
276
+ errors << wrap_pos(position, pos, Jade::Decode::WrongType["Array[2]", ruby_type_name(pair)])
277
+ end
278
+ end
279
+ errors.empty? ? ok(Jade::Dict::Dict[h]) : err(wrap_errors(errors))
280
+ end
281
+
282
+ def wrap_pos(position, pos, inner)
283
+ position == :at_index \
284
+ ? Jade::Decode::AtIndex[pos, inner]
285
+ : Jade::Decode::AtField[pos, inner]
286
+ end
287
+
288
+ def coerce_hash(value)
289
+ case value
290
+ when ::Hash then value
291
+ when ::Data then value.to_h
292
+ else nil
293
+ end
294
+ end
295
+
296
+ def coerce_array(value)
297
+ value.is_a?(::Array) ? value : nil
298
+ end
299
+
300
+ def ruby_type_name(v)
301
+ Jade::Decode.type_name(v)
302
+ end
303
+ end
304
+
305
+ # Public so specialized boundary decoders can emit error values matching
306
+ # the interpreter's `WrongType` format without going through `Runner`.
307
+ def self.type_name(v)
308
+ case v
309
+ when ::String then "String"
310
+ when ::Integer then "Int"
311
+ when ::Float then "Float"
312
+ when TrueClass, FalseClass then "Bool"
313
+ when ::NilClass then "null"
314
+ when ::Array then "Array"
315
+ when ::Hash then "Object"
316
+ else v.class.name
317
+ end
318
+ end
319
+ end
320
+ end
@@ -0,0 +1,121 @@
1
+ require 'jade/diagnostics'
2
+
3
+ module Jade::Diagnostics
4
+ class Renderer
5
+ SEVERITY_COLOR = {
6
+ error: "\e[31m",
7
+ warning: "\e[33m",
8
+ note: "\e[36m",
9
+ help: "\e[32m",
10
+ }.freeze
11
+
12
+ BLUE = "\e[34m".freeze
13
+ BOLD = "\e[1m".freeze
14
+ RESET = "\e[0m".freeze
15
+
16
+ def initialize(colors: $stdout.tty?)
17
+ @colors = colors
18
+ end
19
+
20
+ def render(diagnostic)
21
+ [
22
+ header(diagnostic),
23
+ diagnostic.primary&.then { span_block(it, severity: diagnostic.severity) if it.source },
24
+ *diagnostic
25
+ .secondary
26
+ .map { span_block(_1, severity: :secondary) },
27
+ *diagnostic
28
+ .annotations
29
+ .map { annotation(_1) },
30
+ ]
31
+ .compact
32
+ .join("\n")
33
+ end
34
+
35
+ def render_all(diagnostics)
36
+ diagnostics
37
+ .items
38
+ .map { render(_1) }
39
+ .join("\n\n")
40
+ end
41
+
42
+ private
43
+
44
+ def header(diagnostic)
45
+ "#{bold}#{color(diagnostic.severity)}#{diagnostic.severity}:#{reset} " \
46
+ "#{bold}#{diagnostic.message}#{reset}"
47
+ end
48
+
49
+ def span_block(label, severity:)
50
+ loc = location_of(label.source, label.span.begin)
51
+ end_offset = [label.span.end - 1, 0].max
52
+ end_loc = location_of(label.source, [end_offset, label.source.text.length - 1].min)
53
+ multiline = end_loc.line > loc.line
54
+ gutter_w = (multiline ? end_loc.line : loc.line).to_s.length
55
+ blank = " " * gutter_w
56
+ col_offset = loc.col - 1
57
+ first_line = extract_line(label.source, loc.line).chomp
58
+ span_len = [multiline ? first_line.length - col_offset : label.span.size, 1].max
59
+ caret = severity == :secondary ? "-" : "^"
60
+ underline = " " * col_offset + caret * span_len
61
+ ann_text = label.message ? " #{label.message}" : ""
62
+ uc = severity == :secondary ? blue : color(severity)
63
+
64
+ lines = [
65
+ "#{blank}#{blue} --> #{reset}#{label.source.uri}:#{loc.line}:#{loc.col}",
66
+ "#{blank}#{blue} |#{reset}",
67
+ "#{blue}#{loc.line.to_s.rjust(gutter_w)} | #{reset}#{first_line}",
68
+ "#{blank}#{blue} | #{reset}#{bold}#{uc}#{underline}#{reset}",
69
+ ]
70
+
71
+ if multiline
72
+ (loc.line + 1..end_loc.line).each do |n|
73
+ source_line = extract_line(label.source, n).chomp
74
+ lines << "#{blue}#{n.to_s.rjust(gutter_w)} | #{reset}#{source_line}"
75
+ next unless n == end_loc.line
76
+
77
+ last_underline = caret * [[end_loc.col, 1].max, source_line.length].min
78
+ lines << "#{blank}#{blue} | #{reset}#{bold}#{uc}#{last_underline}#{ann_text}#{reset}"
79
+ end
80
+ else
81
+ lines[-1] = "#{blank}#{blue} | #{reset}#{bold}#{uc}#{underline}#{ann_text}#{reset}"
82
+ end
83
+
84
+ lines << "#{blank}#{blue} |#{reset}"
85
+ lines.join("\n")
86
+ end
87
+
88
+ def annotation(ann)
89
+ " #{bold}#{color(ann.kind)}= #{ann.kind}:#{reset} #{ann.message}"
90
+ end
91
+
92
+ Location = Data.define(:line, :col)
93
+
94
+ def location_of(source, offset)
95
+ (source.line_starts.rindex { _1 <= offset } || 0)
96
+ .then { Location[it + 1, offset - source.line_starts[it] + 1] }
97
+ end
98
+
99
+ def extract_line(source, line_number)
100
+ s = source.line_starts[line_number - 1]
101
+ e = source.line_starts[line_number] || source.text.length
102
+ source.text[s...e]
103
+ end
104
+
105
+ def color(severity)
106
+ @colors ? SEVERITY_COLOR.fetch(severity, "") : ""
107
+ end
108
+
109
+ def blue
110
+ @colors ? BLUE : ""
111
+ end
112
+
113
+ def bold
114
+ @colors ? BOLD : ""
115
+ end
116
+
117
+ def reset
118
+ @colors ? RESET : ""
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,77 @@
1
+ require 'jade/result'
2
+
3
+ module Jade
4
+ module Diagnostics
5
+ Label = Data.define(:source, :span, :message)
6
+ Annotation = Data.define(:kind, :message)
7
+
8
+ Diagnostic = Data.define(:severity, :message, :primary, :secondary, :annotations) do
9
+ def self.error(message, primary:, secondary: [], annotations: [])
10
+ new(severity: :error, message:, primary:, secondary:, annotations:)
11
+ end
12
+
13
+ def self.warning(message, primary:, secondary: [], annotations: [])
14
+ new(severity: :warning, message:, primary:, secondary:, annotations:)
15
+ end
16
+
17
+ def error?
18
+ severity == :error
19
+ end
20
+
21
+ def annotate(kind, text)
22
+ with(annotations: annotations + [Annotation[kind, text]])
23
+ end
24
+ end
25
+
26
+ List = Data.define(:items) do
27
+ def self.empty
28
+ new(items: [])
29
+ end
30
+
31
+ def add(diagnostic)
32
+ with(items: items + [diagnostic])
33
+ end
34
+
35
+ def error(message, source:, span:, label: nil, secondary: [], annotations: [])
36
+ add(Diagnostic.error(
37
+ message,
38
+ primary: Label[source, span, label],
39
+ secondary:,
40
+ annotations:,
41
+ ))
42
+ end
43
+
44
+ def note(text)
45
+ update_last { _1.annotate(:note, text) }
46
+ end
47
+
48
+ def help(text)
49
+ update_last { _1.annotate(:help, text) }
50
+ end
51
+
52
+ def merge(other)
53
+ with(items: items + other.items)
54
+ end
55
+
56
+ def any_errors?
57
+ items.any?(&:error?)
58
+ end
59
+
60
+ def empty?
61
+ items.empty?
62
+ end
63
+
64
+ def to_result(value)
65
+ any_errors? ? Err.new(self) : Ok.new(value)
66
+ end
67
+
68
+ private
69
+
70
+ def update_last(&block)
71
+ return self if items.empty?
72
+
73
+ with(items: items[0...-1] + [block.call(items.last)])
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,16 @@
1
+ require 'did_you_mean'
2
+
3
+ module Jade
4
+ module DidYouMean
5
+ extend self
6
+
7
+ def suggest(name, candidates, max: 3)
8
+ return [] if name.nil? || candidates.empty?
9
+
10
+ ::DidYouMean::SpellChecker
11
+ .new(dictionary: candidates.uniq)
12
+ .correct(name)
13
+ .first(max)
14
+ end
15
+ end
16
+ end
data/lib/jade/entry.rb ADDED
@@ -0,0 +1,177 @@
1
+ module Jade
2
+ Entry = Data.define(
3
+ :name,
4
+ :defined_values,
5
+ :defined_types,
6
+ :imports,
7
+ :exposes,
8
+ :ast,
9
+ :source,
10
+ :env,
11
+ :generated,
12
+ :implementations,
13
+ :entry,
14
+ :diagnostics,
15
+ :usage_index,
16
+ ) do
17
+
18
+ def self.empty(name)
19
+ new(
20
+ name:,
21
+ defined_values: {},
22
+ defined_types: {},
23
+ imports: ::Set[],
24
+ exposes: ::Set[],
25
+ ast: nil,
26
+ source: nil,
27
+ generated: nil,
28
+ env: nil,
29
+ implementations: {},
30
+ entry: false,
31
+ diagnostics: Diagnostics::List.empty,
32
+ usage_index: nil,
33
+ )
34
+ end
35
+
36
+ def expose(symbol)
37
+ with(exposes: exposes + ::Set[symbol])
38
+ end
39
+
40
+ def import(import_entry)
41
+ with(imports: imports + ::Set[import_entry])
42
+ end
43
+
44
+ def exposed_value(unqualified_name)
45
+ exposes
46
+ .find { it.is_a?(Symbol::ValueRef) && it.name == unqualified_name }
47
+ end
48
+
49
+ def exposed_type(unqualified_name)
50
+ exposes
51
+ .find { it.is_a?(Symbol::TypeRef) && it.name == unqualified_name }
52
+ end
53
+
54
+ def exposed_type_variants(unqualified_name)
55
+ type_ref = exposes
56
+ .find { it.is_a?(Symbol::TypeRef) && it.name == unqualified_name }
57
+
58
+ return nil unless type_ref
59
+
60
+ types[unqualified_name]
61
+ .constructor_refs
62
+ .then { it & exposes.to_a }
63
+ .then { it.empty? ? nil : it }
64
+ end
65
+
66
+ def imported_values
67
+ imports
68
+ .flat_map(&:unqualified_symbols)
69
+ .select { it.is_a?(Symbol::ValueRef) }
70
+ .map { [it.name, it] }
71
+ .to_h
72
+ end
73
+
74
+ def imported_types
75
+ imports
76
+ .flat_map(&:unqualified_symbols)
77
+ .select { it.is_a?(Symbol::TypeRef) }
78
+ .map { [it.name, it] }
79
+ .to_h
80
+ end
81
+
82
+ def values
83
+ imported_values.merge(defined_values)
84
+ end
85
+
86
+ def types
87
+ imported_types.merge(defined_types)
88
+ end
89
+
90
+ def define(symbol)
91
+ case symbol
92
+ in Symbol::Union | Symbol::Struct | Symbol::Interface
93
+ add_defined_type(symbol)
94
+
95
+ in Symbol::Implementation
96
+ add_implementation(symbol)
97
+
98
+ in Symbol::Function | Symbol::StdlibFunction |
99
+ Symbol::Constructor | Symbol::Variant |
100
+ Symbol::InteropFunction | Symbol::InterfaceFunction
101
+ add_defined_value(symbol)
102
+ end
103
+ end
104
+
105
+ def lookup_value(name)
106
+ values[name]
107
+ end
108
+
109
+ def lookup_type(name)
110
+ types[name]
111
+ end
112
+
113
+ def lookup_qualified_type(as, type_name)
114
+ imports
115
+ .find { it.alias == as }
116
+ &.qualified_symbols&.find { it.is_a?(Symbol::TypeRef) && it.name == type_name }
117
+ end
118
+
119
+ def path
120
+ source.uri.gsub('.jd', '.rb')
121
+ end
122
+
123
+ # Source spans are stripped so unrelated edits (e.g. whitespace) shifting
124
+ # one definition's span don't bust caches for consumers of others.
125
+ def interface_digest
126
+ Digest::SHA256.hexdigest(Marshal.dump(interface_snapshot))
127
+ end
128
+
129
+ private
130
+
131
+ def interface_snapshot
132
+ value_names = exposes.filter_map { it.is_a?(Symbol::ValueRef) ? it.name : nil }.sort
133
+ type_names = exposes.filter_map { it.is_a?(Symbol::TypeRef) ? it.name : nil }.sort
134
+
135
+ [
136
+ value_names,
137
+ type_names,
138
+ value_names.map { ModuleLoader::Normalize.apply(defined_values[it]) },
139
+ type_names .map { ModuleLoader::Normalize.apply(defined_types[it]) },
140
+ implementations.keys.sort.map { [it, ModuleLoader::Normalize.apply(implementations[it])] },
141
+ ]
142
+ end
143
+
144
+ def add_implementation(symbol)
145
+ symbol
146
+ .with(module_name: name)
147
+ .then { implementations.merge([it.interface.qualified_name, it.type.qualified_name] => it) }
148
+ .then { with(implementations: it) }
149
+ end
150
+
151
+ def add_defined_value(symbol)
152
+ symbol
153
+ .with(module_name: name)
154
+ .then { with(defined_values: defined_values.merge(it.name => it)) }
155
+ end
156
+
157
+ def add_defined_type(symbol)
158
+ case symbol
159
+ in Symbol::Union
160
+ symbol
161
+ .with(
162
+ module_name: name,
163
+ variants: symbol.variants.map { it.with(module_name: name) },
164
+ )
165
+
166
+ in Symbol::Interface(functions:)
167
+ symbol
168
+ .with(module_name: name)
169
+ .with(functions: functions.map { it.with(module_name: name) })
170
+
171
+ else
172
+ symbol.with(module_name: name)
173
+ end
174
+ .then { with(defined_types: defined_types.merge(it.name => it)) }
175
+ end
176
+ end
177
+ end