@@ -252,7 +252,7 @@ fn optional_statements_to_ast(
252252 let statements = if let Some ( statements) = statements {
253253 statements_to_ast ( vm, statements) ?. into_object ( )
254254 } else {
255- vm. ctx . none ( )
255+ vm. ctx . new_list ( vec ! [ ] )
256256 } ;
257257 Ok ( statements)
258258}
@@ -283,6 +283,17 @@ fn make_string_list(vm: &VirtualMachine, names: &[String]) -> PyObjectRef {
283283 )
284284}
285285
286+ fn optional_expressions_to_ast (
287+ vm : & VirtualMachine ,
288+ expressions : & [ Option < ast:: Expression > ] ,
289+ ) -> PyResult < PyListRef > {
290+ let py_expression_nodes: PyResult < _ > = expressions
291+ . iter ( )
292+ . map ( |expression| Ok ( optional_expression_to_ast ( vm, expression) ?) )
293+ . collect ( ) ;
294+ Ok ( vm. ctx . new_list ( py_expression_nodes?) . downcast ( ) . unwrap ( ) )
295+ }
296+
286297fn optional_expression_to_ast ( vm : & VirtualMachine , value : & Option < ast:: Expression > ) -> PyResult {
287298 let value = if let Some ( value) = value {
288299 expression_to_ast ( vm, value) ?. into_object ( )
@@ -526,8 +537,23 @@ fn operator_string(op: &ast::Operator) -> String {
526537}
527538
528539fn parameters_to_ast ( vm : & VirtualMachine , args : & ast:: Parameters ) -> PyResult < AstNodeRef > {
529- let args = map_ast ( parameter_to_ast, vm, & args. args ) ?;
530- Ok ( node ! ( vm, arguments, { args => args } ) )
540+ Ok ( node ! ( vm, arguments, {
541+ args => map_ast( parameter_to_ast, vm, & args. args) ?,
542+ vararg => vararg_to_ast( vm, & args. vararg) ?,
543+ kwonlyargs => map_ast( parameter_to_ast, vm, & args. kwonlyargs) ?,
544+ kw_defaults => optional_expressions_to_ast( vm, & args. kw_defaults) ?,
545+ kwarg => vararg_to_ast( vm, & args. kwarg) ?,
546+ defaults => expressions_to_ast( vm, & args. defaults) ?
547+ } ) )
548+ }
549+
550+ fn vararg_to_ast ( vm : & VirtualMachine , vararg : & ast:: Varargs ) -> PyResult {
551+ let py_node = match vararg {
552+ ast:: Varargs :: None => vm. get_none ( ) ,
553+ ast:: Varargs :: Unnamed => vm. get_none ( ) ,
554+ ast:: Varargs :: Named ( parameter) => parameter_to_ast ( vm, parameter) ?. into_object ( ) ,
555+ } ;
556+ Ok ( py_node)
531557}
532558
533559fn parameter_to_ast ( vm : & VirtualMachine , parameter : & ast:: Parameter ) -> PyResult < AstNodeRef > {
@@ -537,10 +563,15 @@ fn parameter_to_ast(vm: &VirtualMachine, parameter: &ast::Parameter) -> PyResult
537563 vm. ctx . none ( )
538564 } ;
539565
540- Ok ( node ! ( vm, arg, {
566+ let py_node = node ! ( vm, arg, {
541567 arg => vm. ctx. new_str( parameter. arg. to_string( ) ) ,
542568 annotation => py_annotation
543- } ) )
569+ } ) ;
570+
571+ let lineno = vm. ctx . new_int ( parameter. location . row ( ) ) ;
572+ vm. set_attr ( py_node. as_object ( ) , "lineno" , lineno) ?;
573+
574+ Ok ( py_node)
544575}
545576
546577fn optional_string_to_py_obj ( vm : & VirtualMachine , name : & Option < String > ) -> PyObjectRef {
0 commit comments