├── .dockerignore ├── .gitattributes ├── .github ├── CODEOWNERS └── workflows │ ├── build-js.yml │ ├── build-native.yml │ ├── build.yml │ ├── ci.yml │ ├── dependencies.yml │ ├── docker-publish.yml │ ├── generate-docs.yml │ ├── release.yml │ ├── test-pkg.yml │ └── upload-binaries.yml ├── .gitignore ├── .gitpod.Dockerfile ├── .gitpod.yml ├── .npmrc ├── .nvmrc ├── .release-please-manifest.json ├── .vscode └── settings.json ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── Dockerfile-slim ├── LICENSE ├── README.md ├── cli ├── .prettierignore ├── .prettierrc.json ├── CHANGELOG.md ├── bin │ ├── exec.js │ ├── grain.js │ ├── grainc.js │ ├── graindoc.js │ ├── grainformat.js │ ├── grainlsp.js │ ├── grainrun.js │ └── pkg.js └── package.json ├── compiler ├── CHANGELOG.md ├── dune ├── dune-project ├── dune-workspace ├── esy.json ├── esy.lock │ ├── .gitattributes │ ├── .gitignore │ ├── index.json │ ├── opam │ │ ├── angstrom.0.15.0 │ │ │ └── opam │ │ ├── base-bigarray.base │ │ │ └── opam │ │ ├── base-bytes.base │ │ │ └── opam │ │ ├── base-threads.base │ │ │ └── opam │ │ ├── base-unix.base │ │ │ └── opam │ │ ├── base.v0.15.1 │ │ │ └── opam │ │ ├── bigstringaf.0.9.1 │ │ │ └── opam │ │ ├── chrome-trace.3.11.1 │ │ │ └── opam │ │ ├── cmdliner.1.2.0 │ │ │ └── opam │ │ ├── cppo.1.6.9 │ │ │ └── opam │ │ ├── csexp.1.5.2 │ │ │ └── opam │ │ ├── dune-build-info.3.11.1 │ │ │ └── opam │ │ ├── dune-configurator.3.11.1 │ │ │ └── opam │ │ ├── dune-rpc.3.11.1 │ │ │ └── opam │ │ ├── dune.3.11.1 │ │ │ └── opam │ │ ├── dyn.3.11.1 │ │ │ └── opam │ │ ├── fiber.3.7.0 │ │ │ └── opam │ │ ├── fix.20230505 │ │ │ └── opam │ │ ├── gen.1.1 │ │ │ └── opam │ │ ├── js_of_ocaml-compiler.5.0.1 │ │ │ └── opam │ │ ├── menhir.20220210 │ │ │ └── opam │ │ ├── menhirLib.20220210 │ │ │ └── opam │ │ ├── menhirSdk.20220210 │ │ │ └── opam │ │ ├── merlin-extend.0.6.1 │ │ │ └── opam │ │ ├── num.1.4 │ │ │ └── opam │ │ ├── ocaml-compiler-libs.v0.12.4 │ │ │ └── opam │ │ ├── ocaml-lsp-server.1.14.1 │ │ │ └── opam │ │ ├── ocaml-syntax-shims.1.0.0 │ │ │ └── opam │ │ ├── ocamlbuild.0.14.2+win │ │ │ └── opam │ │ ├── ocamlfind.1.9.6 │ │ │ ├── files │ │ │ │ └── 0001-Harden-test-for-OCaml-5.patch │ │ │ └── opam │ │ ├── ocamlformat-rpc-lib.0.26.1 │ │ │ └── opam │ │ ├── ocamlgraph.2.1.0 │ │ │ └── opam │ │ ├── octavius.1.2.2 │ │ │ └── opam │ │ ├── omd.1.3.2 │ │ │ └── opam │ │ ├── ordering.3.11.1 │ │ │ └── opam │ │ ├── parsexp.v0.15.0 │ │ │ └── opam │ │ ├── pp.1.2.0 │ │ │ └── opam │ │ ├── ppx_derivers.1.2.1 │ │ │ └── opam │ │ ├── ppx_deriving.5.2.1 │ │ │ └── opam │ │ ├── ppx_deriving_yojson.3.7.0 │ │ │ └── opam │ │ ├── ppx_sexp_conv.v0.15.1 │ │ │ └── opam │ │ ├── ppx_yojson_conv_lib.v0.16.0 │ │ │ └── opam │ │ ├── ppxlib.0.29.1 │ │ │ └── opam │ │ ├── re.1.11.0 │ │ │ └── opam │ │ ├── reason.3.9.0 │ │ │ └── opam │ │ ├── result.1.5 │ │ │ └── opam │ │ ├── sedlex.3.2 │ │ │ └── opam │ │ ├── seq.base │ │ │ ├── files │ │ │ │ ├── META.seq │ │ │ │ └── seq.install │ │ │ └── opam │ │ ├── sexplib.v0.15.1 │ │ │ └── opam │ │ ├── sexplib0.v0.15.1 │ │ │ └── opam │ │ ├── spawn.v0.15.1 │ │ │ └── opam │ │ ├── stdlib-shims.0.3.0 │ │ │ └── opam │ │ ├── stdune.3.11.1 │ │ │ └── opam │ │ ├── stringext.1.6.0 │ │ │ └── opam │ │ ├── topkg.1.0.7 │ │ │ └── opam │ │ ├── uri.4.4.0 │ │ │ └── opam │ │ ├── uutf.1.0.3 │ │ │ └── opam │ │ ├── xdg.3.11.1 │ │ │ └── opam │ │ └── yojson.2.1.1 │ │ │ └── opam │ └── overrides │ │ ├── opam__s__num_opam__c__1.4_opam_override │ │ ├── files │ │ │ └── num-1.4.patch │ │ └── package.json │ │ ├── opam__s__ocamlbuild_opam__c__0.14.2+win_opam_override │ │ ├── files │ │ │ ├── ocamlbuild-0.14.2.patch │ │ │ └── winpatch.patch │ │ └── package.json │ │ ├── opam__s__ocamlfind_opam__c__1.9.6_opam_override │ │ ├── files │ │ │ └── findlib.patch │ │ └── package.json │ │ └── opam__s__reason_opam__c__3.9.0_opam_override │ │ └── package.json ├── grainc │ ├── config │ │ ├── dune │ │ └── flags.re │ ├── dune │ └── grainc.re ├── graindoc │ ├── config │ │ ├── dune │ │ └── flags.re │ ├── docblock.re │ ├── dune │ └── graindoc.re ├── grainformat │ ├── config │ │ ├── dune │ │ └── flags.re │ ├── dune │ └── grainformat.re ├── grainlsp │ ├── config │ │ ├── dune │ │ └── flags.re │ ├── dune │ ├── grainlsp.re │ └── hacks.js ├── package.json ├── src │ ├── codegen │ │ ├── bigint_flags.re │ │ ├── comp_utils.re │ │ ├── comp_utils.rei │ │ ├── comp_wasm_prim.re │ │ ├── compcore.re │ │ ├── compcore.rei │ │ ├── compmod.re │ │ ├── concatlist.re │ │ ├── concatlist.rei │ │ ├── dune │ │ ├── emitmod.re │ │ ├── garbage_collection.re │ │ ├── linkedtree.re │ │ ├── mashtree.re │ │ ├── optimize_mod.re │ │ ├── optimize_mod.rei │ │ ├── runtime_errors.re │ │ ├── runtime_errors.rei │ │ ├── transl_anf.re │ │ ├── transl_anf.rei │ │ ├── type_metadata.re │ │ └── value_tags.re │ ├── compile.re │ ├── compile.rei │ ├── diagnostics │ │ ├── comment_attributes.re │ │ ├── comments.re │ │ ├── commenttree.re │ │ ├── commenttree.rei │ │ ├── dune │ │ ├── graindoc_lexer.re │ │ ├── graindoc_parser.messages │ │ ├── graindoc_parser.mly │ │ ├── locations.re │ │ └── modules.re │ ├── dune │ ├── formatting │ │ ├── doc.re │ │ ├── doc.rei │ │ ├── dune │ │ └── fmt.re │ ├── language_server │ │ ├── code_action.re │ │ ├── code_action.rei │ │ ├── code_file.re │ │ ├── code_file.rei │ │ ├── driver.re │ │ ├── driver.rei │ │ ├── dune │ │ ├── exit.re │ │ ├── exit.rei │ │ ├── formatting.re │ │ ├── formatting.rei │ │ ├── goto.re │ │ ├── goto.rei │ │ ├── hover.re │ │ ├── hover.rei │ │ ├── initialize.re │ │ ├── initialize.rei │ │ ├── inlayhint.re │ │ ├── inlayhint.rei │ │ ├── lenses.re │ │ ├── lenses.rei │ │ ├── log.re │ │ ├── lsp_types.re │ │ ├── message.re │ │ ├── message.rei │ │ ├── protocol.re │ │ ├── protocol.rei │ │ ├── shutdown.re │ │ ├── shutdown.rei │ │ ├── sourcetree.re │ │ ├── trace.re │ │ ├── trace.rei │ │ ├── utils.re │ │ └── utils.rei │ ├── link.re │ ├── middle_end │ │ ├── analysis_pass.re │ │ ├── analysis_pass.rei │ │ ├── analyze_closure_scoped_vars.re │ │ ├── analyze_closure_scoped_vars.rei │ │ ├── analyze_free_vars.re │ │ ├── analyze_free_vars.rei │ │ ├── analyze_function_calls.re │ │ ├── analyze_function_calls.rei │ │ ├── analyze_globals.re │ │ ├── analyze_globals.rei │ │ ├── analyze_inline_wasm.re │ │ ├── analyze_inline_wasm.rei │ │ ├── analyze_manual_memory_management.re │ │ ├── analyze_manual_memory_management.rei │ │ ├── analyze_mutable_vars.re │ │ ├── analyze_mutable_vars.rei │ │ ├── analyze_purity.re │ │ ├── analyze_purity.rei │ │ ├── analyze_tail_calls.re │ │ ├── analyze_tail_calls.rei │ │ ├── anf_helper.re │ │ ├── anf_helper.rei │ │ ├── anf_iterator.re │ │ ├── anf_iterator.rei │ │ ├── anf_mapper.re │ │ ├── anf_mapper.rei │ │ ├── anf_utils.re │ │ ├── anf_utils.rei │ │ ├── anftree.re │ │ ├── anftree.rei │ │ ├── dune │ │ ├── linearize.re │ │ ├── matchcomp.re │ │ ├── optimization_pass.re │ │ ├── optimize.re │ │ ├── optimize_closures.re │ │ ├── optimize_constants.re │ │ ├── optimize_constants.rei │ │ ├── optimize_dead_assignments.re │ │ ├── optimize_dead_assignments.rei │ │ ├── optimize_dead_branches.re │ │ ├── optimize_dead_branches.rei │ │ ├── optimize_dead_statements.re │ │ ├── optimize_dead_statements.rei │ │ ├── optimize_inline_wasm.re │ │ ├── optimize_inline_wasm.rei │ │ ├── optimize_local_mutations.re │ │ ├── optimize_local_mutations.rei │ │ ├── optimize_manual_memory_management.re │ │ ├── optimize_manual_memory_management.rei │ │ ├── optimize_simple_expressions.re │ │ ├── optimize_simple_expressions.rei │ │ ├── optimize_tail_calls.re │ │ └── optimize_tail_calls.rei │ ├── parsing │ │ ├── README.md │ │ ├── ast_helper.re │ │ ├── ast_helper.rei │ │ ├── ast_mapper.re │ │ ├── ast_mapper.rei │ │ ├── asttypes.re │ │ ├── driver.re │ │ ├── driver.rei │ │ ├── dune │ │ ├── identifier.re │ │ ├── identifier.rei │ │ ├── lexer.re │ │ ├── location.re │ │ ├── location.rei │ │ ├── parser.messages │ │ ├── parser.mly │ │ ├── parser_header.re │ │ ├── parsetree.re │ │ ├── parsetree_iter.re │ │ ├── parsetree_iter.rei │ │ ├── syntaxerr.re │ │ ├── syntaxerr.rei │ │ ├── well_formedness.re │ │ └── wrapped_lexer.re │ ├── typed │ │ ├── btype.re │ │ ├── btype.rei │ │ ├── builtin_types.re │ │ ├── checkertypes.re │ │ ├── checkertypes.rei │ │ ├── cmi_format.re │ │ ├── cmi_format.rei │ │ ├── ctype.re │ │ ├── ctype.rei │ │ ├── datarepr.re │ │ ├── datarepr.rei │ │ ├── dependency_graph.re │ │ ├── dependency_graph.rei │ │ ├── disambiguation.re │ │ ├── dune │ │ ├── env.re │ │ ├── env.rei │ │ ├── ident.re │ │ ├── ident.rei │ │ ├── ident_tbl.re │ │ ├── ident_tbl.rei │ │ ├── includecore.re │ │ ├── includemod.re │ │ ├── includemod.rei │ │ ├── module_resolution.re │ │ ├── module_resolution.rei │ │ ├── mtype.re │ │ ├── oprint.re │ │ ├── oprint.rei │ │ ├── outcometree.re │ │ ├── parmatch.re │ │ ├── parmatch.rei │ │ ├── path.re │ │ ├── path.rei │ │ ├── path_tbl.re │ │ ├── path_tbl.rei │ │ ├── printpat.re │ │ ├── printpat.rei │ │ ├── printtyp.re │ │ ├── printtyp.rei │ │ ├── subst.re │ │ ├── subst.rei │ │ ├── translprim.re │ │ ├── translprim.rei │ │ ├── translsig.re │ │ ├── translsig.rei │ │ ├── type_utils.re │ │ ├── typecore.re │ │ ├── typecore.rei │ │ ├── typed_well_formedness.re │ │ ├── typed_well_formedness.rei │ │ ├── typedecl.re │ │ ├── typedecl.rei │ │ ├── typedtree.re │ │ ├── typedtree.rei │ │ ├── typedtreeIter.re │ │ ├── typedtreeIter.rei │ │ ├── typedtreeMap.re │ │ ├── typedtreeMap.rei │ │ ├── typemod.re │ │ ├── typemod.rei │ │ ├── typepat.re │ │ ├── types.re │ │ ├── typetexp.re │ │ └── typetexp.rei │ └── utils │ │ ├── char_utils.re │ │ ├── config.re │ │ ├── config.rei │ │ ├── consistbl.re │ │ ├── consistbl.rei │ │ ├── dune │ │ ├── filepath.re │ │ ├── fs_access.re │ │ ├── hacks.js │ │ ├── html.re │ │ ├── list_utils.re │ │ ├── literals.re │ │ ├── markdown.re │ │ ├── mini_bigint.re │ │ ├── mini_bigint.rei │ │ ├── range.re │ │ ├── string_utils.re │ │ ├── tbl.re │ │ ├── tbl.rei │ │ ├── version.re │ │ ├── warnings.re │ │ ├── warnings.rei │ │ ├── wasm_utils.re │ │ └── wasm_utils.rei └── test │ ├── BinaryFileExtensions.re │ ├── TestFramework.re │ ├── WarningExtensions.re │ ├── __snapshots__ │ ├── arrays.0f9e7d37.0.snapshot │ ├── arrays.1deb7b51.0.snapshot │ ├── arrays.24453e6e.0.snapshot │ ├── arrays.28fcc534.0.snapshot │ ├── arrays.4c8c9f91.0.snapshot │ ├── arrays.6eac4e1f.0.snapshot │ ├── arrays.74d79181.0.snapshot │ ├── arrays.9e17b4d1.0.snapshot │ ├── arrays.b85cb7fc.0.snapshot │ ├── basic_functionality.00bcbc39.0.snapshot │ ├── basic_functionality.00cfdb2e.0.snapshot │ ├── basic_functionality.03de4778.0.snapshot │ ├── basic_functionality.040643b3.0.snapshot │ ├── basic_functionality.06bd2a80.0.snapshot │ ├── basic_functionality.0996c5f7.0.snapshot │ ├── basic_functionality.0a230f18.0.snapshot │ ├── basic_functionality.0a2e4afa.0.snapshot │ ├── basic_functionality.0c0b170b.0.snapshot │ ├── basic_functionality.0c400bde.0.snapshot │ ├── basic_functionality.0e812a39.0.snapshot │ ├── basic_functionality.0f79ce35.0.snapshot │ ├── basic_functionality.10dda088.0.snapshot │ ├── basic_functionality.122e74b0.0.snapshot │ ├── basic_functionality.125626a9.0.snapshot │ ├── basic_functionality.13335202.0.snapshot │ ├── basic_functionality.16eea1e9.0.snapshot │ ├── basic_functionality.1ad0f349.0.snapshot │ ├── basic_functionality.1ae16d82.0.snapshot │ ├── basic_functionality.1b68c8db.0.snapshot │ ├── basic_functionality.1bf5759c.0.snapshot │ ├── basic_functionality.1d2ec323.0.snapshot │ ├── basic_functionality.1e4b1f39.0.snapshot │ ├── basic_functionality.1f787365.0.snapshot │ ├── basic_functionality.20f7581b.0.snapshot │ ├── basic_functionality.240ef39e.0.snapshot │ ├── basic_functionality.2756b429.0.snapshot │ ├── basic_functionality.27a7e2f7.0.snapshot │ ├── basic_functionality.28405f1f.0.snapshot │ ├── basic_functionality.28bf4c9e.0.snapshot │ ├── basic_functionality.2bcc447b.0.snapshot │ ├── basic_functionality.2cb30a54.0.snapshot │ ├── basic_functionality.2d7e34cf.0.snapshot │ ├── basic_functionality.2f2f8795.0.snapshot │ ├── basic_functionality.2f53324c.0.snapshot │ ├── basic_functionality.2f65c8cf.0.snapshot │ ├── basic_functionality.304ca65f.0.snapshot │ ├── basic_functionality.31e0d562.0.snapshot │ ├── basic_functionality.32a8c452.0.snapshot │ ├── basic_functionality.34dcfbdd.0.snapshot │ ├── basic_functionality.3c2ba165.0.snapshot │ ├── basic_functionality.3e5f990b.0.snapshot │ ├── basic_functionality.3edefd23.0.snapshot │ ├── basic_functionality.3ffd0bf3.0.snapshot │ ├── basic_functionality.427c6671.0.snapshot │ ├── basic_functionality.448497ab.0.snapshot │ ├── basic_functionality.46348f36.0.snapshot │ ├── basic_functionality.48db380c.0.snapshot │ ├── basic_functionality.4d6f9417.0.snapshot │ ├── basic_functionality.4f5bd247.0.snapshot │ ├── basic_functionality.52ca8e0e.0.snapshot │ ├── basic_functionality.565dbeda.0.snapshot │ ├── basic_functionality.5705b20c.0.snapshot │ ├── basic_functionality.593b8d63.0.snapshot │ ├── basic_functionality.5b56d472.0.snapshot │ ├── basic_functionality.5cd54e52.0.snapshot │ ├── basic_functionality.5d973a3e.0.snapshot │ ├── basic_functionality.61c58118.0.snapshot │ ├── basic_functionality.626b2e44.0.snapshot │ ├── basic_functionality.65d36891.0.snapshot │ ├── basic_functionality.67d2cc45.0.snapshot │ ├── basic_functionality.684b6ecb.0.snapshot │ ├── basic_functionality.68d08483.0.snapshot │ ├── basic_functionality.6f9706c2.0.snapshot │ ├── basic_functionality.704872bc.0.snapshot │ ├── basic_functionality.711a4824.0.snapshot │ ├── basic_functionality.7222ab37.0.snapshot │ ├── basic_functionality.7287219f.0.snapshot │ ├── basic_functionality.7599b5a6.0.snapshot │ ├── basic_functionality.7848308f.0.snapshot │ ├── basic_functionality.79ea1ccc.0.snapshot │ ├── basic_functionality.7b13e79a.0.snapshot │ ├── basic_functionality.7bb7b0d4.0.snapshot │ ├── basic_functionality.7beffe4d.0.snapshot │ ├── basic_functionality.7ccc4940.0.snapshot │ ├── basic_functionality.7d0640b4.0.snapshot │ ├── basic_functionality.7edbad66.0.snapshot │ ├── basic_functionality.83f51526.0.snapshot │ ├── basic_functionality.86f332c6.0.snapshot │ ├── basic_functionality.8c8313f3.0.snapshot │ ├── basic_functionality.8e01d666.0.snapshot │ ├── basic_functionality.903ff701.0.snapshot │ ├── basic_functionality.9110d0f5.0.snapshot │ ├── basic_functionality.9157dba1.0.snapshot │ ├── basic_functionality.9379df0d.0.snapshot │ ├── basic_functionality.950b8fda.0.snapshot │ ├── basic_functionality.970a2a2b.0.snapshot │ ├── basic_functionality.974b7936.0.snapshot │ ├── basic_functionality.994117f8.0.snapshot │ ├── basic_functionality.9b9c7047.0.snapshot │ ├── basic_functionality.9c18b19d.0.snapshot │ ├── basic_functionality.9df4a5e0.0.snapshot │ ├── basic_functionality.9fb01eb5.0.snapshot │ ├── basic_functionality.a0045d1c.0.snapshot │ ├── basic_functionality.a0747361.0.snapshot │ ├── basic_functionality.a2e63440.0.snapshot │ ├── basic_functionality.a3f7e180.0.snapshot │ ├── basic_functionality.a4ec9fca.0.snapshot │ ├── basic_functionality.a58a9361.0.snapshot │ ├── basic_functionality.a5d5182f.0.snapshot │ ├── basic_functionality.a72898d0.0.snapshot │ ├── basic_functionality.abd9d13c.0.snapshot │ ├── basic_functionality.b07cc734.0.snapshot │ ├── basic_functionality.b6a1b657.0.snapshot │ ├── basic_functionality.b836b89a.0.snapshot │ ├── basic_functionality.bb137371.0.snapshot │ ├── basic_functionality.bd891a1f.0.snapshot │ ├── basic_functionality.bef9449e.0.snapshot │ ├── basic_functionality.c1554a92.0.snapshot │ ├── basic_functionality.c2c74be4.0.snapshot │ ├── basic_functionality.c4090bb1.0.snapshot │ ├── basic_functionality.c49928a5.0.snapshot │ ├── basic_functionality.c55feb83.0.snapshot │ ├── basic_functionality.c8095f7c.0.snapshot │ ├── basic_functionality.c8144b17.0.snapshot │ ├── basic_functionality.cb9c6c66.0.snapshot │ ├── basic_functionality.cdeddcd2.0.snapshot │ ├── basic_functionality.cefeb364.0.snapshot │ ├── basic_functionality.d0c0c62b.0.snapshot │ ├── basic_functionality.d0cb4f44.0.snapshot │ ├── basic_functionality.d124f931.0.snapshot │ ├── basic_functionality.d6ca4146.0.snapshot │ ├── basic_functionality.d8a7dcf9.0.snapshot │ ├── basic_functionality.d8f6f027.0.snapshot │ ├── basic_functionality.d9fc01df.0.snapshot │ ├── basic_functionality.dbf5d3ff.0.snapshot │ ├── basic_functionality.df4cd2bf.0.snapshot │ ├── basic_functionality.e2902464.0.snapshot │ ├── basic_functionality.e3995c7d.0.snapshot │ ├── basic_functionality.e56cd2a2.0.snapshot │ ├── basic_functionality.e58c3266.0.snapshot │ ├── basic_functionality.e6ea6b06.0.snapshot │ ├── basic_functionality.e811c1e1.0.snapshot │ ├── basic_functionality.ee7c0ebc.0.snapshot │ ├── basic_functionality.f132ca8b.0.snapshot │ ├── basic_functionality.f47797ca.0.snapshot │ ├── basic_functionality.f58be537.0.snapshot │ ├── basic_functionality.f90a3baa.0.snapshot │ ├── basic_functionality.f9743171.0.snapshot │ ├── basic_functionality.fd64a58f.0.snapshot │ ├── basic_functionality.fe19cffe.0.snapshot │ ├── basic_functionality.fe88cb04.0.snapshot │ ├── boxes.08fca3f7.0.snapshot │ ├── boxes.0c59fc4e.0.snapshot │ ├── boxes.17668725.0.snapshot │ ├── boxes.2b56febf.0.snapshot │ ├── boxes.7d564476.0.snapshot │ ├── boxes.9035923e.0.snapshot │ ├── boxes.adbe1660.0.snapshot │ ├── boxes.bc258c1b.0.snapshot │ ├── boxes.eb81e542.0.snapshot │ ├── chars.200d9e1a.0.snapshot │ ├── chars.259e330c.0.snapshot │ ├── chars.27fb7f30.0.snapshot │ ├── chars.51010573.0.snapshot │ ├── chars.7e0f68db.0.snapshot │ ├── chars.af4b3613.0.snapshot │ ├── chars.e1cac8cd.0.snapshot │ ├── comments.573e549e.0.snapshot │ ├── comments.8f52e899.0.snapshot │ ├── comments.ccf5fcf4.0.snapshot │ ├── comments.fd91c233.0.snapshot │ ├── early_return.1183a893.0.snapshot │ ├── enums.aa34084a.0.snapshot │ ├── enums.ae26523b.0.snapshot │ ├── exceptions.a68ae348.0.snapshot │ ├── exceptions.ccac3e71.0.snapshot │ ├── functions.06134c8a.0.snapshot │ ├── functions.0b8146ea.0.snapshot │ ├── functions.14922a92.0.snapshot │ ├── functions.1be5ecd5.0.snapshot │ ├── functions.23afd9c9.0.snapshot │ ├── functions.28e0f2b3.0.snapshot │ ├── functions.49ccab54.0.snapshot │ ├── functions.6eacded0.0.snapshot │ ├── functions.7a8986a5.0.snapshot │ ├── functions.84b6e84b.0.snapshot │ ├── functions.8baf471f.0.snapshot │ ├── functions.9223245d.0.snapshot │ ├── functions.9fd69835.0.snapshot │ ├── functions.b37949b2.0.snapshot │ ├── functions.b3a8d88b.0.snapshot │ ├── functions.b632a2ab.0.snapshot │ ├── functions.c6e8a9aa.0.snapshot │ ├── functions.ce978f54.0.snapshot │ ├── functions.d9466880.0.snapshot │ ├── functions.e6c6212b.0.snapshot │ ├── functions.f400bb7b.0.snapshot │ ├── functions.f647681b.0.snapshot │ ├── includes.1d829099.0.snapshot │ ├── includes.46f78654.0.snapshot │ ├── includes.5dfba7dd.0.snapshot │ ├── includes.6c8d23dc.0.snapshot │ ├── includes.6e78c003.0.snapshot │ ├── includes.7afbe731.0.snapshot │ ├── includes.8222ee98.0.snapshot │ ├── includes.86ff4075.0.snapshot │ ├── includes.a3212bd0.0.snapshot │ ├── includes.b3434679.0.snapshot │ ├── includes.bd3eb3af.0.snapshot │ ├── includes.beda767e.0.snapshot │ ├── includes.c0c0d5ca.0.snapshot │ ├── includes.c62f45f8.0.snapshot │ ├── includes.cedde8e9.0.snapshot │ ├── includes.de6b420f.0.snapshot │ ├── includes.f2bf866b.0.snapshot │ ├── includes.f4ba5583.0.snapshot │ ├── let_mut.00e05fe2.0.snapshot │ ├── let_mut.1176df90.0.snapshot │ ├── let_mut.3307d5a7.0.snapshot │ ├── let_mut.43f6980c.0.snapshot │ ├── let_mut.48249b50.0.snapshot │ ├── let_mut.4c3f3b2b.0.snapshot │ ├── let_mut.4c75261e.0.snapshot │ ├── let_mut.634331f0.0.snapshot │ ├── let_mut.63c16374.0.snapshot │ ├── let_mut.6796c72d.0.snapshot │ ├── let_mut.baaea1d3.0.snapshot │ ├── let_mut.cbbbaeb4.0.snapshot │ ├── let_mut.d2de286b.0.snapshot │ ├── let_mut.e90db621.0.snapshot │ ├── let_mut.f8f208a2.0.snapshot │ ├── let_mut.f9e32f30.0.snapshot │ ├── let_mut.fcc9c65d.0.snapshot │ ├── lists.4cfe47d3.0.snapshot │ ├── lists.884ce894.0.snapshot │ ├── lists.d9fd46fb.0.snapshot │ ├── lists.e5378351.0.snapshot │ ├── loops.0a25def1.0.snapshot │ ├── loops.0fafc5f0.0.snapshot │ ├── loops.c2b7bfc6.0.snapshot │ ├── loops.f1c03b79.0.snapshot │ ├── modules.52d25a2f.0.snapshot │ ├── modules.b59b0085.0.snapshot │ ├── optimizations.d72b00c6.0.snapshot │ ├── optimizations.ff6d5bfb.0.snapshot │ ├── pattern_matching.0539d13e.0.snapshot │ ├── pattern_matching.05b60a1e.0.snapshot │ ├── pattern_matching.0ad4ac05.0.snapshot │ ├── pattern_matching.0bb6923e.0.snapshot │ ├── pattern_matching.0fa61137.0.snapshot │ ├── pattern_matching.14dc7554.0.snapshot │ ├── pattern_matching.16cd197e.0.snapshot │ ├── pattern_matching.16eb3dbf.0.snapshot │ ├── pattern_matching.25930935.0.snapshot │ ├── pattern_matching.3722b060.0.snapshot │ ├── pattern_matching.46f91987.0.snapshot │ ├── pattern_matching.5b158103.0.snapshot │ ├── pattern_matching.5b6ff2d3.0.snapshot │ ├── pattern_matching.5ff49e44.0.snapshot │ ├── pattern_matching.64686134.0.snapshot │ ├── pattern_matching.702ed9b0.0.snapshot │ ├── pattern_matching.7082d3ca.0.snapshot │ ├── pattern_matching.79346fef.0.snapshot │ ├── pattern_matching.7f7fe4ef.0.snapshot │ ├── pattern_matching.8614dff3.0.snapshot │ ├── pattern_matching.8c0dc67a.0.snapshot │ ├── pattern_matching.9561763b.0.snapshot │ ├── pattern_matching.98756c45.0.snapshot │ ├── pattern_matching.9ffaa7a7.0.snapshot │ ├── pattern_matching.aa8d2963.0.snapshot │ ├── pattern_matching.ac58ffc3.0.snapshot │ ├── pattern_matching.b1b060ad.0.snapshot │ ├── pattern_matching.b9db0dd9.0.snapshot │ ├── pattern_matching.be46eb0e.0.snapshot │ ├── pattern_matching.c91eac29.0.snapshot │ ├── pattern_matching.c9582b6d.0.snapshot │ ├── pattern_matching.d048ece0.0.snapshot │ ├── pattern_matching.e17bcd61.0.snapshot │ ├── pattern_matching.e41ad64e.0.snapshot │ ├── pattern_matching.eb4334e1.0.snapshot │ ├── pattern_matching.f0c08ea4.0.snapshot │ ├── pattern_matching.f25e0163.0.snapshot │ ├── pattern_matching.f3d48b0e.0.snapshot │ ├── pattern_matching.f6c9c89c.0.snapshot │ ├── provides.0ef7e7b3.0.snapshot │ ├── provides.10f4f118.0.snapshot │ ├── provides.2a5f527b.0.snapshot │ ├── provides.82c10ab4.0.snapshot │ ├── provides.c3bb4eff.0.snapshot │ ├── provides.c6bf4567.0.snapshot │ ├── provides.f378d570.0.snapshot │ ├── records.012b017b.0.snapshot │ ├── records.02742729.0.snapshot │ ├── records.02af5946.0.snapshot │ ├── records.2dc39420.0.snapshot │ ├── records.49dfc6ff.0.snapshot │ ├── records.54f5977c.0.snapshot │ ├── records.5f340064.0.snapshot │ ├── records.60c0a141.0.snapshot │ ├── records.60c7acc4.0.snapshot │ ├── records.63a951b8.0.snapshot │ ├── records.89d08e01.0.snapshot │ ├── records.98824516.0.snapshot │ ├── records.a3299dd2.0.snapshot │ ├── records.a702778a.0.snapshot │ ├── records.a9c472b1.0.snapshot │ ├── records.b50d234d.0.snapshot │ ├── records.d34c4740.0.snapshot │ ├── records.d393173c.0.snapshot │ ├── records.d44e8007.0.snapshot │ ├── records.e4326567.0.snapshot │ ├── records.e5b56da8.0.snapshot │ ├── records.e705a980.0.snapshot │ ├── records.f6e43cdb.0.snapshot │ ├── records.f6feee77.0.snapshot │ ├── records.fae50a8e.0.snapshot │ ├── stdlib.179d20b9.0.snapshot │ ├── stdlib.1c0b04b7.0.snapshot │ ├── stdlib.24cb9bbf.0.snapshot │ ├── stdlib.323e410a.0.snapshot │ ├── stdlib.37483d2d.0.snapshot │ ├── stdlib.4a5061c2.0.snapshot │ ├── stdlib.5fe88631.0.snapshot │ ├── stdlib.648f406e.0.snapshot │ ├── stdlib.69635cff.0.snapshot │ ├── stdlib.6bf88430.0.snapshot │ ├── stdlib.6de47be2.0.snapshot │ ├── stdlib.8300ad7c.0.snapshot │ ├── stdlib.91a94037.0.snapshot │ ├── stdlib.a70e79ca.0.snapshot │ ├── stdlib.b30d7785.0.snapshot │ ├── stdlib.c09a513a.0.snapshot │ ├── stdlib.cbf0318e.0.snapshot │ ├── stdlib.d28dee65.0.snapshot │ ├── stdlib.d4faa5bf.0.snapshot │ ├── stdlib.d887bb04.0.snapshot │ ├── stdlib.dae8b12a.0.snapshot │ ├── stdlib.e306600a.0.snapshot │ ├── stdlib.e6349872.0.snapshot │ ├── strings.434adad0.0.snapshot │ ├── strings.a67428df.0.snapshot │ ├── strings.b2ad5a89.0.snapshot │ ├── strings.fb85549f.0.snapshot │ ├── tuples.1451773e.0.snapshot │ ├── tuples.1d60b40c.0.snapshot │ ├── tuples.2c91b91d.0.snapshot │ ├── tuples.8d1f0463.0.snapshot │ ├── tuples.a34621a0.0.snapshot │ ├── tuples.b4f702d8.0.snapshot │ ├── tuples.c1eb0a50.0.snapshot │ └── tuples.f206002b.0.snapshot │ ├── config │ ├── dune │ └── flags.re │ ├── dune │ ├── graindoc │ ├── descriptions.expected.md │ ├── descriptions.input.gr │ ├── example.expected.md │ ├── example.input.gr │ ├── functionDoc.expected.md │ ├── functionDoc.input.gr │ ├── noDoc.expected.md │ ├── noDoc.input.gr │ ├── since.expected.md │ ├── since.input.gr │ ├── singleReturn.input.gr │ ├── singleSince.input.gr │ ├── types.expected.md │ └── types.input.gr │ ├── grainfmt │ ├── aliases.expected.gr │ ├── aliases.input.gr │ ├── application.expected.gr │ ├── application.input.gr │ ├── application2.expected.gr │ ├── application2.input.gr │ ├── application_indenting.expected.gr │ ├── application_indenting.input.gr │ ├── arrays.expected.gr │ ├── arrays.input.gr │ ├── binop_perf.expected.gr │ ├── binop_perf.input.gr │ ├── binops.expected.gr │ ├── binops.input.gr │ ├── blocks.expected.gr │ ├── blocks.input.gr │ ├── brace_comments.expected.gr │ ├── brace_comments.input.gr │ ├── chained.expected.gr │ ├── chained.input.gr │ ├── comments.expected.gr │ ├── comments.input.gr │ ├── constraints.expected.gr │ ├── constraints.input.gr │ ├── custom_operators.expected.gr │ ├── custom_operators.input.gr │ ├── data_docs.expected.gr │ ├── data_docs.input.gr │ ├── early_return.expected.gr │ ├── early_return.input.gr │ ├── empty.expected.gr │ ├── empty.input.gr │ ├── enum_long.expected.gr │ ├── enum_long.input.gr │ ├── enums.expected.gr │ ├── enums.input.gr │ ├── for_loops.expected.gr │ ├── for_loops.input.gr │ ├── function_params.expected.gr │ ├── function_params.input.gr │ ├── grouped_expr.expected.gr │ ├── grouped_expr.input.gr │ ├── guards.expected.gr │ ├── guards.input.gr │ ├── ifthenelse.expected.gr │ ├── ifthenelse.input.gr │ ├── ignores.expected.gr │ ├── ignores.input.gr │ ├── includes.expected.gr │ ├── includes.input.gr │ ├── infix.expected.gr │ ├── infix.input.gr │ ├── keyword_expression.expected.gr │ ├── keyword_expression.input.gr │ ├── lambda.expected.gr │ ├── lambda.input.gr │ ├── lets.expected.gr │ ├── lets.input.gr │ ├── list_sugar.expected.gr │ ├── list_sugar.input.gr │ ├── matches.expected.gr │ ├── matches.input.gr │ ├── nested_matches.expected.gr │ ├── nested_matches.input.gr │ ├── number_sugar.expected.gr │ ├── number_sugar.input.gr │ ├── only_comments.expected.gr │ ├── only_comments.input.gr │ ├── operators.expected.gr │ ├── operators.input.gr │ ├── parens.expected.gr │ ├── parens.input.gr │ ├── patterns.expected.gr │ ├── patterns.input.gr │ ├── rationals.expected.gr │ ├── rationals.input.gr │ ├── records.expected.gr │ ├── records.input.gr │ ├── spreads.expected.gr │ ├── spreads.input.gr │ ├── strings.expected.gr │ ├── strings.input.gr │ ├── tuples.expected.gr │ ├── tuples.input.gr │ ├── values.expected.gr │ ├── values.input.gr │ ├── variants.expected.gr │ ├── variants.input.gr │ ├── wasm.expected.gr │ ├── wasm.input.gr │ ├── while_loops.expected.gr │ ├── while_loops.input.gr │ ├── windows.expected.gr │ └── windows.input.gr │ ├── input │ ├── README.txt │ ├── adtprint.gr │ ├── basicenum.gr │ ├── brokenIncludes │ │ ├── broken.gr │ │ └── main.gr │ ├── conditionals.gr │ ├── const.gr │ ├── counter-box.gr │ ├── counter-mut.gr │ ├── cse.gr │ ├── customOperator.gr │ ├── earlyReturn.gr │ ├── fib-better.gr │ ├── fib-bigint.gr │ ├── fib.gr │ ├── forward-decl.gr │ ├── funcShadow.gr │ ├── funcShadowAndIndirect.gr │ ├── indirect-tail.gr │ ├── letMutForLoop.gr │ ├── list.gr │ ├── long_lists.gr │ ├── loopMemoryReclaim.gr │ ├── memoryBase │ │ ├── asserts.gr │ │ ├── basecase.gr │ │ ├── sameAsDefault.gr │ │ ├── slightlyHigher.gr │ │ ├── veryLarge.gr │ │ └── zero.gr │ ├── memoryGrow.gr │ ├── mixedPatternMatching.gr │ ├── modules │ │ └── provideIncludedModule.gr │ ├── nestedModules.gr │ ├── oneBranchTail.gr │ ├── optimization_friendly.gr │ ├── patternMatchUnsafeWasm.gr │ ├── recursive-equal-box.gr │ ├── recursive-equal-mut.gr │ ├── relativeInclude1.gr │ ├── relativeInclude2.gr │ ├── relativeInclude3.gr │ ├── relativeIncludeLinking.gr │ ├── relativeIncludeLinking │ │ ├── a.gr │ │ └── mutExport.gr │ ├── relativeIncludes │ │ ├── bar │ │ │ ├── bar.gr │ │ │ └── baz.gr │ │ ├── foo.gr │ │ └── quux │ │ │ └── quux.gr │ ├── reprovideTypeUnifyA.gr │ ├── reprovideTypeUnifyB.gr │ ├── reprovideTypeUnifyC.gr │ ├── sinister-tail-call.gr │ ├── strings.gr │ ├── ta_1.gr │ ├── toplevelStatements.gr │ ├── unsafeWasmGlobals.gr │ ├── wasiPolyfill.gr │ └── wasiPolyfillNoop.gr │ ├── runner.re │ ├── runtime │ └── numbers.test.gr │ ├── stdlib │ ├── array.test.gr │ ├── bigint.test.gr │ ├── buffer.test.gr │ ├── bytes.test.gr │ ├── char.test.gr │ ├── exception.test.gr │ ├── float32.test.gr │ ├── float64.test.gr │ ├── fs.test.gr │ ├── hash.test.gr │ ├── int16.test.gr │ ├── int32.test.gr │ ├── int64.test.gr │ ├── int8.test.gr │ ├── json.test.gr │ ├── list.test.gr │ ├── map.test.gr │ ├── marshal.test.gr │ ├── number.test.gr │ ├── option.test.gr │ ├── path.test.gr │ ├── pervasives.test.gr │ ├── priorityqueue.test.gr │ ├── queue.test.gr │ ├── random.test.gr │ ├── range.test.gr │ ├── rational.test.gr │ ├── regex.test.gr │ ├── result.test.gr │ ├── set.test.gr │ ├── stack.test.gr │ ├── string.test.gr │ ├── uint16.test.gr │ ├── uint32.test.gr │ ├── uint64.test.gr │ ├── uint8.test.gr │ ├── uri.test.gr │ ├── wasi.file.test.gr │ ├── wasi.process.test.gr │ ├── wasi.random.test.gr │ ├── wasi.time.test.gr │ ├── wasmf32.test.gr │ ├── wasmf64.test.gr │ ├── wasmi32.test.gr │ └── wasmi64.test.gr │ ├── suites │ ├── arrays.re │ ├── basic_functionality.re │ ├── blocks.re │ ├── boxes.re │ ├── chars.re │ ├── comments.re │ ├── crcs.re │ ├── cycles.re │ ├── dune │ ├── enums.re │ ├── exceptions.re │ ├── foreigns.re │ ├── formatter.re │ ├── functions.re │ ├── gc.re │ ├── graindoc.re │ ├── grainlsp.re │ ├── includes.re │ ├── let_mut.re │ ├── linking.re │ ├── lists.re │ ├── loops.re │ ├── memory_base.re │ ├── modules.re │ ├── numbers.re │ ├── optimizations.re │ ├── parsing.re │ ├── pattern_matching.re │ ├── print.re │ ├── provides.re │ ├── records.re │ ├── returns.re │ ├── runtime.re │ ├── stdlib.re │ ├── strings.re │ ├── tuples.re │ ├── types.re │ └── wasi_args.re │ ├── test-data │ ├── bar.txt │ ├── foo.txt │ ├── test-dir │ │ ├── dir │ │ │ └── nested.txt │ │ ├── file1.txt │ │ ├── file2.txt │ │ ├── file3.txt │ │ └── link │ ├── testmod.wasm │ ├── testmod.wat │ ├── testmod_multi_exports.wasm │ └── testmod_multi_exports.wat │ ├── test-libs │ ├── aliases.gr │ ├── brokenRelativeInclude.gr │ ├── compileError.gr │ ├── data.gr │ ├── funcAliasProvide.gr │ ├── letMutProvide.gr │ ├── nested │ │ └── nested.gr │ ├── noProvides.gr │ ├── onlyXProvided.gr │ ├── provideAll.gr │ ├── provideContents.gr │ ├── provideException.gr │ ├── providedType.gr │ ├── reprovideContents.gr │ ├── reprovideException.gr │ ├── simpleModule.gr │ ├── tlists.gr │ └── unsafeWasmGlobalsExports.gr │ ├── test.re │ ├── test_utils.re │ └── utils │ ├── concatlist.re │ ├── dune │ ├── literals.re │ ├── markdown.re │ ├── mini_bigint.re │ ├── string_utils.re │ └── wasm_utils.re ├── docs ├── README.md └── contributor │ ├── README.md │ ├── commits_pull_requests_and_merging.md │ ├── compiler_walkthrough.md │ ├── data_representations.md │ ├── low_level_programming.md │ ├── memory_management.md │ ├── operator_precedence.md │ ├── printing.md │ ├── runtime.md │ ├── standard_library.md │ └── string.md ├── grain_shorthand_color.png ├── package-lock.json ├── package.json ├── release-please-config.json └── stdlib ├── CHANGELOG.md ├── LICENSE ├── README.md ├── array.gr ├── array.md ├── bigint.gr ├── bigint.md ├── buffer.gr ├── buffer.md ├── bytes.gr ├── bytes.md ├── char.gr ├── char.md ├── exception.gr ├── exception.md ├── float32.gr ├── float32.md ├── float64.gr ├── float64.md ├── fs.gr ├── fs.md ├── hash.gr ├── hash.md ├── index.js ├── int16.gr ├── int16.md ├── int32.gr ├── int32.md ├── int64.gr ├── int64.md ├── int8.gr ├── int8.md ├── json.gr ├── json.md ├── list.gr ├── list.md ├── map.gr ├── map.md ├── marshal.gr ├── marshal.md ├── number.gr ├── number.md ├── option.gr ├── option.md ├── package.json ├── path.gr ├── path.md ├── pervasives.gr ├── pervasives.md ├── priorityqueue.gr ├── priorityqueue.md ├── queue.gr ├── queue.md ├── random.gr ├── random.md ├── range.gr ├── range.md ├── rational.gr ├── rational.md ├── regex.gr ├── regex.md ├── result.gr ├── result.md ├── runtime ├── atof │ ├── common.gr │ ├── common.md │ ├── decimal.gr │ ├── decimal.md │ ├── lemire.gr │ ├── lemire.md │ ├── parse.gr │ ├── parse.md │ ├── slow.gr │ ├── slow.md │ ├── table.gr │ └── table.md ├── atoi │ ├── parse.gr │ └── parse.md ├── bigint.gr ├── bigint.md ├── compare.gr ├── compare.md ├── dataStructures.gr ├── dataStructures.md ├── debugPrint.gr ├── debugPrint.md ├── equal.gr ├── equal.md ├── exception.gr ├── exception.md ├── gc.gr ├── gc.md ├── malloc.gr ├── malloc.md ├── math │ ├── kernel │ │ ├── cos.gr │ │ ├── cos.md │ │ ├── sin.gr │ │ ├── sin.md │ │ ├── tan.gr │ │ └── tan.md │ ├── rempio2.gr │ ├── rempio2.md │ ├── trig.gr │ ├── trig.md │ ├── umuldi.gr │ └── umuldi.md ├── numberUtils.gr ├── numberUtils.md ├── numbers.gr ├── numbers.md ├── string.gr ├── string.md ├── unsafe │ ├── constants.gr │ ├── constants.md │ ├── conv.gr │ ├── conv.md │ ├── memory.gr │ ├── memory.md │ ├── offsets.gr │ ├── offsets.md │ ├── panic.gr │ ├── panic.md │ ├── tags.gr │ ├── tags.md │ ├── wasmf32.gr │ ├── wasmf32.md │ ├── wasmf64.gr │ ├── wasmf64.md │ ├── wasmi32.gr │ ├── wasmi32.md │ ├── wasmi64.gr │ └── wasmi64.md ├── utf8.gr ├── utf8.md ├── wasi.gr └── wasi.md ├── set.gr ├── set.md ├── stack.gr ├── stack.md ├── string.gr ├── string.md ├── uint16.gr ├── uint16.md ├── uint32.gr ├── uint32.md ├── uint64.gr ├── uint64.md ├── uint8.gr ├── uint8.md ├── uri.gr ├── uri.md └── wasi ├── file.gr ├── file.md ├── process.gr ├── process.md ├── random.gr ├── random.md ├── time.gr └── time.md /.dockerignore: -------------------------------------------------------------------------------- 1 | # Useful for debugging since Docker doesn't have a built-in tool 2 | # to do this for some reason: 3 | # $ go get -v -u github.com/pwaller/docker-show-context 4 | main 5 | *.mashtree 6 | **/*.mashtree 7 | *.swp 8 | **/*.swp 9 | /compiler/*.install 10 | /*.install 11 | /*.out 12 | output/*.o 13 | output/*.run 14 | output/*.s 15 | output/*.dSYM 16 | script/node_modules 17 | .installed-pkgs 18 | *.sw* 19 | *~ 20 | **/*.o 21 | **/*.log 22 | _build/ 23 | */_build/ 24 | cli/bin/*.exe 25 | cli/bin/*.bc.js 26 | .installed-pkgs 27 | notes.org 28 | node_modules/ 29 | */node_modules/ 30 | **/*.wasm 31 | **/*.wasm.map 32 | **/*.wasm.wast 33 | **/*.wasm.modsig 34 | .tern-port 35 | setup.data 36 | setup.ml 37 | myocamlbuild.ml 38 | .merlin 39 | /*.gr 40 | _esy/ 41 | **/_esy/ 42 | cli/bin/grainc.exe 43 | .git 44 | .gitignore 45 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Autodetect text files 2 | * text=auto 3 | 4 | # Ensure snapshots always use LF 5 | *.snapshot text eol=lf 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | main 2 | *.mashtree 3 | /compiler/*.install 4 | /*.install 5 | /*.out 6 | output/*.o 7 | output/*.run 8 | output/*.s 9 | output/*.dSYM 10 | script/node_modules 11 | .installed-pkgs 12 | *.sw* 13 | *~ 14 | *.o 15 | *.log 16 | _build/ 17 | .installed-pkgs 18 | notes.org 19 | node_modules/ 20 | *.gro 21 | *.wasm 22 | *.wasm.map 23 | *.wat 24 | *.modsig 25 | .tern-port 26 | setup.data 27 | setup.ml 28 | myocamlbuild.ml 29 | .merlin 30 | /*.gr 31 | _esy/ 32 | pkg/ 33 | 34 | # Autogenerated .messages file from Menhir 35 | *.messages.generated 36 | 37 | # The grainc.exe binary is copied to the CLI directory during build 38 | cli/bin/grainc.exe 39 | cli/bin/grainc.bc.js 40 | cli/bin/graindoc.exe 41 | cli/bin/graindoc.bc.js 42 | cli/bin/grainformat.exe 43 | cli/bin/grainformat.bc.js 44 | cli/bin/grainlsp.exe 45 | cli/bin/grainlsp.bc.js 46 | 47 | .DS_Store 48 | -------------------------------------------------------------------------------- /.gitpod.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gitpod/workspace-full 2 | 3 | ENV PATH="/workspace/grain/node_modules/.bin:$PATH" -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | # This configuration file was automatically generated by Gitpod. 2 | # Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file) 3 | # and commit this file to your remote git repository to share the goodness with others. 4 | 5 | image: 6 | file: .gitpod.Dockerfile 7 | 8 | tasks: 9 | - init: | 10 | npm ci 11 | npm run compiler build 12 | vscode: 13 | extensions: 14 | - ocamllabs.ocaml-platform 15 | - grain-lang.vscode-grain 16 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=true 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v22.13.1 -------------------------------------------------------------------------------- /.release-please-manifest.json: -------------------------------------------------------------------------------- 1 | {".":"0.7.0","cli":"0.7.0","compiler":"0.7.0","stdlib":"0.7.0"} -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "*.dyp": "ocaml.ocamllex", 4 | "CODEOWNERS": "ignore" 5 | }, 6 | "ocaml.sandbox": { 7 | "kind": "esy", 8 | "root": "${workspaceFolder:grain}/compiler" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /cli/.prettierignore: -------------------------------------------------------------------------------- 1 | bin/grainc.bc.js 2 | bin/graindoc.bc.js 3 | bin/grainformat.bc.js 4 | bin/grainlsp.bc.js 5 | CHANGELOG.md 6 | -------------------------------------------------------------------------------- /cli/.prettierrc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /cli/bin/grainc.js: -------------------------------------------------------------------------------- 1 | // A wrapper around grainc.bc.js that prepares the `pkg` env 2 | require("./pkg"); 3 | require("./grainc.bc.js"); 4 | -------------------------------------------------------------------------------- /cli/bin/graindoc.js: -------------------------------------------------------------------------------- 1 | // A wrapper around grainc.bc.js that prepares the `pkg` env 2 | require("./pkg"); 3 | require("./graindoc.bc.js"); 4 | -------------------------------------------------------------------------------- /cli/bin/grainformat.js: -------------------------------------------------------------------------------- 1 | // A wrapper around grainformat.bc.js that prepares the `pkg` env 2 | require("./pkg"); 3 | require("./grainformat.bc.js"); 4 | -------------------------------------------------------------------------------- /cli/bin/grainlsp.js: -------------------------------------------------------------------------------- 1 | // A wrapper around grainlsp.bc.js that prepares the `pkg` env 2 | require("./pkg"); 3 | require("./grainlsp.bc.js"); 4 | -------------------------------------------------------------------------------- /compiler/dune: -------------------------------------------------------------------------------- 1 | (alias 2 | (name native) 3 | (deps grainc/grainc.exe graindoc/graindoc.exe grainformat/grainformat.exe 4 | grainlsp/grainlsp.exe test/test.exe)) 5 | 6 | (alias 7 | (name js) 8 | (deps grainc/grainc.bc.js graindoc/graindoc.bc.js 9 | grainformat/grainformat.bc.js grainlsp/grainlsp.bc.js test/test.bc.js)) 10 | -------------------------------------------------------------------------------- /compiler/dune-workspace: -------------------------------------------------------------------------------- 1 | (lang dune 2.0) 2 | 3 | (profile release) 4 | 5 | (env 6 | (_ 7 | (flags 8 | (:standard -warn-error -a+6+31)))) 9 | -------------------------------------------------------------------------------- /compiler/esy.lock/.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | # Set eol to LF so files aren't converted to CRLF-eol on Windows. 3 | * text eol=lf linguist-generated 4 | -------------------------------------------------------------------------------- /compiler/esy.lock/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Reset any possible .gitignore, we want all esy.lock to be un-ignored. 3 | !* 4 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/base-bigarray.base/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "https://github.com/ocaml/opam-repository/issues" 3 | description: """ 4 | Bigarray library distributed with the OCaml compiler 5 | """ 6 | 7 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/base-bytes.base/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: " " 3 | authors: " " 4 | homepage: " " 5 | depends: [ 6 | "ocaml" {>= "4.02.0"} 7 | "ocamlfind" {>= "1.5.3"} 8 | ] 9 | synopsis: "Bytes library distributed with the OCaml compiler" 10 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/base-threads.base/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "https://github.com/ocaml/opam-repository/issues" 3 | description: """ 4 | Threads library distributed with the OCaml compiler 5 | """ 6 | 7 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/base-unix.base/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "https://github.com/ocaml/opam-repository/issues" 3 | description: """ 4 | Unix library distributed with the OCaml compiler 5 | """ 6 | 7 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/fix.20230505/opam: -------------------------------------------------------------------------------- 1 | 2 | opam-version: "2.0" 3 | maintainer: "francois.pottier@inria.fr" 4 | authors: [ 5 | "François Pottier " 6 | ] 7 | homepage: "https://gitlab.inria.fr/fpottier/fix" 8 | dev-repo: "git+https://gitlab.inria.fr/fpottier/fix.git" 9 | bug-reports: "francois.pottier@inria.fr" 10 | license: "LGPL-2.0-only" 11 | build: [ 12 | ["dune" "build" "-p" name "-j" jobs] 13 | ] 14 | depends: [ 15 | "ocaml" { >= "4.03" } 16 | "dune" { >= "1.3" } 17 | ] 18 | synopsis: "Algorithmic building blocks for memoization, recursion, and more" 19 | url { 20 | src: 21 | "https://gitlab.inria.fr/fpottier/fix/-/archive/20230505/archive.tar.gz" 22 | checksum: [ 23 | "md5=2a4afa633128c5010677222f7b3c9451" 24 | "sha512=30d446ba6c19aef78b52d9831eb26f8f6ac10e88bd1eff36d16fbbfb32278b2637e31e63a160aec4abbbfdb1e7612ed25d68c936f4cbf2073e51d713ff3a8adf" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/ocamlfind.1.9.6/files/0001-Harden-test-for-OCaml-5.patch: -------------------------------------------------------------------------------- 1 | diff a/configure b/configure 2 | --- a/configure 3 | +++ b/configure 4 | @@ -294,7 +294,7 @@ 5 | # If findlib has been configured -sitelib $(ocamlc -where) then there's 6 | # nothing to do, but otherwise we need to put OCaml's Standard Library 7 | # into the path setting. 8 | - if [ ! -e "${ocaml_sitelib}/stdlib/META" ]; then 9 | + if [ ! -e "${ocaml_sitelib}/stdlib.cmi" ]; then 10 | ocamlpath="${ocaml_core_stdlib}${path_sep}${ocamlpath}" 11 | fi 12 | fi 13 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/ppx_derivers.1.2.1/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "jeremie@dimino.org" 3 | authors: ["Jérémie Dimino"] 4 | license: "BSD-3-Clause" 5 | homepage: "https://github.com/ocaml-ppx/ppx_derivers" 6 | bug-reports: "https://github.com/ocaml-ppx/ppx_derivers/issues" 7 | dev-repo: "git+https://github.com/ocaml-ppx/ppx_derivers.git" 8 | build: [ 9 | ["dune" "build" "-p" name "-j" jobs] 10 | ] 11 | depends: [ 12 | "ocaml" 13 | "dune" 14 | ] 15 | synopsis: "Shared [@@deriving] plugin registry" 16 | description: """ 17 | Ppx_derivers is a tiny package whose sole purpose is to allow 18 | ppx_deriving and ppx_type_conv to inter-operate gracefully when linked 19 | as part of the same ocaml-migrate-parsetree driver.""" 20 | url { 21 | src: "https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz" 22 | checksum: "md5=5dc2bf130c1db3c731fe0fffc5648b41" 23 | } 24 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/result.1.5/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "Jane Street developers" 3 | authors: ["Jane Street Group, LLC"] 4 | homepage: "https://github.com/janestreet/result" 5 | dev-repo: "git+https://github.com/janestreet/result.git" 6 | bug-reports: "https://github.com/janestreet/result/issues" 7 | license: "BSD-3-Clause" 8 | build: [["dune" "build" "-p" name "-j" jobs]] 9 | depends: [ 10 | "ocaml" 11 | "dune" {>= "1.0"} 12 | ] 13 | synopsis: "Compatibility Result module" 14 | description: """ 15 | Projects that want to use the new result type defined in OCaml >= 4.03 16 | while staying compatible with older version of OCaml should use the 17 | Result module defined in this library.""" 18 | url { 19 | src: 20 | "https://github.com/janestreet/result/releases/download/1.5/result-1.5.tbz" 21 | checksum: "md5=1b82dec78849680b49ae9a8a365b831b" 22 | } 23 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/seq.base/files/META.seq: -------------------------------------------------------------------------------- 1 | name="seq" 2 | version="[distributed with OCaml 4.07 or above]" 3 | description="dummy backward-compatibility package for iterators" 4 | requires="" 5 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/seq.base/files/seq.install: -------------------------------------------------------------------------------- 1 | lib:[ 2 | "META.seq" {"META"} 3 | ] 4 | -------------------------------------------------------------------------------- /compiler/esy.lock/opam/seq.base/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: " " 3 | authors: " " 4 | homepage: " " 5 | depends: [ 6 | "ocaml" {>= "4.07.0"} 7 | ] 8 | dev-repo: "git+https://github.com/ocaml/ocaml.git" 9 | bug-reports: "https://caml.inria.fr/mantis/main_page.php" 10 | synopsis: 11 | "Compatibility package for OCaml's standard iterator type starting from 4.07." 12 | extra-files: [ 13 | ["seq.install" "md5=026b31e1df290373198373d5aaa26e42"] 14 | ["META.seq" "md5=b33c8a1a6c7ed797816ce27df4855107"] 15 | ] 16 | -------------------------------------------------------------------------------- /compiler/esy.lock/overrides/opam__s__num_opam__c__1.4_opam_override/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildsInSource": true, 3 | "build": [ 4 | [ 5 | "make" 6 | ] 7 | ], 8 | "install": [ 9 | [ 10 | "make", 11 | "LIBDIR=#{self.install / 'lib'}", 12 | "findlib-install" 13 | ] 14 | ], 15 | "exportedEnv": { 16 | "CAML_LD_LIBRARY_PATH": { 17 | "val": "#{self.install / 'lib' / 'num' : $CAML_LD_LIBRARY_PATH}", 18 | "scope": "global" 19 | } 20 | }, 21 | "dependencies": { 22 | "ocaml": "*", 23 | "@opam/ocamlfind": "*" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /compiler/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.2+win_opam_override/files/ocamlbuild-0.14.2.patch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/grain-lang/grain/f969df9816bf2c4aa22bc2a658de1f1d743a32b9/compiler/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.2+win_opam_override/files/ocamlbuild-0.14.2.patch -------------------------------------------------------------------------------- /compiler/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.2+win_opam_override/files/winpatch.patch: -------------------------------------------------------------------------------- 1 | --- ./Makefile 2 | +++ ./Makefile 3 | @@ -271,7 +271,7 @@ 4 | echo ' "ocamlbuild.byte" {"ocamlbuild.byte"}' >> ocamlbuild.install 5 | ifeq ($(OCAML_NATIVE), true) 6 | echo ' "ocamlbuild.native" {"ocamlbuild.native"}' >> ocamlbuild.install 7 | - echo ' "ocamlbuild.native" {"ocamlbuild"}' >> ocamlbuild.install 8 | + echo " \"ocamlbuild.native\" {\"ocamlbuild${EXE}\"}" >> ocamlbuild.install 9 | else 10 | echo ' "ocamlbuild.byte" {"ocamlbuild"}' >> ocamlbuild.install 11 | endif 12 | -------------------------------------------------------------------------------- /compiler/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.2+win_opam_override/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": [ 3 | [ 4 | "bash", 5 | "-c", 6 | "#{os == 'windows' ? 'patch -p1 < winpatch.patch' : 'true'}" 7 | ], 8 | [ 9 | "make", 10 | "-f", 11 | "configure.make", 12 | "all", 13 | "OCAMLBUILD_PREFIX=#{self.install}", 14 | "OCAMLBUILD_BINDIR=#{self.bin}", 15 | "OCAMLBUILD_LIBDIR=#{self.lib}", 16 | "OCAMLBUILD_MANDIR=#{self.man}", 17 | "OCAMLBUILD_NATIVE=true", 18 | "OCAMLBUILD_NATIVE_TOOLS=true", 19 | "EXE=#{os == 'windows' ? '.exe': ''}" 20 | ], 21 | [ 22 | "make", 23 | "check-if-preinstalled", 24 | "all", 25 | "EXE=#{os == 'windows' ? '.exe': ''}", 26 | "opam-install" 27 | ] 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /compiler/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.9.6_opam_override/files/findlib.patch: -------------------------------------------------------------------------------- 1 | --- ./Makefile 2 | +++ ./Makefile 3 | @@ -55,7 +55,7 @@ 4 | export USE_CYGPATH; \ 5 | cat findlib.conf.in | \ 6 | $(SH) tools/patch '@SITELIB@' '$(OCAML_SITELIB)' | \ 7 | - $(SH) tools/patch '@FINDLIB_PATH@' '$(FINDLIB_PATH)' -p >findlib.conf 8 | + $(SH) tools/patch '@FINDLIB_PATH@' '$(FINDLIB_PATH)' >findlib.conf 9 | if ./tools/cmd_from_same_dir ocamlc; then \ 10 | echo 'ocamlc="ocamlc.opt"' >>findlib.conf; \ 11 | fi 12 | -------------------------------------------------------------------------------- /compiler/esy.lock/overrides/opam__s__reason_opam__c__3.9.0_opam_override/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": "dune build -p reason" 3 | } 4 | -------------------------------------------------------------------------------- /compiler/grainc/config/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name flags) 3 | (libraries dune.configurator)) 4 | 5 | (rule 6 | (targets flags.sexp) 7 | (action 8 | (run ./flags.exe))) 9 | -------------------------------------------------------------------------------- /compiler/grainc/config/flags.re: -------------------------------------------------------------------------------- 1 | module C = Configurator.V1; 2 | 3 | let () = { 4 | C.main(~name="grain_exe_flags", c => { 5 | let default = []; 6 | 7 | let flags = 8 | switch (C.ocaml_config_var(c, "system")) { 9 | | Some("macosx") => 10 | // These flags preserve the original C++ error behavior. Ref https://github.com/ocaml/ocaml/issues/10423 11 | ["-cc", "clang++"] 12 | | Some("mingw64") => 13 | // MinGW needs these flags passed directly to flexdll, to avoid needing MinGW locations in the path 14 | ["-ccopt", "-l:libpthread.a", "-ccopt", "-l:libstdc++.a"] 15 | | Some(_) => default 16 | | None => default 17 | }; 18 | 19 | C.Flags.write_sexp("flags.sexp", flags); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /compiler/grainc/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name grainc) 3 | (public_name grainc) 4 | (package grain) 5 | (modules grainc) 6 | (modes exe js) 7 | (flags 8 | (:standard 9 | (:include ./config/flags.sexp))) 10 | (libraries grain grain_diagnostics binaryen dune-build-info) 11 | (js_of_ocaml 12 | (flags --no-sourcemap --no-extern-fs --quiet))) 13 | -------------------------------------------------------------------------------- /compiler/graindoc/config/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name flags) 3 | (libraries dune.configurator)) 4 | 5 | (rule 6 | (targets flags.sexp) 7 | (action 8 | (run ./flags.exe))) 9 | -------------------------------------------------------------------------------- /compiler/graindoc/config/flags.re: -------------------------------------------------------------------------------- 1 | module C = Configurator.V1; 2 | 3 | let () = { 4 | C.main(~name="grain_exe_flags", c => { 5 | let default = []; 6 | 7 | let flags = 8 | switch (C.ocaml_config_var(c, "system")) { 9 | | Some("macosx") => 10 | // These flags preserve the original C++ error behavior. Ref https://github.com/ocaml/ocaml/issues/10423 11 | ["-cc", "clang++"] 12 | | Some("mingw64") => 13 | // MinGW needs these flags passed directly to flexdll, to avoid needing MinGW locations in the path 14 | ["-ccopt", "-l:libpthread.a", "-ccopt", "-l:libstdc++.a"] 15 | | Some(_) => default 16 | | None => default 17 | }; 18 | 19 | C.Flags.write_sexp("flags.sexp", flags); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /compiler/graindoc/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name docblock) 3 | (public_name graindoc.docblock) 4 | (modules docblock) 5 | (libraries grain grain_diagnostics grain_utils)) 6 | 7 | (executable 8 | (name graindoc) 9 | (public_name graindoc) 10 | (package graindoc) 11 | (modules graindoc) 12 | (modes exe js) 13 | (flags 14 | (:standard 15 | (:include ./config/flags.sexp))) 16 | (libraries cmdliner grain grain_diagnostics grain_utils graindoc.docblock 17 | binaryen dune-build-info) 18 | (preprocess 19 | (pps ppx_deriving_cmdliner)) 20 | (js_of_ocaml 21 | (flags --no-sourcemap --no-extern-fs --quiet))) 22 | -------------------------------------------------------------------------------- /compiler/grainformat/config/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name flags) 3 | (libraries dune.configurator)) 4 | 5 | (rule 6 | (targets flags.sexp) 7 | (action 8 | (run ./flags.exe))) 9 | -------------------------------------------------------------------------------- /compiler/grainformat/config/flags.re: -------------------------------------------------------------------------------- 1 | module C = Configurator.V1; 2 | 3 | let () = { 4 | C.main(~name="grain_exe_flags", c => { 5 | let default = []; 6 | 7 | let flags = 8 | switch (C.ocaml_config_var(c, "system")) { 9 | | Some("macosx") => 10 | // These flags preserve the original C++ error behavior. Ref https://github.com/ocaml/ocaml/issues/10423 11 | ["-cc", "clang++"] 12 | | Some("mingw64") => 13 | // MinGW needs these flags passed directly to flexdll, to avoid needing MinGW locations in the path 14 | ["-ccopt", "-l:libpthread.a", "-ccopt", "-l:libstdc++.a"] 15 | | Some(_) => default 16 | | None => default 17 | }; 18 | 19 | C.Flags.write_sexp("flags.sexp", flags); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /compiler/grainformat/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name grainformat) 3 | (public_name grainformat) 4 | (package grainformat) 5 | (modules grainformat) 6 | (modes exe js) 7 | (flags 8 | (:standard 9 | (:include ./config/flags.sexp))) 10 | (libraries cmdliner grain grain_utils grain_parsing grain_formatting 11 | binaryen dune-build-info) 12 | (preprocess 13 | (pps ppx_deriving_cmdliner)) 14 | (js_of_ocaml 15 | (flags --no-sourcemap --no-extern-fs --quiet))) 16 | -------------------------------------------------------------------------------- /compiler/grainlsp/config/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name flags) 3 | (libraries dune.configurator)) 4 | 5 | (rule 6 | (targets flags.sexp) 7 | (action 8 | (run ./flags.exe))) 9 | -------------------------------------------------------------------------------- /compiler/grainlsp/config/flags.re: -------------------------------------------------------------------------------- 1 | module C = Configurator.V1; 2 | 3 | let () = { 4 | C.main(~name="grain_exe_flags", c => { 5 | let default = []; 6 | 7 | let flags = 8 | switch (C.ocaml_config_var(c, "system")) { 9 | | Some("macosx") => 10 | // These flags preserve the original C++ error behavior. Ref https://github.com/ocaml/ocaml/issues/10423 11 | ["-cc", "clang++"] 12 | | Some("mingw64") => 13 | // MinGW needs these flags passed directly to flexdll, to avoid needing MinGW locations in the path 14 | ["-ccopt", "-l:libpthread.a", "-ccopt", "-l:libstdc++.a"] 15 | | Some(_) => default 16 | | None => default 17 | }; 18 | 19 | C.Flags.write_sexp("flags.sexp", flags); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /compiler/grainlsp/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name grainlsp) 3 | (public_name grainlsp) 4 | (package grainlsp) 5 | (modules grainlsp) 6 | (modes exe js) 7 | (flags 8 | (:standard 9 | (:include ./config/flags.sexp))) 10 | (libraries cmdliner grain_utils grain_language_server grain_formatting 11 | dune-build-info) 12 | (js_of_ocaml 13 | (flags --no-sourcemap --no-extern-fs --quiet) 14 | (javascript_files hacks.js))) 15 | -------------------------------------------------------------------------------- /compiler/src/codegen/bigint_flags.re: -------------------------------------------------------------------------------- 1 | open Sexplib.Conv; 2 | 3 | [@deriving sexp] 4 | type t = 5 | | BigIntNegative; 6 | 7 | let to_int32 = n => 8 | switch (n) { 9 | | BigIntNegative => 1l 10 | }; 11 | 12 | let all_to_int32 = 13 | List.fold_left((acc, cur) => Int32.logor(acc, to_int32(cur)), 0l); 14 | -------------------------------------------------------------------------------- /compiler/src/codegen/compcore.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | open Grain_middle_end; 3 | open Mashtree; 4 | open Binaryen; 5 | 6 | exception WasmRunnerError(Module.t, option(string), string); 7 | 8 | let validate_module: (~name: string=?, Module.t) => unit; 9 | 10 | let compile_wasm_module: 11 | (~name: string=?, Linkedtree.linked_program) => Module.t; 12 | 13 | let module_to_bytes: Module.t => bytes; 14 | -------------------------------------------------------------------------------- /compiler/src/codegen/compmod.re: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | open Mashtree; 3 | 4 | type compiled_program = { 5 | asm: Binaryen.Module.t, 6 | signature: Cmi_format.cmi_infos, 7 | }; 8 | 9 | let compile_wasm_module = (~name=?, {Linkedtree.signature} as linked_program) => { 10 | let asm = Compcore.compile_wasm_module(~name?, linked_program); 11 | {asm, signature}; 12 | }; 13 | -------------------------------------------------------------------------------- /compiler/src/codegen/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name grain_codegen) 3 | (public_name grain_codegen) 4 | (synopsis "Grain compiler code generation") 5 | (libraries compiler-libs.common grain_middle_end grain_parsing grain_typed 6 | grain_utils ppx_sexp_conv.runtime-lib sexplib binaryen) 7 | (preprocess 8 | (pps ppx_sexp_conv))) 9 | -------------------------------------------------------------------------------- /compiler/src/codegen/optimize_mod.rei: -------------------------------------------------------------------------------- 1 | open Binaryen; 2 | 3 | let optimize: (~optimize_level: int=?, ~shrink_level: int=?, Module.t) => unit; 4 | -------------------------------------------------------------------------------- /compiler/src/codegen/runtime_errors.re: -------------------------------------------------------------------------------- 1 | /** Runtime Error definitions */ 2 | open Sexplib.Conv; 3 | 4 | [@deriving sexp] 5 | type grain_error = 6 | | IndexOutOfBounds 7 | | IndexNonInteger 8 | | MatchFailure; 9 | -------------------------------------------------------------------------------- /compiler/src/codegen/runtime_errors.rei: -------------------------------------------------------------------------------- 1 | /** Runtime Error definitions */; 2 | 3 | [@deriving sexp] 4 | type grain_error = 5 | | IndexOutOfBounds 6 | | IndexNonInteger 7 | | MatchFailure; 8 | -------------------------------------------------------------------------------- /compiler/src/codegen/transl_anf.rei: -------------------------------------------------------------------------------- 1 | open Grain_middle_end; 2 | 3 | let global_name: Grain_typed.Ident.t => string; 4 | let transl_anf_program: Anftree.anf_program => Mashtree.mash_program; 5 | -------------------------------------------------------------------------------- /compiler/src/diagnostics/comment_attributes.re: -------------------------------------------------------------------------------- 1 | exception InvalidAttribute(string); 2 | exception MalformedAttribute(string, string); 3 | 4 | type param_id = 5 | | LabeledParam(string) 6 | | PositionalParam(int); 7 | 8 | type t = 9 | | Param({ 10 | attr_id: param_id, 11 | attr_desc: string, 12 | }) 13 | | Returns({attr_desc: string}) 14 | | Example({attr_desc: string}) 15 | | Deprecated({attr_desc: string}) 16 | | Since({attr_version: string}) 17 | | History({ 18 | attr_version: string, 19 | attr_desc: string, 20 | }) 21 | | Throws({ 22 | attr_type: string, 23 | attr_desc: string, 24 | }); 25 | 26 | type parsed_graindoc = (option(string), list(t)); 27 | -------------------------------------------------------------------------------- /compiler/src/diagnostics/commenttree.rei: -------------------------------------------------------------------------------- 1 | open Grain_parsing; 2 | 3 | type t; 4 | 5 | let empty: t; 6 | 7 | let from_comments: list(Parsetree.comment) => t; 8 | 9 | let query: (t, Location.t) => list(Parsetree.comment); 10 | let query_line: (t, int) => option(Parsetree.comment); 11 | -------------------------------------------------------------------------------- /compiler/src/diagnostics/dune: -------------------------------------------------------------------------------- 1 | (menhir 2 | (modules graindoc_parser) 3 | (flags --explain --unused-tokens --exn-carries-state --strict)) 4 | 5 | (rule 6 | (action 7 | (with-stdout-to 8 | graindoc_parser_messages.ml 9 | (run menhir %{dep:graindoc_parser.mly} --compile-errors 10 | %{dep:graindoc_parser.messages} --unused-tokens)))) 11 | 12 | (library 13 | (name grain_diagnostics) 14 | (public_name grain_diagnostics) 15 | (synopsis "Diagnostic modules for Grain compiler") 16 | (libraries compiler-libs.common grain_utils grain_typed str 17 | ppx_deriving_yojson.runtime yojson menhirLib sexplib) 18 | (preprocess 19 | (pps ppx_deriving_yojson sedlex.ppx))) 20 | -------------------------------------------------------------------------------- /compiler/src/diagnostics/locations.re: -------------------------------------------------------------------------------- 1 | open Grain_parsing; 2 | 3 | let get_raw_pos_info = (pos: Lexing.position) => ( 4 | pos.pos_fname, 5 | pos.pos_lnum, 6 | pos.pos_cnum - pos.pos_bol, 7 | pos.pos_bol, 8 | ); 9 | 10 | let get_comment_loc = (comment: Parsetree.comment) => 11 | switch (comment) { 12 | | Line(cmt) => cmt.cmt_loc 13 | | Block(cmt) => cmt.cmt_loc 14 | | Doc(cmt) => cmt.cmt_loc 15 | | Shebang(cmt) => cmt.cmt_loc 16 | }; 17 | -------------------------------------------------------------------------------- /compiler/src/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name grain) 3 | (public_name grain) 4 | (libraries cmdliner compiler-libs.common grain_codegen grain_middle_end 5 | grain_parsing grain_typed grain_utils grain_diagnostics 6 | ppx_sexp_conv.runtime-lib sexplib) 7 | (preprocess 8 | (pps ppx_sexp_conv))) 9 | 10 | (install 11 | (section lib) 12 | (files) 13 | (package grain)) 14 | -------------------------------------------------------------------------------- /compiler/src/formatting/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name grain_formatting) 3 | (public_name grain_formatting) 4 | (libraries grain grain_diagnostics grain_parsing grain_utils)) 5 | -------------------------------------------------------------------------------- /compiler/src/language_server/code_action.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | //https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#documentFormattingParams 4 | module RequestParams: { 5 | [@deriving yojson({strict: false})] 6 | type t; 7 | }; 8 | 9 | //https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textEdit 10 | module ResponseResult: { 11 | [@deriving yojson] 12 | type t; 13 | }; 14 | 15 | let process: 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | RequestParams.t 21 | ) => 22 | unit; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/driver.rei: -------------------------------------------------------------------------------- 1 | type status = 2 | | Reading 3 | | Break 4 | | Exit(int); 5 | 6 | let process: Protocol.request_message => status; 7 | -------------------------------------------------------------------------------- /compiler/src/language_server/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name grain_language_server) 3 | (libraries grain grain_diagnostics grain_parsing grain_utils uri 4 | grain_formatting ppx_deriving_yojson.runtime yojson) 5 | (preprocess 6 | (pps ppx_deriving.enum ppx_deriving_yojson))) 7 | -------------------------------------------------------------------------------- /compiler/src/language_server/exit.re: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#exit 4 | module RequestParams = { 5 | [@deriving yojson] 6 | type t = unit; 7 | }; 8 | 9 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#exit 10 | module ResponseResult = { 11 | [@deriving yojson] 12 | type t = unit; 13 | }; 14 | 15 | let process = 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | params: RequestParams.t, 21 | ) => { 22 | Protocol.response(~id, ResponseResult.to_yojson()); 23 | }; 24 | -------------------------------------------------------------------------------- /compiler/src/language_server/exit.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#exit 4 | module RequestParams: { 5 | [@deriving yojson] 6 | type t; 7 | }; 8 | 9 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#exit 10 | module ResponseResult: { 11 | [@deriving yojson] 12 | type t; 13 | }; 14 | 15 | let process: 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | RequestParams.t 21 | ) => 22 | unit; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/formatting.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | //https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#documentFormattingParams 4 | module RequestParams: { 5 | [@deriving yojson({strict: false})] 6 | type t; 7 | }; 8 | 9 | //https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textEdit 10 | module ResponseResult: { 11 | [@deriving yojson] 12 | type t; 13 | }; 14 | 15 | let process: 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | RequestParams.t 21 | ) => 22 | unit; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/goto.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | type goto_request_type = 4 | | Definition 5 | | TypeDefinition; 6 | 7 | module RequestParams: { 8 | [@deriving yojson({strict: false})] 9 | type t; 10 | }; 11 | 12 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#location 13 | module ResponseResult: { 14 | [@deriving yojson] 15 | type t; 16 | }; 17 | 18 | let process: 19 | ( 20 | ~id: Protocol.message_id, 21 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 22 | ~documents: Hashtbl.t(Protocol.uri, string), 23 | goto_request_type, 24 | RequestParams.t 25 | ) => 26 | unit; 27 | -------------------------------------------------------------------------------- /compiler/src/language_server/hover.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#hoverParams 4 | module RequestParams: { 5 | [@deriving yojson({strict: false})] 6 | type t; 7 | }; 8 | 9 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#hover 10 | module ResponseResult: { 11 | [@deriving yojson] 12 | type t; 13 | }; 14 | 15 | let process: 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | RequestParams.t 21 | ) => 22 | unit; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/initialize.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#initializeParams 4 | module RequestParams: { 5 | [@deriving yojson({strict: false})] 6 | type t; 7 | }; 8 | 9 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#initializeResult 10 | module ResponseResult: { 11 | [@deriving yojson] 12 | type t; 13 | }; 14 | 15 | let process: 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | RequestParams.t 21 | ) => 22 | unit; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/inlayhint.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#inlayHintParams 4 | module RequestParams: { 5 | [@deriving yojson({strict: false})] 6 | type t; 7 | }; 8 | 9 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_inlayHint 10 | module ResponseResult: { 11 | [@deriving yojson] 12 | type t; 13 | }; 14 | 15 | let process: 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | RequestParams.t 21 | ) => 22 | unit; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/lenses.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeLensParams 4 | module RequestParams: { 5 | [@deriving yojson({strict: false})] 6 | type t; 7 | }; 8 | 9 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeLens 10 | module ResponseResult: { 11 | [@deriving yojson] 12 | type t; 13 | }; 14 | 15 | let process: 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | RequestParams.t 21 | ) => 22 | unit; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/log.re: -------------------------------------------------------------------------------- 1 | [@deriving (enum, yojson)] 2 | type message_type = 3 | | [@value 1] Error 4 | | Warning 5 | | Info 6 | | Log 7 | | Debug; 8 | 9 | [@deriving yojson] 10 | type t = { 11 | [@key "type"] 12 | type_: int, 13 | message: string, 14 | }; 15 | 16 | let log = (~message_type=Info, message) => { 17 | let type_ = message_type_to_enum(message_type); 18 | Protocol.notification( 19 | ~method="window/logMessage", 20 | to_yojson({message, type_}), 21 | ); 22 | }; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/lsp_types.re: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | open Sourcetree; 3 | 4 | type code = { 5 | program: Typedtree.typed_program, 6 | sourcetree: Sourcetree.sourcetree, 7 | dirty: bool, 8 | }; 9 | -------------------------------------------------------------------------------- /compiler/src/language_server/shutdown.re: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#shutdown 4 | module RequestParams = { 5 | [@deriving yojson] 6 | type t = unit; 7 | }; 8 | 9 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#shutdown 10 | module ResponseResult = { 11 | [@deriving yojson] 12 | type t = unit; 13 | }; 14 | 15 | let process = 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | params: RequestParams.t, 21 | ) => { 22 | Protocol.response(~id, ResponseResult.to_yojson()); 23 | }; 24 | -------------------------------------------------------------------------------- /compiler/src/language_server/shutdown.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | 3 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#shutdown 4 | module RequestParams: { 5 | [@deriving yojson] 6 | type t; 7 | }; 8 | 9 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#shutdown 10 | module ResponseResult: { 11 | [@deriving yojson] 12 | type t; 13 | }; 14 | 15 | let process: 16 | ( 17 | ~id: Protocol.message_id, 18 | ~compiled_code: Hashtbl.t(Protocol.uri, Lsp_types.code), 19 | ~documents: Hashtbl.t(Protocol.uri, string), 20 | RequestParams.t 21 | ) => 22 | unit; 23 | -------------------------------------------------------------------------------- /compiler/src/language_server/trace.rei: -------------------------------------------------------------------------------- 1 | // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#setTrace 2 | module RequestParams: { 3 | // Not abstract so it can pluck the value 4 | [@deriving yojson({strict: false})] 5 | type t = {value: Protocol.trace_value}; 6 | }; 7 | 8 | let set_level: string => unit; 9 | let log: (~verbose: string=?, string) => unit; 10 | -------------------------------------------------------------------------------- /compiler/src/language_server/utils.re: -------------------------------------------------------------------------------- 1 | open Grain_utils; 2 | open Grain_diagnostics; 3 | let uri_to_filename = (uri: Uri.t): string => { 4 | Uri.path(uri) |> Str.replace_first(Str.regexp("^/\\(.\\):"), "\\1:"); 5 | }; 6 | 7 | let filename_to_uri = (filename: string): Uri.t => { 8 | Uri.make(~scheme="file", ~host="", ~path=filename, ()); 9 | }; 10 | 11 | let loc_to_range = (pos: Grain_parsing.Location.t): Protocol.range => { 12 | let (_, startline, startchar, _) = 13 | Locations.get_raw_pos_info(pos.loc_start); 14 | let (_, endline, endchar) = 15 | Grain_parsing.Location.get_pos_info(pos.loc_end); 16 | 17 | { 18 | range_start: { 19 | line: startline - 1, 20 | character: startchar, 21 | }, 22 | range_end: { 23 | line: endline - 1, 24 | character: endchar, 25 | }, 26 | }; 27 | }; 28 | -------------------------------------------------------------------------------- /compiler/src/language_server/utils.rei: -------------------------------------------------------------------------------- 1 | open Grain_utils; 2 | open Grain_diagnostics; 3 | 4 | let uri_to_filename: Protocol.uri => string; 5 | let filename_to_uri: string => Protocol.uri; 6 | 7 | let loc_to_range: Grain_parsing.Location.t => Protocol.range; 8 | -------------------------------------------------------------------------------- /compiler/src/link.re: -------------------------------------------------------------------------------- 1 | open Grain_codegen; 2 | 3 | let link = (~main_object, ~outfile, dependencies) => { 4 | let linked_program = Linkedtree.link(~main_object, dependencies); 5 | let compiled_program = Compmod.compile_wasm_module(linked_program); 6 | Emitmod.emit_binary( 7 | compiled_program.asm, 8 | compiled_program.signature, 9 | outfile, 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analysis_pass.re: -------------------------------------------------------------------------------- 1 | /** A single analysis pass. */ 2 | type t = Anftree.anf_program => unit; 3 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analysis_pass.rei: -------------------------------------------------------------------------------- 1 | /** A single analysis pass. */ 2 | type t = Anftree.anf_program => unit; 3 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_closure_scoped_vars.rei: -------------------------------------------------------------------------------- 1 | open Anf_iterator; 2 | open Grain_typed; 3 | 4 | let is_closure_scoped_var: Ident.t => bool; 5 | 6 | let analyze: Analysis_pass.t; 7 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_free_vars.rei: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | 4 | let anf_free_vars: anf_expression => Ident.Set.t; 5 | let comp_free_vars: comp_expression => Ident.Set.t; 6 | 7 | let analyze: Analysis_pass.t; 8 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_function_calls.rei: -------------------------------------------------------------------------------- 1 | open Anf_iterator; 2 | open Grain_typed; 3 | 4 | let has_indirect_call: Ident.t => bool; 5 | 6 | let analyze: Analysis_pass.t; 7 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_globals.rei: -------------------------------------------------------------------------------- 1 | let analyze: Analysis_pass.t; 2 | 3 | let get_globals: unit => Grain_typed.Ident.Set.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_inline_wasm.rei: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | 4 | type inline_type = 5 | | WasmPrimN(primn); 6 | 7 | let mod_has_inlineable_wasm: ref(bool); 8 | 9 | let get_inline_wasm_type: Ident.t => inline_type; 10 | let has_inline_wasm_type: Ident.t => bool; 11 | 12 | let analyze: Analysis_pass.t; 13 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_manual_memory_management.rei: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | 4 | let mod_has_manual_memory_management: ref(bool); 5 | 6 | let is_manual_memory_management_call: Ident.t => bool; 7 | 8 | let analyze: Analysis_pass.t; 9 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_mutable_vars.re: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | 4 | let mutable_vars = ref(Ident.Set.empty); 5 | 6 | let is_mutable = id => Ident.Set.mem(id, mutable_vars^); 7 | 8 | module MutableVarsArg = { 9 | include Anf_iterator.DefaultIterArgument; 10 | 11 | let enter_anf_expression = ({anf_desc}) => { 12 | switch (anf_desc) { 13 | | AELet(_, _, Mutable, binds, _) => 14 | List.iter( 15 | ((id, _)) => {mutable_vars := Ident.Set.add(id, mutable_vars^)}, 16 | binds, 17 | ) 18 | | _ => () 19 | }; 20 | }; 21 | }; 22 | 23 | module MutableVarsIter = Anf_iterator.MakeIter(MutableVarsArg); 24 | 25 | let analyze = prog => { 26 | mutable_vars := Ident.Set.empty; 27 | MutableVarsIter.iter_anf_program(prog); 28 | }; 29 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_mutable_vars.rei: -------------------------------------------------------------------------------- 1 | let is_mutable: Grain_typed.Ident.t => bool; 2 | 3 | let analyze: Anftree.anf_program => unit; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_purity.rei: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | 4 | let comp_expression_purity: comp_expression => option(bool); 5 | let anf_expression_purity: anf_expression => option(bool); 6 | 7 | let analyze: Analysis_pass.t; 8 | -------------------------------------------------------------------------------- /compiler/src/middle_end/analyze_tail_calls.rei: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | 4 | let comp_is_tail_recursive: comp_expression => option(bool); 5 | let comp_is_tail_call: comp_expression => option(bool); 6 | let mark_not_tail_recursive: comp_expression => unit; 7 | 8 | let analyze: Analysis_pass.t; 9 | -------------------------------------------------------------------------------- /compiler/src/middle_end/anf_mapper.rei: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_parsing; 3 | open Grain_typed; 4 | open Types; 5 | 6 | module type MapArgument = { 7 | let enter_imm_expression: imm_expression => imm_expression; 8 | let leave_imm_expression: imm_expression => imm_expression; 9 | 10 | let enter_comp_expression: comp_expression => comp_expression; 11 | let leave_comp_expression: comp_expression => comp_expression; 12 | 13 | let enter_anf_expression: anf_expression => anf_expression; 14 | let leave_anf_expression: anf_expression => anf_expression; 15 | 16 | let enter_anf_program: anf_program => anf_program; 17 | let leave_anf_program: anf_program => anf_program; 18 | }; 19 | 20 | module DefaultMapArgument: MapArgument; 21 | 22 | module MakeMap: 23 | (Iter: MapArgument) => { 24 | let map_anf_program: anf_program => anf_program; 25 | }; 26 | -------------------------------------------------------------------------------- /compiler/src/middle_end/anf_utils.rei: -------------------------------------------------------------------------------- 1 | open Grain_typed; 2 | open Anftree; 3 | 4 | let clear_locations: anf_program => anf_program; 5 | -------------------------------------------------------------------------------- /compiler/src/middle_end/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name grain_middle_end) 3 | (public_name grain_middle_end) 4 | (synopsis "Grain compiler middle end") 5 | (libraries compiler-libs.common grain_parsing grain_typed grain_utils 6 | ppx_sexp_conv.runtime-lib sexplib) 7 | (preprocess 8 | (pps ppx_sexp_conv))) 9 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimization_pass.re: -------------------------------------------------------------------------------- 1 | /** A single optimization pass. Returns an optimized version of its argument. */ 2 | type t = Anftree.anf_program => Anftree.anf_program; 3 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_constants.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which propagates constant values throughout the program. */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_dead_assignments.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which removes all dead assignments. */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_dead_branches.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which removes static `if` condition checks. */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_dead_statements.re: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | 4 | let get_comp_purity = c => 5 | Option.value(~default=false) @@ Analyze_purity.comp_expression_purity(c); 6 | 7 | module DSEArg: Anf_mapper.MapArgument = { 8 | include Anf_mapper.DefaultMapArgument; 9 | 10 | let leave_anf_expression = ({anf_desc: desc} as a) => 11 | switch (desc) { 12 | | AESeq(hd, tl) when get_comp_purity(hd) => tl 13 | | AESeq(_) 14 | | AELet(_) 15 | | AEComp(_) => a 16 | }; 17 | }; 18 | 19 | module DSEMapper = Anf_mapper.MakeMap(DSEArg); 20 | 21 | let optimize = anfprog => { 22 | DSEMapper.map_anf_program(anfprog); 23 | }; 24 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_dead_statements.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which removes all dead statements. */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_inline_wasm.re: -------------------------------------------------------------------------------- 1 | // This module still exists to support the --no-bulk-memory flag. 2 | 3 | open Anftree; 4 | open Grain_typed; 5 | open Analyze_inline_wasm; 6 | 7 | module IWArg: Anf_mapper.MapArgument = { 8 | include Anf_mapper.DefaultMapArgument; 9 | 10 | let leave_comp_expression = ({comp_desc: desc} as c) => { 11 | switch (desc) { 12 | | CApp(({imm_desc: ImmId(id)}, _), args, _) 13 | when has_inline_wasm_type(id) => 14 | let primn = 15 | switch (get_inline_wasm_type(id)) { 16 | | WasmPrimN(primn) => primn 17 | }; 18 | {...c, comp_desc: CPrimN(primn, args)}; 19 | | _ => c 20 | }; 21 | }; 22 | }; 23 | 24 | module IWMapper = Anf_mapper.MakeMap(IWArg); 25 | 26 | let optimize = anfprog => 27 | if (mod_has_inlineable_wasm^) { 28 | IWMapper.map_anf_program(anfprog); 29 | } else { 30 | anfprog; 31 | }; 32 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_inline_wasm.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which inlines wasm instructions from their equivalent Grain functions */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_local_mutations.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which optimizes boxes used locally into local mutations. */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_manual_memory_management.re: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | open Analyze_manual_memory_management; 4 | 5 | module IWArg: Anf_mapper.MapArgument = { 6 | include Anf_mapper.DefaultMapArgument; 7 | 8 | let leave_comp_expression = ({comp_desc: desc} as c) => { 9 | switch (desc) { 10 | | CApp(({imm_desc: ImmId(id)}, _), [arg1], _) 11 | when is_manual_memory_management_call(id) => { 12 | ...c, 13 | // Other optimizations will remove the identifier completely 14 | // if appropriate 15 | comp_desc: CImmExpr(arg1), 16 | } 17 | | _ => c 18 | }; 19 | }; 20 | }; 21 | 22 | module IWMapper = Anf_mapper.MakeMap(IWArg); 23 | 24 | let optimize = anfprog => 25 | if (Grain_utils.Config.no_gc^ && mod_has_manual_memory_management^) { 26 | IWMapper.map_anf_program(anfprog); 27 | } else { 28 | anfprog; 29 | }; 30 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_manual_memory_management.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which removes incRef/decRef calls in user code when GC is disabled. */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_simple_expressions.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which folds constant values in a single binop into a single value. */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_tail_calls.re: -------------------------------------------------------------------------------- 1 | open Anftree; 2 | open Grain_typed; 3 | open Types; 4 | open Analyze_tail_calls; 5 | 6 | let comp_is_tail_call = c => 7 | Option.value(~default=false) @@ Analyze_tail_calls.comp_is_tail_call(c); 8 | 9 | module TailCallsArg: Anf_mapper.MapArgument = { 10 | include Anf_mapper.DefaultMapArgument; 11 | 12 | let leave_comp_expression = ({comp_desc: desc} as c) => 13 | switch (desc) { 14 | | CApp(f, args, _) when comp_is_tail_call(c) => { 15 | ...c, 16 | comp_desc: CApp(f, args, true), 17 | } 18 | | _ => c 19 | }; 20 | }; 21 | 22 | module TailCallsMapper = Anf_mapper.MakeMap(TailCallsArg); 23 | 24 | let optimize = anfprog => TailCallsMapper.map_anf_program(anfprog); 25 | -------------------------------------------------------------------------------- /compiler/src/middle_end/optimize_tail_calls.rei: -------------------------------------------------------------------------------- 1 | /** Optimization pass which optimizes tail recursive functions into a loop. */ 2 | 3 | let optimize: Optimization_pass.t; 4 | -------------------------------------------------------------------------------- /compiler/src/parsing/README.md: -------------------------------------------------------------------------------- 1 | # Parsing 2 | This submodule contains code used for the Grain frontend. 3 | While this will certainly evolve over time, the initial version of this 4 | library is heavily inspired by the `parsing` directory of the OCaml 5 | compiler; we try to use their idioms, since they know better than anyone 6 | the best way to write a compiler in OCaml. 7 | -------------------------------------------------------------------------------- /compiler/src/parsing/driver.rei: -------------------------------------------------------------------------------- 1 | /** Wrapper for the parser, including error handling and ambiguous parses. */ 2 | 3 | let parse: 4 | (~name: string=?, Sedlexing.lexbuf, unit => string) => 5 | Parsetree.parsed_program; 6 | 7 | let read_imports: Parsetree.parsed_program => list(Location.loc(string)); 8 | 9 | let scan_for_imports: 10 | (~defer_errors: bool=?, string) => list(Location.loc(string)); 11 | 12 | let scan_string_for_imports: 13 | (~defer_errors: bool=?, string, string) => list(Location.loc(string)); 14 | 15 | let reset: unit => unit; 16 | -------------------------------------------------------------------------------- /compiler/src/parsing/syntaxerr.re: -------------------------------------------------------------------------------- 1 | /* See copyright information in syntaxerr.mli */ 2 | 3 | type stxerr = 4 | | LetWithoutBody(Location.t) 5 | | Other(Location.t); 6 | 7 | exception Error(stxerr); 8 | 9 | let prepare_error = 10 | fun 11 | | LetWithoutBody(loc) => 12 | Location.errorf(~loc, "Missing expression after let binding") 13 | | Other(loc) => Location.errorf(~loc, "Syntax error"); 14 | 15 | let () = 16 | Location.register_error_of_exn( 17 | fun 18 | | Error(err) => Some(prepare_error(err)) 19 | | _ => None, 20 | ); 21 | 22 | let location_of_error = 23 | fun 24 | | LetWithoutBody(l) 25 | | Other(l) => l; 26 | -------------------------------------------------------------------------------- /compiler/src/typed/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name grain_typed) 3 | (public_name grain_typed) 4 | (synopsis "Grain compiler type utilities") 5 | (libraries compiler-libs.common grain_parsing grain_utils 6 | ppx_deriving_yojson.runtime ppx_sexp_conv.runtime-lib sexplib yojson 7 | ocamlgraph) 8 | (preprocess 9 | (pps ppx_sexp_conv ppx_deriving_yojson))) 10 | -------------------------------------------------------------------------------- /compiler/src/typed/ident_tbl.re: -------------------------------------------------------------------------------- 1 | include Hashtbl.Make({ 2 | type t = Ident.t; 3 | let equal = (i, j) => Ident.same(i, j); 4 | let hash = i => Hashtbl.hash(i); 5 | }); 6 | -------------------------------------------------------------------------------- /compiler/src/typed/ident_tbl.rei: -------------------------------------------------------------------------------- 1 | include Hashtbl.S with type key = Ident.t; 2 | -------------------------------------------------------------------------------- /compiler/src/typed/module_resolution.rei: -------------------------------------------------------------------------------- 1 | let get_object_name: string => string; 2 | 3 | let locate_object_file: 4 | (~loc: Grain_parsing.Location.t, ~disable_relpath: bool=?, string) => string; 5 | 6 | let locate_unit_object_file: 7 | (~path: list(string)=?, ~base_dir: string=?, string) => string; 8 | 9 | let resolve_unit: 10 | ( 11 | ~search_path: list(string)=?, 12 | ~cache: bool=?, 13 | ~base_dir: string=?, 14 | string 15 | ) => 16 | string; 17 | 18 | let load_dependency_graph: string => unit; 19 | let load_dependency_graph_from_string: (string, string) => unit; 20 | 21 | let read_file_cmi: string => Cmi_format.cmi_infos; 22 | 23 | let clear_dependency_graph: unit => unit; 24 | 25 | let current_filename: ref(unit => string); 26 | 27 | let get_dependencies: unit => list(string); 28 | 29 | let get_out_of_date_dependencies: unit => list(string); 30 | 31 | let dump_dependency_graph: unit => unit; 32 | -------------------------------------------------------------------------------- /compiler/src/typed/path.rei: -------------------------------------------------------------------------------- 1 | /* Modified version of OCaml Path module. */ 2 | 3 | [@deriving (sexp, yojson)] 4 | type t = 5 | | PIdent(Ident.t) 6 | | PExternal(t, string); 7 | 8 | let same: (t, t) => bool; 9 | let compare: (t, t) => int; 10 | let find_free_opt: (list(Ident.t), t) => option(Ident.t); 11 | let isfree: (Ident.t, t) => bool; 12 | let binding_time: t => int; 13 | let flatten: t => (Ident.t, list(string)); 14 | 15 | let nopos: int; 16 | 17 | let name: t => string; 18 | 19 | let head: t => Ident.t; 20 | 21 | let heads: t => list(Ident.t); 22 | 23 | let last: t => string; 24 | 25 | let stamp: t => int; 26 | -------------------------------------------------------------------------------- /compiler/src/typed/path_tbl.rei: -------------------------------------------------------------------------------- 1 | include Hashtbl.S with type key = Path.t; 2 | 3 | let sexp_of_t: ('a => Sexplib.Sexp.t, t('a)) => Sexplib.Sexp.t; 4 | let t_of_sexp: (Sexplib.Sexp.t => 'a, Sexplib.Sexp.t) => t('a); 5 | -------------------------------------------------------------------------------- /compiler/src/typed/translprim.rei: -------------------------------------------------------------------------------- 1 | open Typedtree; 2 | 3 | type primitive_constant = 4 | | HeapTypeMetadata 5 | | ElideTypeInfo; 6 | 7 | type primitive = 8 | | PrimitiveConstant(primitive_constant) 9 | | Primitive0(prim0) 10 | | Primitive1(prim1) 11 | | Primitive2(prim2) 12 | | PrimitiveN(primn); 13 | 14 | module PrimMap: Hashtbl.S with type key = string; 15 | 16 | let prim_map: PrimMap.t(primitive); 17 | 18 | let transl_prim: 19 | (Env.t, Grain_parsing.Parsetree.primitive_description) => 20 | (list(value_binding), Ident.t, Types.value_description, Env.t); 21 | -------------------------------------------------------------------------------- /compiler/src/typed/translsig.rei: -------------------------------------------------------------------------------- 1 | open Grain_utils; 2 | open Types; 3 | 4 | let translate_signature: signature => signature; 5 | -------------------------------------------------------------------------------- /compiler/src/typed/typed_well_formedness.rei: -------------------------------------------------------------------------------- 1 | /** 2 | * Performs well-formedness checks on the given typed program. 3 | * These checks are distinct from those defined in Grain_parsing.Well_formedness. 4 | */ 5 | let check_well_formedness: Typedtree.typed_program => unit; 6 | -------------------------------------------------------------------------------- /compiler/src/utils/char_utils.re: -------------------------------------------------------------------------------- 1 | // Based on BatChar 2 | let is_uppercase_letter = c => 'A' <= c && c <= 'Z'; 3 | let is_lowercase_letter = c => 'a' <= c && c <= 'z'; 4 | -------------------------------------------------------------------------------- /compiler/src/utils/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name grain_utils) 3 | (public_name grain_utils) 4 | (synopsis "Utilities for the Grain compiler") 5 | (libraries fp fs.lib cmdliner compiler-libs.common ppx_sexp_conv.runtime-lib 6 | sexplib str dune-build-info) 7 | (preprocess 8 | (pps ppx_sexp_conv sedlex.ppx)) 9 | (js_of_ocaml 10 | (javascript_files hacks.js))) 11 | -------------------------------------------------------------------------------- /compiler/src/utils/list_utils.re: -------------------------------------------------------------------------------- 1 | // Based on BatList 2 | let fold_lefti = (fn, init, lis) => { 3 | let rec iter = (idx, result, lis) => { 4 | switch (lis) { 5 | | [] => result 6 | | [item, ...rest] => iter(idx + 1, fn(result, idx, item), rest) 7 | }; 8 | }; 9 | iter(0, init, lis); 10 | }; 11 | 12 | let filter_mapi = (f, list) => { 13 | let rec filter_mapi = (count, f) => 14 | fun 15 | | [hd, ...tl] => { 16 | switch (f(hd, count)) { 17 | | Some(result) => [result, ...filter_mapi(count + 1, f, tl)] 18 | | None => filter_mapi(count + 1, f, tl) 19 | }; 20 | } 21 | | [] => []; 22 | 23 | filter_mapi(0, f, list); 24 | }; 25 | -------------------------------------------------------------------------------- /compiler/src/utils/mini_bigint.rei: -------------------------------------------------------------------------------- 1 | type t = {mutable limbs: array(int64)}; 2 | 3 | let zero: unit => t; 4 | let of_int: int => t; 5 | let unsigned_add_i64: (t, int64) => t; 6 | let unsigned_mul_i32: (t, int32) => t; 7 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/arrays.24453e6e.0.snapshot: -------------------------------------------------------------------------------- 1 | arrays › array1_trailing 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MArray 8 | (((immediate_desc (MImmConst (MConstI32 1))) 9 | (immediate_analyses ((last_usage Unknown)))) 10 | ((immediate_desc (MImmConst (MConstI32 2))) 11 | (immediate_analyses ((last_usage Unknown)))) 12 | ((immediate_desc (MImmConst (MConstI32 3))) 13 | (immediate_analyses ((last_usage Unknown))))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/arrays.9e17b4d1.0.snapshot: -------------------------------------------------------------------------------- 1 | arrays › array3 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MArray 8 | (((immediate_desc (MImmConst (MConstI32 1))) 9 | (immediate_analyses ((last_usage Unknown)))) 10 | ((immediate_desc (MImmConst (MConstI32 2))) 11 | (immediate_analyses ((last_usage Unknown)))) 12 | ((immediate_desc (MImmConst (MConstI32 3))) 13 | (immediate_analyses ((last_usage Unknown))))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/arrays.b85cb7fc.0.snapshot: -------------------------------------------------------------------------------- 1 | arrays › array1_trailing_space 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MArray 8 | (((immediate_desc (MImmConst (MConstI32 1))) 9 | (immediate_analyses ((last_usage Unknown)))) 10 | ((immediate_desc (MImmConst (MConstI32 2))) 11 | (immediate_analyses ((last_usage Unknown)))) 12 | ((immediate_desc (MImmConst (MConstI32 3))) 13 | (immediate_analyses ((last_usage Unknown))))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.00cfdb2e.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › binop2.4 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 -2))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.03de4778.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › neg 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 -40))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.20f7581b.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › simple_min 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 -1073741824))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.2756b429.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › forty 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 40))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.27a7e2f7.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › bigint_start_pos 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MBigInt (flags ()) (limbs (-1)))))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.2cb30a54.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › bigint_start_neg 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate (MBigInt (flags (BigIntNegative)) (limbs (-1)))))))) 7 | (main_body_stack_size 8 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 9 | (stack_size_f32 0) (stack_size_f64 0))) 10 | (globals ()) (function_table_elements ()) 11 | (global_function_table_offset ((name function_table_global))) 12 | (compilation_mode Normal) (type_metadata ))) 13 | (signature )) 14 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.2d7e34cf.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › and2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 2147483646)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.2f65c8cf.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › fals 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 2147483646)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.304ca65f.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › oct_neg 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 -63))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.31e0d562.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › infinity 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MFloat64 9218868437227405312)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.34dcfbdd.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › int64_1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MInt64 99999999999999999)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.3ffd0bf3.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › orshort1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 -2)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.427c6671.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › uint64_1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MUint64 99999999999999999)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.448497ab.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › binop5 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 2))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.48db380c.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › if4 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 3))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.4d6f9417.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › not1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 2147483646)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.4f5bd247.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › heap_number_i64_wrapper 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MInt64 2147483648)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.565dbeda.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › hex_neg 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 -255))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.5b56d472.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › and3 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 2147483646)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.5cd54e52.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › or4 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 2147483646)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.6f9706c2.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › or1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 -2)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.704872bc.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › assert1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 1879048190)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.7222ab37.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › tru 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 -2)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.7848308f.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › or3 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 -2)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.7b13e79a.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › and4 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 2147483646)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.7bb7b0d4.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › uint32_1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MUint32 42)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.7beffe4d.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › hex_dec_exp5 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MFloat64 4650610929073913856)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.7ccc4940.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › division1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MRational (numerator_flags ()) (numerator_limbs (5)) 8 | (denominator_flags ()) (denominator_limbs (2)))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.83f51526.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › hex_dec_exp3 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MFloat64 4584664420663164928)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.86f332c6.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › bin_neg 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 -10))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.8c8313f3.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › hex_dec_exp2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MFloat64 4630826316843712512)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.8e01d666.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › infinity_neg 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MFloat64 -4503599627370496)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.903ff701.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › hex_dec_exp4 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MFloat64 4650529565213458432)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.950b8fda.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › binop2.3 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 -2))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.970a2a2b.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › not2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 -2)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.9b9c7047.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › void 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MString foo)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.9df4a5e0.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › and1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 -2)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.9fb01eb5.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › simple_max 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 1073741823))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.a0747361.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › hex 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 255))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.a4ec9fca.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › andshort2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 2147483646)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.bd891a1f.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › oct 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 63))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.c1554a92.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › or2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 -2)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.c8144b17.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › bin 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 10))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.d124f931.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › nil 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 1879048190)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.d8f6f027.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › hex_dec_exp1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MFloat64 4629700416936869888)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.e6ea6b06.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › int32_1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MInt32 42)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.f47797ca.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › hex_dec_exp5 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MFloat64 4650599933957636096)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.f90a3baa.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › heap_number_i32_wrapper_max 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MInt64 2147483647)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.f9743171.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › heap_number_i32_wrapper 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MInt64 1073741824)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/basic_functionality.fe19cffe.0.snapshot: -------------------------------------------------------------------------------- 1 | basic functionality › bigint_2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MBigInt (flags ()) (limbs (-7851998425750883293 1164749010670168)))))))) 8 | (main_body_stack_size 9 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 10 | (stack_size_f32 0) (stack_size_f64 0))) 11 | (globals ()) (function_table_elements ()) 12 | (global_function_table_offset ((name function_table_global))) 13 | (compilation_mode Normal) (type_metadata ))) 14 | (signature )) 15 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/chars.200d9e1a.0.snapshot: -------------------------------------------------------------------------------- 1 | chars › char4 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstChar A))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/chars.259e330c.0.snapshot: -------------------------------------------------------------------------------- 1 | chars › char2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstChar A))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/chars.27fb7f30.0.snapshot: -------------------------------------------------------------------------------- 1 | chars › char8 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstChar \"\\226\\156\\168\"))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/chars.51010573.0.snapshot: -------------------------------------------------------------------------------- 1 | chars › char7 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstChar \"\\240\\159\\140\\190\"))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/chars.7e0f68db.0.snapshot: -------------------------------------------------------------------------------- 1 | chars › char6 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstChar \"\\240\\159\\146\\175\"))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/chars.af4b3613.0.snapshot: -------------------------------------------------------------------------------- 1 | chars › char5 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstChar A))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/chars.e1cac8cd.0.snapshot: -------------------------------------------------------------------------------- 1 | chars › char3 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstChar A))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/comments.573e549e.0.snapshot: -------------------------------------------------------------------------------- 1 | comments › comment_alone 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 10))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/comments.8f52e899.0.snapshot: -------------------------------------------------------------------------------- 1 | comments › comment_block 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 10))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/comments.ccf5fcf4.0.snapshot: -------------------------------------------------------------------------------- 1 | comments › comment_shebang 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 10))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/comments.fd91c233.0.snapshot: -------------------------------------------------------------------------------- 1 | comments › comment_doc 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 10))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/enums.aa34084a.0.snapshot: -------------------------------------------------------------------------------- 1 | enums › adt_trailing 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MADT 8 | ((immediate_desc (MImmConst (MConstI32 496428475))) 9 | (immediate_analyses ((last_usage Unknown)))) 10 | ((immediate_desc (MImmConst (MConstI32 1113))) 11 | (immediate_analyses ((last_usage Unknown)))) 12 | ((immediate_desc (MImmConst (MConstI32 1))) 13 | (immediate_analyses ((last_usage Unknown)))) 14 | ())))))) 15 | (main_body_stack_size 16 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 17 | (stack_size_f32 0) (stack_size_f64 0))) 18 | (globals ()) (function_table_elements ()) 19 | (global_function_table_offset ((name function_table_global))) 20 | (compilation_mode Normal) (type_metadata ))) 21 | (signature )) 22 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/exceptions.a68ae348.0.snapshot: -------------------------------------------------------------------------------- 1 | exceptions › exception_4 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MADT 8 | ((immediate_desc (MImmConst (MConstI32 0))) 9 | (immediate_analyses ((last_usage Unknown)))) 10 | ((immediate_desc (MImmConst (MConstI32 2))) 11 | (immediate_analyses ((last_usage Unknown)))) 12 | ((immediate_desc (MImmConst (MConstI32 1114))) 13 | (immediate_analyses ((last_usage Unknown)))) 14 | ())))))) 15 | (main_body_stack_size 16 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 17 | (stack_size_f32 0) (stack_size_f64 0))) 18 | (globals ()) (function_table_elements ()) 19 | (global_function_table_offset ((name function_table_global))) 20 | (compilation_mode Normal) (type_metadata ))) 21 | (signature )) 22 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/exceptions.ccac3e71.0.snapshot: -------------------------------------------------------------------------------- 1 | exceptions › exception_2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MADT 8 | ((immediate_desc (MImmConst (MConstI32 0))) 9 | (immediate_analyses ((last_usage Unknown)))) 10 | ((immediate_desc (MImmConst (MConstI32 2))) 11 | (immediate_analyses ((last_usage Unknown)))) 12 | ((immediate_desc (MImmConst (MConstI32 1113))) 13 | (immediate_analyses ((last_usage Unknown)))) 14 | ())))))) 15 | (main_body_stack_size 16 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 17 | (stack_size_f32 0) (stack_size_f64 0))) 18 | (globals ()) (function_table_elements ()) 19 | (global_function_table_offset ((name function_table_global))) 20 | (compilation_mode Normal) (type_metadata ))) 21 | (signature )) 22 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/functions.ce978f54.0.snapshot: -------------------------------------------------------------------------------- 1 | functions › multi_bind2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 3))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/includes.1d829099.0.snapshot: -------------------------------------------------------------------------------- 1 | includes › include_relative_path2 2 | ((mash_code 3 | ((functions ()) 4 | (imports 5 | (((mimp_id ((name x))) (mimp_mod ../../test/test-libs/provideAll.gr) 6 | (mimp_name x) (mimp_type (MGlobalImport Managed true)) 7 | (mimp_kind MImportGrain) (mimp_setup MCallGetter) (mimp_used true)))) 8 | (exports ()) 9 | (main_body 10 | (((instr_desc 11 | (MImmediate 12 | ((immediate_desc (MImmBinding (MGlobalBind x_1122 Managed))) 13 | (immediate_analyses ((last_usage Last))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/includes.5dfba7dd.0.snapshot: -------------------------------------------------------------------------------- 1 | includes › include_alias 2 | ((mash_code 3 | ((functions ()) 4 | (imports 5 | (((mimp_id ((name x))) (mimp_mod provideAll.gr) (mimp_name x) 6 | (mimp_type (MGlobalImport Managed true)) (mimp_kind MImportGrain) 7 | (mimp_setup MCallGetter) (mimp_used true)))) 8 | (exports ()) 9 | (main_body 10 | (((instr_desc 11 | (MImmediate 12 | ((immediate_desc (MImmBinding (MGlobalBind x_1122 Managed))) 13 | (immediate_analyses ((last_usage Last))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/includes.7afbe731.0.snapshot: -------------------------------------------------------------------------------- 1 | includes › include_some 2 | ((mash_code 3 | ((functions ()) 4 | (imports 5 | (((mimp_id ((name x))) (mimp_mod provideAll.gr) (mimp_name x) 6 | (mimp_type (MGlobalImport Managed true)) (mimp_kind MImportGrain) 7 | (mimp_setup MCallGetter) (mimp_used true)))) 8 | (exports ()) 9 | (main_body 10 | (((instr_desc 11 | (MImmediate 12 | ((immediate_desc (MImmBinding (MGlobalBind x_1122 Managed))) 13 | (immediate_analyses ((last_usage Last))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/includes.8222ee98.0.snapshot: -------------------------------------------------------------------------------- 1 | includes › include_module 2 | ((mash_code 3 | ((functions ()) 4 | (imports 5 | (((mimp_id ((name x))) (mimp_mod provideAll.gr) (mimp_name x) 6 | (mimp_type (MGlobalImport Managed true)) (mimp_kind MImportGrain) 7 | (mimp_setup MCallGetter) (mimp_used true)))) 8 | (exports ()) 9 | (main_body 10 | (((instr_desc 11 | (MImmediate 12 | ((immediate_desc (MImmBinding (MGlobalBind x_1122 Managed))) 13 | (immediate_analyses ((last_usage Last))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/includes.a3212bd0.0.snapshot: -------------------------------------------------------------------------------- 1 | includes › include_relative_path3 2 | ((mash_code 3 | ((functions ()) 4 | (imports 5 | (((mimp_id ((name j))) (mimp_mod nested/nested.gr) (mimp_name j) 6 | (mimp_type (MGlobalImport Managed true)) (mimp_kind MImportGrain) 7 | (mimp_setup MCallGetter) (mimp_used true)))) 8 | (exports ()) 9 | (main_body 10 | (((instr_desc 11 | (MImmediate 12 | ((immediate_desc (MImmBinding (MGlobalBind j_1040 Managed))) 13 | (immediate_analyses ((last_usage Last))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/includes.beda767e.0.snapshot: -------------------------------------------------------------------------------- 1 | includes › include_relative_path1 2 | ((mash_code 3 | ((functions ()) 4 | (imports 5 | (((mimp_id ((name x))) (mimp_mod ../test-libs/provideAll.gr) 6 | (mimp_name x) (mimp_type (MGlobalImport Managed true)) 7 | (mimp_kind MImportGrain) (mimp_setup MCallGetter) (mimp_used true)))) 8 | (exports ()) 9 | (main_body 10 | (((instr_desc 11 | (MImmediate 12 | ((immediate_desc (MImmBinding (MGlobalBind x_1122 Managed))) 13 | (immediate_analyses ((last_usage Last))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/modules.52d25a2f.0.snapshot: -------------------------------------------------------------------------------- 1 | modules › smallest_submodule 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 1879048190)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/provides.0ef7e7b3.0.snapshot: -------------------------------------------------------------------------------- 1 | provides › provide7 2 | ((mash_code 3 | ((functions ()) 4 | (imports 5 | (((mimp_id ((stamp 1046) (name x))) (mimp_mod provideAll.gr) 6 | (mimp_name x) (mimp_type (MGlobalImport Managed true)) 7 | (mimp_kind MImportGrain) (mimp_setup MCallGetter) (mimp_used true)))) 8 | (exports ()) 9 | (main_body 10 | (((instr_desc 11 | (MImmediate 12 | ((immediate_desc (MImmBinding (MGlobalBind x_1046 Managed))) 13 | (immediate_analyses ((last_usage Last))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((stamp 1047) (name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/provides.f378d570.0.snapshot: -------------------------------------------------------------------------------- 1 | provides › provide4 2 | ((mash_code 3 | ((functions ()) 4 | (imports 5 | (((mimp_id ((stamp 1040) (name x))) (mimp_mod onlyXProvided.gr) 6 | (mimp_name x) (mimp_type (MGlobalImport Managed true)) 7 | (mimp_kind MImportGrain) (mimp_setup MCallGetter) (mimp_used true)))) 8 | (exports ()) 9 | (main_body 10 | (((instr_desc 11 | (MImmediate 12 | ((immediate_desc (MImmBinding (MGlobalBind x_1040 Managed))) 13 | (immediate_analyses ((last_usage Last))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((stamp 1041) (name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/records.012b017b.0.snapshot: -------------------------------------------------------------------------------- 1 | records › record_spread_2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstLiteral (MConstI32 1879048190)))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((stamp 1122) (name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/strings.434adad0.0.snapshot: -------------------------------------------------------------------------------- 1 | strings › string2 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MString \"\\240\\159\\146\\175\")))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((stamp 1114) (name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/strings.a67428df.0.snapshot: -------------------------------------------------------------------------------- 1 | strings › string1 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body (((instr_desc (MAllocate (MString foo)))))) 5 | (main_body_stack_size 6 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 7 | (stack_size_f32 0) (stack_size_f64 0))) 8 | (globals ()) (function_table_elements ()) 9 | (global_function_table_offset ((stamp 1114) (name function_table_global))) 10 | (compilation_mode Normal) (type_metadata ))) 11 | (signature )) 12 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/strings.b2ad5a89.0.snapshot: -------------------------------------------------------------------------------- 1 | strings › string3 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate (MString \"making my way downtown, walking fast\")))))) 7 | (main_body_stack_size 8 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 9 | (stack_size_f32 0) (stack_size_f64 0))) 10 | (globals ()) (function_table_elements ()) 11 | (global_function_table_offset ((stamp 1114) (name function_table_global))) 12 | (compilation_mode Normal) (type_metadata ))) 13 | (signature )) 14 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/tuples.8d1f0463.0.snapshot: -------------------------------------------------------------------------------- 1 | tuples › tup1_trailing 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MTuple 8 | (((immediate_desc (MImmConst (MConstI32 1))) 9 | (immediate_analyses ((last_usage Unknown)))) 10 | ((immediate_desc (MImmConst (MConstI32 2))) 11 | (immediate_analyses ((last_usage Unknown)))) 12 | ((immediate_desc (MImmConst (MConstI32 3))) 13 | (immediate_analyses ((last_usage Unknown))))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((stamp 1116) (name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/tuples.b4f702d8.0.snapshot: -------------------------------------------------------------------------------- 1 | tuples › no_non_trailing_comma_singleton_tup 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MImmediate 7 | ((immediate_desc (MImmConst (MConstI32 1))) 8 | (immediate_analyses ((last_usage Unknown))))))))) 9 | (main_body_stack_size 10 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 11 | (stack_size_f32 0) (stack_size_f64 0))) 12 | (globals ()) (function_table_elements ()) 13 | (global_function_table_offset ((stamp 1114) (name function_table_global))) 14 | (compilation_mode Normal) (type_metadata ))) 15 | (signature )) 16 | -------------------------------------------------------------------------------- /compiler/test/__snapshots__/tuples.f206002b.0.snapshot: -------------------------------------------------------------------------------- 1 | tuples › tup1_trailing_space 2 | ((mash_code 3 | ((functions ()) (imports ()) (exports ()) 4 | (main_body 5 | (((instr_desc 6 | (MAllocate 7 | (MTuple 8 | (((immediate_desc (MImmConst (MConstI32 1))) 9 | (immediate_analyses ((last_usage Unknown)))) 10 | ((immediate_desc (MImmConst (MConstI32 2))) 11 | (immediate_analyses ((last_usage Unknown)))) 12 | ((immediate_desc (MImmConst (MConstI32 3))) 13 | (immediate_analyses ((last_usage Unknown))))))))))) 14 | (main_body_stack_size 15 | ((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0) 16 | (stack_size_f32 0) (stack_size_f64 0))) 17 | (globals ()) (function_table_elements ()) 18 | (global_function_table_offset ((stamp 1116) (name function_table_global))) 19 | (compilation_mode Normal) (type_metadata ))) 20 | (signature )) 21 | -------------------------------------------------------------------------------- /compiler/test/config/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name flags) 3 | (libraries dune.configurator)) 4 | 5 | (rule 6 | (targets flags.sexp) 7 | (action 8 | (run ./flags.exe))) 9 | -------------------------------------------------------------------------------- /compiler/test/config/flags.re: -------------------------------------------------------------------------------- 1 | module C = Configurator.V1; 2 | 3 | let () = { 4 | C.main(~name="grain_exe_flags", c => { 5 | let default = []; 6 | 7 | let flags = 8 | switch (C.ocaml_config_var(c, "system")) { 9 | | Some("macosx") => 10 | // These flags preserve the original C++ error behavior. Ref https://github.com/ocaml/ocaml/issues/10423 11 | ["-cc", "clang++"] 12 | | Some("mingw64") => 13 | // MinGW needs these flags passed directly to flexdll, to avoid needing MinGW locations in the path 14 | ["-ccopt", "-l:libpthread.a", "-ccopt", "-l:libstdc++.a"] 15 | | Some(_) => default 16 | | None => default 17 | }; 18 | 19 | C.Flags.write_sexp("flags.sexp", flags); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /compiler/test/dune: -------------------------------------------------------------------------------- 1 | (dirs :standard suites utils) 2 | 3 | (library 4 | (name Grain_tests) 5 | (public_name grain-tests.framework) 6 | (libraries grain rely.lib) 7 | (modules TestFramework WarningExtensions BinaryFileExtensions test_utils 8 | runner)) 9 | 10 | (executable 11 | (name test) 12 | (public_name test) 13 | (package grain-tests) 14 | (modes exe js) 15 | (flags 16 | (:standard 17 | -linkall 18 | -g 19 | -w 20 | -40 21 | (:include ./config/flags.sexp))) 22 | (libraries grain grain-tests.framework grain-tests.suites grain-tests.utils) 23 | (modules test) 24 | (js_of_ocaml 25 | (flags --no-sourcemap --quiet))) 26 | -------------------------------------------------------------------------------- /compiler/test/graindoc/descriptions.expected.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: DescriptionGrainDoc 3 | --- 4 | 5 | ## Types 6 | 7 | Type declarations included in the DescriptionGrainDoc module. 8 | 9 | ### DescriptionGrainDoc.**DocAlias** 10 | 11 | ```grain 12 | type DocAlias = Bool 13 | ``` 14 | 15 | Alias Doc 16 | 17 | ### DescriptionGrainDoc.**DocRecord** 18 | 19 | ```grain 20 | record DocRecord { 21 | docField: Bool, 22 | } 23 | ``` 24 | 25 | Record Doc 26 | 27 | ### DescriptionGrainDoc.**DocEnum** 28 | 29 | ```grain 30 | enum DocEnum { 31 | DocCase, 32 | } 33 | ``` 34 | 35 | Enum Doc 36 | 37 | ## Values 38 | 39 | Functions and constants included in the DescriptionGrainDoc module. 40 | 41 | ### DescriptionGrainDoc.**docValue** 42 | 43 | ```grain 44 | docValue: Number 45 | ``` 46 | 47 | Value Doc 48 | 49 | ### DescriptionGrainDoc.**docFunction** 50 | 51 | ```grain 52 | docFunction: (x: Number) => Number 53 | ``` 54 | 55 | Function Doc 56 | 57 | -------------------------------------------------------------------------------- /compiler/test/graindoc/descriptions.input.gr: -------------------------------------------------------------------------------- 1 | module DescriptionGrainDoc 2 | 3 | // No Documentation 4 | /** 5 | * No Alias Doc 6 | */ 7 | type NoDocAlias = Bool 8 | /** 9 | * No Record Doc 10 | */ 11 | record NoDocRecord { 12 | noDocField: Bool 13 | } 14 | /** 15 | * No Enum Doc 16 | */ 17 | enum NoDocEnum { 18 | NoDocCase 19 | } 20 | /** 21 | * No Value Doc 22 | */ 23 | let noDocValue = 1 24 | /** 25 | * No Function Doc 26 | */ 27 | let noDocFunction = (x: Number) => x + 1 28 | // Documentation 29 | /** 30 | * Alias Doc 31 | */ 32 | provide type DocAlias = Bool 33 | /** 34 | * Record Doc 35 | */ 36 | provide record DocRecord { 37 | docField: Bool 38 | } 39 | /** 40 | * Enum Doc 41 | */ 42 | provide enum DocEnum { 43 | DocCase 44 | } 45 | /** 46 | * Value Doc 47 | */ 48 | provide let docValue = 1 49 | /** 50 | * Function Doc 51 | */ 52 | provide let docFunction = (x: Number) => x + 1 53 | -------------------------------------------------------------------------------- /compiler/test/graindoc/functionDoc.input.gr: -------------------------------------------------------------------------------- 1 | module FunctionGrainDoc 2 | /** 3 | * An alias for normal syntactic array access, i.e. `array[n]`. 4 | * 5 | * Retrieves the element from the array at the specified index. 6 | * A negative index is treated as an offset from the end of the array. 7 | * 8 | * @param index: The index to access 9 | * @param array: The array to access 10 | * @returns The element from the array 11 | * 12 | * @since v0.1.0 13 | * @history v0.2.0: Argument order changed to data-last 14 | */ 15 | provide let get = (index, array) => { 16 | array[index] 17 | } 18 | -------------------------------------------------------------------------------- /compiler/test/graindoc/noDoc.expected.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: NoGrainDoc 3 | --- 4 | 5 | ## Types 6 | 7 | Type declarations included in the NoGrainDoc module. 8 | 9 | ### NoGrainDoc.**DocAlias** 10 | 11 | ```grain 12 | type DocAlias = Bool 13 | ``` 14 | 15 | ### NoGrainDoc.**DocRecord** 16 | 17 | ```grain 18 | record DocRecord { 19 | docField: Bool, 20 | } 21 | ``` 22 | 23 | ### NoGrainDoc.**DocEnum** 24 | 25 | ```grain 26 | enum DocEnum { 27 | DocCase, 28 | } 29 | ``` 30 | 31 | ## Values 32 | 33 | Functions and constants included in the NoGrainDoc module. 34 | 35 | ### NoGrainDoc.**docValue** 36 | 37 | ```grain 38 | docValue: Number 39 | ``` 40 | 41 | ### NoGrainDoc.**docFunction** 42 | 43 | ```grain 44 | docFunction: (x: Number) => Number 45 | ``` 46 | 47 | -------------------------------------------------------------------------------- /compiler/test/graindoc/noDoc.input.gr: -------------------------------------------------------------------------------- 1 | module NoGrainDoc 2 | 3 | // No Documentation 4 | type NoDocAlias = Bool 5 | record NoDocRecord { 6 | noDocField: Bool 7 | } 8 | enum NoDocEnum { 9 | NoDocCase 10 | } 11 | let noDocValue = 1 12 | let noDocFunction = (x: Number) => x + 1 13 | // Documentation 14 | provide type DocAlias = Bool 15 | provide record DocRecord { 16 | docField: Bool 17 | } 18 | provide enum DocEnum { 19 | DocCase 20 | } 21 | provide let docValue = 1 22 | provide let docFunction = (x: Number) => x + 1 23 | -------------------------------------------------------------------------------- /compiler/test/graindoc/singleReturn.input.gr: -------------------------------------------------------------------------------- 1 | module SingleReturn 2 | 3 | /** 4 | * @returns first return 5 | * @returns second return 6 | */ 7 | provide let test = () => 1 8 | -------------------------------------------------------------------------------- /compiler/test/graindoc/singleSince.input.gr: -------------------------------------------------------------------------------- 1 | module SingleSince 2 | 3 | /** 4 | * @since v1.0.0 5 | * @since v1.0.0 6 | */ 7 | provide let test = () => print("t") 8 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/blocks.expected.gr: -------------------------------------------------------------------------------- 1 | module Blocks 2 | 3 | { 4 | 1 + 1 5 | } 6 | 7 | { 8 | 1 + 1 9 | 2 + 2 10 | } 11 | 12 | if (true) { 13 | print("true") 14 | } else { 15 | print("false") 16 | } 17 | 18 | let myFun = () => { 19 | true 20 | } 21 | 22 | let myfun1 = (a, b) => { 23 | true 24 | true 25 | false 26 | } 27 | 28 | let myfun = ( 29 | a, 30 | b, 31 | c, 32 | d, 33 | e, 34 | f, 35 | g, 36 | h, 37 | i, 38 | j, 39 | k, 40 | l, 41 | m, 42 | n, 43 | o, 44 | p, 45 | aaaaa, 46 | bbbbb, 47 | ccccc, 48 | dddddd, 49 | eeeee, 50 | ) => { 51 | true 52 | true 53 | false 54 | } 55 | 56 | let x = if (true) { 57 | 5 58 | } else { 59 | if (true) { 60 | // print 61 | print("Oi") 62 | } 63 | 6 64 | } 65 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/blocks.input.gr: -------------------------------------------------------------------------------- 1 | module Blocks 2 | 3 | { 1 + 1 } 4 | 5 | { 6 | 1 + 1 7 | 2 + 2 8 | } 9 | 10 | 11 | 12 | if (true) { print("true"); } else {print("false");}; 13 | 14 | let myFun = () => { true } 15 | 16 | let myfun1 = (a,b) => { true; true ; false} 17 | 18 | 19 | let myfun = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,aaaaa,bbbbb,ccccc,dddddd,eeeee) => { true; true ; false} 20 | 21 | let x = if (true) { 22 | 5 23 | } else { 24 | if (true) { 25 | // print 26 | print("Oi") 27 | } 28 | 6 29 | } 30 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/brace_comments.expected.gr: -------------------------------------------------------------------------------- 1 | module BraceComments 2 | 3 | match (1) { // fails 4 | // fails2 5 | 1 => "1", 6 | _ => "*", // x 7 | } 8 | 9 | if (true) { // block 1 10 | // block 2 11 | 1 // block 2a 12 | // block 2b 13 | } else { // block3 14 | // block 4 15 | 2 // block 5 16 | // block 6 17 | } 18 | 19 | let space = "" 20 | 21 | provide let rec setCounter = val => { 22 | // Write the value to memory. 23 | setCounter(val) 24 | } 25 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/brace_comments.input.gr: -------------------------------------------------------------------------------- 1 | module BraceComments 2 | 3 | match (1) { // fails 4 | // fails2 5 | 1 => "1", 6 | _ => "*", // x 7 | } 8 | 9 | if (true) { // block 1 10 | // block 2 11 | 1 // block 2a 12 | // block 2b 13 | } else { // block3 14 | // block 4 15 | 2 // block 5 16 | // block 6 17 | } 18 | 19 | let space = "" 20 | 21 | provide let rec setCounter = val => { 22 | // Write the value to memory. 23 | setCounter(val) 24 | } 25 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/chained.expected.gr: -------------------------------------------------------------------------------- 1 | module Chained 2 | 3 | let g = 7 // g represents the precision desired, p is the values of p[i] to plug into Lanczos' formula 4 | and p = 8 // another comment 5 | and q = 32 6 | 7 | let myFunction2 = x => { 8 | let inter = x + 1 9 | "some string" 10 | } 11 | and myFunction3 = y => { 12 | let myVal = 5 13 | "some string" 14 | } 15 | 16 | let g = 7 17 | and p = 8 18 | and q = 32 19 | 20 | let myFunction2 = x => { 21 | let inter = x + 1 22 | "some string" 23 | } // a comment 24 | and myFunction3 = y => { 25 | let myVal = 5 26 | "some string" 27 | } 28 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/chained.input.gr: -------------------------------------------------------------------------------- 1 | module Chained 2 | 3 | 4 | let g = 7 // g represents the precision desired, p is the values of p[i] to plug into Lanczos' formula 5 | and p = 8 // another comment 6 | and q = 32 7 | 8 | 9 | let myFunction2 = x => { 10 | let inter = x + 1 11 | "some string" 12 | } and myFunction3 = y => { 13 | let myVal = 5 14 | "some string" 15 | } 16 | 17 | let g = 7 18 | and p = 8 19 | and q = 32 20 | 21 | let myFunction2 = x => { 22 | let inter = x + 1 23 | "some string" 24 | } // a comment 25 | and myFunction3 = y => { 26 | let myVal = 5 27 | "some string" 28 | } 29 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/constraints.expected.gr: -------------------------------------------------------------------------------- 1 | module Constraints 2 | 3 | from "list" include List 4 | let test = test => { 5 | // Comments 6 | List.forEach(i => { 7 | // Comment In ForEach 8 | print(i) 9 | }, test: List) 10 | } 11 | 12 | // Regression #2244 13 | (1: Number): Number 14 | 15 | ((1: Number): Number): Number 16 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/constraints.input.gr: -------------------------------------------------------------------------------- 1 | module Constraints 2 | 3 | from "list" include List 4 | let test = test => { 5 | // Comments 6 | List.forEach(i => { 7 | // Comment In ForEach 8 | print(i) 9 | }, test: List) 10 | } 11 | 12 | // Regression #2244 13 | (1: Number): Number 14 | 15 | ((1: Number): Number): Number 16 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/custom_operators.expected.gr: -------------------------------------------------------------------------------- 1 | module CustomOperators 2 | 3 | let (+++) = (*) 4 | let (***) = (+) 5 | 6 | // validate precedence is maintained 7 | (a +++ b) *** c 8 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/custom_operators.input.gr: -------------------------------------------------------------------------------- 1 | module CustomOperators 2 | 3 | let (+++) = (*) 4 | let (***) = (+) 5 | 6 | // validate precedence is maintained 7 | (a +++ b) *** c 8 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/data_docs.expected.gr: -------------------------------------------------------------------------------- 1 | module DataDocs 2 | 3 | enum EventType { 4 | Enter, 5 | Exit, 6 | } 7 | /** 8 | * An event is the start or end of a token amongst other events. 9 | * Tokens can “contain” other tokens, even though they are stored in a flat 10 | * list, through `enter`ing before them, and `exit`ing after them. 11 | */ 12 | and type Event = (EventType, Token, TokenizeContext) 13 | /** 14 | * Another event is the start or end of a token amongst other events. 15 | * Tokens can “contain” other tokens, even though they are stored in a flat 16 | * list, through `enter`ing before them, and `exit`ing after them. 17 | */ 18 | and enum EventType2 { 19 | Enter2, 20 | Exit2, 21 | } 22 | // line comment 23 | and type Event2 = (EventType2, Token, TokenizeContext) 24 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/data_docs.input.gr: -------------------------------------------------------------------------------- 1 | module DataDocs 2 | 3 | enum EventType { 4 | Enter, 5 | Exit, 6 | } 7 | /** 8 | * An event is the start or end of a token amongst other events. 9 | * Tokens can “contain” other tokens, even though they are stored in a flat 10 | * list, through `enter`ing before them, and `exit`ing after them. 11 | */ 12 | and type Event = (EventType, Token, TokenizeContext) 13 | /** 14 | * Another event is the start or end of a token amongst other events. 15 | * Tokens can “contain” other tokens, even though they are stored in a flat 16 | * list, through `enter`ing before them, and `exit`ing after them. 17 | */ 18 | 19 | 20 | and enum EventType2 { 21 | Enter2, 22 | Exit2, 23 | } 24 | // line comment 25 | and type Event2 = (EventType2, Token, TokenizeContext) 26 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/early_return.expected.gr: -------------------------------------------------------------------------------- 1 | module EarlyReturn 2 | 3 | let earlyReturn = () => { 4 | if (true) return 5 else return 6 5 | 6 | match (1) { 7 | 6 => return 6, 8 | 7 => { 9 | return 7 10 | }, 11 | _ => return 8, 12 | } 13 | 14 | return 1234567 + 1234567 + 123456 + 124567 + 1234567 + 1234567 + 123456 15 | } 16 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/early_return.input.gr: -------------------------------------------------------------------------------- 1 | module EarlyReturn 2 | 3 | let earlyReturn = () => { 4 | if (true) return 5 else return 6 5 | 6 | match (1) { 6 => return 6, 7 => { return 7 }, _ => return 8 } 7 | 8 | return 1234567 + 1234567 + 123456 + 124567 + 1234567 + 1234567 +123456 9 | } 10 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/empty.expected.gr: -------------------------------------------------------------------------------- 1 | module Empty // Empty module 2 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/empty.input.gr: -------------------------------------------------------------------------------- 1 | module Empty // Empty module 2 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/enum_long.input.gr: -------------------------------------------------------------------------------- 1 | module EnumLong 2 | 3 | provide enum Shape< a, b, c, d, e, f, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, cc > { 4 | Shape( a, b, c, d, e, f, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, bb, cc ), 5 | } 6 | 7 | provide enum Test { 8 | Test( Shape< 9 | String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String > ), 10 | } 11 | 12 | enum EvenNumber { 13 | Zero, // comment 0 14 | OddPlusOne(OddNumber), // comment 1 15 | // comment 2 16 | // comment 3 17 | } 18 | and enum OddNumber { 19 | // comment 4 20 | // comment 5 21 | EvenPlusOne(EvenNumber), 22 | } // comment 6 23 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/for_loops.expected.gr: -------------------------------------------------------------------------------- 1 | module ForLoops 2 | 3 | let size = 2 4 | 5 | for (let mut i = 0; i < size; i += 1) { 6 | let strLength = 0 7 | } 8 | 9 | let verylongvariablenameforcingalinebreakhereplease = 2 10 | 11 | for ( 12 | let mut i = 0; 13 | i < verylongvariablenameforcingalinebreakhereplease; 14 | i += 1 15 | ) { 16 | let strLength = 0 17 | print("Loop") 18 | } 19 | 20 | for (let mut i = 0; i < size; i += 1) print("Loop") 21 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/for_loops.input.gr: -------------------------------------------------------------------------------- 1 | module ForLoops 2 | 3 | let size = 2 4 | 5 | for (let mut i = 0; i < size; i += 1) { 6 | let strLength = 0 7 | } 8 | 9 | let verylongvariablenameforcingalinebreakhereplease = 2 10 | 11 | for (let mut i = 0; i < verylongvariablenameforcingalinebreakhereplease; i += 1) { 12 | let strLength = 0 13 | print("Loop") 14 | } 15 | 16 | for (let mut i = 0; i < size; i += 1) 17 | print("Loop") 18 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/function_params.expected.gr: -------------------------------------------------------------------------------- 1 | module FunctionParams 2 | 3 | let single_arg = x => x 4 | 5 | let unit_arg = () => 3 6 | 7 | let two_args = (x, y) => 4 8 | 9 | provide let fake_write: (int, int, int, string) => string = ( 10 | fd, 11 | iovs, 12 | iovs_len, 13 | nwritten, 14 | ) => { 15 | "ok" 16 | } 17 | 18 | let lots_of_args = ( 19 | verylonglong1, 20 | verylonglong2, 21 | verylonglong3, 22 | verylonglong4, 23 | verylonglong1, 24 | ) => { 25 | print("lots of args") 26 | } 27 | 28 | let stringTailMatcher = (toMatch, len) => 29 | ( 30 | buf: Number, 31 | pos: Number, 32 | start: Number, 33 | limit: Number, 34 | end: Number, 35 | state, 36 | stack, 37 | ) => { 38 | true 39 | } 40 | 41 | let f: Number => (Number, Number) => Number = a => (b, c) => a + b + c 42 | 43 | let namedArg: (?suffix: String) => String = (suffix="") => suffix 44 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/function_params.input.gr: -------------------------------------------------------------------------------- 1 | module FunctionParams 2 | 3 | let single_arg = (x) => x 4 | 5 | let unit_arg = () => 3 6 | 7 | let two_args = (x,y) => 4 8 | 9 | provide let fake_write: (int, int, int, string) => string = 10 | ( 11 | fd, 12 | iovs, 13 | iovs_len, 14 | nwritten, 15 | ) => { 16 | "ok" 17 | } 18 | 19 | let lots_of_args = (verylonglong1,verylonglong2,verylonglong3,verylonglong4,verylonglong1) => { 20 | print("lots of args") 21 | } 22 | 23 | let stringTailMatcher = (toMatch, len) => 24 | ( 25 | buf: Number, 26 | pos: Number, 27 | start: Number, 28 | limit: Number, 29 | end: Number, 30 | state, 31 | stack, 32 | ) => { 33 | true 34 | } 35 | 36 | let f: Number => (Number, Number) => Number = a => (b, c) => a + b + c 37 | 38 | let namedArg: (?suffix: String) => String = (suffix="") => suffix 39 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/grouped_expr.expected.gr: -------------------------------------------------------------------------------- 1 | module GroupedExpr 2 | 3 | let printFoo = () => print("foo") 4 | let printBar = () => print("bar") 5 | 6 | (if (true) printFoo else printBar)() 7 | 8 | (a + b).label 9 | 10 | (a + b)[2] 11 | 12 | [1, 2, 3][2] 13 | [> 1, 2, 3][2] 14 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/grouped_expr.input.gr: -------------------------------------------------------------------------------- 1 | module GroupedExpr 2 | 3 | let printFoo = () => print("foo") 4 | let printBar = () => print("bar") 5 | 6 | (if (true) printFoo else printBar)() 7 | 8 | (a + b).label 9 | 10 | (a + b)[2] 11 | 12 | [1, 2, 3][2] 13 | [> 1, 2, 3][2] 14 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/guards.expected.gr: -------------------------------------------------------------------------------- 1 | module Guards 2 | 3 | let myNumber = Some(99) 4 | let isTuesday = true 5 | 6 | match (myNumber) { 7 | Some(val) when val > 100 => print("Greater than 100"), 8 | _ when isTuesday => print("It's Tuesday"), 9 | _ => print("Nothing else matched"), 10 | } 11 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/guards.input.gr: -------------------------------------------------------------------------------- 1 | module Guards 2 | 3 | let myNumber = Some(99) 4 | let isTuesday = true 5 | 6 | 7 | match (myNumber) { 8 | Some(val) when val > 100 => print("Greater than 100"), 9 | _ when isTuesday => print("It's Tuesday"), 10 | _ => print("Nothing else matched") 11 | } 12 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/ifthenelse.expected.gr: -------------------------------------------------------------------------------- 1 | module IfThenElse 2 | 3 | if (true) { 4 | "a reallly long string long long long lfd dsds dsds dsds" 5 | } else if (false) { 6 | "aaa" 7 | } else { 8 | "short" 9 | } 10 | 11 | if (SomeModule.ne(mval, 10)) 12 | (if (SomeModule.ltS(yval, 11)) SomeModule.sub(12, mres) else mres) 13 | else 14 | 14 15 | 16 | if (SomeModule.ne(mval, 10000)) 17 | (if (SomeModule.ltS(yval, 111111)) SomeModule.sub(1323232, mres) else mres) 18 | else 19 | 1232324 20 | 21 | if (1 == 2) { 22 | print("false") 23 | } else { 24 | print("true") 25 | } 26 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/ifthenelse.input.gr: -------------------------------------------------------------------------------- 1 | module IfThenElse 2 | 3 | if (true) { "a reallly long string long long long lfd dsds dsds dsds"} else if (false) "aaa" else { "short"} 4 | 5 | if (SomeModule.ne(mval, 10)) (if (SomeModule.ltS(yval, 11)) SomeModule.sub(12, mres) else mres) else 14 6 | 7 | if (SomeModule.ne(mval, 10000)) (if (SomeModule.ltS(yval, 111111)) SomeModule.sub(1323232, mres) else mres) else 1232324 8 | 9 | if (1 ==2) { 10 | print("false") 11 | } else print("true") 12 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/ignores.expected.gr: -------------------------------------------------------------------------------- 1 | module Ignores 2 | 3 | let x = 5 4 | 5 | // formatter-ignore 6 | let x2 = [ 1, 7 | 2, 8 | 3] 9 | 10 | let y = [3, 4, 5] 11 | 12 | if (true) { 13 | // formatter-ignore 14 | let yy = [1, 15 | 2] // comment 16 | 17 | let zz = [5, 6] 18 | } 19 | 20 | // formatter-ignore 21 | let single_ast_line = "x" 22 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/ignores.input.gr: -------------------------------------------------------------------------------- 1 | module Ignores 2 | 3 | let x= 5 4 | 5 | // formatter-ignore 6 | let x2 = [ 1, 7 | 2, 8 | 3] 9 | 10 | let y = [ 3, 11 | 4, 12 | 5] 13 | 14 | 15 | if (true) { 16 | // formatter-ignore 17 | let yy = [1, 18 | 2] // comment 19 | 20 | let zz = [5, 21 | 6] 22 | } 23 | 24 | // formatter-ignore 25 | let single_ast_line = "x" 26 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/keyword_expression.expected.gr: -------------------------------------------------------------------------------- 1 | module KeywordExpression 2 | 3 | (fail "unimplemented") + 5 4 | 5 | (fail "unimplemented"): Number 6 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/keyword_expression.input.gr: -------------------------------------------------------------------------------- 1 | module KeywordExpression 2 | 3 | (fail "unimplemented") + 5 4 | 5 | (fail "unimplemented"): Number 6 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/lambda.expected.gr: -------------------------------------------------------------------------------- 1 | module Lambda 2 | 3 | x => { 4 | x + 1 5 | } 6 | 7 | y => { 8 | let x = 1 9 | let z = 2 10 | } 11 | 12 | // Regression #2229 13 | let foo: ((a, b)) => Void = a => void 14 | 15 | let testfna = forEachCodePoint(c => /* arg */ void) 16 | 17 | let testfn = forEachCodePoint(c => /* arg */ { 18 | // a 19 | void 20 | }, "") 21 | 22 | let testfn3 = forEachCodePoint(( 23 | c, /* arg 1 */ 24 | d, // eol2 25 | e, /* arg */ 26 | // eol 27 | ) => { 28 | // a 29 | void 30 | }, "") 31 | 32 | let testfn4 = forEachCodePoint(/* pre */ c => /* arg */ { 33 | // a 34 | void 35 | }, "") 36 | 37 | let testfn5 = forEachCodePoint(c => /* arg */ { 38 | // a 39 | void 40 | }, "") 41 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/lambda.input.gr: -------------------------------------------------------------------------------- 1 | module Lambda 2 | 3 | x => { x + 1} 4 | 5 | y => { 6 | let x = 1 7 | let z = 2 8 | } 9 | 10 | // Regression #2229 11 | let foo: ((a, b)) => Void = a => void 12 | 13 | let testfna = forEachCodePoint(c /* arg */ => void) 14 | 15 | let testfn = forEachCodePoint(c /* arg */ => { 16 | // a 17 | void 18 | }, "") 19 | 20 | let testfn3 = forEachCodePoint((c, /* arg 1 */ 21 | d, // eol2 22 | e /* arg */ 23 | // eol 24 | ) => { 25 | // a 26 | void 27 | }, "") 28 | 29 | let testfn4 = forEachCodePoint(/* pre */ c /* arg */ => { 30 | // a 31 | void 32 | }, "") 33 | 34 | let testfn5 = forEachCodePoint( c => /* arg */ { 35 | // a 36 | void 37 | }, "") 38 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/lets.expected.gr: -------------------------------------------------------------------------------- 1 | @noPervasives 2 | @runtimeMode 3 | module Lets 4 | 5 | let rec myFun1 = x => x + 1 6 | and myFun2 = x => x + 1 7 | 8 | let myBlock = { 9 | "some string" 10 | } 11 | 12 | let myFunction2 = x => { 13 | let inter = x + 1 14 | "some string" 15 | } 16 | and myFunction3 = y => { 17 | let myVal = 5 18 | "some string" 19 | } 20 | 21 | // Attributes 22 | 23 | @attribute 24 | let myToplevelAttributeFunction = x => x 25 | 26 | let myFunction4 = () => { 27 | @attribute 28 | let myAttributeFunction = () => 5 29 | } 30 | 31 | let rotate = (count, list) => { 32 | let (beginning, end) = if (count >= 0) 33 | part(count, list) 34 | else 35 | part(length(list) + count, list) 36 | append(end, beginning) 37 | } 38 | 39 | let qsize = (if (WasmI32.eqz(WasmI32.and_(m + 1n, 1n))) { 40 | m + 1n 41 | } else { 42 | m + 2n 43 | }) >> 1n 44 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/lets.input.gr: -------------------------------------------------------------------------------- 1 | @noPervasives @runtimeMode 2 | 3 | module Lets 4 | 5 | let rec myFun1 = x => x + 1 and myFun2 = x => x + 1 6 | 7 | let myBlock = { 8 | "some string" 9 | } 10 | 11 | 12 | let myFunction2 = (x) => { 13 | let inter = x + 1 14 | "some string" 15 | } 16 | 17 | and myFunction3 = (y) => { 18 | let myVal = 5 19 | "some string" 20 | } 21 | 22 | 23 | // Attributes 24 | 25 | @attribute 26 | let myToplevelAttributeFunction = (x) => x 27 | 28 | let myFunction4 = () => { 29 | @attribute 30 | let myAttributeFunction = () => 5 31 | } 32 | 33 | let rotate = (count, list) => { 34 | let (beginning, end) = if (count >= 0) part(count, list) 35 | else part(length(list) + count, list) 36 | append(end, beginning) 37 | } 38 | 39 | let qsize = (if (WasmI32.eqz(WasmI32.and_(m + 1n, 1n))) { 40 | m + 1n 41 | } else { 42 | m + 2n 43 | }) >> 44 | 1n 45 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/nested_matches.expected.gr: -------------------------------------------------------------------------------- 1 | module NestedMatches 2 | 3 | let join = (separator: String, items: List) => { 4 | let rec iter = (sep, acc, rem) => { 5 | match (rem) { 6 | [] => acc, 7 | [hd, ...tl] => { 8 | let newAcc = match (acc) { 9 | None => Some(hd), 10 | Some(s) => Some(hd ++ sep ++ s), 11 | } 12 | iter(sep, newAcc, tl) 13 | }, 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/nested_matches.input.gr: -------------------------------------------------------------------------------- 1 | module NestedMatches 2 | 3 | let join = (separator: String, items: List) => { 4 | let rec iter = (sep, acc, rem) => { 5 | match(rem) { 6 | [] => acc, 7 | [hd, ...tl] => { 8 | let newAcc = match(acc) { 9 | None => Some(hd), 10 | Some(s) => Some(hd ++ sep ++ s) 11 | } 12 | iter(sep, newAcc, tl) 13 | } 14 | } 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/number_sugar.expected.gr: -------------------------------------------------------------------------------- 1 | module NumberSugar 2 | 3 | let mut count = 10 4 | 5 | count /= 9 6 | 7 | count += 3 8 | 9 | count *= 7 10 | 11 | count -= 33 12 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/number_sugar.input.gr: -------------------------------------------------------------------------------- 1 | module NumberSugar 2 | 3 | let mut count = 10 4 | 5 | count /= 9 6 | 7 | count += 3 8 | 9 | count *= 7 10 | 11 | count -= 33 12 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/only_comments.expected.gr: -------------------------------------------------------------------------------- 1 | module OnlyComments 2 | 3 | /* this is just a comment */ 4 | 5 | // and this too 6 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/only_comments.input.gr: -------------------------------------------------------------------------------- 1 | module OnlyComments 2 | 3 | 4 | 5 | /* this is just a comment */ 6 | 7 | 8 | 9 | 10 | // and this too 11 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/operators.expected.gr: -------------------------------------------------------------------------------- 1 | module Operators 2 | 3 | from "list" include List 4 | 5 | let myList = [] 6 | 7 | List.reduce((&&), true, myList) 8 | 9 | let a = true 10 | let b = true && false 11 | let c = false 12 | 13 | !b 14 | 15 | if (!b) print("false") 16 | 17 | if (a && b) print("true") 18 | 19 | if (a && (b || c)) print("who knows") 20 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/operators.input.gr: -------------------------------------------------------------------------------- 1 | module Operators 2 | 3 | from "list" include List 4 | 5 | let myList = [] 6 | 7 | List.reduce((&&), true, myList) 8 | 9 | let a = true 10 | let b = true && false 11 | let c = false 12 | 13 | !b 14 | 15 | if (!b) print("false") 16 | 17 | if (a && b) print("true") 18 | 19 | if (a && (b || c)) print("who knows") 20 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/parens.expected.gr: -------------------------------------------------------------------------------- 1 | module Parens 2 | 3 | let x = y => y + 0 4 | 5 | x(3) + 4 6 | 7 | let a = true 8 | let b = false 9 | let c = false 10 | 11 | if (a && b || c) { 12 | print("who knows") 13 | } 14 | 15 | if (a && (b || c)) { 16 | print("who knows") 17 | } 18 | 19 | 3 + 4 * 5 20 | 21 | (3 + 4) * 5 22 | 23 | 3 - 4 + 5 24 | 3 - (4 + 5) 25 | 26 | "a" ++ "b" ++ "c" 27 | 28 | let zz = 3 - 4 + (5 - 6) 29 | let zz2 = (3 - 4) * (5 - 6) 30 | let zz3 = 3 * 4 * (5 - 6) 31 | 32 | print(x(3) + x(4)) 33 | print(x(3) - x(4) + x(5)) 34 | print(x(3) - (x(4) + x(5))) 35 | print(x(3) - x(4) + x(5)) 36 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/parens.input.gr: -------------------------------------------------------------------------------- 1 | module Parens 2 | 3 | let x = y => y + 0 4 | 5 | x(3) + 4 6 | 7 | let a = true 8 | let b = false 9 | let c = false 10 | 11 | if ((a && b) || c) { 12 | print("who knows") 13 | } 14 | 15 | if (a && (b || c)) { 16 | print("who knows") 17 | } 18 | 19 | 3 + (4 * 5) 20 | 21 | (3 + 4) * 5 22 | 23 | 3 - 4 + 5 24 | 3 - (4 + 5) 25 | 26 | "a" ++ "b" ++ "c" 27 | 28 | 29 | 30 | let zz = (3 - 4) + (5 - 6); 31 | let zz2 = (3 - 4) * (5 - 6); 32 | let zz3 = (3 * 4) * (5 - 6); 33 | 34 | print (x(3)+x(4)) 35 | print (x(3)-x(4)+x(5)) 36 | print (x(3)-(x(4)+x(5))) 37 | print ((x(3)-x(4))+x(5)) 38 | 39 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/rationals.expected.gr: -------------------------------------------------------------------------------- 1 | module Rationals 2 | 3 | from "int32" include Int32 4 | 5 | let a = Int32.toNumber(3l) * (2/3) 6 | 7 | let b = 2/3 + Int32.toNumber(4l) 8 | 9 | let c = Int32.toNumber(3l) + 2/3 10 | 11 | let x = 3 * (2/3) 12 | 13 | let y = 2/3 + 4 14 | 15 | let z = 3 + 2/3 16 | 17 | assert 4 * (2/3) == 8/3 18 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/rationals.input.gr: -------------------------------------------------------------------------------- 1 | module Rationals 2 | 3 | from "int32" include Int32 4 | 5 | let a = Int32.toNumber(3l) * (2/3) 6 | 7 | let b = 2/3 + Int32.toNumber(4l) 8 | 9 | let c = Int32.toNumber(3l) + (2/3) 10 | 11 | let x = 3 * (2/3) 12 | 13 | let y = 2/3 + 4 14 | 15 | let z = 3 + (2/3) 16 | 17 | assert 4 * (2/3) == 8/3 18 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/spreads.input.gr: -------------------------------------------------------------------------------- 1 | module Spreads 2 | 3 | let rec filter = (fn, list) => { 4 | match (list) { 5 | [] => [], 6 | [first, ...rest] => if (fn(first)) [first, ...filter(fn, rest)] else filter(fn, rest) 7 | } 8 | } 9 | 10 | let filteri = (fn, list) => { 11 | let rec iter = (fn, list, index22) => { 12 | match (list) { 13 | [] => [], 14 | [first, ...rest] => if (fn(first, index22)) [first, ...iter(fn, rest, index22 + 1)] else iter(fn, rest, index22 + 1) 15 | } 16 | } 17 | iter(fn, list, 0) 18 | } 19 | 20 | let rec reject = (fn, list) => { 21 | match (list) { 22 | [] => [], 23 | [first, ...rest] => if (!fn(first)) [first, ...reject(fn, rest)] else reject(fn, rest) 24 | } 25 | } 26 | 27 | let rec reject2 = (fn, list) => { 28 | match (list) { 29 | [] => [], 30 | [first, ...rest] => { let x = []; x 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/strings.expected.gr: -------------------------------------------------------------------------------- 1 | module Strings 2 | 3 | from "string" include String 4 | 5 | let newline = "\n" 6 | 7 | let data = String.split("\n", "a long string") 8 | 9 | "string with emojis 💯💯💯" 10 | 11 | let ஹௐఅ = "unicode identifier" 12 | 13 | let c = Some('\'') 14 | 15 | let d = '\'' 16 | 17 | let b = b"\n" 18 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/strings.input.gr: -------------------------------------------------------------------------------- 1 | module Strings 2 | 3 | from "string" include String 4 | 5 | let newline = "\n" 6 | 7 | let data = String.split("\n", "a long string") 8 | 9 | "string with emojis 💯💯💯" 10 | 11 | let ஹௐఅ = "unicode identifier" 12 | 13 | let c = Some('\'') 14 | 15 | let d = '\'' 16 | 17 | let b = b"\n" 18 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/tuples.input.gr: -------------------------------------------------------------------------------- 1 | module Tuples 2 | 3 | let user = ("Klaus Teuber", 67, "yellow") 4 | 5 | let (name, age, color) = user 6 | 7 | 8 | let (x, y) = ((1, 2), (3, 4)) 9 | let (a, b) = y 10 | 11 | let a = (1) 12 | 13 | let c: (Number, Number) = (1, 1) 14 | 15 | let d = (1, 2, 3) 16 | 17 | let e = (1, 2, 3, ) 18 | 19 | let (a,b,c,d,e,f,g,h,i,j,k,l,m,n) = (1111111,22222,333333,44444,55555,66666,77777,88888,9999,10000,111111,222222,33333,4444) 20 | 21 | let (a111,b222,c333,d444,e555,f5555,g66666,h777777,i888888,j999999,k0000000,l0000000,m1111111,n) = (1111111,22222,333333,44444,55555,66666,77777,88888,9999,10000,111111,222222,33333,4444) 22 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/values.expected.gr: -------------------------------------------------------------------------------- 1 | module Values 2 | 3 | from "int32" include Int32 4 | from "int64" include Int64 5 | from "float32" include Float32 6 | from "float64" include Float64 7 | from "bytes" include Bytes 8 | from "runtime/unsafe/wasmi32" include WasmI32 9 | from "runtime/unsafe/wasmi64" include WasmI64 10 | 11 | from "runtime/unsafe/wasmf32" include WasmF32 12 | from "runtime/unsafe/wasmf64" include WasmF64 13 | 14 | let char = 'a' 15 | 16 | let string = "abc" 17 | 18 | let hex = 0x77 19 | 20 | let float = 1.4 21 | 22 | let int32: Int32 = 55l 23 | 24 | let int64: Int64 = 55L 25 | 26 | let float32: Float32 = 4.5f 27 | 28 | let float64: Float64 = 4.5d 29 | 30 | let wi32: WasmI32 = 0n 31 | 32 | let wi64: WasmI64 = 0N 33 | 34 | let wf32: WasmF32 = 1.0w 35 | 36 | let wf64: WasmF64 = 1.0W 37 | 38 | let flag: bool = true 39 | 40 | let falseflag: bool = false 41 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/values.input.gr: -------------------------------------------------------------------------------- 1 | module Values 2 | 3 | from "int32" include Int32 4 | from "int64" include Int64 5 | from "float32" include Float32 6 | from "float64" include Float64 7 | from "bytes" include Bytes 8 | from "runtime/unsafe/wasmi32" include WasmI32 9 | from "runtime/unsafe/wasmi64" include WasmI64 10 | 11 | from "runtime/unsafe/wasmf32" include WasmF32 12 | from "runtime/unsafe/wasmf64" include WasmF64 13 | 14 | let char = 'a' 15 | 16 | let string = "abc" 17 | 18 | let hex = 0x77 19 | 20 | let float = 1.4 21 | 22 | 23 | let int32 : Int32 = 55l 24 | 25 | let int64 : Int64 = 55L 26 | 27 | let float32 : Float32 = 4.5f 28 | 29 | let float64 : Float64 = 4.5d 30 | 31 | let wi32 : WasmI32 = 0n 32 | 33 | let wi64 : WasmI64 = 0N 34 | 35 | let wf32 : WasmF32 = 1.0w 36 | 37 | let wf64 : WasmF64 = 1.0W 38 | 39 | let flag: bool = true 40 | 41 | let falseflag: bool = false 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/variants.expected.gr: -------------------------------------------------------------------------------- 1 | module Variants 2 | 3 | enum Animals { 4 | VeryVeryLong, 5 | VeryVeryLongVeryVeryLong, 6 | VeryVeryLongVeryVeryLongVeryVeryLong, 7 | } 8 | 9 | enum SmallAnimals { 10 | Abc, 11 | Def, 12 | } 13 | 14 | enum CabbageColor { 15 | Red, 16 | Green, 17 | } 18 | enum Veggie { 19 | Squash, 20 | Cabbage(CabbageColor), 21 | Broccoli, 22 | } 23 | 24 | let redCabbage = Cabbage(Red) 25 | 26 | enum TrailingComment { 27 | Squash, /* trailing comment */ 28 | Cabbage(CabbageColor), 29 | Broccoli, // We all love squash 30 | } 31 | 32 | enum InlineRec { 33 | Rec{ x: Number, y: Number }, 34 | Tup(Number, Number), 35 | } 36 | 37 | let r = Rec{ /* first comment */ 38 | x: 1, /* second comment */ 39 | y: 2, // third comment 40 | } /* fourth comment */ 41 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/variants.input.gr: -------------------------------------------------------------------------------- 1 | module Variants 2 | 3 | enum Animals { VeryVeryLong, VeryVeryLongVeryVeryLong, VeryVeryLongVeryVeryLongVeryVeryLong} 4 | 5 | 6 | enum SmallAnimals { Abc, Def} 7 | 8 | enum CabbageColor { Red, Green } 9 | enum Veggie { 10 | Squash, 11 | Cabbage(CabbageColor), 12 | Broccoli, 13 | } 14 | 15 | let redCabbage = Cabbage(Red) 16 | 17 | enum TrailingComment { 18 | Squash, /* trailing comment */ 19 | Cabbage(CabbageColor), 20 | Broccoli, // We all love squash 21 | } 22 | 23 | enum InlineRec { Rec {x: Number,y: Number}, Tup(Number, Number) } 24 | 25 | let r = Rec { /* first comment */ 26 | x: 1, /* second comment */ y:2 // third comment 27 | } /* fourth comment */ 28 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/wasm.expected.gr: -------------------------------------------------------------------------------- 1 | module Wasm 2 | 3 | provide let allocateBytes = size => { 4 | let len = size + 8n 5 | let bytes = Memory.malloc(len) 6 | Memory.fill(bytes, 0n, len) 7 | WasmI32.store(bytes, Tags._GRAIN_BYTES_HEAP_TAG, 0n) 8 | WasmI32.store(bytes, size, 4n) 9 | bytes 10 | } 11 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/wasm.input.gr: -------------------------------------------------------------------------------- 1 | module Wasm 2 | 3 | provide let allocateBytes = (size) => { 4 | let len = size + 8n 5 | let bytes = Memory.malloc(len) 6 | Memory.fill(bytes, 0n, len) 7 | WasmI32.store(bytes, Tags._GRAIN_BYTES_HEAP_TAG, 0n) 8 | WasmI32.store(bytes, size, 4n) 9 | bytes 10 | } 11 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/while_loops.expected.gr: -------------------------------------------------------------------------------- 1 | module WhileLoops 2 | 3 | let mut i = 0 4 | let size = 10 5 | 6 | while (i < size) { 7 | i += 1 8 | } 9 | 10 | while (i < size) i += 1 11 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/while_loops.input.gr: -------------------------------------------------------------------------------- 1 | module WhileLoops 2 | 3 | let mut i = 0 4 | let size = 10 5 | 6 | while (i < size) { 7 | i = i + 1 8 | } 9 | 10 | while (i < size) 11 | i = i + 1 12 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/windows.expected.gr: -------------------------------------------------------------------------------- 1 | module Windows 2 | 3 | let x = "windows has different eol markers" 4 | 5 | let y = "The formatter should preserve that" 6 | -------------------------------------------------------------------------------- /compiler/test/grainfmt/windows.input.gr: -------------------------------------------------------------------------------- 1 | module Windows 2 | 3 | let x = "windows has different eol markers" 4 | 5 | let y = "The formatter should preserve that" 6 | -------------------------------------------------------------------------------- /compiler/test/input/README.txt: -------------------------------------------------------------------------------- 1 | This directory is for handwritten, standalone test files 2 | -------------------------------------------------------------------------------- /compiler/test/input/adtprint.gr: -------------------------------------------------------------------------------- 1 | module AdtPrint 2 | 3 | provide enum Printable { 4 | Foo, 5 | Bar, 6 | Baz(String), 7 | Qux(Number, String, Bool), 8 | Quux, 9 | Flip(String), 10 | } 11 | 12 | print(Foo) 13 | print(Bar) 14 | print(Baz("baz")) 15 | print(Qux(5, "qux", false)) 16 | print(Quux) 17 | print(Flip("flip")) 18 | -------------------------------------------------------------------------------- /compiler/test/input/basicenum.gr: -------------------------------------------------------------------------------- 1 | module BasicNum 2 | 3 | enum rec List { 4 | Empty, 5 | Cons(a, List), 6 | } 7 | 8 | let rec contains = (e, l) => { 9 | match (l) { 10 | Empty => false, 11 | Cons(hd, tl) => 12 | if (hd == e) { 13 | true 14 | } else { 15 | contains(e, tl) 16 | }, 17 | } 18 | } 19 | 20 | print( 21 | ( 22 | contains(1, Empty), 23 | contains(1, Cons(1, Empty)), 24 | contains(3, Cons(1, Cons(3, Empty))), 25 | ) 26 | ) 27 | -------------------------------------------------------------------------------- /compiler/test/input/brokenIncludes/broken.gr: -------------------------------------------------------------------------------- 1 | module Broken 2 | 3 | from "number" include Number 4 | from "./foo.gr" include Foo 5 | 6 | provide let min = Number.min 7 | -------------------------------------------------------------------------------- /compiler/test/input/brokenIncludes/main.gr: -------------------------------------------------------------------------------- 1 | module Main 2 | 3 | from "./broken.gr" include Broken 4 | 5 | print(Broken.min(2, 3)) 6 | -------------------------------------------------------------------------------- /compiler/test/input/conditionals.gr: -------------------------------------------------------------------------------- 1 | module Conditionals 2 | 3 | let x = 5 4 | if (x == 4) { 5 | false 6 | } else { 7 | if (x == 5) { 8 | true 9 | } else { 10 | "what" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /compiler/test/input/const.gr: -------------------------------------------------------------------------------- 1 | module Const 2 | 3 | let x = 4 + 5 4 | let y = x * 2 5 | let z = y - x 6 | let a = x + 7 7 | let b = 14 8 | a + b 9 | -------------------------------------------------------------------------------- /compiler/test/input/counter-box.gr: -------------------------------------------------------------------------------- 1 | module CounterBox 2 | 3 | let counter = { 4 | let count = box(0) 5 | let rec counterHelp = () => { 6 | let new = unbox(count) + 1 7 | count := new 8 | new 9 | } 10 | counterHelp 11 | } 12 | { 13 | print(counter()) 14 | print(counter()) 15 | print(counter()) 16 | } 17 | -------------------------------------------------------------------------------- /compiler/test/input/counter-mut.gr: -------------------------------------------------------------------------------- 1 | module CounterMut 2 | 3 | let counter = { 4 | let mut count = 0 5 | let rec counterHelp = () => { 6 | count += 1 7 | count 8 | } 9 | counterHelp 10 | } 11 | { 12 | print(counter()) 13 | print(counter()) 14 | print(counter()) 15 | } 16 | -------------------------------------------------------------------------------- /compiler/test/input/cse.gr: -------------------------------------------------------------------------------- 1 | module CSE 2 | 3 | let x = 5 4 | let y = x 5 | let a = x + 2 6 | let b = y + 2 7 | 8 | y + 2 9 | -------------------------------------------------------------------------------- /compiler/test/input/customOperator.gr: -------------------------------------------------------------------------------- 1 | module CustomOperator 2 | 3 | from "result" include Result 4 | 5 | let (>>=) = (a, b) => Result.flatMap(b, a) 6 | 7 | let add = b => a => Ok(a + b) 8 | let div = b => a => { 9 | if (b == 0) { 10 | Err("Division by zero!") 11 | } else { 12 | Ok(a / b) 13 | } 14 | } 15 | 16 | print(Ok(1) >>= add(5) >>= div(2)) 17 | print(Ok(1) >>= add(5) >>= div(0)) 18 | -------------------------------------------------------------------------------- /compiler/test/input/earlyReturn.gr: -------------------------------------------------------------------------------- 1 | module EarlyReturn 2 | 3 | from "array" include Array 4 | 5 | let findFour = arr => { 6 | for (let mut i = 0; i < Array.length(arr); i += 1) { 7 | if (arr[i] == 4) { 8 | return Some(4) 9 | } 10 | } 11 | 12 | return None 13 | } 14 | 15 | print(findFour([> 1, 2, 3, 4, 5, 6])) 16 | print(findFour([> 1, 3, 5])) 17 | -------------------------------------------------------------------------------- /compiler/test/input/fib-better.gr: -------------------------------------------------------------------------------- 1 | module FibBetter 2 | 3 | let rec fib_help = (n, cur, next) => { 4 | if (n == 0) { 5 | cur 6 | } else { 7 | fib_help(n - 1, next, cur + next) 8 | } 9 | } 10 | 11 | let fib = n => { 12 | fib_help(n, 0, 1) 13 | } 14 | 15 | print(fib(25)) 16 | -------------------------------------------------------------------------------- /compiler/test/input/fib-bigint.gr: -------------------------------------------------------------------------------- 1 | module FibBigint 2 | 3 | let rec fib_help = (n, cur, next) => { 4 | if (n == 0) { 5 | cur 6 | } else { 7 | fib_help(n - 1, next, cur + next) 8 | } 9 | } 10 | and fib = n => { 11 | fib_help(n, 0, 1) 12 | } 13 | 14 | print(fib(100)) 15 | -------------------------------------------------------------------------------- /compiler/test/input/fib.gr: -------------------------------------------------------------------------------- 1 | module Fib 2 | 3 | let rec fib = n => { 4 | if (n == 0) { 5 | 0 6 | } else { 7 | if (n == 1) { 8 | 1 9 | } else { 10 | fib(n - 1) + fib(n - 2) 11 | } 12 | } 13 | } 14 | 15 | print(fib(10)) 16 | -------------------------------------------------------------------------------- /compiler/test/input/forward-decl.gr: -------------------------------------------------------------------------------- 1 | module ForwardDecl 2 | 3 | // Contrived example to test simple tail calls 4 | 5 | let rec isEvenHelp = (n, b) => { 6 | if (n == 0) { 7 | b 8 | } else { 9 | isOddHelp(n - 1, !b) 10 | } 11 | } 12 | and isOddHelp = (n, b) => { 13 | if (n == 1) { 14 | b 15 | } else { 16 | isEvenHelp(n - 1, !b) 17 | } 18 | } 19 | 20 | let isEven = n => { 21 | isEvenHelp(n, true) 22 | } 23 | and isOdd = n => { 24 | isOddHelp(n, true) 25 | } 26 | 27 | print(isOdd(9999)) 28 | -------------------------------------------------------------------------------- /compiler/test/input/funcShadow.gr: -------------------------------------------------------------------------------- 1 | module FuncShadow 2 | 3 | let foo = () => "bar" 4 | print(foo()) 5 | let foo = () => "baz" 6 | print(foo()) 7 | -------------------------------------------------------------------------------- /compiler/test/input/funcShadowAndIndirect.gr: -------------------------------------------------------------------------------- 1 | module FuncShadowAndIndirect 2 | 3 | let foo = () => "bar" 4 | print(foo()) 5 | let foo = () => "baz" 6 | print(foo()) 7 | 8 | let foo = () => () => "qux" 9 | let foo = foo() 10 | print(foo()) 11 | -------------------------------------------------------------------------------- /compiler/test/input/indirect-tail.gr: -------------------------------------------------------------------------------- 1 | module IndirectTail 2 | 3 | let add = (x, y) => { 4 | x + y 5 | } 6 | let double = x => { 7 | add(x, x) 8 | } 9 | 10 | print(double(2) + double(3)) 11 | -------------------------------------------------------------------------------- /compiler/test/input/letMutForLoop.gr: -------------------------------------------------------------------------------- 1 | module LetMutForLoop 2 | 3 | from "runtime/unsafe/wasmi64" include WasmI64 4 | from "runtime/debugPrint" include DebugPrint 5 | 6 | @unsafe 7 | let foo = () => { 8 | use WasmI64.{ (+), (<) } 9 | for (let mut x = 0N; x < 5N; x += 1N) { 10 | DebugPrint.printI64(x) 11 | } 12 | } 13 | 14 | foo() 15 | -------------------------------------------------------------------------------- /compiler/test/input/list.gr: -------------------------------------------------------------------------------- 1 | module List 2 | 3 | from "list" include List 4 | use List.* 5 | 6 | print("OK") 7 | -------------------------------------------------------------------------------- /compiler/test/input/long_lists.gr: -------------------------------------------------------------------------------- 1 | module LongLists 2 | 3 | from "list" include List 4 | use List.* 5 | 6 | let rec make_list = (x, n) => { 7 | let rec helper = (a, b, acc) => { 8 | if (a == 0) { 9 | acc 10 | } else { 11 | helper(a - 1, b, [b, ...acc]) 12 | } 13 | } 14 | helper(n, x, []) 15 | } 16 | and loop = n => { 17 | if (n == 0) { 18 | true 19 | } else { 20 | let lst = make_list(n, n) 21 | loop(n - 1) 22 | } 23 | } 24 | 25 | print(loop(25)) // <- eats up a lot of heap 26 | -------------------------------------------------------------------------------- /compiler/test/input/loopMemoryReclaim.gr: -------------------------------------------------------------------------------- 1 | module LoopMemoryReclaim 2 | 3 | let f = () => { 4 | "this is a thirty-two byte string" 5 | } 6 | 7 | for (let mut i = 0; i < 1024; i += 1) { 8 | // Since f uses 64 bytes of memory at runtime, calling it 1024 times 9 | // spans 1 WebAssembly page of memory. As the Grain runtime uses roughly 10 | // half a page of memory, this sufficiently exercises garbage collection. 11 | let s = f() 12 | } 13 | 14 | print("OK") 15 | -------------------------------------------------------------------------------- /compiler/test/input/memoryBase/asserts.gr: -------------------------------------------------------------------------------- 1 | module Asserts 2 | 3 | from "runtime/unsafe/wasmi32" include WasmI32 4 | 5 | @unsafe 6 | primitive heapStart = "@heap.start" 7 | @unsafe 8 | primitive typeMetadata = "@heap.type_metadata" 9 | 10 | @unsafe 11 | let doTest = () => { 12 | use WasmI32.{ (==), (>), (<) } 13 | assert typeMetadata() == 0x110008n 14 | assert heapStart() > 0x110008n 15 | assert heapStart() < 0x110308n 16 | } 17 | 18 | doTest() 19 | -------------------------------------------------------------------------------- /compiler/test/input/memoryBase/basecase.gr: -------------------------------------------------------------------------------- 1 | module BaseCase 2 | 3 | enum Thing { 4 | HelloWorld, 5 | } 6 | 7 | print(HelloWorld) 8 | -------------------------------------------------------------------------------- /compiler/test/input/memoryBase/sameAsDefault.gr: -------------------------------------------------------------------------------- 1 | module SameAsDefault 2 | 3 | enum Thing { 4 | HelloWorld, 5 | } 6 | 7 | print(HelloWorld) 8 | -------------------------------------------------------------------------------- /compiler/test/input/memoryBase/slightlyHigher.gr: -------------------------------------------------------------------------------- 1 | module SlightlyHigher 2 | 3 | enum Thing { 4 | HelloWorld, 5 | } 6 | 7 | print(HelloWorld) 8 | -------------------------------------------------------------------------------- /compiler/test/input/memoryBase/veryLarge.gr: -------------------------------------------------------------------------------- 1 | module VeryLarge 2 | 3 | enum Thing { 4 | HelloWorld, 5 | } 6 | 7 | print(HelloWorld) 8 | -------------------------------------------------------------------------------- /compiler/test/input/memoryBase/zero.gr: -------------------------------------------------------------------------------- 1 | module Zero 2 | 3 | enum Thing { 4 | HelloWorld, 5 | } 6 | 7 | print(HelloWorld) 8 | -------------------------------------------------------------------------------- /compiler/test/input/memoryGrow.gr: -------------------------------------------------------------------------------- 1 | module MemoryGrow 2 | 3 | from "array" include Array 4 | 5 | let array = Array.init(1_000_000, i => (i, i + 1)) 6 | 7 | let mut sum = 0 8 | 9 | for (let mut i = 0; i < 1_000_000; i += 1) { 10 | let (a, b) = array[i] 11 | sum += a 12 | sum += b 13 | } 14 | 15 | print(sum) 16 | -------------------------------------------------------------------------------- /compiler/test/input/modules/provideIncludedModule.gr: -------------------------------------------------------------------------------- 1 | module ProvideIncludedModule 2 | 3 | from "option" include Option 4 | from "array" include Array 5 | 6 | provide { module Option as Smoption } 7 | 8 | module Qux { 9 | provide let val = 9 10 | provide module Quux { 11 | provide { module Array } 12 | } 13 | } 14 | 15 | provide { module Qux } 16 | -------------------------------------------------------------------------------- /compiler/test/input/nestedModules.gr: -------------------------------------------------------------------------------- 1 | module NestedModules 2 | 3 | from "list" include List 4 | from "./modules/provideIncludedModule.gr" include ProvideIncludedModule as Deep 5 | 6 | module Foo { 7 | provide let foo = "hello from foo" 8 | provide module Bar { 9 | provide let bar = "hello from bar" 10 | provide { module List } 11 | } 12 | } 13 | 14 | print(Foo.foo) 15 | print(Foo.Bar.bar) 16 | print(Foo.Bar.List.map(x => x + 1, [1, 2, 3])) 17 | print(Deep.Qux.val) 18 | print(Deep.Qux.Quux.Array.map(x => x + 1, [> 1, 2, 3])) 19 | print(Deep.Smoption.isSome(None)) 20 | 21 | print("foo") 22 | -------------------------------------------------------------------------------- /compiler/test/input/oneBranchTail.gr: -------------------------------------------------------------------------------- 1 | module OneBranchTail 2 | 3 | let rec filter = (f, l) => { 4 | match (l) { 5 | [hd, ...tl] => if (f(hd)) [hd, ...filter(f, tl)] else filter(f, tl), 6 | [] => [], 7 | } 8 | } 9 | 10 | print(filter(x => x == 2, [1, 2, 3])) 11 | -------------------------------------------------------------------------------- /compiler/test/input/optimization_friendly.gr: -------------------------------------------------------------------------------- 1 | module OptimiationFriendly 2 | 3 | let rec fib = n => { 4 | if (n == 0) { 5 | 0 6 | } else { 7 | if (n == 1) { 8 | 1 9 | } else { 10 | fib(n - 1) + fib(n - 2) 11 | } 12 | } 13 | } 14 | 15 | let rec spinlock = n => { 16 | if (n <= 0) { 17 | false 18 | } else { 19 | let y = fib(30) 20 | spinlock(n - 1) 21 | } 22 | } 23 | 24 | spinlock(1000) 25 | -------------------------------------------------------------------------------- /compiler/test/input/patternMatchUnsafeWasm.gr: -------------------------------------------------------------------------------- 1 | module PatternMatchUnsafeWasm 2 | 3 | @unsafe 4 | let test = () => { 5 | @unsafe 6 | let foo = val => { 7 | match (val) { 8 | 1n => print(1), 9 | 2n => print(2), 10 | 3n => print(3), 11 | 4n => print(4), 12 | 5n => print(5), 13 | 6n => print(6), 14 | _ => print("other"), 15 | } 16 | } 17 | foo(0n) 18 | foo(1n) 19 | foo(5n) 20 | foo(8n) 21 | foo(42n) 22 | } 23 | 24 | test() 25 | -------------------------------------------------------------------------------- /compiler/test/input/recursive-equal-box.gr: -------------------------------------------------------------------------------- 1 | module RecursiveEqualBox 2 | 3 | provide enum rec R { 4 | Atom, 5 | Recursive(Box>), 6 | } 7 | 8 | let t = box(None) 9 | let u = box(None) 10 | let x = Recursive(t) 11 | let w = Recursive(u) 12 | 13 | t := Some(x) 14 | 15 | assert !(x == w) 16 | 17 | u := Some(w) 18 | 19 | assert x == w 20 | 21 | provide record rec Rec { 22 | int: Number, 23 | r: Box>, 24 | } 25 | 26 | let a = { int: 5, r: box(None) } 27 | let b = { int: 5, r: box(None) } 28 | 29 | a.r := Some(a) 30 | 31 | assert a is a 32 | assert a == a 33 | 34 | assert !(a == b) 35 | 36 | b.r := Some(b) 37 | 38 | assert !(a is b) 39 | assert a == b 40 | 41 | print("OK") 42 | -------------------------------------------------------------------------------- /compiler/test/input/recursive-equal-mut.gr: -------------------------------------------------------------------------------- 1 | module RecursiveEqualMut 2 | 3 | // Note: This file doesn't include the Recursive type test 4 | // because it isn't achievable with `let mut` 5 | 6 | provide record rec Rec { 7 | int: Number, 8 | mut r: Option, 9 | } 10 | 11 | let a = { int: 5, r: None } 12 | let b = { int: 5, r: None } 13 | 14 | a.r = Some(a) 15 | 16 | assert a is a 17 | assert a == a 18 | 19 | assert !(a == b) 20 | 21 | b.r = Some(b) 22 | 23 | assert !(a is b) 24 | assert a == b 25 | 26 | print("OK") 27 | -------------------------------------------------------------------------------- /compiler/test/input/relativeInclude1.gr: -------------------------------------------------------------------------------- 1 | module RelativeInclude1 2 | 3 | from "../test-libs/provideAll.gr" include ProvideAll 4 | use ProvideAll.* 5 | x 6 | -------------------------------------------------------------------------------- /compiler/test/input/relativeInclude2.gr: -------------------------------------------------------------------------------- 1 | module RelativeImport2 2 | 3 | from "../../test/test-libs/provideAll.gr" include ProvideAll 4 | use ProvideAll.* 5 | x 6 | -------------------------------------------------------------------------------- /compiler/test/input/relativeInclude3.gr: -------------------------------------------------------------------------------- 1 | module RelativeImport3 2 | 3 | from "nested/nested" include Nested 4 | use Nested.* 5 | j 6 | -------------------------------------------------------------------------------- /compiler/test/input/relativeIncludeLinking.gr: -------------------------------------------------------------------------------- 1 | module RelativeIncludeLinking 2 | 3 | from "./relativeIncludeLinking/a.gr" include A 4 | from "./relativeIncludeLinking/mutExport.gr" include MutExport 5 | 6 | MutExport.x := unbox(MutExport.x) + 1 7 | 8 | print(A.readX()) 9 | print(unbox(MutExport.x)) 10 | -------------------------------------------------------------------------------- /compiler/test/input/relativeIncludeLinking/a.gr: -------------------------------------------------------------------------------- 1 | module A 2 | 3 | from "./mutExport.gr" include MutExport 4 | 5 | MutExport.x := unbox(MutExport.x) + 1 6 | 7 | provide let readX = () => unbox(MutExport.x) 8 | -------------------------------------------------------------------------------- /compiler/test/input/relativeIncludeLinking/mutExport.gr: -------------------------------------------------------------------------------- 1 | module MutExport 2 | 3 | provide let x = box(0) 4 | -------------------------------------------------------------------------------- /compiler/test/input/relativeIncludes/bar/bar.gr: -------------------------------------------------------------------------------- 1 | module Bar 2 | 3 | from "./baz.gr" include Baz 4 | use Baz.{ baz } 5 | 6 | provide let bar = n => baz(n) * 3 7 | -------------------------------------------------------------------------------- /compiler/test/input/relativeIncludes/bar/baz.gr: -------------------------------------------------------------------------------- 1 | module Baz 2 | 3 | from "../quux/quux.gr" include Quux 4 | use Quux.{ quux } 5 | provide let baz = n => quux(n) + 1 6 | -------------------------------------------------------------------------------- /compiler/test/input/relativeIncludes/foo.gr: -------------------------------------------------------------------------------- 1 | module Foo 2 | 3 | from "./bar/bar.gr" include Bar 4 | use Bar.{ bar } 5 | 6 | print(bar(2)) 7 | -------------------------------------------------------------------------------- /compiler/test/input/relativeIncludes/quux/quux.gr: -------------------------------------------------------------------------------- 1 | module Quux 2 | 3 | provide let quux = n => n * n 4 | -------------------------------------------------------------------------------- /compiler/test/input/reprovideTypeUnifyA.gr: -------------------------------------------------------------------------------- 1 | module ReprovideTypeUnifyA 2 | 3 | from "./reprovideTypeUnifyB.gr" include ReprovideTypeUnifyB 4 | use ReprovideTypeUnifyB.{ type T, a } 5 | print(a == { x: 1, }) 6 | -------------------------------------------------------------------------------- /compiler/test/input/reprovideTypeUnifyB.gr: -------------------------------------------------------------------------------- 1 | module ReprovideTypeUnifyB 2 | 3 | from "./reprovideTypeUnifyC.gr" include ReprovideTypeUnifyC 4 | use ReprovideTypeUnifyC.{ type T } 5 | let a = { x: 1, } 6 | provide { type T, a } 7 | -------------------------------------------------------------------------------- /compiler/test/input/reprovideTypeUnifyC.gr: -------------------------------------------------------------------------------- 1 | module ReprovideTypeUnifyC 2 | 3 | provide record T { 4 | x: Number, 5 | } 6 | -------------------------------------------------------------------------------- /compiler/test/input/sinister-tail-call.gr: -------------------------------------------------------------------------------- 1 | module SinisterTailCall 2 | 3 | // Contrived example to test *ADVANCED* tail calls 4 | 5 | let rec isEvenHelp = (n, b) => { 6 | if (n == 0) { 7 | b 8 | } else { 9 | // Note the different argument size 10 | isOdd(n - 1) 11 | } 12 | } 13 | and isOddHelp = (n, b) => { 14 | if (n == 1) { 15 | b 16 | } else { 17 | // See above 18 | isEven(n - 1) 19 | } 20 | } 21 | and isEven = n => { 22 | isEvenHelp(n, true) 23 | } 24 | and isOdd = n => { 25 | isOddHelp(n, true) 26 | } 27 | 28 | print(isOdd(999999)) 29 | -------------------------------------------------------------------------------- /compiler/test/input/strings.gr: -------------------------------------------------------------------------------- 1 | module Strings 2 | 3 | let foo = "foo" 4 | let bar = "bar" 5 | strslice(strcat(foo, bar), 1, 4) 6 | -------------------------------------------------------------------------------- /compiler/test/input/ta_1.gr: -------------------------------------------------------------------------------- 1 | module TA_1 2 | 3 | (1, 2, 3)[6] 4 | -------------------------------------------------------------------------------- /compiler/test/input/toplevelStatements.gr: -------------------------------------------------------------------------------- 1 | module TopLevelStatements 2 | 3 | let one = 1 4 | let two = 2 5 | print(one) 6 | print(two) 7 | 8 | let three = 3 9 | print(three) 10 | 11 | let four = 4 12 | let five = two + three 13 | print(four) 14 | print(five) 15 | 16 | "foo" 17 | -------------------------------------------------------------------------------- /compiler/test/input/unsafeWasmGlobals.gr: -------------------------------------------------------------------------------- 1 | module UnsafeWasmGlobals 2 | 3 | from "runtime/debugPrint" include DebugPrint 4 | 5 | from "unsafeWasmGlobalsExports" include UnsafeWasmGlobalsExports 6 | use UnsafeWasmGlobalsExports.{ _I32_VAL, _I64_VAL, _F32_VAL, _F64_VAL } 7 | 8 | DebugPrint.printI32(_I32_VAL) 9 | DebugPrint.printI64(_I64_VAL) 10 | DebugPrint.printF32(_F32_VAL) 11 | DebugPrint.printF64(_F64_VAL) 12 | -------------------------------------------------------------------------------- /compiler/test/input/wasiPolyfill.gr: -------------------------------------------------------------------------------- 1 | module WasiPolyfill 2 | 3 | foreign wasm fd_write: ( 4 | WasmI32, 5 | WasmI32, 6 | WasmI32, 7 | WasmI32, 8 | ) => WasmI32 from "wasi_snapshot_preview1" 9 | 10 | provide let fd_write: (WasmI32, WasmI32, WasmI32, WasmI32) => WasmI32 = 11 | ( 12 | fd, 13 | iovs, 14 | iovs_len, 15 | nwritten, 16 | ) => { 17 | fd_write(fd, iovs, iovs_len, nwritten) 18 | fd_write(fd, iovs, iovs_len, nwritten) 19 | fd_write(fd, iovs, iovs_len, nwritten) 20 | } 21 | 22 | provide let args_get = (a, b) => { 23 | 76n 24 | } 25 | -------------------------------------------------------------------------------- /compiler/test/input/wasiPolyfillNoop.gr: -------------------------------------------------------------------------------- 1 | module WasiPolyfillNoop 2 | 3 | provide let fd_write: (WasmI32, WasmI32, WasmI32, WasmI32) => WasmI32 = 4 | ( 5 | fd, 6 | iovs, 7 | iovs_len, 8 | nwritten, 9 | ) => { 10 | 0n 11 | } 12 | -------------------------------------------------------------------------------- /compiler/test/stdlib/exception.test.gr: -------------------------------------------------------------------------------- 1 | module ExceptionTest 2 | 3 | from "exception" include Exception 4 | 5 | exception Test1 6 | exception Test2(String) 7 | // Exception.toString 8 | assert Exception.toString(Failure("Test")) == "Failure: Test" 9 | assert Exception.toString(Test1) == "Test1" 10 | assert Exception.toString(Test2("Test")) == "Test2(\"Test\")" 11 | 12 | // Exception.registerPrinter 13 | let printer = e => { 14 | match (e) { 15 | Test1 => Some("Test1: This is a test"), 16 | Test2(s) => Some("Test2"), 17 | _ => None, 18 | } 19 | } 20 | Exception.registerPrinter(printer) 21 | assert Exception.toString(Test1) == "Test1: This is a test" 22 | assert Exception.toString(Test2("Test")) == "Test2" 23 | -------------------------------------------------------------------------------- /compiler/test/stdlib/wasi.process.test.gr: -------------------------------------------------------------------------------- 1 | module ProcessTest 2 | 3 | from "array" include Array 4 | from "wasi/process" include Process 5 | 6 | // Just a smoke test 7 | match (Process.argv()) { 8 | Ok(arr) => assert Array.length(arr) > 0, 9 | Err(err) => throw err, 10 | } 11 | 12 | // Just a smoke test 13 | match (Process.env()) { 14 | Ok(arr) => assert Array.length(arr) == 0, 15 | Err(err) => throw err, 16 | } 17 | 18 | Process.exit(5) 19 | -------------------------------------------------------------------------------- /compiler/test/stdlib/wasi.random.test.gr: -------------------------------------------------------------------------------- 1 | module RandomTest 2 | 3 | from "wasi/random" include Random 4 | 5 | // Just smoke tests, there's a miniscule chance these could fail 6 | 7 | let r1 = Random.randomUint32() 8 | let r2 = Random.randomUint32() 9 | match ((r1, r2)) { 10 | (Ok(x), Ok(y)) => assert x != y, 11 | (Err(err), _) => throw err, 12 | (_, Err(err)) => throw err, 13 | } 14 | 15 | let r1 = Random.randomUint64() 16 | let r2 = Random.randomUint64() 17 | 18 | match ((r1, r2)) { 19 | (Ok(x), Ok(y)) => assert x != y, 20 | (Err(err), _) => throw err, 21 | (_, Err(err)) => throw err, 22 | } 23 | 24 | let r1 = Random.random() 25 | let r2 = Random.random() 26 | 27 | match ((r1, r2)) { 28 | (Ok(x), Ok(y)) => assert x != y, 29 | (Err(err), _) => throw err, 30 | (_, Err(err)) => throw err, 31 | } 32 | -------------------------------------------------------------------------------- /compiler/test/suites/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name Grain_tests_suites) 3 | (public_name grain-tests.suites) 4 | (libraries grain grain-tests.framework uri) 5 | (modules (:standard))) 6 | -------------------------------------------------------------------------------- /compiler/test/suites/runtime.re: -------------------------------------------------------------------------------- 1 | open Grain_tests.TestFramework; 2 | open Grain_tests.Runner; 3 | 4 | describe("runtime", ({test, testSkip}) => { 5 | let test_or_skip = 6 | Sys.backend_type == Other("js_of_ocaml") ? testSkip : test; 7 | 8 | let assertRuntime = makeRuntimeRunner(test_or_skip); 9 | assertRuntime("numbers.test"); 10 | }); 11 | -------------------------------------------------------------------------------- /compiler/test/test-data/bar.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/grain-lang/grain/f969df9816bf2c4aa22bc2a658de1f1d743a32b9/compiler/test/test-data/bar.txt -------------------------------------------------------------------------------- /compiler/test/test-data/foo.txt: -------------------------------------------------------------------------------- 1 | foo, bar, & baz -------------------------------------------------------------------------------- /compiler/test/test-data/test-dir/dir/nested.txt: -------------------------------------------------------------------------------- 1 | In a directory -------------------------------------------------------------------------------- /compiler/test/test-data/test-dir/file1.txt: -------------------------------------------------------------------------------- 1 | File 1 -------------------------------------------------------------------------------- /compiler/test/test-data/test-dir/file2.txt: -------------------------------------------------------------------------------- 1 | File 2 -------------------------------------------------------------------------------- /compiler/test/test-data/test-dir/file3.txt: -------------------------------------------------------------------------------- 1 | File 3 -------------------------------------------------------------------------------- /compiler/test/test-data/test-dir/link: -------------------------------------------------------------------------------- 1 | ./file1.txt -------------------------------------------------------------------------------- /compiler/test/test-data/testmod.wasm: -------------------------------------------------------------------------------- 1 | asm``imports imported_func exported_func 2 | A* !nameimport0func1 -------------------------------------------------------------------------------- /compiler/test/test-data/testmod.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $type0 (func (param i32))) 3 | (type $type1 (func)) 4 | (import "imports" "imported_func" (func $import0 (param i32))) 5 | (export "exported_func" (func $func1)) 6 | (func $func1 7 | (i32.const 42) 8 | (call $import0))) 9 | -------------------------------------------------------------------------------- /compiler/test/test-data/testmod_multi_exports.wasm: -------------------------------------------------------------------------------- 1 | asm``(imports imported_funcimportsmem A, A- L exported_funcexported_func2 exported_globexported_glob2memory 2 | A* A+ -------------------------------------------------------------------------------- /compiler/test/test-data/testmod_multi_exports.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $type0 (func (param i32))) 3 | (type $type1 (func)) 4 | (import "imports" "imported_func" (func $import0 (param i32))) 5 | (import "imports" "mem" (memory $0 0)) 6 | (export "exported_func" (func $func1)) 7 | (export "exported_func2" (func $func2)) 8 | (export "exported_glob" (global $glob1)) 9 | (export "exported_glob2" (global $glob2)) 10 | (export "memory" (memory $0)) 11 | (func $func1 12 | (i32.const 42) 13 | (call $import0)) 14 | (func $func2 15 | (i32.const 43) 16 | (call $import0)) 17 | (global $glob1 i32 (i32.const 44)) 18 | (global $glob2 i32 (i32.const 45))) 19 | -------------------------------------------------------------------------------- /compiler/test/test-libs/aliases.gr: -------------------------------------------------------------------------------- 1 | module Aliases 2 | 3 | provide type Foo = Number 4 | provide type Bar = List 5 | 6 | abstract type Baz = Number 7 | abstract type Qux = a 8 | 9 | provide let baz = 5: Baz 10 | provide let qux = 7: Qux 11 | -------------------------------------------------------------------------------- /compiler/test/test-libs/brokenRelativeInclude.gr: -------------------------------------------------------------------------------- 1 | module BrokenRelativeInclude 2 | 3 | from "./data" include Data 4 | -------------------------------------------------------------------------------- /compiler/test/test-libs/compileError.gr: -------------------------------------------------------------------------------- 1 | module CompileError 2 | 3 | let val = 3 + true 4 | -------------------------------------------------------------------------------- /compiler/test/test-libs/data.gr: -------------------------------------------------------------------------------- 1 | module Data 2 | 3 | provide record Foo { bar: a } 4 | -------------------------------------------------------------------------------- /compiler/test/test-libs/funcAliasProvide.gr: -------------------------------------------------------------------------------- 1 | module FuncAliasProvide 2 | 3 | provide type FnType = () => String 4 | 5 | provide let function: FnType = () => "abc" 6 | -------------------------------------------------------------------------------- /compiler/test/test-libs/letMutProvide.gr: -------------------------------------------------------------------------------- 1 | module LetMutProvide 2 | 3 | provide let mut x = 3 4 | -------------------------------------------------------------------------------- /compiler/test/test-libs/nested/nested.gr: -------------------------------------------------------------------------------- 1 | module Nested 2 | 3 | provide let j = "j" 4 | -------------------------------------------------------------------------------- /compiler/test/test-libs/noProvides.gr: -------------------------------------------------------------------------------- 1 | module NoProvides 2 | 3 | let x = 4 4 | let y = 5 5 | let z = foo => { 6 | "bar" 7 | } 8 | -------------------------------------------------------------------------------- /compiler/test/test-libs/onlyXProvided.gr: -------------------------------------------------------------------------------- 1 | module OnlyXProvided 2 | 3 | provide let x = 4 4 | let y = 5 5 | let z = foo => { 6 | "bar" 7 | } 8 | -------------------------------------------------------------------------------- /compiler/test/test-libs/provideAll.gr: -------------------------------------------------------------------------------- 1 | module ProvideAll 2 | 3 | provide let x = 5 4 | provide let y = x => { 5 | x 6 | } 7 | provide let z = "foo" 8 | -------------------------------------------------------------------------------- /compiler/test/test-libs/provideContents.gr: -------------------------------------------------------------------------------- 1 | module ProvideContents 2 | 3 | provide enum Type { 4 | A, 5 | B, 6 | C, 7 | } 8 | 9 | record Type2 { 10 | x: Number 11 | } 12 | 13 | provide { type Type2 as Other } 14 | 15 | provide module Mod { 16 | provide let val = 123 17 | } 18 | -------------------------------------------------------------------------------- /compiler/test/test-libs/provideException.gr: -------------------------------------------------------------------------------- 1 | module ProvideException 2 | 3 | exception OriginalException 4 | 5 | let excVal1 = OriginalException 6 | 7 | provide { exception OriginalException as MyException, excVal1 } 8 | -------------------------------------------------------------------------------- /compiler/test/test-libs/providedType.gr: -------------------------------------------------------------------------------- 1 | module ProvidedType 2 | 3 | from "map" include Map 4 | 5 | provide let apply = (f: Map.Map => Void) => { 6 | let map = Map.make() 7 | Map.set("foo", "bar", map) 8 | f(map) 9 | } 10 | -------------------------------------------------------------------------------- /compiler/test/test-libs/reprovideContents.gr: -------------------------------------------------------------------------------- 1 | module ReprovideContents 2 | 3 | from "./provideContents.gr" include ProvideContents 4 | 5 | use ProvideContents.{ type Type, type Other as OtherT, module Mod } 6 | 7 | let val = { x: 1 } 8 | 9 | provide { type Type, type OtherT, module Mod, val } 10 | -------------------------------------------------------------------------------- /compiler/test/test-libs/reprovideException.gr: -------------------------------------------------------------------------------- 1 | module ReprovideException 2 | 3 | from "./provideException.gr" include ProvideException 4 | use ProvideException.{ exception MyException, excVal1 } 5 | 6 | let excVal2 = ProvideException.MyException 7 | 8 | provide { exception MyException, excVal1, excVal2 } 9 | -------------------------------------------------------------------------------- /compiler/test/test-libs/simpleModule.gr: -------------------------------------------------------------------------------- 1 | module Simple 2 | 3 | provide module Simple { 4 | provide let foo = 5 5 | provide let func = () => 5 6 | } 7 | -------------------------------------------------------------------------------- /compiler/test/test-libs/tlists.gr: -------------------------------------------------------------------------------- 1 | module TLists 2 | 3 | provide enum rec TList { 4 | Empty, 5 | Cons(a, TList), 6 | } 7 | 8 | provide let rec sum = l => { 9 | match (l) { 10 | Empty => 0, 11 | Cons(a, more) => a + sum(more), 12 | } 13 | } 14 | 15 | provide let rec append = (l1, l2) => { 16 | match (l1) { 17 | Empty => l2, 18 | Cons(hd, tl) => Cons(hd, append(tl, l2)), 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /compiler/test/test-libs/unsafeWasmGlobalsExports.gr: -------------------------------------------------------------------------------- 1 | module UnsafeWasmGlobalsExports 2 | 3 | @unsafe 4 | provide let _I32_VAL = 42n 5 | @unsafe 6 | provide let _I64_VAL = 42N 7 | @unsafe 8 | provide let _F32_VAL = 42.0w 9 | @unsafe 10 | provide let _F64_VAL = 42.0W 11 | -------------------------------------------------------------------------------- /compiler/test/test.re: -------------------------------------------------------------------------------- 1 | prerr_newline(); 2 | Grain_tests.TestFramework.cli(); 3 | -------------------------------------------------------------------------------- /compiler/test/utils/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name Grain_tests_utils) 3 | (public_name grain-tests.utils) 4 | (libraries grain grain-tests.framework) 5 | (modules (:standard))) 6 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Grain Docs 2 | 3 | ## For users 4 | 5 | If you're looking for language documentation, you can find it at grain-lang.org. Looking to contribute? The source can be found in the [Grain website repository](https://github.com/grain-lang/grain-lang.org). 6 | 7 | ## For contributors 8 | 9 | The contributor docs are hosted here, in the `contributor` directory. These docs should be helpful as you implement features. 10 | -------------------------------------------------------------------------------- /docs/contributor/README.md: -------------------------------------------------------------------------------- 1 | # Grain Contributor Docs 2 | 3 | These docs are meant to be helpful to contributors as they continue improving Grain. If there's a topic not covered here that you think would be helpful, let us know! Additionally, feel free to make any changes that you think would make this information more clear. 4 | 5 | If you're new to Grain and want to jump straight into core compiler development, or you're just curious about how things work under the hood, check out the [compiler walkthrough](https://github.com/grain-lang/grain/blob/main/docs/contributor/compiler_walkthrough.md). 6 | 7 | If you want to know more about how Grain data structures are stored in memory, check out the [data representations guide](https://github.com/grain-lang/grain/blob/main/docs/contributor/data_representations.md). 8 | -------------------------------------------------------------------------------- /grain_shorthand_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/grain-lang/grain/f969df9816bf2c4aa22bc2a658de1f1d743a32b9/grain_shorthand_color.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grain", 3 | "private": true, 4 | "version": "0.7.0", 5 | "description": "The Grain monorepo.", 6 | "workspaces": [ 7 | "cli", 8 | "stdlib", 9 | "compiler" 10 | ], 11 | "engines": { 12 | "node": ">=22.13" 13 | }, 14 | "scripts": { 15 | "prepare": "npm run cli link", 16 | "test": "npm run compiler test --", 17 | "cli": "npm run --workspace=@grain/cli --", 18 | "compiler": "npm run --workspace=@grain/compiler --", 19 | "stdlib": "npm run --workspace=@grain/stdlib --", 20 | "postcompiler": "npm run stdlib clean" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /stdlib/index.js: -------------------------------------------------------------------------------- 1 | module.exports = __dirname; 2 | -------------------------------------------------------------------------------- /stdlib/runtime/atof/lemire.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Lemire 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Lemire module. 8 | 9 | ### Lemire.**computeFloat** 10 | 11 | ```grain 12 | computeFloat: (exponent: WasmI64, mantissa: WasmI64) => Common.BiasedFp 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /stdlib/runtime/atof/parse.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Parse 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Parse module. 8 | 9 | ### Parse.**isFastPath** 10 | 11 | ```grain 12 | isFastPath: 13 | (exponent: WasmI32, mantissa: WasmI64, negative: Bool, manyDigits: Bool) => 14 | Bool 15 | ``` 16 | 17 | ### Parse.**parseFloat** 18 | 19 | ```grain 20 | parseFloat: (string: String) => Result 21 | ``` 22 | 23 | -------------------------------------------------------------------------------- /stdlib/runtime/atof/slow.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Slow 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Slow module. 8 | 9 | ### Slow.**parseLongMantissa** 10 | 11 | ```grain 12 | parseLongMantissa: (s: String) => Common.BiasedFp 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /stdlib/runtime/atof/table.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Table 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Table module. 8 | 9 | ### Table.**get_F64_POWERS10_FAST_PATH** 10 | 11 | ```grain 12 | get_F64_POWERS10_FAST_PATH: () => WasmI32 13 | ``` 14 | 15 | ### Table.**get_POWERS5** 16 | 17 | ```grain 18 | get_POWERS5: () => WasmI32 19 | ``` 20 | 21 | -------------------------------------------------------------------------------- /stdlib/runtime/equal.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Equal 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Equal module. 8 | 9 | ### Equal.**equal** 10 | 11 |
12 | Added in 0.1.0 13 | No other changes yet. 14 |
15 | 16 | ```grain 17 | equal: (value1: a, value2: a) => Bool 18 | ``` 19 | 20 | Check that two values are equal. This checks for structural equality, 21 | so it also works for comparing things like tuples and lists. 22 | 23 | Parameters: 24 | 25 | |param|type|description| 26 | |-----|----|-----------| 27 | |`value1`|`a`|The first operand| 28 | |`value2`|`a`|The second operand| 29 | 30 | Returns: 31 | 32 | |type|description| 33 | |----|-----------| 34 | |`Bool`|`true` if the values are structurally equal or `false` otherwise| 35 | 36 | -------------------------------------------------------------------------------- /stdlib/runtime/gc.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: GC 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the GC module. 8 | 9 | ### GC.**malloc** 10 | 11 | ```grain 12 | malloc: (size: WasmI32) => WasmI32 13 | ``` 14 | 15 | ### GC.**free** 16 | 17 | ```grain 18 | free: (userPtr: WasmI32) => Void 19 | ``` 20 | 21 | ### GC.**incRef** 22 | 23 | ```grain 24 | incRef: (userPtr: WasmI32) => WasmI32 25 | ``` 26 | 27 | ### GC.**decRef** 28 | 29 | ```grain 30 | decRef: (userPtr: WasmI32) => WasmI32 31 | ``` 32 | 33 | -------------------------------------------------------------------------------- /stdlib/runtime/math/kernel/cos.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Cosine 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Cosine module. 8 | 9 | ### Cosine.**cos** 10 | 11 | ```grain 12 | cos: (x: WasmF64, y: WasmF64) => WasmF64 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /stdlib/runtime/math/kernel/sin.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sine 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Sine module. 8 | 9 | ### Sine.**sin** 10 | 11 | ```grain 12 | sin: (x: WasmF64, y: WasmF64, iy: Bool) => WasmF64 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /stdlib/runtime/math/kernel/tan.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tangent 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Tangent module. 8 | 9 | ### Tangent.**tan** 10 | 11 | ```grain 12 | tan: (x: WasmF64, y: WasmF64, iy: Bool) => WasmF64 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /stdlib/runtime/math/rempio2.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Rempio2 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Rempio2 module. 8 | 9 | ### Rempio2.**rempio2** 10 | 11 | ```grain 12 | rempio2: (x: WasmF64, i: WasmI64, sign: Bool) => (Int32, Float64, Float64) 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /stdlib/runtime/math/trig.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Trig 3 | --- 4 | 5 | Raw trigonometric functions. 6 | 7 | ## Values 8 | 9 | Functions and constants included in the Trig module. 10 | 11 | ### Trig.**sin** 12 | 13 | ```grain 14 | sin: (x: WasmF64) => WasmF64 15 | ``` 16 | 17 | ### Trig.**cos** 18 | 19 | ```grain 20 | cos: (x: WasmF64) => WasmF64 21 | ``` 22 | 23 | ### Trig.**tan** 24 | 25 | ```grain 26 | tan: (x: WasmF64) => WasmF64 27 | ``` 28 | 29 | -------------------------------------------------------------------------------- /stdlib/runtime/math/umuldi.gr: -------------------------------------------------------------------------------- 1 | module Umuldi 2 | 3 | from "runtime/unsafe/wasmi32" include WasmI32 4 | from "runtime/unsafe/wasmi64" include WasmI64 5 | from "runtime/unsafe/conv" include Conv 6 | use Conv.{ toUint64 } 7 | 8 | @unsafe 9 | provide let umuldi = (u: WasmI64, v: WasmI64) => { // see: jdh8/metallic/blob/master/src/soft/integer/umulditi3.h 10 | use WasmI64.{ (+), (*), (&), (>>>), (<<) } 11 | let u1 = u & 0xFFFFFFFFN 12 | let v1 = v & 0xFFFFFFFFN 13 | 14 | let a1 = u >>> 32N 15 | let b1 = v >>> 32N 16 | 17 | let t = u1 * v1 18 | let w0 = t & 0xFFFFFFFFN 19 | let t = a1 * v1 + (t >>> 32N) 20 | let w1 = t >>> 32N 21 | let t = u1 * b1 + (t & 0xFFFFFFFFN) 22 | 23 | let result = (t << 32N) + w0 24 | let res128_hi = a1 * b1 + w1 + (t >>> 32N) 25 | return (toUint64(result), toUint64(res128_hi)) 26 | } 27 | -------------------------------------------------------------------------------- /stdlib/runtime/math/umuldi.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Umuldi 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Umuldi module. 8 | 9 | ### Umuldi.**umuldi** 10 | 11 | ```grain 12 | umuldi: (u: WasmI64, v: WasmI64) => (Uint64, Uint64) 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /stdlib/runtime/unsafe/offsets.gr: -------------------------------------------------------------------------------- 1 | /** 2 | * Various common offsets for data structures throughout the runtime. 3 | */ 4 | @runtimeMode 5 | module Offsets 6 | 7 | // String 8 | provide let _STR_LEN_OFFSET = 4n 9 | provide let _STR_DATA_OFFSET = 8n 10 | 11 | // Array 12 | provide let _ARRAY_LEN_OFFSET = 4n 13 | provide let _ARRAY_DATA_OFFSET = 8n 14 | provide let _ARRAY_ITEM_SIZE = 4n 15 | 16 | // Bytes 17 | provide let _BYTES_LEN_OFFSET = 4n 18 | provide let _BYTES_DATA_OFFSET = 8n 19 | 20 | // Int32 21 | provide let _INT32_VALUE_OFFSET = 4n 22 | 23 | // Uint32 24 | provide let _UINT32_VALUE_OFFSET = 4n 25 | 26 | // Float32 27 | provide let _FLOAT32_VALUE_OFFSET = 4n 28 | 29 | // Int64 30 | provide let _INT64_VALUE_OFFSET = 8n 31 | 32 | // Uint64 33 | provide let _UINT64_VALUE_OFFSET = 8n 34 | 35 | // Float64 36 | provide let _FLOAT64_VALUE_OFFSET = 8n 37 | -------------------------------------------------------------------------------- /stdlib/runtime/unsafe/panic.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Panic 3 | --- 4 | 5 | ## Values 6 | 7 | Functions and constants included in the Panic module. 8 | 9 | ### Panic.**panic** 10 | 11 | ```grain 12 | panic: (msg: String) => a 13 | ``` 14 | 15 | --------------------------------------------------------------------------------