mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-04 12:18:19 +00:00
New module
header
Implements the new `module` header syntax as described in "module and package changes" [1]: ``` module [Request, Response, req] ``` The old syntax should still work fine, and is automatically upgraded to the new one when running `roc format`. [1] https://docs.google.com/document/d/1E_77fO-44BtoBtXoVeWyGh1xN2KRTWTu8q6i25RNNx0/edit
This commit is contained in:
parent
7754dd7ef7
commit
057a18573a
92 changed files with 1445 additions and 1563 deletions
|
@ -339,7 +339,7 @@ fn import_transitive_alias() {
|
|||
"RBTree.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface RBTree exposes [RedBlackTree, empty] imports []
|
||||
module [RedBlackTree, empty]
|
||||
|
||||
# The color of a node. Leaves are considered Black.
|
||||
NodeColor : [Red, Black]
|
||||
|
@ -357,7 +357,7 @@ fn import_transitive_alias() {
|
|||
"Other.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface Other exposes [empty] imports []
|
||||
module [empty]
|
||||
|
||||
import RBTree
|
||||
|
||||
|
@ -372,9 +372,9 @@ fn import_transitive_alias() {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn interface_with_deps() {
|
||||
fn module_with_deps() {
|
||||
let subs_by_module = Default::default();
|
||||
let src_dir = fixtures_dir().join("interface_with_deps");
|
||||
let src_dir = fixtures_dir().join("module_with_deps");
|
||||
let filename = src_dir.join("Primary.roc");
|
||||
let arena = Bump::new();
|
||||
let loaded = load_and_typecheck(
|
||||
|
@ -488,7 +488,7 @@ fn load_docs() {
|
|||
#[test]
|
||||
fn import_alias() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "ImportAlias", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "ImportAlias", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -501,7 +501,7 @@ fn import_alias() {
|
|||
#[test]
|
||||
fn import_inside_def() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "ImportInsideDef", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "ImportInsideDef", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -517,7 +517,7 @@ fn import_inside_def() {
|
|||
fn exposed_used_outside_scope() {
|
||||
let subs_by_module = Default::default();
|
||||
load_fixture(
|
||||
"interface_with_deps",
|
||||
"module_with_deps",
|
||||
"ExposedUsedOutsideScope",
|
||||
subs_by_module,
|
||||
);
|
||||
|
@ -527,17 +527,13 @@ fn exposed_used_outside_scope() {
|
|||
#[should_panic(expected = "MODULE NOT IMPORTED")]
|
||||
fn import_used_outside_scope() {
|
||||
let subs_by_module = Default::default();
|
||||
load_fixture(
|
||||
"interface_with_deps",
|
||||
"ImportUsedOutsideScope",
|
||||
subs_by_module,
|
||||
);
|
||||
load_fixture("module_with_deps", "ImportUsedOutsideScope", subs_by_module);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_load_and_typecheck() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "WithBuiltins", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "WithBuiltins", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -558,7 +554,7 @@ fn test_load_and_typecheck() {
|
|||
#[test]
|
||||
fn iface_quicksort() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "Quicksort", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "Quicksort", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -574,7 +570,7 @@ fn iface_quicksort() {
|
|||
#[test]
|
||||
fn load_astar() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "AStar", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "AStar", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -606,7 +602,7 @@ fn load_principal_types() {
|
|||
#[test]
|
||||
fn iface_dep_types() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "Primary", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "Primary", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -650,7 +646,7 @@ fn app_dep_types() {
|
|||
#[test]
|
||||
fn imported_dep_regression() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "OneDep", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "OneDep", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -663,7 +659,7 @@ fn imported_dep_regression() {
|
|||
#[test]
|
||||
fn ingested_file() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "IngestedFile", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "IngestedFile", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -678,7 +674,7 @@ fn ingested_file() {
|
|||
#[test]
|
||||
fn ingested_file_bytes() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "IngestedFileBytes", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "IngestedFileBytes", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -695,7 +691,7 @@ fn parse_problem() {
|
|||
"Main.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface Main exposes [main] imports []
|
||||
module [main]
|
||||
|
||||
main = [
|
||||
"
|
||||
|
@ -732,7 +728,7 @@ fn parse_problem() {
|
|||
#[should_panic(expected = "FILE NOT FOUND")]
|
||||
fn file_not_found() {
|
||||
let subs_by_module = Default::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "invalid$name", subs_by_module);
|
||||
let loaded_module = load_fixture("module_with_deps", "invalid$name", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
|
@ -887,7 +883,7 @@ fn opaque_wrapped_unwrapped_outside_defining_module() {
|
|||
"Age.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface Age exposes [Age] imports []
|
||||
module [Age]
|
||||
|
||||
Age := U32
|
||||
"
|
||||
|
@ -897,7 +893,7 @@ fn opaque_wrapped_unwrapped_outside_defining_module() {
|
|||
"Main.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface Main exposes [twenty, readAge] imports []
|
||||
module [twenty, readAge]
|
||||
|
||||
import Age exposing [Age]
|
||||
|
||||
|
@ -965,7 +961,8 @@ fn unused_imports() {
|
|||
"Dep1.roc",
|
||||
indoc!(
|
||||
r#"
|
||||
interface Dep1 exposes [one] imports []
|
||||
module [one]
|
||||
|
||||
one = 1
|
||||
"#
|
||||
),
|
||||
|
@ -974,7 +971,8 @@ fn unused_imports() {
|
|||
"Dep2.roc",
|
||||
indoc!(
|
||||
r#"
|
||||
interface Dep2 exposes [two] imports []
|
||||
module [two]
|
||||
|
||||
two = 2
|
||||
"#
|
||||
),
|
||||
|
@ -983,7 +981,7 @@ fn unused_imports() {
|
|||
"Dep3.roc",
|
||||
indoc!(
|
||||
r#"
|
||||
interface Dep3 exposes [Three, three] imports []
|
||||
module [Three, three]
|
||||
|
||||
Three : [Three]
|
||||
|
||||
|
@ -995,7 +993,7 @@ fn unused_imports() {
|
|||
"Main.roc",
|
||||
indoc!(
|
||||
r#"
|
||||
interface Main exposes [usedModule, unusedModule, unusedExposed, unusedWithAlias, usingThreeValue] imports []
|
||||
module [usedModule, unusedModule, unusedExposed, usingThreeValue, unusedWithAlias]
|
||||
|
||||
import Dep1
|
||||
import Dep3 exposing [Three]
|
||||
|
@ -1663,48 +1661,13 @@ fn import_builtin_in_platform_and_check_app() {
|
|||
assert!(result.is_ok(), "should check");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn module_doesnt_match_file_path() {
|
||||
let modules = vec![(
|
||||
"Age.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface NotAge exposes [Age] imports []
|
||||
|
||||
Age := U32
|
||||
"
|
||||
),
|
||||
)];
|
||||
|
||||
let err = multiple_modules("module_doesnt_match_file_path", modules).unwrap_err();
|
||||
assert_eq!(
|
||||
err,
|
||||
indoc!(
|
||||
r"
|
||||
── WEIRD MODULE NAME in tmp/module_doesnt_match_file_path/Age.roc ──────────────
|
||||
|
||||
This module name does not correspond with the file path it is defined
|
||||
in:
|
||||
|
||||
1│ interface NotAge exposes [Age] imports []
|
||||
^^^^^^
|
||||
|
||||
Module names must correspond with the file paths they are defined in.
|
||||
For example, I expect to see BigNum defined in BigNum.roc, or Math.Sin
|
||||
defined in Math/Sin.roc."
|
||||
),
|
||||
"\n{}",
|
||||
err
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn module_cyclic_import_itself() {
|
||||
let modules = vec![(
|
||||
"Age.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface Age exposes [] imports []
|
||||
module []
|
||||
|
||||
import Age
|
||||
"
|
||||
|
@ -1742,7 +1705,8 @@ fn module_cyclic_import_transitive() {
|
|||
"Age.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface Age exposes [] imports []
|
||||
module []
|
||||
|
||||
import Person
|
||||
"
|
||||
),
|
||||
|
@ -1751,7 +1715,8 @@ fn module_cyclic_import_transitive() {
|
|||
"Person.roc",
|
||||
indoc!(
|
||||
r"
|
||||
interface Person exposes [] imports []
|
||||
module []
|
||||
|
||||
import Age
|
||||
"
|
||||
),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue