2020-11-19 10:36:52 +00:00
# include "lang/evaluator.hpp"
2020-11-20 19:26:19 +00:00
# include <bit>
2020-11-19 10:36:52 +00:00
# include <unordered_map>
namespace hex : : lang {
2020-11-22 15:22:02 +00:00
Evaluator : : Evaluator ( prv : : Provider * & provider , std : : endian dataEndianess ) : m_provider ( provider ) , m_dataEndianess ( dataEndianess ) {
PatternData : : setEndianess ( dataEndianess ) ;
2020-11-19 10:36:52 +00:00
}
std : : pair < PatternData * , size_t > Evaluator : : createStructPattern ( ASTNodeVariableDecl * varDeclNode , u64 offset ) {
std : : vector < PatternData * > members ;
auto structNode = static_cast < ASTNodeStruct * > ( this - > m_types [ varDeclNode - > getCustomVariableTypeName ( ) ] ) ;
2020-11-27 20:20:23 +00:00
if ( structNode = = nullptr ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " '%s' does not name a type " , varDeclNode - > getCustomVariableTypeName ( ) . c_str ( ) ) } ;
2020-11-19 10:36:52 +00:00
return { nullptr , 0 } ;
2020-11-27 20:20:23 +00:00
}
2020-11-19 10:36:52 +00:00
size_t structSize = 0 ;
for ( const auto & node : structNode - > getNodes ( ) ) {
const auto & member = static_cast < ASTNodeVariableDecl * > ( node ) ;
2020-11-21 22:00:09 +00:00
u64 memberOffset = 0 ;
2020-11-19 10:36:52 +00:00
2020-11-22 15:22:02 +00:00
if ( member - > getPointerSize ( ) . has_value ( ) ) {
2020-11-21 22:00:09 +00:00
this - > m_provider - > read ( offset + structSize , & memberOffset , member - > getPointerSize ( ) . value ( ) ) ;
2020-11-22 15:22:02 +00:00
memberOffset = hex : : changeEndianess ( memberOffset , member - > getPointerSize ( ) . value ( ) , this - > m_dataEndianess ) ;
}
2020-11-21 22:00:09 +00:00
else
memberOffset = offset + structSize ;
2020-11-19 10:36:52 +00:00
2020-11-21 22:00:09 +00:00
const auto typeDeclNode = static_cast < ASTNodeTypeDecl * > ( this - > m_types [ member - > getCustomVariableTypeName ( ) ] ) ;
2020-11-19 10:36:52 +00:00
2020-11-21 22:00:09 +00:00
PatternData * pattern = nullptr ;
u64 memberSize = 0 ;
if ( member - > getVariableType ( ) = = Token : : TypeToken : : Type : : Signed8Bit & & member - > getArraySize ( ) > 1 ) {
std : : tie ( pattern , memberSize ) = this - > createStringPattern ( member , memberOffset ) ;
2020-11-19 10:36:52 +00:00
} else if ( member - > getVariableType ( ) = = Token : : TypeToken : : Type : : CustomType
2020-11-20 14:52:06 +00:00
& & typeDeclNode ! = nullptr & & typeDeclNode - > getAssignedType ( ) = = Token : : TypeToken : : Type : : Signed8Bit
2020-11-19 10:36:52 +00:00
& & member - > getArraySize ( ) > 1 ) {
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createStringPattern ( member , memberOffset ) ;
2020-11-19 10:36:52 +00:00
}
else if ( member - > getArraySize ( ) > 1 ) {
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createArrayPattern ( member , memberOffset ) ;
2020-11-19 10:36:52 +00:00
}
2020-11-21 19:19:33 +00:00
else if ( member - > getArraySizeVariable ( ) . has_value ( ) ) {
std : : optional < size_t > arraySize ;
for ( auto & prevMember : members ) {
if ( prevMember - > getPatternType ( ) = = PatternData : : Type : : Unsigned & & prevMember - > getName ( ) = = member - > getArraySizeVariable ( ) ) {
u64 value = 0 ;
this - > m_provider - > read ( prevMember - > getOffset ( ) , & value , prevMember - > getSize ( ) ) ;
2020-11-22 15:22:02 +00:00
value = hex : : changeEndianess ( value , prevMember - > getSize ( ) , this - > m_dataEndianess ) ;
2020-11-21 19:19:33 +00:00
arraySize = value ;
}
}
2020-11-27 20:20:23 +00:00
if ( ! arraySize . has_value ( ) ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " '%s' does not name a previous member of '%s' " , member - > getArraySizeVariable ( ) . value ( ) . c_str ( ) , varDeclNode - > getCustomVariableTypeName ( ) . c_str ( ) ) } ;
2020-11-21 19:19:33 +00:00
return { nullptr , 0 } ;
2020-11-27 20:20:23 +00:00
}
2020-11-21 19:19:33 +00:00
2020-11-27 20:20:23 +00:00
ASTNodeVariableDecl * processedMember = new ASTNodeVariableDecl ( member - > getLineNumber ( ) , member - > getVariableType ( ) , member - > getVariableName ( ) , member - > getCustomVariableTypeName ( ) , member - > getOffset ( ) , arraySize . value ( ) ) ;
2020-11-21 19:19:33 +00:00
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createArrayPattern ( processedMember , memberOffset ) ;
2020-11-21 19:19:33 +00:00
}
2020-11-19 10:36:52 +00:00
else if ( member - > getVariableType ( ) ! = Token : : TypeToken : : Type : : CustomType ) {
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createBuiltInTypePattern ( member , memberOffset ) ;
2020-11-19 10:36:52 +00:00
}
else {
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createCustomTypePattern ( member , memberOffset ) ;
}
2020-11-19 10:36:52 +00:00
2020-11-21 22:00:09 +00:00
if ( pattern = = nullptr )
return { nullptr , 0 } ;
2020-11-19 10:36:52 +00:00
2020-11-21 22:00:09 +00:00
if ( member - > getPointerSize ( ) . has_value ( ) ) {
members . push_back ( new PatternDataPointer ( offset + structSize , member - > getPointerSize ( ) . value ( ) , member - > getVariableName ( ) , pattern ) ) ;
structSize + = member - > getPointerSize ( ) . value ( ) ;
}
else {
2020-11-19 10:36:52 +00:00
members . push_back ( pattern ) ;
2020-11-21 22:00:09 +00:00
structSize + = memberSize ;
2020-11-19 10:36:52 +00:00
}
}
return { new PatternDataStruct ( offset , structSize , varDeclNode - > getVariableName ( ) , structNode - > getName ( ) , members , 0x00FFFFFF ) , structSize } ;
}
2020-11-20 20:29:28 +00:00
std : : pair < PatternData * , size_t > Evaluator : : createUnionPattern ( ASTNodeVariableDecl * varDeclNode , u64 offset ) {
std : : vector < PatternData * > members ;
auto unionNode = static_cast < ASTNodeUnion * > ( this - > m_types [ varDeclNode - > getCustomVariableTypeName ( ) ] ) ;
2020-11-27 20:20:23 +00:00
if ( unionNode = = nullptr ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " '%s' does not name a type " , varDeclNode - > getCustomVariableTypeName ( ) . c_str ( ) ) } ;
2020-11-20 20:29:28 +00:00
return { nullptr , 0 } ;
2020-11-27 20:20:23 +00:00
}
2020-11-20 20:29:28 +00:00
size_t unionSize = 0 ;
for ( const auto & node : unionNode - > getNodes ( ) ) {
const auto & member = static_cast < ASTNodeVariableDecl * > ( node ) ;
2020-11-21 22:00:09 +00:00
u64 memberOffset = 0 ;
2020-11-22 15:22:02 +00:00
if ( member - > getPointerSize ( ) . has_value ( ) ) {
2020-11-21 22:00:09 +00:00
this - > m_provider - > read ( offset + unionSize , & memberOffset , member - > getPointerSize ( ) . value ( ) ) ;
2020-11-22 15:22:02 +00:00
memberOffset = hex : : changeEndianess ( memberOffset , member - > getPointerSize ( ) . value ( ) , this - > m_dataEndianess ) ;
}
2020-11-21 22:00:09 +00:00
else
memberOffset = offset ;
2020-11-20 20:29:28 +00:00
const auto typeDeclNode = static_cast < ASTNodeTypeDecl * > ( this - > m_types [ member - > getCustomVariableTypeName ( ) ] ) ;
2020-11-21 22:00:09 +00:00
PatternData * pattern = nullptr ;
u64 memberSize = 0 ;
2020-11-20 20:29:28 +00:00
2020-11-21 22:00:09 +00:00
if ( member - > getVariableType ( ) = = Token : : TypeToken : : Type : : Signed8Bit & & member - > getArraySize ( ) > 1 ) {
std : : tie ( pattern , memberSize ) = this - > createStringPattern ( member , memberOffset ) ;
2020-11-20 20:29:28 +00:00
} else if ( member - > getVariableType ( ) = = Token : : TypeToken : : Type : : CustomType
& & typeDeclNode ! = nullptr & & typeDeclNode - > getAssignedType ( ) = = Token : : TypeToken : : Type : : Signed8Bit
& & member - > getArraySize ( ) > 1 ) {
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createStringPattern ( member , memberOffset ) ;
2020-11-20 20:29:28 +00:00
}
else if ( member - > getArraySize ( ) > 1 ) {
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createArrayPattern ( member , memberOffset ) ;
2020-11-20 20:29:28 +00:00
}
2020-11-21 22:00:09 +00:00
else if ( member - > getArraySizeVariable ( ) . has_value ( ) ) {
std : : optional < size_t > arraySize ;
for ( auto & prevMember : members ) {
if ( prevMember - > getPatternType ( ) = = PatternData : : Type : : Unsigned & & prevMember - > getName ( ) = = member - > getArraySizeVariable ( ) ) {
u64 value = 0 ;
this - > m_provider - > read ( prevMember - > getOffset ( ) , & value , prevMember - > getSize ( ) ) ;
2020-11-22 15:22:02 +00:00
value = hex : : changeEndianess ( value , prevMember - > getSize ( ) , this - > m_dataEndianess ) ;
2020-11-21 22:00:09 +00:00
arraySize = value ;
}
}
2020-11-20 20:29:28 +00:00
2020-11-27 20:20:23 +00:00
if ( ! arraySize . has_value ( ) ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " '%s' does not name a previous member of '%s' " , member - > getArraySizeVariable ( ) . value ( ) . c_str ( ) , varDeclNode - > getCustomVariableTypeName ( ) . c_str ( ) ) } ;
2020-11-20 20:29:28 +00:00
return { nullptr , 0 } ;
2020-11-27 20:20:23 +00:00
}
2020-11-20 20:29:28 +00:00
2020-12-05 09:36:30 +00:00
if ( arraySize . value ( ) = = 0 ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " Value of '%s' is zero " , member - > getArraySizeVariable ( ) . value ( ) . c_str ( ) ) } ;
return { nullptr , 0 } ;
}
2020-11-27 20:20:23 +00:00
ASTNodeVariableDecl * processedMember = new ASTNodeVariableDecl ( member - > getLineNumber ( ) , member - > getVariableType ( ) , member - > getVariableName ( ) , member - > getCustomVariableTypeName ( ) , member - > getOffset ( ) , arraySize . value ( ) ) ;
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createArrayPattern ( processedMember , memberOffset ) ;
}
else if ( member - > getVariableType ( ) ! = Token : : TypeToken : : Type : : CustomType ) {
std : : tie ( pattern , memberSize ) = this - > createBuiltInTypePattern ( member , memberOffset ) ;
2020-11-20 20:29:28 +00:00
}
else {
2020-11-21 22:00:09 +00:00
std : : tie ( pattern , memberSize ) = this - > createCustomTypePattern ( member , memberOffset ) ;
}
2020-11-20 20:29:28 +00:00
2020-11-21 22:00:09 +00:00
if ( pattern = = nullptr )
return { nullptr , 0 } ;
2020-11-20 20:29:28 +00:00
2020-11-21 22:00:09 +00:00
if ( member - > getPointerSize ( ) . has_value ( ) ) {
members . push_back ( new PatternDataPointer ( offset , member - > getPointerSize ( ) . value ( ) , member - > getVariableName ( ) , pattern ) ) ;
unionSize = std : : max ( size_t ( member - > getPointerSize ( ) . value ( ) ) , unionSize ) ;
}
else {
2020-11-20 20:29:28 +00:00
members . push_back ( pattern ) ;
2020-11-21 22:00:09 +00:00
unionSize = std : : max ( memberSize , unionSize ) ;
2020-11-20 20:29:28 +00:00
}
}
return { new PatternDataUnion ( offset , unionSize , varDeclNode - > getVariableName ( ) , unionNode - > getName ( ) , members , 0x00FFFFFF ) , unionSize } ;
}
2020-11-19 10:36:52 +00:00
std : : pair < PatternData * , size_t > Evaluator : : createEnumPattern ( ASTNodeVariableDecl * varDeclNode , u64 offset ) {
auto * enumType = static_cast < ASTNodeEnum * > ( this - > m_types [ varDeclNode - > getCustomVariableTypeName ( ) ] ) ;
2020-11-27 20:20:23 +00:00
if ( enumType = = nullptr ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " '%s' does not name a type " , varDeclNode - > getCustomVariableTypeName ( ) . c_str ( ) ) } ;
2020-11-19 10:36:52 +00:00
return { nullptr , 0 } ;
2020-11-27 20:20:23 +00:00
}
2020-11-19 10:36:52 +00:00
size_t size = getTypeSize ( enumType - > getUnderlyingType ( ) ) ;
return { new PatternDataEnum ( offset , size , varDeclNode - > getVariableName ( ) , enumType - > getName ( ) , enumType - > getValues ( ) ) , size } ;
}
2020-11-20 19:26:19 +00:00
std : : pair < PatternData * , size_t > Evaluator : : createBitfieldPattern ( ASTNodeVariableDecl * varDeclNode , u64 offset ) {
auto * bitfieldType = static_cast < ASTNodeBitField * > ( this - > m_types [ varDeclNode - > getCustomVariableTypeName ( ) ] ) ;
2020-11-27 20:20:23 +00:00
if ( bitfieldType = = nullptr ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " '%s' does not name a type " , varDeclNode - > getCustomVariableTypeName ( ) . c_str ( ) ) } ;
2020-11-20 19:26:19 +00:00
return { nullptr , 0 } ;
2020-11-27 20:20:23 +00:00
}
2020-11-20 19:26:19 +00:00
size_t size = 0 ;
for ( auto & [ fieldName , fieldSize ] : bitfieldType - > getFields ( ) )
size + = fieldSize ;
size = std : : bit_ceil ( size ) / 8 ;
return { new PatternDataBitfield ( offset , size , varDeclNode - > getVariableName ( ) , bitfieldType - > getName ( ) , bitfieldType - > getFields ( ) ) , size } ;
}
2020-11-19 10:36:52 +00:00
std : : pair < PatternData * , size_t > Evaluator : : createArrayPattern ( ASTNodeVariableDecl * varDeclNode , u64 offset ) {
std : : vector < PatternData * > entries ;
2020-11-20 20:59:27 +00:00
size_t arrayOffset = 0 ;
2020-11-21 19:19:33 +00:00
std : : optional < u32 > arrayColor ;
2020-11-19 10:36:52 +00:00
for ( u32 i = 0 ; i < varDeclNode - > getArraySize ( ) ; i + + ) {
2020-11-27 20:20:23 +00:00
ASTNodeVariableDecl * nonArrayVarDeclNode = new ASTNodeVariableDecl ( varDeclNode - > getLineNumber ( ) , varDeclNode - > getVariableType ( ) , " [ " + std : : to_string ( i ) + " ] " , varDeclNode - > getCustomVariableTypeName ( ) , varDeclNode - > getOffset ( ) , 1 ) ;
2020-11-19 10:36:52 +00:00
2020-11-21 19:19:33 +00:00
2020-11-20 20:59:27 +00:00
if ( varDeclNode - > getVariableType ( ) = = Token : : TypeToken : : Type : : Padding ) {
return { new PatternDataPadding ( offset , varDeclNode - > getArraySize ( ) ) , varDeclNode - > getArraySize ( ) } ;
} else if ( varDeclNode - > getVariableType ( ) ! = Token : : TypeToken : : Type : : CustomType ) {
2020-11-21 19:19:33 +00:00
const auto & [ pattern , size ] = this - > createBuiltInTypePattern ( nonArrayVarDeclNode , offset + arrayOffset ) ;
2020-11-19 10:36:52 +00:00
if ( pattern = = nullptr )
return { nullptr , 0 } ;
2020-11-21 19:19:33 +00:00
if ( ! arrayColor . has_value ( ) )
arrayColor = pattern - > getColor ( ) ;
pattern - > setColor ( arrayColor . value ( ) ) ;
2020-11-19 10:36:52 +00:00
entries . push_back ( pattern ) ;
2020-11-20 20:59:27 +00:00
arrayOffset + = size ;
2020-11-19 10:36:52 +00:00
} else {
2020-11-20 20:59:27 +00:00
const auto & [ pattern , size ] = this - > createCustomTypePattern ( nonArrayVarDeclNode , offset + arrayOffset ) ;
2020-11-19 10:36:52 +00:00
if ( pattern = = nullptr )
return { nullptr , 0 } ;
2020-11-21 19:19:33 +00:00
if ( ! arrayColor . has_value ( ) )
arrayColor = pattern - > getColor ( ) ;
pattern - > setColor ( arrayColor . value ( ) ) ;
2020-11-19 10:36:52 +00:00
entries . push_back ( pattern ) ;
2020-11-20 20:59:27 +00:00
arrayOffset + = size ;
2020-11-19 10:36:52 +00:00
}
delete nonArrayVarDeclNode ;
}
2020-11-27 08:09:59 +00:00
return { new PatternDataArray ( offset , arrayOffset , varDeclNode - > getVariableName ( ) , entries , arrayColor . value ( ) ) , arrayOffset } ;
2020-11-19 10:36:52 +00:00
}
std : : pair < PatternData * , size_t > Evaluator : : createStringPattern ( ASTNodeVariableDecl * varDeclNode , u64 offset ) {
size_t arraySize = varDeclNode - > getArraySize ( ) ;
return { new PatternDataString ( offset , arraySize , varDeclNode - > getVariableName ( ) ) , arraySize } ;
}
std : : pair < PatternData * , size_t > Evaluator : : createCustomTypePattern ( ASTNodeVariableDecl * varDeclNode , u64 offset ) {
auto & currType = this - > m_types [ varDeclNode - > getCustomVariableTypeName ( ) ] ;
2020-11-27 20:20:23 +00:00
if ( currType = = nullptr ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " '%s' does not name a type " , varDeclNode - > getCustomVariableTypeName ( ) . c_str ( ) ) } ;
2020-11-19 10:36:52 +00:00
return { nullptr , 0 } ;
2020-11-27 20:20:23 +00:00
}
2020-11-19 10:36:52 +00:00
switch ( currType - > getType ( ) ) {
case ASTNode : : Type : : Struct :
return this - > createStructPattern ( varDeclNode , offset ) ;
2020-11-20 20:29:28 +00:00
case ASTNode : : Type : : Union :
return this - > createUnionPattern ( varDeclNode , offset ) ;
2020-11-19 10:36:52 +00:00
case ASTNode : : Type : : Enum :
return this - > createEnumPattern ( varDeclNode , offset ) ;
2020-11-20 19:26:19 +00:00
case ASTNode : : Type : : Bitfield :
return this - > createBitfieldPattern ( varDeclNode , offset ) ;
2020-11-19 10:36:52 +00:00
case ASTNode : : Type : : TypeDecl :
return this - > createBuiltInTypePattern ( varDeclNode , offset ) ;
}
return { nullptr , 0 } ;
}
std : : pair < PatternData * , size_t > Evaluator : : createBuiltInTypePattern ( ASTNodeVariableDecl * varDeclNode , u64 offset ) {
auto type = varDeclNode - > getVariableType ( ) ;
if ( type = = Token : : TypeToken : : Type : : CustomType ) {
const auto & currType = static_cast < ASTNodeTypeDecl * > ( this - > m_types [ varDeclNode - > getCustomVariableTypeName ( ) ] ) ;
2020-11-27 20:20:23 +00:00
if ( currType = = nullptr ) {
this - > m_error = { varDeclNode - > getLineNumber ( ) , hex : : format ( " '%s' does not name a type " , varDeclNode - > getCustomVariableTypeName ( ) . c_str ( ) ) } ;
2020-11-19 10:36:52 +00:00
return { nullptr , 0 } ;
2020-11-27 20:20:23 +00:00
}
2020-11-19 10:36:52 +00:00
type = currType - > getAssignedType ( ) ;
}
size_t typeSize = getTypeSize ( type ) ;
size_t arraySize = varDeclNode - > getArraySize ( ) ;
2020-11-20 20:59:27 +00:00
if ( isSigned ( type ) ) {
2020-11-19 10:36:52 +00:00
if ( typeSize = = 1 & & arraySize = = 1 )
return { new PatternDataCharacter ( offset , typeSize , varDeclNode - > getVariableName ( ) ) , 1 } ;
else if ( arraySize > 1 )
return createArrayPattern ( varDeclNode , offset ) ;
else
return { new PatternDataSigned ( offset , typeSize , varDeclNode - > getVariableName ( ) ) , typeSize * arraySize } ;
} else if ( isUnsigned ( varDeclNode - > getVariableType ( ) ) ) {
if ( arraySize > 1 )
return createArrayPattern ( varDeclNode , offset ) ;
else
return { new PatternDataUnsigned ( offset , typeSize , varDeclNode - > getVariableName ( ) ) , typeSize * arraySize } ;
} else if ( isFloatingPoint ( varDeclNode - > getVariableType ( ) ) ) {
if ( arraySize > 1 )
return createArrayPattern ( varDeclNode , offset ) ;
else
return { new PatternDataFloat ( offset , typeSize , varDeclNode - > getVariableName ( ) ) , typeSize * arraySize } ;
}
return { nullptr , 0 } ;
}
std : : pair < Result , std : : vector < PatternData * > > Evaluator : : evaluate ( const std : : vector < ASTNode * > & ast ) {
// Evaluate types
for ( const auto & node : ast ) {
switch ( node - > getType ( ) ) {
case ASTNode : : Type : : Struct :
{
auto * structNode = static_cast < ASTNodeStruct * > ( node ) ;
this - > m_types . emplace ( structNode - > getName ( ) , structNode ) ;
}
break ;
2020-11-20 20:29:28 +00:00
case ASTNode : : Type : : Union :
{
auto * unionNode = static_cast < ASTNodeUnion * > ( node ) ;
this - > m_types . emplace ( unionNode - > getName ( ) , unionNode ) ;
}
break ;
2020-11-19 10:36:52 +00:00
case ASTNode : : Type : : Enum :
{
auto * enumNode = static_cast < ASTNodeEnum * > ( node ) ;
this - > m_types . emplace ( enumNode - > getName ( ) , enumNode ) ;
}
break ;
2020-11-20 19:26:19 +00:00
case ASTNode : : Type : : Bitfield :
{
auto * bitfieldNode = static_cast < ASTNodeBitField * > ( node ) ;
this - > m_types . emplace ( bitfieldNode - > getName ( ) , bitfieldNode ) ;
}
break ;
2020-11-19 10:36:52 +00:00
case ASTNode : : Type : : TypeDecl :
{
auto * typeDeclNode = static_cast < ASTNodeTypeDecl * > ( node ) ;
if ( typeDeclNode - > getAssignedType ( ) = = Token : : TypeToken : : Type : : CustomType )
this - > m_types . emplace ( typeDeclNode - > getTypeName ( ) , this - > m_types [ typeDeclNode - > getAssignedCustomTypeName ( ) ] ) ;
else
this - > m_types . emplace ( typeDeclNode - > getTypeName ( ) , typeDeclNode ) ;
}
break ;
case ASTNode : : Type : : VariableDecl : break ;
case ASTNode : : Type : : Scope : break ;
}
}
// Evaluate variable declarations
std : : vector < PatternData * > variables ;
for ( const auto & node : ast ) {
if ( node - > getType ( ) ! = ASTNode : : Type : : VariableDecl )
continue ;
auto * varDeclNode = static_cast < ASTNodeVariableDecl * > ( node ) ;
if ( varDeclNode - > getVariableType ( ) = = Token : : TypeToken : : Type : : Signed8Bit & & varDeclNode - > getArraySize ( ) > 1 ) {
const auto & [ pattern , _ ] = createStringPattern ( varDeclNode , varDeclNode - > getOffset ( ) . value ( ) ) ;
variables . push_back ( pattern ) ;
}
else if ( varDeclNode - > getArraySize ( ) > 1 ) {
const auto & [ pattern , _ ] = this - > createArrayPattern ( varDeclNode , varDeclNode - > getOffset ( ) . value ( ) ) ;
variables . push_back ( pattern ) ;
} else if ( varDeclNode - > getVariableType ( ) ! = Token : : TypeToken : : Type : : CustomType ) {
const auto & [ pattern , _ ] = this - > createBuiltInTypePattern ( varDeclNode , varDeclNode - > getOffset ( ) . value ( ) ) ;
variables . push_back ( pattern ) ;
} else {
const auto & [ pattern , _ ] = this - > createCustomTypePattern ( varDeclNode , varDeclNode - > getOffset ( ) . value ( ) ) ;
variables . push_back ( pattern ) ;
}
}
for ( const auto & var : variables )
if ( var = = nullptr )
return { ResultEvaluatorError , { } } ;
return { ResultSuccess , variables } ;
}
}