After parsing a module, we now recursively traverse the tree to find
all imports inside Defs, not just the top-level ones.
Previously, imported modules were available in the entire file,
but that's no longer the case. Therefore, Scope now keeps track of
imported modules and Env::qualified_lookup checks whether a module
is available in the provided scope.
Note: Unused import warnings are still global and need to be updated.
Previously, all imports were available in the header, so we could start
processing dependencies as soon as we parsed it. However, the new imports
are treated as defs, so we have to parse the whole module to find them.
This commit essentially moves the dependency resolution from the `LoadHeader`
phase to the `Parse` phase, and it updates canonicalization to introduce
module symbols into scope when a `ValueDef::ModuleImport` is encountered.
NOTE:
- The `imports` header still parses, but it's no longer wired up. I will remove
it in an upcoming commit.
- Ingested files and imports that appear in nested expressions are not
yet supported by load
Traverse pattern ASTs and desugar two cases
- Desugar optional record field default value expr. This expr might
contain nodes that need to be desugared, such as binary operations.
Failing to desugar this expr can cause an internal panic later in
canonicalization.
- Discard SpaceBefore and SpaceAfter nodes so that patterns can be
destructured over multiple lines. Keeping these nodes can cause an
internal panic later in canonicalization. Fixes [1].
[1]: https://github.com/roc-lang/roc/issues/5653.