From a605d182b41b5f27f3c938b1e4ea75a5f8e410b4 Mon Sep 17 00:00:00 2001 From: Araozu Date: Thu, 11 Jan 2024 19:36:11 -0500 Subject: [PATCH] Codegen function call parameters --- CHANGELOG.md | 2 +- src/codegen/function_call.rs | 4 +++- src/syntax/ast/functions.rs | 1 + src/syntax/expression/function_call_expr.rs | 13 +++++++------ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de45564..2ce1906 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ ## v0.0.10 - [x] Parse function call parameters -- [ ] Codegen function call parameters +- [x] Codegen function call parameters - [ ] Parse function declaration arguments - [ ] Begin work on semantic analysis - [ ] Symbol table diff --git a/src/codegen/function_call.rs b/src/codegen/function_call.rs index ade02e2..ee48731 100644 --- a/src/codegen/function_call.rs +++ b/src/codegen/function_call.rs @@ -4,6 +4,8 @@ use super::Transpilable; impl Transpilable for FunctionCall { fn transpile(&self) -> String { - format!("{}()", self.function.transpile()) + let parameters = &self.arguments.arguments.iter().map(|expr| expr.transpile()).collect::>().join(", "); + + format!("{}({})", self.function.transpile(), parameters) } } diff --git a/src/syntax/ast/functions.rs b/src/syntax/ast/functions.rs index 67fd85e..f864f47 100644 --- a/src/syntax/ast/functions.rs +++ b/src/syntax/ast/functions.rs @@ -3,6 +3,7 @@ use super::Expression; #[derive(Debug)] pub struct FunctionCall { pub function: Box, + pub arguments: Box, } #[derive(Debug)] diff --git a/src/syntax/expression/function_call_expr.rs b/src/syntax/expression/function_call_expr.rs index 4bd2d8d..a1eec04 100644 --- a/src/syntax/expression/function_call_expr.rs +++ b/src/syntax/expression/function_call_expr.rs @@ -1,7 +1,10 @@ use crate::{ lexic::token::Token, syntax::{ - ast::{functions::FunctionCall, Expression}, + ast::{ + functions::{ArgumentsList, FunctionCall}, + Expression, + }, functions::arguments_list, ParseResult, }, @@ -20,7 +23,7 @@ pub fn try_parse(tokens: &Vec, pos: usize) -> ParseResult }; // Parse arguments list - let (_args_list, next_pos) = match arguments_list::try_parse(tokens, next_pos) { + let (arguments, next_pos) = match arguments_list::try_parse(tokens, next_pos) { ParseResult::Ok(args, next) => (args, next), ParseResult::Err(err) => return ParseResult::Err(err), _ => { @@ -30,13 +33,11 @@ pub fn try_parse(tokens: &Vec, pos: usize) -> ParseResult let fun_call = FunctionCall { function: Box::new(primary_expr), + arguments: Box::new(arguments), }; ParseResult::Ok(Expression::FunctionCall(fun_call), next_pos) } - #[cfg(test)] -mod test { - -} +mod test {}