@@ -11,9 +11,11 @@ use super::TranslateCtx;
11
11
use crate :: {
12
12
ast,
13
13
c:: {
14
+ self ,
14
15
ast:: expr:: { BinaryOperator , Expr , ExprKind } ,
15
- parser:: { error :: ParseErrorKind , ParseError } ,
16
+ parser:: ParseError ,
16
17
} ,
18
+ name:: Name ,
17
19
} ;
18
20
19
21
pub fn translate_expr ( ctx : & mut TranslateCtx , expr : & Expr ) -> Result < ast:: Expr , ParseError > {
@@ -91,7 +93,7 @@ pub fn translate_expr(ctx: &mut TranslateCtx, expr: &Expr) -> Result<ast::Expr,
91
93
ExprKind :: PostIncrement ( _) => todo ! ( ) ,
92
94
ExprKind :: PostDecrement ( _) => todo ! ( ) ,
93
95
ExprKind :: Identifier ( name) => {
94
- return Err ( ParseErrorKind :: UndefinedVariable ( name . into ( ) ) . at ( expr. source ) ) ;
96
+ return Ok ( ast :: ExprKind :: Variable ( Name :: plain ( name ) ) . at ( expr. source ) ) ;
95
97
}
96
98
ExprKind :: EnumConstant ( _, _) => todo ! ( ) ,
97
99
ExprKind :: CompoundLiteral ( compound_literal) => {
@@ -128,6 +130,30 @@ pub fn translate_expr(ctx: &mut TranslateCtx, expr: &Expr) -> Result<ast::Expr,
128
130
inner : translate_expr ( ctx, inner) ?,
129
131
} ) )
130
132
. at ( expr. source ) ,
131
- ExprKind :: Call ( _target, _args) => todo ! ( "translate C call expression" ) ,
133
+ ExprKind :: Call ( target, c_args) => {
134
+ eprintln ! ( "warning: c function call expression are not isolated yet to only call functions defined within then same file" ) ;
135
+ eprintln ! ( "warning: c function call expression cannot call expression yet" ) ;
136
+
137
+ let c:: ast:: ExprKind :: Identifier ( target) = & target. as_ref ( ) . kind else {
138
+ return Err ( ParseError :: message (
139
+ "Calling the result of expressions is not supported yet" ,
140
+ expr. source ,
141
+ ) ) ;
142
+ } ;
143
+
144
+ let args = c_args
145
+ . iter ( )
146
+ . map ( |c_arg| translate_expr ( ctx, c_arg) )
147
+ . collect :: < Result < Vec < ast:: Expr > , ParseError > > ( ) ?;
148
+
149
+ ast:: ExprKind :: Call ( Box :: new ( ast:: Call {
150
+ name : Name :: plain ( target) ,
151
+ args,
152
+ expected_to_return : None ,
153
+ generics : vec ! [ ] ,
154
+ using : vec ! [ ] ,
155
+ } ) )
156
+ . at ( expr. source )
157
+ }
132
158
} )
133
159
}
0 commit comments