| 532 | } |
| 533 | |
| 534 | bool EvaluateExpression( ParserState& state, ASTNode* node, Type& type, ExpressionValue& value, StateValue* stateValues ) |
| 535 | { |
| 536 | if( !node ) |
| 537 | { |
| 538 | return false; |
| 539 | } |
| 540 | |
| 541 | type.symbol = nullptr; |
| 542 | switch( node->GetNodeType() ) |
| 543 | { |
| 544 | case NT_CONSTANT: |
| 545 | switch( node->GetToken()->type ) |
| 546 | { |
| 547 | case OP_INT_CONST: { |
| 548 | type.FromTokenType( OP_INT ); |
| 549 | ExpressionValueElement element; |
| 550 | element.intValue = ParseNumber( node->GetToken()->stringValue.start, node->GetToken()->stringValue.end ); |
| 551 | value.push_back( element ); |
| 552 | } |
| 553 | return true; |
| 554 | case OP_BOOL_CONST: { |
| 555 | type.FromTokenType( OP_INT ); |
| 556 | ExpressionValueElement element; |
| 557 | element.intValue = node->GetToken()->intValue != 0 ? 1 : 0; |
| 558 | value.push_back( element ); |
| 559 | } |
| 560 | return true; |
| 561 | case OP_FLOAT_CONST: { |
| 562 | type.FromTokenType( OP_FLOAT ); |
| 563 | ExpressionValueElement element; |
| 564 | element.floatValue = ParseFloat( node->GetToken()->stringValue.start, node->GetToken()->stringValue.end ); |
| 565 | value.push_back( element ); |
| 566 | } |
| 567 | return true; |
| 568 | case OP_STRING_CONST: { |
| 569 | type.FromTokenType( OP_STRING ); |
| 570 | ExpressionValueElement element; |
| 571 | element.stringValue = ParseString( node->GetToken()->stringValue ); |
| 572 | value.push_back( element ); |
| 573 | } |
| 574 | return true; |
| 575 | } |
| 576 | return false; |
| 577 | case NT_VAR_IDENTIFIER: { |
| 578 | if( node->GetSymbol()->definition == nullptr ) |
| 579 | { |
| 580 | state.ShowMessage( node->GetLocation(), EC_UNINITIALIZED_VAR, ToString( node->GetSymbol()->name ).c_str() ); |
| 581 | return false; |
| 582 | } |
| 583 | ASTNode* definition = node->GetSymbol()->definition; |
| 584 | if( definition->GetChildOrNull( 1 ) == nullptr ) |
| 585 | { |
| 586 | state.ShowMessage( definition->GetToken()->fileLocation, EC_UNINITIALIZED_VAR, ToString( definition->GetSymbol()->name ).c_str() ); |
| 587 | return false; |
| 588 | } |
| 589 | type = node->GetSymbol()->type; |
| 590 | return EvaluateInitializer( state, definition->GetChildOrNull( 1 ), type, value, nullptr ); |
| 591 | } |
no test coverage detected