diff --git a/project/components/ast.cpp b/project/components/ast.cpp index b95e64a..837da3f 100644 --- a/project/components/ast.cpp +++ b/project/components/ast.cpp @@ -103,7 +103,7 @@ String AST::to_string() result.append_fmt( "%S : %s %S", Name, access_level, ParentType ); - CodeType interface = Next->cast< CodeType >(); + CodeType interface = ParentType->Next->cast< CodeType >(); if ( interface ) result.append( "\n" ); @@ -703,7 +703,7 @@ String AST::to_string() result.append_fmt( "%S : %s %S", Name, access_level, ParentType ); - CodeType interface = Next->cast< CodeType >(); + CodeType interface = ParentType->Next->cast< CodeType >(); if ( interface ) result.append( "\n" ); @@ -924,6 +924,35 @@ String AST::to_string() case Variable: { + if ( Parent && Parent->Type == Variable ) + { + // Its a comma-separated variable ( a NextVar ) + + if ( Specs ) + result.append_fmt( "%S ", Specs->to_string() ); + + result.append( Name ); + + if ( ArrExpr ) + { + result.append_fmt( "[ %S ]", ArrExpr->to_string() ); + + AST* next_arr_expr = ArrExpr->Next; + while ( next_arr_expr ) + { + result.append_fmt( "[ %S ]", next_arr_expr->to_string() ); + next_arr_expr = next_arr_expr->Next; + } + } + + if ( Value ) + result.append_fmt( " = %S", Value->to_string() ); + + // Keep the chain going... + if ( NextVar ) + result.append_fmt( ", %S", NextVar->to_string() ); + } + if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) result.append( "export " ); @@ -955,6 +984,9 @@ String AST::to_string() if ( Value ) result.append_fmt( " = %S", Value->to_string() ); + if ( NextVar ) + result.append_fmt( ", %S", NextVar->to_string() ); + if ( InlineCmt ) result.append_fmt("; %S", InlineCmt->Content); else @@ -964,7 +996,7 @@ String AST::to_string() } if ( BitfieldSize ) - result.append_fmt( "%S %S : %S;", ValueType->to_string(), Name, BitfieldSize->to_string() ); + result.append_fmt( "%S %S : %S", ValueType->to_string(), Name, BitfieldSize->to_string() ); else if ( ValueType->ArrExpr ) { @@ -976,12 +1008,18 @@ String AST::to_string() result.append_fmt( "[ %S ]", next_arr_expr->to_string() ); next_arr_expr = next_arr_expr->Next; } - - result.append( ";" ); } else - result.append_fmt( "%S %S;", ValueType->to_string(), Name ); + result.append_fmt( "%S %S", ValueType->to_string(), Name ); + + if ( Value ) + result.append_fmt( " = %S", Value->to_string() ); + + if ( NextVar ) + result.append_fmt( ", %S", NextVar->to_string() ); + + result.append( ";" ); if ( InlineCmt ) result.append_fmt(" %S", InlineCmt->Content); @@ -1508,6 +1546,7 @@ bool AST::is_equal( AST* other ) check_member_ast( Value ); check_member_ast( Attributes ); check_member_ast( Specs ); + check_member_ast( NextVar ); return true; } diff --git a/project/components/ast.hpp b/project/components/ast.hpp index 13f0604..c30901f 100644 --- a/project/components/ast.hpp +++ b/project/components/ast.hpp @@ -229,22 +229,19 @@ struct AST union { struct { - union { - AST* InlineCmt; // Class, Constructor, Destructor, Enum, Friend, Functon, Operator, OpCast, Struct, Typedef, Using, Variable - AST* SpecsFuncSuffix; // Only used with typenames, to store the function suffix if typename is function signature. - }; + 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 + AST* ReturnType; // Function, Operator, Typename AST* UnderlyingType; // Enum, Typedef AST* ValueType; // Parameter, Variable }; union { - AST* BitfieldSize; // Varaiable (Class/Struct Data Member) - AST* Params; // Constructor, Function, Operator, Template + AST* BitfieldSize; // Variable (Class/Struct Data Member) + AST* Params; // Constructor, Function, Operator, Template, Typename }; union { AST* ArrExpr; // Typename @@ -252,6 +249,10 @@ struct AST 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* SpecsFuncSuffix; // Only used with typenames, to store the function suffix if typename is function signature. + }; }; StringCached Content; // Attributes, Comment, Execution, Include SpecifierT ArrSpecs[AST::ArrSpecs_Cap]; // Specifiers @@ -284,28 +285,29 @@ struct AST_POD union { struct { - union { - AST* InlineCmt; // Class, Constructor, Destructor, Enum, Friend, Functon, Operator, OpCast, Struct, Typedef, Using, Variable - AST* SpecsFuncSuffix; // Only used with typenames, to store the function suffix if typename is function signature. - }; - AST* Attributes; // Class, Enum, Function, Struct, Typename, Union, Using, Variable - AST* Specs; // Function, Operator, Typename, Variable + 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 + AST* ReturnType; // Function, Operator, Typename AST* UnderlyingType; // Enum, Typedef AST* ValueType; // Parameter, Variable }; union { - AST* BitfieldSize; // Varaiable (Class/Struct Data Member) - AST* Params; // Function, Operator, Template + AST* BitfieldSize; // Variable (Class/Struct Data Member) + AST* Params; // Constructor, Function, Operator, Template, Typename }; union { - AST* ArrExpr; // Type Symbol - AST* Body; // Class, Constructr, Destructor, Enum, Function, Namespace, Struct, Union - AST* Declaration; // Friend, Template - AST* Value; // Parameter, Variable + AST* ArrExpr; // Typename + AST* Body; // Class, Constructr, Destructor, Enum, 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* SpecsFuncSuffix; // Only used with typenames, to store the function suffix if typename is function signature. }; }; StringCached Content; // Attributes, Comment, Execution, Include diff --git a/project/components/ast_types.hpp b/project/components/ast_types.hpp index 754f63c..03ed5d0 100644 --- a/project/components/ast_types.hpp +++ b/project/components/ast_types.hpp @@ -68,6 +68,7 @@ struct AST_Class CodeType ParentType; char _PAD_PARAMS_[ sizeof(AST*) ]; CodeBody Body; + char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; }; }; CodeType Last; @@ -93,6 +94,7 @@ struct AST_Constructor Code InitializerList; CodeParam Params; Code Body; + char _PAD_PROPERTIES_2_ [ sizeof(AST*) * 2 ]; }; }; Code Prev; @@ -132,6 +134,7 @@ struct AST_Destructor CodeSpecifiers Specs; char _PAD_PROPERTIES_2_ [ sizeof(AST*) * 2 ]; Code Body; + char _PAD_PROPERTIES_3_ [ sizeof(AST*) ]; }; }; Code Prev; @@ -156,6 +159,7 @@ struct AST_Enum CodeType UnderlyingType; char _PAD_PARAMS_[ sizeof(AST*) ]; CodeBody Body; + char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; }; }; Code Prev; @@ -193,6 +197,7 @@ struct AST_Extern { char _PAD_PROPERTIES_[ sizeof(AST*) * 5 ]; CodeBody Body; + char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; }; }; Code Prev; @@ -230,6 +235,7 @@ struct AST_Friend CodeComment InlineCmt; char _PAD_PROPERTIES_[ sizeof(AST*) * 4 ]; Code Declaration; + char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; }; }; Code Prev; @@ -254,6 +260,7 @@ struct AST_Fn CodeType ReturnType; CodeParam Params; CodeBody Body; + char _PAD_PROPERTIES_ [ sizeof(AST*) ]; }; }; Code Prev; @@ -288,6 +295,7 @@ struct AST_NS struct { char _PAD_PROPERTIES_[ sizeof(AST*) * 5 ]; CodeBody Body; + char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; }; }; Code Prev; @@ -313,6 +321,7 @@ struct AST_Operator CodeType ReturnType; CodeParam Params; CodeBody Body; + char _PAD_PROPERTIES_ [ sizeof(AST*) ]; }; }; Code Prev; @@ -338,6 +347,7 @@ struct AST_OpCast CodeType ValueType; char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; CodeBody Body; + char _PAD_PROPERTIES_3_[ sizeof(AST*) ]; }; }; Code Prev; @@ -360,6 +370,7 @@ struct AST_Param CodeType ValueType; char _PAD_PROPERTIES_[ sizeof(AST*) ]; Code Value; + char _PAD_PROPERTIES_3_[ sizeof(AST*) ]; }; }; CodeParam Last; @@ -431,6 +442,7 @@ struct AST_Struct CodeType ParentType; char _PAD_PARAMS_[ sizeof(AST*) ]; CodeBody Body; + char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; }; }; CodeType Last; @@ -453,6 +465,7 @@ struct AST_Template char _PAD_PROPERTIES_[ sizeof(AST*) * 4 ]; CodeParam Params; Code Declaration; + char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; }; }; Code Prev; @@ -472,12 +485,13 @@ struct AST_Type char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; struct { - CodeSpecifiers SpecsFuncSuffix; // Only used for function signatures + char _PAD_INLINE_CMT_[ sizeof(AST*) ]; CodeAttributes Attributes; CodeSpecifiers Specs; CodeType ReturnType; // Only used for function signatures CodeParam Params; // Only used for function signatures Code ArrExpr; + CodeSpecifiers SpecsFuncSuffix; // Only used for function signatures }; }; Code Prev; @@ -500,7 +514,7 @@ struct AST_Typedef CodeComment InlineCmt; char _PAD_PROPERTIES_[ sizeof(AST*) * 2 ]; Code UnderlyingType; - char _PAD_PROPERTIES_2_[ sizeof(AST*) * 2 ]; + char _PAD_PROPERTIES_2_[ sizeof(AST*) * 3 ]; }; }; Code Prev; @@ -524,6 +538,7 @@ struct AST_Union CodeAttributes Attributes; char _PAD_PROPERTIES_[ sizeof(AST*) * 3 ]; CodeBody Body; + char _PAD_PROPERTIES_2_[ sizeof(AST*) ]; }; }; Code Prev; @@ -547,7 +562,7 @@ struct AST_Using CodeAttributes Attributes; char _PAD_SPECS_ [ sizeof(AST*) ]; CodeType UnderlyingType; - char _PAD_PROPERTIES_[ sizeof(AST*) * 2 ]; + char _PAD_PROPERTIES_[ sizeof(AST*) * 3 ]; }; }; Code Prev; @@ -573,6 +588,7 @@ struct AST_Var CodeType ValueType; Code BitfieldSize; Code Value; + CodeVar NextVar; }; }; Code Prev; diff --git a/project/components/inlines.hpp b/project/components/inlines.hpp index f1d53fd..7f35ab9 100644 --- a/project/components/inlines.hpp +++ b/project/components/inlines.hpp @@ -67,15 +67,21 @@ Code& Code::operator ++() void CodeClass::add_interface( CodeType type ) { - if ( ! ast->Next ) + CodeType possible_slot = ast->ParentType; + if ( possible_slot.ast ) { - ast->Next = type; - ast->Last = ast->Next; - return; + // Were adding an interface to parent type, so we need to make sure the parent type is public. + ast->ParentAccess = AccessSpec::Public; + // If your planning on adding a proper parent, + // then you'll need to move this over to ParentType->next and update ParentAccess accordingly. } - ast->Next->Next = type; - ast->Last = ast->Next->Next; + while ( possible_slot.ast != nullptr ) + { + possible_slot.ast = (AST_Type*) possible_slot->Next.ast; + } + + possible_slot.ast = type.ast; } void CodeParam::append( CodeParam other ) @@ -129,14 +135,21 @@ CodeParam& CodeParam::operator ++() void CodeStruct::add_interface( CodeType type ) { - if ( ! ast->Next ) + CodeType possible_slot = ast->ParentType; + if ( possible_slot.ast ) { - ast->Next = type; - ast->Last = ast->Next; + // Were adding an interface to parent type, so we need to make sure the parent type is public. + ast->ParentAccess = AccessSpec::Public; + // If your planning on adding a proper parent, + // then you'll need to move this over to ParentType->next and update ParentAccess accordingly. } - ast->Next->Next = type; - ast->Last = ast->Next->Next; + while ( possible_slot.ast != nullptr ) + { + possible_slot.ast = (AST_Type*) possible_slot->Next.ast; + } + + possible_slot.ast = type.ast; } CodeBody def_body( CodeT type ) diff --git a/project/components/interface.parsing.cpp b/project/components/interface.parsing.cpp index 3381076..329f958 100644 --- a/project/components/interface.parsing.cpp +++ b/project/components/interface.parsing.cpp @@ -4963,6 +4963,7 @@ CodeType parse_type( bool* typedef_is_function ) SpecifierT spec = ESpecifier::to_type( currtok ); if ( spec != ESpecifier::Const + // TODO : Add support for NoExcept // && spec != ESpecifier::NoExcept && spec != ESpecifier::RValue ) {