roc/crates/compiler
2024-07-30 06:57:36 -07:00
..
alias_analysis move List.map* into roc 2024-07-13 10:39:56 -07:00
build clippy 2024-07-13 10:39:59 -07:00
builtins update tuning todo 2024-07-28 20:33:48 -07:00
can remove spaces_middle from crates/compiler/can/src/desugar.rs 2024-07-29 13:11:57 -04:00
checkmate Update stale document references 2024-06-26 02:16:20 -04:00
checkmate_schema Fix types 2023-07-17 10:10:50 -05:00
collections use CalledVia::BangSuffix 2024-03-21 15:51:21 +11:00
constrain Handle multi pattern unbound list rest variables 2024-06-21 17:01:49 +01:00
debug_flags less verbose build debugging 2024-02-28 13:50:48 +01:00
derive fix example, update mono 2024-04-13 14:26:17 +02:00
derive_key Change docs/errors from "optional" to "default value" record fields 2024-04-03 08:55:35 -07:00
exhaustive fix indexing 2023-11-20 21:09:12 -08:00
fmt spaces_middle -> lines_between 2024-07-29 13:06:48 -04:00
gen_dev get native dev backend working 2024-07-21 20:07:52 -07:00
gen_llvm switch to passing the copy function into zig (implement llvm) 2024-07-21 19:04:57 -07:00
gen_wasm get wasm dev backend working 2024-07-21 19:53:36 -07:00
ident incorrect implementation of partial_cmp on an Ord type 2023-10-07 19:11:36 +02:00
late_solve Fix types 2023-07-17 10:10:50 -05:00
load Feedback: add doc comments, verbiage changes, capitalize Roc, remove a resolved TODO 2024-07-28 14:45:32 -07:00
load_internal Implement block / indent based parsing 2024-07-27 13:34:16 -07:00
module Implement block / indent based parsing 2024-07-27 13:34:16 -07:00
mono get wasm dev backend working 2024-07-21 19:53:36 -07:00
parse Merge pull request #6938 from joshuawarner32/fix-unreachable 2024-07-30 06:57:36 -07:00
problem Update from PR comments 2024-07-07 18:33:20 -07:00
region completion working when there are errors in the file and has types 2024-01-29 21:54:44 +10:00
roc_target Use roc_target over target_lexicon 2024-03-31 10:50:26 -07:00
serialize rust 1.71 clippy fixes 2023-07-25 10:46:46 +02:00
solve Make sure FunctionKind is determined in all entry points 2024-07-07 16:01:14 -05:00
solve_problem Remove Nat from Hash, Inspect, Encode, Decode 2024-01-26 16:17:05 -05:00
solve_schema Move unify::Mode to roc_solve_schema 2023-07-17 09:50:36 -05:00
test_derive Handle root type when loading from str 2024-06-08 19:46:41 -03:00
test_gen Implement block / indent based parsing 2024-07-27 13:34:16 -07:00
test_mono update mono tests 2024-07-15 17:25:51 -07:00
test_mono_macros Use larger stacks for some mono tests 2023-06-06 16:05:12 -05:00
test_solve_helpers Handle root type when loading from str 2024-06-08 19:46:41 -03:00
test_syntax Merge branch 'main' into fix-deprecated-interpolated-formatting 2024-07-29 17:40:23 -07:00
types clippy + fmt 2024-06-19 12:34:10 +02:00
uitest Merge pull request #6881 from roc-lang/empty-open-union 2024-07-09 16:46:54 +02:00
unify use dead_code for Both 2024-07-05 14:17:52 +02:00
work Delete worker.rs for now 2024-06-17 22:25:15 -04:00
worker clippy 2024-06-17 22:25:15 -04:00
DESIGN.md Start a section on canonicalization 2023-03-13 14:07:42 +00:00
README.md Start working on new compiler design documentation 2023-03-11 11:40:53 -05:00

The Roc Compiler

For an overview of the design and architecture of the compiler, see DESIGN.md. If you want to dive into the implementation or get some tips on debugging the compiler, see below

Getting started with the code

The compiler contains a lot of code! If you're new to the project it can be hard to know where to start. It's useful to have some sort of "main entry point", or at least a "good place to start" for each of the main phases.

After you get into the details, you'll discover that some parts of the compiler have more than one entry point. And things can be interwoven together in subtle and complex ways, for reasons to do with performance, edge case handling, etc. But if this is "day one" for you, and you're just trying to get familiar with things, this should be "good enough".

The compiler is invoked from the CLI via build_file in cli/src/build.rs

Phase Entry point / main functions
Compiler entry point load/src/file.rs: load, load_and_monomorphize
Parse header parse/src/module.rs: parse_header
Parse definitions parse/src/module.rs: module_defs
Canonicalize can/src/def.rs: canonicalize_defs
Type check solve/src/module.rs: run_solve
Gather types to specialize mono/src/ir.rs: PartialProc::from_named_function
Solve specialized types mono/src/ir.rs: from_can, with_hole
Insert reference counting mono/src/ir.rs: Proc::insert_refcount_operations
Code gen (optimized but slow) gen_llvm/src/llvm/build.rs: build_procedures
Code gen (unoptimized but fast, CPU) gen_dev/src/object_builder.rs: build_module
Code gen (unoptimized but fast, Wasm) gen_wasm/src/lib.rs: build_module

For a more detailed understanding of the compilation phases, see the Phase, BuildTask, and Msg enums in load/src/file.rs.

Debugging the compiler

Please see the debug flags for information on how to ask the compiler to emit debug information during various stages of compilation.

There are some goals for more sophisticated debugging tools:

General Tips

Miscompilations

If you observe a miscomplication, you may first want to check the generated mono IR for your code - maybe there was a problem during specialization or layout generation. One way to do this is to add a test to test_mono/src/tests.rs and run the tests with cargo test -p test_mono; this will write the mono IR to a file.

Typechecking errors

First, try to minimize your reproduction into a test that fits in solve_expr.

Once you've done this, check out the ROC_PRINT_UNIFICATIONS debug flag. It will show you where type unification went right and wrong. This is usually enough to figure out a fix for the bug.

If that doesn't work and you know your error has something to do with ranks, you may want to instrument deep_copy_var_help in solve.

If that doesn't work, chatting on Zulip is always a good strategy.