@@ -1521,6 +1521,31 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
1521
1521
ASR::ttype_t *type = ASRUtils::TYPE (ASR::make_Tuple_t (al, loc,
1522
1522
types.p , types.size ()));
1523
1523
return type;
1524
+ } else if (var_annotation == " Callable" ) {
1525
+ LCOMPILERS_ASSERT (AST::is_a<AST::Tuple_t>(*s->m_slice ));
1526
+ AST::Tuple_t *t = AST::down_cast<AST::Tuple_t>(s->m_slice );
1527
+ LCOMPILERS_ASSERT (t->n_elts <= 2 && t->n_elts >= 1 );
1528
+ Vec<ASR::ttype_t *> arg_types;
1529
+ LCOMPILERS_ASSERT (AST::is_a<AST::List_t>(*t->m_elts [0 ]));
1530
+
1531
+ AST::List_t *arg_list = AST::down_cast<AST::List_t>(t->m_elts [0 ]);
1532
+ if (arg_list->n_elts > 0 ) {
1533
+ arg_types.reserve (al, arg_list->n_elts );
1534
+ for (size_t i=0 ; i<arg_list->n_elts ; i++) {
1535
+ arg_types.push_back (al, ast_expr_to_asr_type (loc, *arg_list->m_elts [i]));
1536
+ }
1537
+ } else {
1538
+ arg_types.reserve (al, 1 );
1539
+ }
1540
+ ASR::ttype_t * ret_type = nullptr ;
1541
+ if (t->n_elts == 2 ) {
1542
+ ret_type = ast_expr_to_asr_type (loc, *t->m_elts [1 ]);
1543
+ }
1544
+ ASR::ttype_t *type = ASRUtils::TYPE (ASR::make_FunctionType_t (al, loc, arg_types.p ,
1545
+ arg_types.size (), ret_type, ASR::abiType::Source,
1546
+ ASR::deftypeType::Interface, nullptr , false , false ,
1547
+ false , false , false , nullptr , 0 , nullptr , 0 , false ));
1548
+ return type;
1524
1549
} else if (var_annotation == " set" ) {
1525
1550
if (AST::is_a<AST::Name_t>(*s->m_slice )) {
1526
1551
ASR::ttype_t *type = ast_expr_to_asr_type (loc, *s->m_slice );
@@ -3380,6 +3405,69 @@ class SymbolTableVisitor : public CommonVisitor<SymbolTableVisitor> {
3380
3405
tmp = tmp0;
3381
3406
}
3382
3407
3408
+ ASR::symbol_t * create_implicit_interface_function (Location &loc, ASR::FunctionType_t *func, std::string func_name) {
3409
+ SymbolTable *parent_scope = current_scope;
3410
+ current_scope = al.make_new <SymbolTable>(parent_scope);
3411
+
3412
+ Vec<ASR::expr_t *> args;
3413
+ args.reserve (al, func->n_arg_types );
3414
+ std::string sym_name = to_lower (func_name);
3415
+ for (size_t i=0 ; i<func->n_arg_types ; i++) {
3416
+ std::string arg_name = sym_name + " _arg_" + std::to_string (i);
3417
+ arg_name = to_lower (arg_name);
3418
+ ASR::symbol_t *v;
3419
+ SetChar variable_dependencies_vec;
3420
+ variable_dependencies_vec.reserve (al, 1 );
3421
+ ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec,
3422
+ func->m_arg_types [i]);
3423
+ v = ASR::down_cast<ASR::symbol_t >(
3424
+ ASR::make_Variable_t (al, loc,
3425
+ current_scope, s2c (al, arg_name), variable_dependencies_vec.p ,
3426
+ variable_dependencies_vec.size (), ASRUtils::intent_unspecified,
3427
+ nullptr , nullptr , ASR::storage_typeType::Default, func->m_arg_types [i],
3428
+ ASR::abiType::Source, ASR::Public, ASR::presenceType::Required,
3429
+ false ));
3430
+ current_scope->add_symbol (arg_name, v);
3431
+ LCOMPILERS_ASSERT (v != nullptr )
3432
+ args.push_back (al, ASRUtils::EXPR (ASR::make_Var_t (al, loc,
3433
+ v)));
3434
+ }
3435
+
3436
+ ASR::expr_t *to_return = nullptr ;
3437
+ if (func->m_return_var_type ) {
3438
+ std::string return_var_name = sym_name + " _return_var_name" ;
3439
+ SetChar variable_dependencies_vec;
3440
+ variable_dependencies_vec.reserve (al, 1 );
3441
+ ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec,
3442
+ func->m_return_var_type );
3443
+ ASR::asr_t *return_var = ASR::make_Variable_t (al, loc,
3444
+ current_scope, s2c (al, return_var_name), variable_dependencies_vec.p ,
3445
+ variable_dependencies_vec.size (), ASRUtils::intent_return_var,
3446
+ nullptr , nullptr , ASR::storage_typeType::Default, func->m_return_var_type ,
3447
+ ASR::abiType::Source, ASR::Public, ASR::presenceType::Required,
3448
+ false );
3449
+ current_scope->add_symbol (return_var_name, ASR::down_cast<ASR::symbol_t >(return_var));
3450
+ to_return = ASRUtils::EXPR (ASR::make_Var_t (al, loc,
3451
+ ASR::down_cast<ASR::symbol_t >(return_var)));
3452
+ }
3453
+
3454
+ tmp = ASRUtils::make_Function_t_util (
3455
+ al, loc,
3456
+ /* a_symtab */ current_scope,
3457
+ /* a_name */ s2c (al, sym_name),
3458
+ nullptr , 0 ,
3459
+ /* a_args */ args.p ,
3460
+ /* n_args */ args.size (),
3461
+ /* a_body */ nullptr ,
3462
+ /* n_body */ 0 ,
3463
+ /* a_return_var */ to_return,
3464
+ ASR::abiType::BindC, ASR::accessType::Public, ASR::deftypeType::Interface,
3465
+ nullptr , false , false , false , false , false , /* a_type_parameters */ nullptr ,
3466
+ /* n_type_parameters */ 0 , nullptr , 0 , false , false , false );
3467
+ current_scope = parent_scope;
3468
+ return ASR::down_cast<ASR::symbol_t >(tmp);
3469
+ }
3470
+
3383
3471
void visit_FunctionDef (const AST::FunctionDef_t &x) {
3384
3472
dependencies.clear (al);
3385
3473
SymbolTable *parent_scope = current_scope;
@@ -3497,20 +3585,26 @@ class SymbolTableVisitor : public CommonVisitor<SymbolTableVisitor> {
3497
3585
if (current_procedure_abi_type == ASR::abiType::BindC) {
3498
3586
value_attr = true ;
3499
3587
}
3500
- SetChar variable_dependencies_vec;
3501
- variable_dependencies_vec.reserve (al, 1 );
3502
- ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec, arg_type, init_expr, value);
3503
- ASR::asr_t *v = ASR::make_Variable_t (al, loc, current_scope,
3504
- s2c (al, arg_s), variable_dependencies_vec.p ,
3505
- variable_dependencies_vec.size (),
3506
- s_intent, init_expr, value, storage_type, arg_type,
3507
- current_procedure_abi_type, s_access, s_presence,
3508
- value_attr);
3509
- current_scope->add_symbol (arg_s, ASR::down_cast<ASR::symbol_t >(v));
3510
-
3511
- ASR::symbol_t *var = current_scope->get_symbol (arg_s);
3588
+ ASR::symbol_t *v;
3589
+ if (ASR::is_a<ASR::FunctionType_t>(*arg_type)) {
3590
+ ASR::FunctionType_t *func = ASR::down_cast<ASR::FunctionType_t>(arg_type);
3591
+ v = create_implicit_interface_function (loc, func, arg_s);
3592
+ } else {
3593
+ SetChar variable_dependencies_vec;
3594
+ variable_dependencies_vec.reserve (al, 1 );
3595
+ ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec, arg_type, init_expr, value);
3596
+ ASR::asr_t *_tmp = ASR::make_Variable_t (al, loc, current_scope,
3597
+ s2c (al, arg_s), variable_dependencies_vec.p ,
3598
+ variable_dependencies_vec.size (),
3599
+ s_intent, init_expr, value, storage_type, arg_type,
3600
+ current_procedure_abi_type, s_access, s_presence,
3601
+ value_attr);
3602
+ v = ASR::down_cast<ASR::symbol_t >(_tmp);
3603
+
3604
+ }
3605
+ current_scope->add_symbol (arg_s, v);
3512
3606
args.push_back (al, ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc ,
3513
- var )));
3607
+ v )));
3514
3608
}
3515
3609
ASR::accessType s_access = ASR::accessType::Public;
3516
3610
ASR::deftypeType deftype = ASR::deftypeType::Implementation;
0 commit comments