Skip to content

Commit

Permalink
Multiple return and target values.
Browse files Browse the repository at this point in the history
  • Loading branch information
g-r-a-n-t committed Jun 8, 2021
1 parent 6a7c162 commit 882606f
Showing 1 changed file with 35 additions and 10 deletions.
45 changes: 35 additions & 10 deletions src/shorthand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,9 @@ macro_rules! expressions {
/// Creates a Yul variable declaration statement.
#[macro_export]
macro_rules! variable_declaration {
{let $name:tt := $($expression:tt)*} => {
{let $($names:tt),* := $($expression:tt)*} => {
yul::Statement::VariableDeclaration(yul::VariableDeclaration {
identifiers: vec![identifier! {$name}],
identifiers: identifiers! {$($names)*},
expression: Some(expression! {$($expression)*})
})
};
Expand All @@ -209,9 +209,9 @@ macro_rules! variable_declaration {
/// Creates a Yul assignment statement.
#[macro_export]
macro_rules! assignment {
{$name:tt := $($expression:tt)+} => {
{$($names:tt),* := $($expression:tt)+} => {
yul::Statement::Assignment(yul::Assignment {
identifiers: vec![identifier! {$name}],
identifiers: identifiers! {$($names)*},
expression: expression! {$($expression)*}
})
};
Expand Down Expand Up @@ -278,15 +278,11 @@ macro_rules! code_statement {
/// Creates a Yul function definition.
#[macro_export]
macro_rules! function_definition {
{function $name:tt($($params:tt),*) $(-> $returns:tt)? {$($statements:tt)*}} => {
{function $name:tt($($params:tt),*) $(->)? $($returns:ident),* {$($statements:tt)*}} => {
yul::Statement::FunctionDefinition(yul::FunctionDefinition {
name: identifier! {$name},
parameters: identifiers! {$($params)*},
returns: {
let mut returns = vec![];
$(returns.push(identifier!{$returns});)*
returns
},
returns: identifiers! {$($returns)*},
block: block!{$($statements)*},
})
};
Expand Down Expand Up @@ -467,6 +463,14 @@ mod tests {
)
}

#[test]
fn variable_declaration_multiple_targets() {
assert_eq!(
variable_declaration! {let foo, bar := 42}.to_string(),
"let foo, bar := 42"
)
}

#[test]
fn variable_declaration_function() {
assert_eq!(
Expand Down Expand Up @@ -508,6 +512,11 @@ mod tests {
assert_eq!(assignment! {foo := 42}.to_string(), "foo := 42")
}

#[test]
fn assignment_multiple_targets() {
assert_eq!(assignment! {foo, bar := 42}.to_string(), "foo, bar := 42")
}

#[test]
fn large_assignment() {
assert_eq!(
Expand Down Expand Up @@ -630,6 +639,22 @@ mod tests {
)
}

#[test]
fn function_definition_multiple_returns() {
let bit = identifier! {bit};

assert_eq!(
function_definition! {
function foo([bit], coin) -> bar, baz {
(let baz := add(bit, coin))
(bar := hello_world(baz, "hi"))
}
}
.to_string(),
r#"function foo(bit, coin) -> bar, baz { let baz := add(bit, coin) bar := hello_world(baz, "hi") }"#
)
}

#[test]
fn function_definition_no_return() {
let bit = identifier! {bit};
Expand Down

0 comments on commit 882606f

Please sign in to comment.