mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 15:54:45 -08:00
member proc usage reductions on CodeTypes complete (Typedef, Union, Using, Var)
proceeding to finalize the AST interface reductions...
This commit is contained in:
parent
05e65aa464
commit
defe42c15c
@ -557,7 +557,7 @@ void to_string( AST* self, String* result )
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Typedef:
|
case Typedef:
|
||||||
cast(CodeTypedef, {self}).to_string( * result );
|
to_string(cast(CodeTypedef, {self}), result );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Typename:
|
case Typename:
|
||||||
@ -565,19 +565,19 @@ void to_string( AST* self, String* result )
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Union:
|
case Union:
|
||||||
cast(CodeUnion, {self}).to_string( * result );
|
to_string( cast(CodeUnion, {self}), result );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Using:
|
case Using:
|
||||||
cast(CodeUsing, {self}).to_string( * result );
|
to_string(cast(CodeUsing, {self}), result );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Using_Namespace:
|
case Using_Namespace:
|
||||||
cast(CodeUsing, {self}).to_string_ns( * result );
|
to_string_ns(cast(CodeUsing, {self}), result );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Variable:
|
case Variable:
|
||||||
cast(CodeVar, {self}).to_string( * result );
|
to_string(cast(CodeVar, {self}), result );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Enum_Body:
|
case Enum_Body:
|
||||||
|
@ -264,7 +264,6 @@ struct Code_POD
|
|||||||
{
|
{
|
||||||
AST* ast;
|
AST* ast;
|
||||||
};
|
};
|
||||||
|
|
||||||
static_assert( sizeof(Code) == sizeof(Code_POD), "ERROR: Code is not POD" );
|
static_assert( sizeof(Code) == sizeof(Code_POD), "ERROR: Code is not POD" );
|
||||||
|
|
||||||
// Desired width of the AST data structure.
|
// Desired width of the AST data structure.
|
||||||
@ -421,73 +420,9 @@ struct AST
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AST_POD
|
|
||||||
{
|
|
||||||
union {
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
AST* InlineCmt; // Class, Constructor, Destructor, Enum, Friend, Functon, Operator, OpCast, Struct, Typedef, Using, Variable
|
|
||||||
AST* Attributes; // Class, Enum, Function, Struct, Typedef, Union, Using, Variable
|
|
||||||
AST* Specs; // Destructor, Function, Operator, Typename, Variable
|
|
||||||
union {
|
|
||||||
AST* InitializerList; // Constructor
|
|
||||||
AST* ParentType; // Class, Struct, ParentType->Next has a possible list of interfaces.
|
|
||||||
AST* ReturnType; // Function, Operator, Typename
|
|
||||||
AST* UnderlyingType; // Enum, Typedef
|
|
||||||
AST* ValueType; // Parameter, Variable
|
|
||||||
};
|
|
||||||
union {
|
|
||||||
AST* Macro; // Parameter
|
|
||||||
AST* BitfieldSize; // Variable (Class/Struct Data Member)
|
|
||||||
AST* Params; // Constructor, Function, Operator, Template, Typename
|
|
||||||
};
|
|
||||||
union {
|
|
||||||
AST* ArrExpr; // Typename
|
|
||||||
AST* Body; // Class, Constructr, Destructor, Enum, Friend, Function, Namespace, Struct, Union
|
|
||||||
AST* Declaration; // Friend, Template
|
|
||||||
AST* Value; // Parameter, Variable
|
|
||||||
};
|
|
||||||
union {
|
|
||||||
AST* NextVar; // Variable; Possible way to handle comma separated variables declarations. ( , NextVar->Specs NextVar->Name NextVar->ArrExpr = NextVar->Value )
|
|
||||||
AST* SuffixSpecs; // Only used with typenames, to store the function suffix if typename is function signature. ( May not be needed )
|
|
||||||
AST* PostNameMacro; // Only used with parameters for specifically UE_REQUIRES (Thanks Unreal)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
StringCached Content; // Attributes, Comment, Execution, Include
|
|
||||||
struct {
|
|
||||||
SpecifierT ArrSpecs[AST_ArrSpecs_Cap]; // Specifiers
|
|
||||||
AST* NextSpecs; // Specifiers; If ArrSpecs is full, then NextSpecs is used.
|
|
||||||
};
|
|
||||||
};
|
|
||||||
union {
|
|
||||||
AST* Prev;
|
|
||||||
AST* Front;
|
|
||||||
AST* Last;
|
|
||||||
};
|
|
||||||
union {
|
|
||||||
AST* Next;
|
|
||||||
AST* Back;
|
|
||||||
};
|
|
||||||
parser::Token* Token; // Reference to starting token, only avaialble if it was derived from parsing.
|
|
||||||
AST* Parent;
|
|
||||||
StringCached Name;
|
|
||||||
CodeT Type;
|
|
||||||
CodeFlag CodeFlags;
|
|
||||||
ModuleFlag ModuleFlags;
|
|
||||||
union {
|
|
||||||
b32 IsFunction; // Used by typedef to not serialize the name field.
|
|
||||||
b32 IsParamPack; // Used by typename to know if type should be considered a parameter pack.
|
|
||||||
OperatorT Op;
|
|
||||||
AccessSpec ParentAccess;
|
|
||||||
s32 NumEntries;
|
|
||||||
s32 VarConstructorInit; // Used by variables to know that initialization is using a constructor expression instead of an assignment expression.
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// Its intended for the AST to have equivalent size to its POD.
|
// Its intended for the AST to have equivalent size to its POD.
|
||||||
// All extra functionality within the AST namespace should just be syntatic sugar.
|
// All extra functionality within the AST namespace should just be syntatic sugar.
|
||||||
static_assert( sizeof(AST) == sizeof(AST_POD), "ERROR: AST IS NOT POD" );
|
static_assert( sizeof(AST) == AST_POD_Size, "ERROR: AST POD is not size of AST_POD_Size" );
|
||||||
static_assert( sizeof(AST_POD) == AST_POD_Size, "ERROR: AST POD is not size of AST_POD_Size" );
|
|
||||||
|
|
||||||
// Used when the its desired when omission is allowed in a definition.
|
// Used when the its desired when omission is allowed in a definition.
|
||||||
#define NoCode { nullptr }
|
#define NoCode { nullptr }
|
||||||
|
@ -1093,46 +1093,46 @@ void to_string(CodeTemplate self, String* result )
|
|||||||
append_fmt( result, "template<>\n%S", GEN_NS to_string(self->Declaration) );
|
append_fmt( result, "template<>\n%S", GEN_NS to_string(self->Declaration) );
|
||||||
}
|
}
|
||||||
|
|
||||||
String CodeTypedef::to_string()
|
String to_string(CodeTypedef self)
|
||||||
{
|
{
|
||||||
String result = string_make( GlobalAllocator, "" );
|
String result = string_make( GlobalAllocator, "" );
|
||||||
to_string( result );
|
to_string( self, & result );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeTypedef::to_string( String& result )
|
void to_string(CodeTypedef self, String* result )
|
||||||
{
|
{
|
||||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
if ( bitfield_is_equal( u32, self->ModuleFlags, ModuleFlag_Export ))
|
||||||
append( & result, "export " );
|
append( result, "export " );
|
||||||
|
|
||||||
append( & result, "typedef ");
|
append( result, "typedef ");
|
||||||
|
|
||||||
// Determines if the typedef is a function typename
|
// Determines if the typedef is a function typename
|
||||||
if ( ast->UnderlyingType->ReturnType )
|
if ( self->UnderlyingType->ReturnType )
|
||||||
append( & result, GEN_NS to_string(ast->UnderlyingType) );
|
append( result, GEN_NS to_string(self->UnderlyingType) );
|
||||||
else
|
else
|
||||||
append_fmt( & result, "%S %S", GEN_NS to_string(ast->UnderlyingType), ast->Name );
|
append_fmt( result, "%S %S", GEN_NS to_string(self->UnderlyingType), self->Name );
|
||||||
|
|
||||||
if ( ast->UnderlyingType->Type == ECode::Typename && ast->UnderlyingType->ArrExpr )
|
if ( self->UnderlyingType->Type == ECode::Typename && self->UnderlyingType->ArrExpr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ];", GEN_NS to_string(ast->UnderlyingType->ArrExpr) );
|
append_fmt( result, "[ %S ];", GEN_NS to_string(self->UnderlyingType->ArrExpr) );
|
||||||
|
|
||||||
AST* next_arr_expr = ast->UnderlyingType->ArrExpr->Next;
|
AST* next_arr_expr = self->UnderlyingType->ArrExpr->Next;
|
||||||
while ( next_arr_expr )
|
while ( next_arr_expr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ];", GEN_NS to_string(next_arr_expr) );
|
append_fmt( result, "[ %S ];", GEN_NS to_string(next_arr_expr) );
|
||||||
next_arr_expr = next_arr_expr->Next;
|
next_arr_expr = next_arr_expr->Next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
append( & result, ";" );
|
append( result, ";" );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ast->InlineCmt )
|
if ( self->InlineCmt )
|
||||||
append_fmt( & result, " %S", ast->InlineCmt->Content);
|
append_fmt( result, " %S", self->InlineCmt->Content);
|
||||||
else
|
else
|
||||||
append( & result, "\n");
|
append( result, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
String to_string(CodeType self)
|
String to_string(CodeType self)
|
||||||
@ -1188,235 +1188,235 @@ void to_string(CodeType self, String* result )
|
|||||||
append( result, "...");
|
append( result, "...");
|
||||||
}
|
}
|
||||||
|
|
||||||
String CodeUnion::to_string()
|
String to_string(CodeUnion self)
|
||||||
{
|
{
|
||||||
String result = string_make( GlobalAllocator, "" );
|
String result = string_make( GlobalAllocator, "" );
|
||||||
to_string( result );
|
to_string( self, & result );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeUnion::to_string( String& result )
|
void to_string(CodeUnion self, String* result )
|
||||||
{
|
{
|
||||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
if ( bitfield_is_equal( u32, self->ModuleFlags, ModuleFlag_Export ))
|
||||||
append( & result, "export " );
|
append( result, "export " );
|
||||||
|
|
||||||
append( & result, "union " );
|
append( result, "union " );
|
||||||
|
|
||||||
if ( ast->Attributes )
|
if ( self->Attributes )
|
||||||
append_fmt( & result, "%S ",GEN_NS to_string(ast->Attributes) );
|
append_fmt( result, "%S ",GEN_NS to_string(self->Attributes) );
|
||||||
|
|
||||||
if ( ast->Name )
|
if ( self->Name )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "%S\n{\n%S\n}"
|
append_fmt( result, "%S\n{\n%S\n}"
|
||||||
, ast->Name
|
, self->Name
|
||||||
, GEN_NS to_string(ast->Body)
|
, GEN_NS to_string(self->Body)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Anonymous union
|
// Anonymous union
|
||||||
append_fmt( & result, "\n{\n%S\n}"
|
append_fmt( result, "\n{\n%S\n}"
|
||||||
, GEN_NS to_string(ast->Body)
|
, GEN_NS to_string(self->Body)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) )
|
if ( self->Parent.ast == nullptr || ( self->Parent->Type != ECode::Typedef && self->Parent->Type != ECode::Variable ) )
|
||||||
append( & result, ";\n");
|
append( result, ";\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
String CodeUsing::to_string()
|
String to_string(CodeUsing self)
|
||||||
{
|
{
|
||||||
String result = string_make( GlobalAllocator, "" );
|
String result = string_make( GlobalAllocator, "" );
|
||||||
switch ( ast->Type )
|
switch ( self->Type )
|
||||||
{
|
{
|
||||||
using namespace ECode;
|
using namespace ECode;
|
||||||
case Using:
|
case Using:
|
||||||
to_string( result );
|
to_string( self, & result );
|
||||||
break;
|
break;
|
||||||
case Using_Namespace:
|
case Using_Namespace:
|
||||||
to_string_ns( result );
|
to_string_ns( self, & result );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeUsing::to_string( String& result )
|
void to_string(CodeUsing self, String* result )
|
||||||
{
|
{
|
||||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
if ( bitfield_is_equal( u32, self->ModuleFlags, ModuleFlag_Export ))
|
||||||
append( & result, "export " );
|
append( result, "export " );
|
||||||
|
|
||||||
if ( ast->Attributes )
|
if ( self->Attributes )
|
||||||
append_fmt( & result, "%S ",GEN_NS to_string(ast->Attributes) );
|
append_fmt( result, "%S ",GEN_NS to_string(self->Attributes) );
|
||||||
|
|
||||||
if ( ast->UnderlyingType )
|
if ( self->UnderlyingType )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "using %S = %S", ast->Name, GEN_NS to_string(ast->UnderlyingType) );
|
append_fmt( result, "using %S = %S", self->Name, GEN_NS to_string(self->UnderlyingType) );
|
||||||
|
|
||||||
if ( ast->UnderlyingType->ArrExpr )
|
if ( self->UnderlyingType->ArrExpr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ]", GEN_NS to_string(ast->UnderlyingType->ArrExpr) );
|
append_fmt( result, "[ %S ]", GEN_NS to_string(self->UnderlyingType->ArrExpr) );
|
||||||
|
|
||||||
AST* next_arr_expr = ast->UnderlyingType->ArrExpr->Next;
|
AST* next_arr_expr = self->UnderlyingType->ArrExpr->Next;
|
||||||
while ( next_arr_expr )
|
while ( next_arr_expr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ]", GEN_NS to_string(next_arr_expr) );
|
append_fmt( result, "[ %S ]", GEN_NS to_string(next_arr_expr) );
|
||||||
next_arr_expr = next_arr_expr->Next;
|
next_arr_expr = next_arr_expr->Next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
append( & result, ";" );
|
append( result, ";" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
append_fmt( & result, "using %S;", ast->Name );
|
append_fmt( result, "using %S;", self->Name );
|
||||||
|
|
||||||
if ( ast->InlineCmt )
|
if ( self->InlineCmt )
|
||||||
append_fmt( & result, " %S\n", ast->InlineCmt->Content );
|
append_fmt( result, " %S\n", self->InlineCmt->Content );
|
||||||
else
|
else
|
||||||
append( & result, "\n");
|
append( result, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeUsing::to_string_ns( String& result )
|
void to_string_ns(CodeUsing self, String* result )
|
||||||
{
|
{
|
||||||
if ( ast->InlineCmt )
|
if ( self->InlineCmt )
|
||||||
append_fmt( & result, "using namespace $S; %S", ast->Name, ast->InlineCmt->Content );
|
append_fmt( result, "using namespace $S; %S", self->Name, self->InlineCmt->Content );
|
||||||
else
|
else
|
||||||
append_fmt( & result, "using namespace %s;\n", ast->Name );
|
append_fmt( result, "using namespace %s;\n", self->Name );
|
||||||
}
|
}
|
||||||
|
|
||||||
String CodeVar::to_string()
|
String to_string(CodeVar self)
|
||||||
{
|
{
|
||||||
String result = string_make( GlobalAllocator, "" );
|
String result = string_make( GlobalAllocator, "" );
|
||||||
to_string( result );
|
to_string( self, & result );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeVar::to_string( String& result )
|
void to_string(CodeVar self, String* result )
|
||||||
{
|
{
|
||||||
if ( ast->Parent && ast->Parent->Type == ECode::Variable )
|
if ( self->Parent && self->Parent->Type == ECode::Variable )
|
||||||
{
|
{
|
||||||
// Its a comma-separated variable ( a NextVar )
|
// Its a comma-separated variable ( a NextVar )
|
||||||
|
|
||||||
if ( ast->Specs )
|
if ( self->Specs )
|
||||||
append_fmt( & result, "%S ", GEN_NS to_string(ast->Specs) );
|
append_fmt( result, "%S ", GEN_NS to_string(self->Specs) );
|
||||||
|
|
||||||
append( & result, ast->Name );
|
append( result, self->Name );
|
||||||
|
|
||||||
if ( ast->ValueType->ArrExpr )
|
if ( self->ValueType->ArrExpr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ]", GEN_NS to_string(ast->ValueType->ArrExpr) );
|
append_fmt( result, "[ %S ]", GEN_NS to_string(self->ValueType->ArrExpr) );
|
||||||
|
|
||||||
AST* next_arr_expr = ast->ValueType->ArrExpr->Next;
|
AST* next_arr_expr = self->ValueType->ArrExpr->Next;
|
||||||
while ( next_arr_expr )
|
while ( next_arr_expr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ]", GEN_NS to_string(next_arr_expr) );
|
append_fmt( result, "[ %S ]", GEN_NS to_string(next_arr_expr) );
|
||||||
next_arr_expr = next_arr_expr->Next;
|
next_arr_expr = next_arr_expr->Next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ast->Value )
|
if ( self->Value )
|
||||||
{
|
{
|
||||||
if ( ast->VarConstructorInit )
|
if ( self->VarConstructorInit )
|
||||||
append_fmt( & result, "( %S ", GEN_NS to_string(ast->Value) );
|
append_fmt( result, "( %S ", GEN_NS to_string(self->Value) );
|
||||||
else
|
else
|
||||||
append_fmt( & result, " = %S", GEN_NS to_string(ast->Value) );
|
append_fmt( result, " = %S", GEN_NS to_string(self->Value) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep the chain going...
|
// Keep the chain going...
|
||||||
if ( ast->NextVar )
|
if ( self->NextVar )
|
||||||
append_fmt( & result, ", %S", ast->NextVar.to_string() );
|
append_fmt( result, ", %S", self->NextVar.to_string() );
|
||||||
|
|
||||||
if ( ast->VarConstructorInit )
|
if ( self->VarConstructorInit )
|
||||||
append( & result, " )");
|
append( result, " )");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
if ( bitfield_is_equal( u32, self->ModuleFlags, ModuleFlag_Export ))
|
||||||
append( & result, "export " );
|
append( result, "export " );
|
||||||
|
|
||||||
if ( ast->Attributes || ast->Specs )
|
if ( self->Attributes || self->Specs )
|
||||||
{
|
{
|
||||||
if ( ast->Attributes )
|
if ( self->Attributes )
|
||||||
append_fmt( & result, "%S ", GEN_NS to_string(ast->Specs) );
|
append_fmt( result, "%S ", GEN_NS to_string(self->Specs) );
|
||||||
|
|
||||||
if ( ast->Specs )
|
if ( self->Specs )
|
||||||
append_fmt( & result, "%S\n", GEN_NS to_string(ast->Specs) );
|
append_fmt( result, "%S\n", GEN_NS to_string(self->Specs) );
|
||||||
|
|
||||||
append_fmt( & result, "%S %S", GEN_NS to_string(ast->ValueType), ast->Name );
|
append_fmt( result, "%S %S", GEN_NS to_string(self->ValueType), self->Name );
|
||||||
|
|
||||||
if ( ast->ValueType->ArrExpr )
|
if ( self->ValueType->ArrExpr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ]", GEN_NS to_string(ast->ValueType->ArrExpr) );
|
append_fmt( result, "[ %S ]", GEN_NS to_string(self->ValueType->ArrExpr) );
|
||||||
|
|
||||||
AST* next_arr_expr = ast->ValueType->ArrExpr->Next;
|
AST* next_arr_expr = self->ValueType->ArrExpr->Next;
|
||||||
while ( next_arr_expr )
|
while ( next_arr_expr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ]", GEN_NS to_string(next_arr_expr) );
|
append_fmt( result, "[ %S ]", GEN_NS to_string(next_arr_expr) );
|
||||||
next_arr_expr = next_arr_expr->Next;
|
next_arr_expr = next_arr_expr->Next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ast->BitfieldSize )
|
if ( self->BitfieldSize )
|
||||||
append_fmt( & result, " : %S", GEN_NS to_string(ast->BitfieldSize) );
|
append_fmt( result, " : %S", GEN_NS to_string(self->BitfieldSize) );
|
||||||
|
|
||||||
if ( ast->Value )
|
if ( self->Value )
|
||||||
{
|
{
|
||||||
if ( ast->VarConstructorInit )
|
if ( self->VarConstructorInit )
|
||||||
append_fmt( & result, "( %S ", GEN_NS to_string(ast->Value) );
|
append_fmt( result, "( %S ", GEN_NS to_string(self->Value) );
|
||||||
else
|
else
|
||||||
append_fmt( & result, " = %S", GEN_NS to_string(ast->Value) );
|
append_fmt( result, " = %S", GEN_NS to_string(self->Value) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ast->NextVar )
|
if ( self->NextVar )
|
||||||
append_fmt( & result, ", %S", ast->NextVar.to_string() );
|
append_fmt( result, ", %S", self->NextVar.to_string() );
|
||||||
|
|
||||||
if ( ast->VarConstructorInit )
|
if ( self->VarConstructorInit )
|
||||||
append( & result, " )");
|
append( result, " )");
|
||||||
|
|
||||||
if ( ast->InlineCmt )
|
if ( self->InlineCmt )
|
||||||
append_fmt( & result, "; %S", ast->InlineCmt->Content);
|
append_fmt( result, "; %S", self->InlineCmt->Content);
|
||||||
else
|
else
|
||||||
append( & result, ";\n" );
|
append( result, ";\n" );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ast->BitfieldSize )
|
if ( self->BitfieldSize )
|
||||||
append_fmt( & result, "%S %S : %S", GEN_NS to_string(ast->ValueType), ast->Name, GEN_NS to_string(ast->BitfieldSize) );
|
append_fmt( result, "%S %S : %S", GEN_NS to_string(self->ValueType), self->Name, GEN_NS to_string(self->BitfieldSize) );
|
||||||
|
|
||||||
else if ( ast->ValueType->ArrExpr )
|
else if ( self->ValueType->ArrExpr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "%S %S[ %S ]", GEN_NS to_string(ast->ValueType), ast->Name, GEN_NS to_string(ast->ValueType->ArrExpr) );
|
append_fmt( result, "%S %S[ %S ]", GEN_NS to_string(self->ValueType), self->Name, GEN_NS to_string(self->ValueType->ArrExpr) );
|
||||||
|
|
||||||
AST* next_arr_expr = ast->ValueType->ArrExpr->Next;
|
AST* next_arr_expr = self->ValueType->ArrExpr->Next;
|
||||||
while ( next_arr_expr )
|
while ( next_arr_expr )
|
||||||
{
|
{
|
||||||
append_fmt( & result, "[ %S ]", GEN_NS to_string(next_arr_expr) );
|
append_fmt( result, "[ %S ]", GEN_NS to_string(next_arr_expr) );
|
||||||
next_arr_expr = next_arr_expr->Next;
|
next_arr_expr = next_arr_expr->Next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
append_fmt( & result, "%S %S", GEN_NS to_string(ast->ValueType), ast->Name );
|
append_fmt( result, "%S %S", GEN_NS to_string(self->ValueType), self->Name );
|
||||||
|
|
||||||
if ( ast->Value )
|
if ( self->Value )
|
||||||
{
|
{
|
||||||
if ( ast->VarConstructorInit )
|
if ( self->VarConstructorInit )
|
||||||
append_fmt( & result, "( %S ", GEN_NS to_string(ast->Value) );
|
append_fmt( result, "( %S ", GEN_NS to_string(self->Value) );
|
||||||
else
|
else
|
||||||
append_fmt( & result, " = %S", GEN_NS to_string(ast->Value) );
|
append_fmt( result, " = %S", GEN_NS to_string(self->Value) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ast->NextVar )
|
if ( self->NextVar )
|
||||||
append_fmt( & result, ", %S", ast->NextVar.to_string() );
|
append_fmt( result, ", %S", self->NextVar.to_string() );
|
||||||
|
|
||||||
if ( ast->VarConstructorInit )
|
if ( self->VarConstructorInit )
|
||||||
append( & result, " )");
|
append( result, " )");
|
||||||
|
|
||||||
append( & result, ";" );
|
append( result, ";" );
|
||||||
|
|
||||||
if ( ast->InlineCmt )
|
if ( self->InlineCmt )
|
||||||
append_fmt( & result, " %S", ast->InlineCmt->Content);
|
append_fmt( result, " %S", self->InlineCmt->Content);
|
||||||
else
|
else
|
||||||
append( & result, "\n");
|
append( result, "\n");
|
||||||
}
|
}
|
||||||
|
@ -105,11 +105,26 @@ void to_string(CodeTemplate self, String* result);
|
|||||||
String to_string(CodeType self);
|
String to_string(CodeType self);
|
||||||
void to_string(CodeType self, String* result);
|
void to_string(CodeType self, String* result);
|
||||||
|
|
||||||
|
String to_string(CodeTypedef self);
|
||||||
|
void to_string(CodeTypedef self, String* result);
|
||||||
|
|
||||||
|
String to_string(CodeUnion self);
|
||||||
|
void to_string(CodeUnion self, String* result);
|
||||||
|
|
||||||
|
String to_string (CodeUsing op_cast );
|
||||||
|
void to_string (CodeUsing op_cast, String* result );
|
||||||
|
void to_string_ns(CodeUsing op_cast, String* result );
|
||||||
|
|
||||||
|
String to_string(CodeVar self);
|
||||||
|
void to_string(CodeVar self, String* result);
|
||||||
|
|
||||||
#pragma region Code Types
|
#pragma region Code Types
|
||||||
// These structs are not used at all by the C vairant.
|
// These structs are not used at all by the C vairant.
|
||||||
#if ! GEN_COMPILER_C
|
#if ! GEN_COMPILER_C
|
||||||
// stati_assert( GEN_COMPILER_C, "This should not be compiled with the C-library" );
|
// stati_assert( GEN_COMPILER_C, "This should not be compiled with the C-library" );
|
||||||
|
|
||||||
|
#define Verify_POD(Type) static_assert(size_of(Code##Type) == size_of(AST_##Type), "ERROR: Code##Type is not a POD")
|
||||||
|
|
||||||
struct CodeBody
|
struct CodeBody
|
||||||
{
|
{
|
||||||
#if GEN_SUPPORT_CPP_MEMBER_FEATURES
|
#if GEN_SUPPORT_CPP_MEMBER_FEATURES
|
||||||
@ -897,7 +912,7 @@ struct CodeStmt_While
|
|||||||
|
|
||||||
struct CodeTemplate
|
struct CodeTemplate
|
||||||
{
|
{
|
||||||
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
|
#if GEN_SUPPORT_CPP_MEMBER_FEATURES
|
||||||
Using_Code( CodeTemplate );
|
Using_Code( CodeTemplate );
|
||||||
|
|
||||||
String to_string() { return GEN_NS to_string(* this); }
|
String to_string() { return GEN_NS to_string(* this); }
|
||||||
@ -927,11 +942,11 @@ struct CodeType
|
|||||||
|
|
||||||
struct CodeTypedef
|
struct CodeTypedef
|
||||||
{
|
{
|
||||||
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
|
#if GEN_SUPPORT_CPP_MEMBER_FEATURES
|
||||||
Using_Code( CodeTypedef );
|
Using_Code( CodeTypedef );
|
||||||
|
|
||||||
String to_string();
|
String to_string() { return GEN_NS to_string(* this); }
|
||||||
void to_string( String& result );
|
void to_string( String& result ) { return GEN_NS to_string(* this, & result); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Using_CodeOps( CodeTypedef );
|
Using_CodeOps( CodeTypedef );
|
||||||
@ -945,8 +960,8 @@ struct CodeUnion
|
|||||||
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
|
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
|
||||||
Using_Code( CodeUnion );
|
Using_Code( CodeUnion );
|
||||||
|
|
||||||
String to_string();
|
String to_string() { return GEN_NS to_string(* this); }
|
||||||
void to_string( String& result );
|
void to_string( String& result ) { return GEN_NS to_string(* this, & result); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Using_CodeOps(CodeUnion);
|
Using_CodeOps(CodeUnion);
|
||||||
@ -960,9 +975,9 @@ struct CodeUsing
|
|||||||
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
|
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
|
||||||
Using_Code( CodeUsing );
|
Using_Code( CodeUsing );
|
||||||
|
|
||||||
String to_string();
|
String to_string() { return GEN_NS to_string(* this); }
|
||||||
void to_string( String& result );
|
void to_string( String& result ) { return GEN_NS to_string(* this, & result); }
|
||||||
void to_string_ns( String& result );
|
void to_string_ns( String& result ) { return GEN_NS to_string_ns(* this, & result); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Using_CodeOps(CodeUsing);
|
Using_CodeOps(CodeUsing);
|
||||||
@ -976,8 +991,8 @@ struct CodeVar
|
|||||||
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
|
#if GEN_SUPPORT_CPP_MEMBER_FEATURES || 1
|
||||||
Using_Code( CodeVar );
|
Using_Code( CodeVar );
|
||||||
|
|
||||||
String to_string();
|
String to_string() { return GEN_NS to_string(* this); }
|
||||||
void to_string( String& result );
|
void to_string( String& result ) { return GEN_NS to_string(* this, & result); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Using_CodeOps(CodeVar);
|
Using_CodeOps(CodeVar);
|
||||||
@ -994,6 +1009,8 @@ struct CodeVar
|
|||||||
void to_string_export( CodeBody body, String& result ) { return to_string_export(body, & result); };
|
void to_string_export( CodeBody body, String& result ) { return to_string_export(body, & result); };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#undef Verify_POD
|
||||||
|
|
||||||
#endif //if ! GEN_COMPILER_C
|
#endif //if ! GEN_COMPILER_C
|
||||||
|
|
||||||
#pragma endregion Code Types
|
#pragma endregion Code Types
|
||||||
|
Loading…
Reference in New Issue
Block a user