0.5.0 -- tuples and more optimizations #12
@@ -3,7 +3,7 @@ use pretty_assertions::assert_eq;
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_function_declaration_with_spillover_params() -> anyhow::Result<()> {
|
fn test_function_declaration_with_spillover_params() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(debug r#"
|
let compiled = compile!(check r#"
|
||||||
// we need more than 4 params to 'spill' into a stack var
|
// we need more than 4 params to 'spill' into a stack var
|
||||||
fn doSomething(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
|
fn doSomething(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
|
||||||
return arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9;
|
return arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9;
|
||||||
@@ -13,8 +13,14 @@ fn test_function_declaration_with_spillover_params() -> anyhow::Result<()> {
|
|||||||
let returned = doSomething(item1, 2, 3, 4, 5, 6, 7, 8, 9);
|
let returned = doSomething(item1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||||||
"#);
|
"#);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {"
|
indoc! {"
|
||||||
j main
|
j main
|
||||||
doSomething:
|
doSomething:
|
||||||
@@ -67,7 +73,7 @@ fn test_function_declaration_with_spillover_params() -> anyhow::Result<()> {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_early_return() -> anyhow::Result<()> {
|
fn test_early_return() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(debug r#"
|
let compiled = compile!(check r#"
|
||||||
// This is a test function declaration with no body
|
// This is a test function declaration with no body
|
||||||
fn doSomething() {
|
fn doSomething() {
|
||||||
if (1 == 1) {
|
if (1 == 1) {
|
||||||
@@ -79,8 +85,14 @@ fn test_early_return() -> anyhow::Result<()> {
|
|||||||
doSomething();
|
doSomething();
|
||||||
"#);
|
"#);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -107,14 +119,20 @@ fn test_early_return() -> anyhow::Result<()> {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_function_declaration_with_register_params() -> anyhow::Result<()> {
|
fn test_function_declaration_with_register_params() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(debug r#"
|
let compiled = compile!(check r#"
|
||||||
// This is a test function declaration with no body
|
// This is a test function declaration with no body
|
||||||
fn doSomething(arg1, arg2) {
|
fn doSomething(arg1, arg2) {
|
||||||
};
|
};
|
||||||
"#);
|
"#);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {"
|
indoc! {"
|
||||||
j main
|
j main
|
||||||
doSomething:
|
doSomething:
|
||||||
|
|||||||
@@ -33,17 +33,6 @@ macro_rules! compile {
|
|||||||
compiler.compile().errors
|
compiler.compile().errors
|
||||||
}};
|
}};
|
||||||
|
|
||||||
(debug $source:expr) => {{
|
|
||||||
let mut writer = std::io::BufWriter::new(Vec::new());
|
|
||||||
let compiler = crate::Compiler::new(
|
|
||||||
parser::Parser::new(tokenizer::Tokenizer::from($source)),
|
|
||||||
Some(crate::CompilerConfig { debug: true }),
|
|
||||||
);
|
|
||||||
let res = compiler.compile();
|
|
||||||
res.instructions.write(&mut writer)?;
|
|
||||||
output!(writer)
|
|
||||||
}};
|
|
||||||
|
|
||||||
(check $source:expr) => {{
|
(check $source:expr) => {{
|
||||||
let mut writer = std::io::BufWriter::new(Vec::new());
|
let mut writer = std::io::BufWriter::new(Vec::new());
|
||||||
let compiler = crate::Compiler::new(
|
let compiler = crate::Compiler::new(
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use pretty_assertions::assert_eq;
|
|||||||
#[test]
|
#[test]
|
||||||
fn block_scope() -> anyhow::Result<()> {
|
fn block_scope() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
let x = 10;
|
let x = 10;
|
||||||
{
|
{
|
||||||
let y = 20;
|
let y = 20;
|
||||||
@@ -13,8 +13,14 @@ fn block_scope() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -33,7 +39,7 @@ fn block_scope() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn variable_scope_isolation() -> anyhow::Result<()> {
|
fn variable_scope_isolation() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
let x = 10;
|
let x = 10;
|
||||||
{
|
{
|
||||||
let x = 20;
|
let x = 20;
|
||||||
@@ -42,8 +48,14 @@ fn variable_scope_isolation() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -61,7 +73,7 @@ fn variable_scope_isolation() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn function_parameter_scope() -> anyhow::Result<()> {
|
fn function_parameter_scope() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
fn double(x) {
|
fn double(x) {
|
||||||
return x * 2;
|
return x * 2;
|
||||||
};
|
};
|
||||||
@@ -70,8 +82,14 @@ fn function_parameter_scope() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -95,52 +113,10 @@ fn function_parameter_scope() -> anyhow::Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn function_local_variables() -> anyhow::Result<()> {
|
|
||||||
let compiled = compile! {
|
|
||||||
debug "
|
|
||||||
let global = 100;
|
|
||||||
|
|
||||||
fn test() {
|
|
||||||
let local = 50;
|
|
||||||
return local + global;
|
|
||||||
};
|
|
||||||
|
|
||||||
let result = test();
|
|
||||||
"
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
compiled,
|
|
||||||
indoc! {
|
|
||||||
"
|
|
||||||
j main
|
|
||||||
test:
|
|
||||||
push ra
|
|
||||||
move r8 50
|
|
||||||
add r1 r8 r0
|
|
||||||
move r15 r1
|
|
||||||
j __internal_L1
|
|
||||||
__internal_L1:
|
|
||||||
pop ra
|
|
||||||
j ra
|
|
||||||
main:
|
|
||||||
move r8 100
|
|
||||||
push r8
|
|
||||||
jal test
|
|
||||||
pop r8
|
|
||||||
move r9 r15
|
|
||||||
"
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn nested_block_scopes() -> anyhow::Result<()> {
|
fn nested_block_scopes() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
let x = 1;
|
let x = 1;
|
||||||
{
|
{
|
||||||
let x = 2;
|
let x = 2;
|
||||||
@@ -154,8 +130,14 @@ fn nested_block_scopes() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -176,7 +158,7 @@ fn nested_block_scopes() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn variable_shadowing_in_conditional() -> anyhow::Result<()> {
|
fn variable_shadowing_in_conditional() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
let x = 10;
|
let x = 10;
|
||||||
|
|
||||||
if (true) {
|
if (true) {
|
||||||
@@ -187,8 +169,14 @@ fn variable_shadowing_in_conditional() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -208,7 +196,7 @@ fn variable_shadowing_in_conditional() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn variable_shadowing_in_loop() -> anyhow::Result<()> {
|
fn variable_shadowing_in_loop() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
let x = 0;
|
let x = 0;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
@@ -220,8 +208,14 @@ fn variable_shadowing_in_loop() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -246,7 +240,7 @@ fn variable_shadowing_in_loop() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn const_scope() -> anyhow::Result<()> {
|
fn const_scope() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
const PI = 3.14;
|
const PI = 3.14;
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -256,8 +250,14 @@ fn const_scope() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -273,7 +273,7 @@ fn const_scope() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn device_in_scope() -> anyhow::Result<()> {
|
fn device_in_scope() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
device d0 = \"d0\";
|
device d0 = \"d0\";
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -282,8 +282,14 @@ fn device_in_scope() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -300,7 +306,7 @@ fn device_in_scope() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn function_scope_isolation() -> anyhow::Result<()> {
|
fn function_scope_isolation() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
fn func1() {
|
fn func1() {
|
||||||
let x = 10;
|
let x = 10;
|
||||||
return x;
|
return x;
|
||||||
@@ -316,8 +322,14 @@ fn function_scope_isolation() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -354,7 +366,7 @@ fn function_scope_isolation() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn tuple_unpacking_scope() -> anyhow::Result<()> {
|
fn tuple_unpacking_scope() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
fn pair() {
|
fn pair() {
|
||||||
return (1, 2);
|
return (1, 2);
|
||||||
};
|
};
|
||||||
@@ -366,8 +378,14 @@ fn tuple_unpacking_scope() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -397,7 +415,7 @@ fn tuple_unpacking_scope() -> anyhow::Result<()> {
|
|||||||
#[test]
|
#[test]
|
||||||
fn shadowing_doesnt_affect_outer() -> anyhow::Result<()> {
|
fn shadowing_doesnt_affect_outer() -> anyhow::Result<()> {
|
||||||
let compiled = compile! {
|
let compiled = compile! {
|
||||||
debug "
|
check "
|
||||||
let x = 5;
|
let x = 5;
|
||||||
let y = x;
|
let y = x;
|
||||||
{
|
{
|
||||||
@@ -408,8 +426,14 @@ fn shadowing_doesnt_affect_outer() -> anyhow::Result<()> {
|
|||||||
"
|
"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
|
|||||||
@@ -6,14 +6,20 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_declaration() -> anyhow::Result<()> {
|
fn test_tuple_literal_declaration() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let (x, y) = (1, 2);
|
let (x, y) = (1, 2);
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -30,14 +36,20 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_declaration_with_underscore() -> anyhow::Result<()> {
|
fn test_tuple_literal_declaration_with_underscore() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let (x, _) = (1, 2);
|
let (x, _) = (1, 2);
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -53,7 +65,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_assignment() -> anyhow::Result<()> {
|
fn test_tuple_literal_assignment() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let x = 0;
|
let x = 0;
|
||||||
let y = 0;
|
let y = 0;
|
||||||
@@ -61,8 +73,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -81,7 +99,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_with_variables() -> anyhow::Result<()> {
|
fn test_tuple_literal_with_variables() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let a = 42;
|
let a = 42;
|
||||||
let b = 99;
|
let b = 99;
|
||||||
@@ -89,8 +107,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -109,14 +133,20 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_three_elements() -> anyhow::Result<()> {
|
fn test_tuple_literal_three_elements() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let (x, y, z) = (1, 2, 3);
|
let (x, y, z) = (1, 2, 3);
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -134,7 +164,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_assignment_with_underscore() -> anyhow::Result<()> {
|
fn test_tuple_literal_assignment_with_underscore() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let i = 0;
|
let i = 0;
|
||||||
let x = 123;
|
let x = 123;
|
||||||
@@ -142,8 +172,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -161,7 +197,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_return_simple() -> anyhow::Result<()> {
|
fn test_tuple_return_simple() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn getPair() {
|
fn getPair() {
|
||||||
return (10, 20);
|
return (10, 20);
|
||||||
@@ -170,8 +206,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -199,7 +241,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_return_with_underscore() -> anyhow::Result<()> {
|
fn test_tuple_return_with_underscore() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn getPair() {
|
fn getPair() {
|
||||||
return (5, 15);
|
return (5, 15);
|
||||||
@@ -208,8 +250,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -237,7 +285,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_return_three_elements() -> anyhow::Result<()> {
|
fn test_tuple_return_three_elements() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn getTriple() {
|
fn getTriple() {
|
||||||
return (1, 2, 3);
|
return (1, 2, 3);
|
||||||
@@ -246,8 +294,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -277,7 +331,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_return_assignment() -> anyhow::Result<()> {
|
fn test_tuple_return_assignment() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn getPair() {
|
fn getPair() {
|
||||||
return (42, 84);
|
return (42, 84);
|
||||||
@@ -288,8 +342,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -346,7 +406,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_return_called_by_non_tuple_return() -> anyhow::Result<()> {
|
fn test_tuple_return_called_by_non_tuple_return() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn doSomething() {
|
fn doSomething() {
|
||||||
return (1, 2);
|
return (1, 2);
|
||||||
@@ -361,8 +421,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -399,7 +465,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_non_tuple_return_called_by_tuple_return() -> anyhow::Result<()> {
|
fn test_non_tuple_return_called_by_tuple_return() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn getValue() {
|
fn getValue() {
|
||||||
return 42;
|
return 42;
|
||||||
@@ -414,8 +480,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -471,7 +543,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_multiple_tuple_returns_in_function() -> anyhow::Result<()> {
|
fn test_multiple_tuple_returns_in_function() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn getValue(x) {
|
fn getValue(x) {
|
||||||
if (x) {
|
if (x) {
|
||||||
@@ -485,8 +557,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -528,7 +606,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_return_with_expression() -> anyhow::Result<()> {
|
fn test_tuple_return_with_expression() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn add(x, y) {
|
fn add(x, y) {
|
||||||
return (x, y);
|
return (x, y);
|
||||||
@@ -538,8 +616,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -571,7 +655,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_nested_function_tuple_calls() -> anyhow::Result<()> {
|
fn test_nested_function_tuple_calls() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn inner() {
|
fn inner() {
|
||||||
return (1, 2);
|
return (1, 2);
|
||||||
@@ -586,8 +670,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -628,14 +718,20 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_with_constant_expressions() -> anyhow::Result<()> {
|
fn test_tuple_literal_with_constant_expressions() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let (a, b) = (1 + 2, 3 * 4);
|
let (a, b) = (1 + 2, 3 * 4);
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -652,7 +748,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_with_variable_expressions() -> anyhow::Result<()> {
|
fn test_tuple_literal_with_variable_expressions() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let x = 5;
|
let x = 5;
|
||||||
let y = 10;
|
let y = 10;
|
||||||
@@ -660,8 +756,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -682,7 +784,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_assignment_with_expressions() -> anyhow::Result<()> {
|
fn test_tuple_assignment_with_expressions() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let a = 0;
|
let a = 0;
|
||||||
let b = 0;
|
let b = 0;
|
||||||
@@ -691,8 +793,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -714,7 +822,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_literal_with_function_calls() -> anyhow::Result<()> {
|
fn test_tuple_literal_with_function_calls() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn getValue() { return 42; };
|
fn getValue() { return 42; };
|
||||||
fn getOther() { return 99; };
|
fn getOther() { return 99; };
|
||||||
@@ -723,8 +831,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -765,7 +879,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_with_logical_expressions() -> anyhow::Result<()> {
|
fn test_tuple_with_logical_expressions() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let x = 1;
|
let x = 1;
|
||||||
let y = 0;
|
let y = 0;
|
||||||
@@ -773,8 +887,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -795,7 +915,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_with_comparison_expressions() -> anyhow::Result<()> {
|
fn test_tuple_with_comparison_expressions() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
let x = 5;
|
let x = 5;
|
||||||
let y = 10;
|
let y = 10;
|
||||||
@@ -803,8 +923,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -825,7 +951,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_with_device_property_access() -> anyhow::Result<()> {
|
fn test_tuple_with_device_property_access() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
device sensor = "d0";
|
device sensor = "d0";
|
||||||
device display = "d1";
|
device display = "d1";
|
||||||
@@ -834,8 +960,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -854,7 +986,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_with_device_property_and_function_call() -> anyhow::Result<()> {
|
fn test_tuple_with_device_property_and_function_call() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
device self = "db";
|
device self = "db";
|
||||||
|
|
||||||
@@ -866,8 +998,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -898,7 +1036,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_with_function_call_expressions() -> anyhow::Result<()> {
|
fn test_tuple_with_function_call_expressions() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn getValue() { return 10; }
|
fn getValue() { return 10; }
|
||||||
fn getOther() { return 20; }
|
fn getOther() { return 20; }
|
||||||
@@ -907,8 +1045,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
@@ -951,7 +1095,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_with_stack_spillover() -> anyhow::Result<()> {
|
fn test_tuple_with_stack_spillover() -> anyhow::Result<()> {
|
||||||
let compiled = compile!(
|
let compiled = compile!(
|
||||||
debug
|
check
|
||||||
r#"
|
r#"
|
||||||
fn get8() {
|
fn get8() {
|
||||||
return (1, 2, 3, 4, 5, 6, 7, 8);
|
return (1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
@@ -962,8 +1106,14 @@ mod test {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
compiled.errors.is_empty(),
|
||||||
|
"Expected no errors, got: {:?}",
|
||||||
|
compiled.errors
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
compiled,
|
compiled.output,
|
||||||
indoc! {
|
indoc! {
|
||||||
"
|
"
|
||||||
j main
|
j main
|
||||||
|
|||||||
Reference in New Issue
Block a user