| 580 | } |
| 581 | |
| 582 | void ast_globalLet ( yyscan_t scanner, bool kwd_let, bool glob_shar, bool pub_var, |
| 583 | AnnotationArgumentList * ann, VariableDeclaration * decl ) { |
| 584 | auto pDecl = decl; |
| 585 | if ( pDecl->pTypeDecl ) { |
| 586 | for ( const auto & name_at : *pDecl->pNameList ) { |
| 587 | VariablePtr pVar = new Variable(); |
| 588 | pVar->name = name_at.name; |
| 589 | pVar->aka = name_at.aka; |
| 590 | if ( !name_at.aka.empty() ) { |
| 591 | das_yyerror(scanner,"global variable " + name_at.name + " can't have an aka",name_at.at, |
| 592 | CompilationError::invalid_global_aka); |
| 593 | } |
| 594 | pVar->at = name_at.at; |
| 595 | if ( pDecl->pNameList->size()>1 ) { |
| 596 | pVar->type = new TypeDecl(*pDecl->pTypeDecl); |
| 597 | } else { |
| 598 | pVar->type = pDecl->pTypeDecl; pDecl->pTypeDecl = nullptr; |
| 599 | } |
| 600 | if ( pDecl->pInit ) { |
| 601 | if ( pDecl->pNameList->size()>1 ) { |
| 602 | pVar->init = pDecl->pInit->clone(); |
| 603 | } else { |
| 604 | pVar->init = pDecl->pInit; pDecl->pInit = nullptr; |
| 605 | } |
| 606 | pVar->init_via_move = pDecl->init_via_move; |
| 607 | pVar->init_via_clone = pDecl->init_via_clone; |
| 608 | } |
| 609 | if ( kwd_let ) { |
| 610 | pVar->type->constant = true; |
| 611 | } else { |
| 612 | pVar->type->removeConstant = true; |
| 613 | } |
| 614 | pVar->global_shared = glob_shar; |
| 615 | pVar->private_variable = !pub_var; |
| 616 | if ( ann ) { |
| 617 | // note: we can do this because the annotation syntax is for single variable only |
| 618 | pVar->annotation = das::move(*ann); |
| 619 | delete ann; |
| 620 | ann = nullptr; |
| 621 | } |
| 622 | if ( !yyextra->g_Program->addVariable(pVar) ) |
| 623 | das_yyerror(scanner,"global variable is already declared " + name_at.name,name_at.at, |
| 624 | CompilationError::already_declared_global); |
| 625 | } |
| 626 | } |
| 627 | delete pDecl; |
| 628 | } |
| 629 | |
| 630 | bool isOpName ( const string & name ) { |
| 631 | return !(isalpha(name[0]) || name[0]=='_' || name[0]=='`'); |
no test coverage detected