mirror of
https://github.com/Ed94/gencpp.git
synced 2024-11-10 02:54:53 -08:00
Added support for inline comments
Also now doing comment serialization on def_comment directly as parse_comment doesn't need it. Essentially comment ast types serialize the same way s untyped and execution ASTs
This commit is contained in:
parent
5e79e8ba65
commit
c97762ac16
@ -17,7 +17,7 @@ GEN_NS_END
|
|||||||
using namespace gen;
|
using namespace gen;
|
||||||
|
|
||||||
constexpr char const* generation_notice =
|
constexpr char const* generation_notice =
|
||||||
"// This file was generated automatially by gen.bootstrap.cpp "
|
"// This file was generated automatially by gencpp's bootstrap.cpp "
|
||||||
"(See: https://github.com/Ed94/gencpp)\n\n";
|
"(See: https://github.com/Ed94/gencpp)\n\n";
|
||||||
|
|
||||||
constexpr bool DontSkipInitialDirectives = false;
|
constexpr bool DontSkipInitialDirectives = false;
|
||||||
|
@ -43,6 +43,11 @@ String AST::to_string()
|
|||||||
|
|
||||||
case Comment:
|
case Comment:
|
||||||
{
|
{
|
||||||
|
// TODO : Move this formmating process to def_comment,
|
||||||
|
// Were going to preserve as much of the original formatting as possible
|
||||||
|
// so that the parsed comments don't have any artifacts.
|
||||||
|
// Just doing what untyped and execution do
|
||||||
|
#if 0
|
||||||
if ( Prev && Prev->Type != Comment && Prev->Type != NewLine )
|
if ( Prev && Prev->Type != Comment && Prev->Type != NewLine )
|
||||||
result.append( "\n" );
|
result.append( "\n" );
|
||||||
|
|
||||||
@ -72,6 +77,9 @@ String AST::to_string()
|
|||||||
|
|
||||||
if ( result.back() != '\n' )
|
if ( result.back() != '\n' )
|
||||||
result.append( "\n" );
|
result.append( "\n" );
|
||||||
|
#else
|
||||||
|
result.append( Content );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -140,9 +148,15 @@ String AST::to_string()
|
|||||||
result.append_fmt( "class %S %S", Attributes->to_string(), Name );
|
result.append_fmt( "class %S %S", Attributes->to_string(), Name );
|
||||||
|
|
||||||
else result.append_fmt( "class %S", Name );
|
else result.append_fmt( "class %S", Name );
|
||||||
|
|
||||||
|
// Check if it can have an end-statement
|
||||||
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
||||||
result.append(";\n");
|
{
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt( "; // %S\n", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append(";\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -169,7 +183,12 @@ String AST::to_string()
|
|||||||
if ( Params )
|
if ( Params )
|
||||||
result.append_fmt( "( %S )", Params->to_string() );
|
result.append_fmt( "( %S )", Params->to_string() );
|
||||||
else
|
else
|
||||||
result.append( "(void);\n" );
|
{
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt( "(void); // %S\n", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append( "(void);\n" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -203,10 +222,15 @@ String AST::to_string()
|
|||||||
result.append_fmt( "~%S()", Parent->Name );
|
result.append_fmt( "~%S()", Parent->Name );
|
||||||
|
|
||||||
if ( specs.has( ESpecifier::Pure ) )
|
if ( specs.has( ESpecifier::Pure ) )
|
||||||
result.append( " = 0;\n" );
|
result.append( " = 0;" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
result.append_fmt( "~%S();\n", Parent->Name );
|
result.append_fmt( "~%S();", Parent->Name );
|
||||||
|
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt( " %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append("\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -249,7 +273,12 @@ String AST::to_string()
|
|||||||
result.append_fmt( "enum %S : %S", Name, UnderlyingType->to_string() );
|
result.append_fmt( "enum %S : %S", Name, UnderlyingType->to_string() );
|
||||||
|
|
||||||
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
||||||
result.append(";\n");
|
{
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt("; %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append(";\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -299,7 +328,12 @@ String AST::to_string()
|
|||||||
result.append_fmt( "%S : %S", Name, UnderlyingType->to_string() );
|
result.append_fmt( "%S : %S", Name, UnderlyingType->to_string() );
|
||||||
|
|
||||||
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
||||||
result.append(";\n");
|
{
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt("; %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append(";\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -327,7 +361,14 @@ String AST::to_string()
|
|||||||
result.append_fmt( "friend %S", Declaration->to_string() );
|
result.append_fmt( "friend %S", Declaration->to_string() );
|
||||||
|
|
||||||
if ( result[ result.length() -1 ] != ';' )
|
if ( result[ result.length() -1 ] != ';' )
|
||||||
result.append( ";\n" );
|
{
|
||||||
|
result.append( ";" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt(" %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append("\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Function:
|
case Function:
|
||||||
@ -404,7 +445,10 @@ String AST::to_string()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.append( ";\n" );
|
if ( InlineCmt )
|
||||||
|
result.append_fmt( "; %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append( ";\n" );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -495,8 +539,11 @@ String AST::to_string()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.append( ";\n" );
|
if ( InlineCmt )
|
||||||
|
result.append_fmt( "; %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append( ";\n" );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -504,6 +551,8 @@ String AST::to_string()
|
|||||||
{
|
{
|
||||||
if ( Specs )
|
if ( Specs )
|
||||||
{
|
{
|
||||||
|
// TODO : Add support for specifies before the operator keyword
|
||||||
|
|
||||||
if ( Name && Name.length() )
|
if ( Name && Name.length() )
|
||||||
result.append_fmt( "%Soperator %S()", Name, ValueType->to_string() );
|
result.append_fmt( "%Soperator %S()", Name, ValueType->to_string() );
|
||||||
else
|
else
|
||||||
@ -532,6 +581,8 @@ String AST::to_string()
|
|||||||
case Operator_Cast_Fwd:
|
case Operator_Cast_Fwd:
|
||||||
if ( Specs )
|
if ( Specs )
|
||||||
{
|
{
|
||||||
|
// TODO : Add support for specifies before the operator keyword
|
||||||
|
|
||||||
result.append_fmt( "operator %S()", ValueType->to_string() );
|
result.append_fmt( "operator %S()", ValueType->to_string() );
|
||||||
|
|
||||||
for ( SpecifierT spec : Specs->cast<CodeSpecifiers>() )
|
for ( SpecifierT spec : Specs->cast<CodeSpecifiers>() )
|
||||||
@ -543,11 +594,17 @@ String AST::to_string()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.append( ";" );
|
if ( InlineCmt )
|
||||||
|
result.append_fmt( "; %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append( ";\n" );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
result.append_fmt("operator %S();\n", ValueType->to_string() );
|
if ( InlineCmt )
|
||||||
|
result.append_fmt("operator %S(); %S", ValueType->to_string() );
|
||||||
|
else
|
||||||
|
result.append_fmt("operator %S();\n", ValueType->to_string() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Parameters:
|
case Parameters:
|
||||||
@ -680,7 +737,12 @@ String AST::to_string()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
||||||
result.append(";\n");
|
{
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt("; %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append(";\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -695,7 +757,12 @@ String AST::to_string()
|
|||||||
else result.append_fmt( "struct %S", Name );
|
else result.append_fmt( "struct %S", Name );
|
||||||
|
|
||||||
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
if ( Parent == nullptr || ( Parent->Type != ECode::Typedef && Parent->Type != ECode::Variable ) )
|
||||||
result.append(";\n");
|
{
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt("; %S", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append(";\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -726,8 +793,13 @@ String AST::to_string()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result.append( ";\n" );
|
result.append( ";" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt(" %S", InlineCmt->Content);
|
||||||
|
else
|
||||||
|
result.append("\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -796,15 +868,23 @@ String AST::to_string()
|
|||||||
if ( UnderlyingType->ArrExpr )
|
if ( UnderlyingType->ArrExpr )
|
||||||
result.append_fmt( "[%S]", UnderlyingType->ArrExpr->to_string() );
|
result.append_fmt( "[%S]", UnderlyingType->ArrExpr->to_string() );
|
||||||
|
|
||||||
result.append( ";\n" );
|
result.append( ";" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
result.append_fmt( "using %S;\n", Name );
|
result.append_fmt( "using %S;", Name );
|
||||||
|
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt(" %S\n", InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append("\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Using_Namespace:
|
case Using_Namespace:
|
||||||
result.append_fmt( "using namespace %s;\n", Name );
|
if ( InlineCmt )
|
||||||
|
result.append_fmt( "using namespace $S; %S", Name, InlineCmt->Content );
|
||||||
|
else
|
||||||
|
result.append_fmt( "using namespace %s;\n", Name );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Variable:
|
case Variable:
|
||||||
@ -831,19 +911,27 @@ String AST::to_string()
|
|||||||
if ( Value )
|
if ( Value )
|
||||||
result.append_fmt( " = %S", Value->to_string() );
|
result.append_fmt( " = %S", Value->to_string() );
|
||||||
|
|
||||||
result.append( ";\n" );
|
if ( InlineCmt )
|
||||||
|
result.append_fmt("; %S", InlineCmt->Content);
|
||||||
|
else
|
||||||
|
result.append( ";\n" );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( BitfieldSize )
|
if ( BitfieldSize )
|
||||||
result.append_fmt( "%S %S : %S;\n", ValueType->to_string(), Name, BitfieldSize->to_string() );
|
result.append_fmt( "%S %S : %S;", ValueType->to_string(), Name, BitfieldSize->to_string() );
|
||||||
|
|
||||||
else if ( UnderlyingType->ArrExpr )
|
else if ( UnderlyingType->ArrExpr )
|
||||||
result.append_fmt( "%S %S[%S];\n", UnderlyingType->to_string(), Name, UnderlyingType->ArrExpr->to_string() );
|
result.append_fmt( "%S %S[%S];", UnderlyingType->to_string(), Name, UnderlyingType->ArrExpr->to_string() );
|
||||||
|
|
||||||
else
|
else
|
||||||
result.append_fmt( "%S %S;\n", UnderlyingType->to_string(), Name );
|
result.append_fmt( "%S %S;", UnderlyingType->to_string(), Name );
|
||||||
|
|
||||||
|
if ( InlineCmt )
|
||||||
|
result.append_fmt(" %S", InlineCmt->Content);
|
||||||
|
else
|
||||||
|
result.append("\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -226,10 +226,11 @@ struct AST
|
|||||||
union {
|
union {
|
||||||
struct
|
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* Attributes; // Class, Enum, Function, Struct, Typedef, Union, Using, Variable
|
||||||
AST* Specs; // Function, Operator, Type symbol, Variable
|
AST* Specs; // Destructor, Function, Operator, Type symbol, Variable
|
||||||
union {
|
union {
|
||||||
AST* InitializerList; // Constructor, Destructor
|
AST* InitializerList; // Constructor
|
||||||
AST* ParentType; // Class, Struct
|
AST* ParentType; // Class, Struct
|
||||||
AST* ReturnType; // Function, Operator
|
AST* ReturnType; // Function, Operator
|
||||||
AST* UnderlyingType; // Enum, Typedef
|
AST* UnderlyingType; // Enum, Typedef
|
||||||
@ -237,7 +238,7 @@ struct AST
|
|||||||
};
|
};
|
||||||
union {
|
union {
|
||||||
AST* BitfieldSize; // Varaiable (Class/Struct Data Member)
|
AST* BitfieldSize; // Varaiable (Class/Struct Data Member)
|
||||||
AST* Params; // Function, Operator, Template
|
AST* Params; // Constructor, Function, Operator, Template
|
||||||
};
|
};
|
||||||
union {
|
union {
|
||||||
AST* ArrExpr; // Type Symbol
|
AST* ArrExpr; // Type Symbol
|
||||||
@ -275,10 +276,11 @@ struct AST_POD
|
|||||||
union {
|
union {
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
AST* InlineCmt; // Class, Constructor, Destructor, Enum, Friend, Functon, Operator, OpCast, Struct, Typedef, Using, Variable
|
||||||
AST* Attributes; // Class, Enum, Function, Struct, Typename, Union, Using, Variable
|
AST* Attributes; // Class, Enum, Function, Struct, Typename, Union, Using, Variable
|
||||||
AST* Specs; // Function, Operator, Type symbol, Variable
|
AST* Specs; // Function, Operator, Type symbol, Variable
|
||||||
union {
|
union {
|
||||||
AST* InitializerList; // Constructor, Destructor
|
AST* InitializerList; // Constructor
|
||||||
AST* ParentType; // Class, Struct
|
AST* ParentType; // Class, Struct
|
||||||
AST* ReturnType; // Function, Operator
|
AST* ReturnType; // Function, Operator
|
||||||
AST* UnderlyingType; // Enum, Typedef
|
AST* UnderlyingType; // Enum, Typedef
|
||||||
|
@ -57,6 +57,7 @@ struct AST_Class
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
char _PAD_SPECS_ [ sizeof(AST*) ];
|
char _PAD_SPECS_ [ sizeof(AST*) ];
|
||||||
CodeType ParentType;
|
CodeType ParentType;
|
||||||
@ -80,10 +81,11 @@ struct AST_Constructor
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char _PAD_PROPERTIES_ [ sizeof(AST*) * 3 ];
|
CodeComment InlineCmt;
|
||||||
Code InitializerList;
|
char _PAD_PROPERTIES_ [ sizeof(AST*) * 3 ];
|
||||||
CodeParam Params;
|
Code InitializerList;
|
||||||
Code Body;
|
CodeParam Params;
|
||||||
|
Code Body;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
Code Prev;
|
Code Prev;
|
||||||
@ -116,6 +118,7 @@ struct AST_Destructor
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
char _PAD_PROPERTIES_ [ sizeof(AST*) * 1 ];
|
char _PAD_PROPERTIES_ [ sizeof(AST*) * 1 ];
|
||||||
CodeSpecifiers Specs;
|
CodeSpecifiers Specs;
|
||||||
char _PAD_PROPERTIES_2_ [ sizeof(AST*) * 2 ];
|
char _PAD_PROPERTIES_2_ [ sizeof(AST*) * 2 ];
|
||||||
@ -137,6 +140,7 @@ struct AST_Enum
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
char _PAD_SPEC_ [ sizeof(AST*) ];
|
char _PAD_SPEC_ [ sizeof(AST*) ];
|
||||||
CodeType UnderlyingType;
|
CodeType UnderlyingType;
|
||||||
@ -175,7 +179,7 @@ struct AST_Extern
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) * 4 ];
|
char _PAD_PROPERTIES_[ sizeof(AST*) * 5 ];
|
||||||
CodeBody Body;
|
CodeBody Body;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -209,8 +213,9 @@ struct AST_Friend
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) * 4 ];
|
CodeComment InlineCmt;
|
||||||
Code Declaration;
|
char _PAD_PROPERTIES_[ sizeof(AST*) * 4 ];
|
||||||
|
Code Declaration;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
Code Prev;
|
Code Prev;
|
||||||
@ -228,6 +233,7 @@ struct AST_Fn
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
CodeSpecifiers Specs;
|
CodeSpecifiers Specs;
|
||||||
CodeType ReturnType;
|
CodeType ReturnType;
|
||||||
@ -263,7 +269,7 @@ struct AST_NS
|
|||||||
union {
|
union {
|
||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct {
|
struct {
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) * 4 ];
|
char _PAD_PROPERTIES_[ sizeof(AST*) * 5 ];
|
||||||
CodeBody Body;
|
CodeBody Body;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -283,6 +289,7 @@ struct AST_Operator
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
CodeSpecifiers Specs;
|
CodeSpecifiers Specs;
|
||||||
CodeType ReturnType;
|
CodeType ReturnType;
|
||||||
@ -306,6 +313,7 @@ struct AST_OpCast
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) ];
|
char _PAD_PROPERTIES_[ sizeof(AST*) ];
|
||||||
CodeSpecifiers Specs;
|
CodeSpecifiers Specs;
|
||||||
CodeType ValueType;
|
CodeType ValueType;
|
||||||
@ -328,7 +336,7 @@ struct AST_Param
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char _PAD_PROPERTIES_2_[ sizeof(AST*) * 2 ];
|
char _PAD_PROPERTIES_2_[ sizeof(AST*) * 3 ];
|
||||||
CodeType ValueType;
|
CodeType ValueType;
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) ];
|
char _PAD_PROPERTIES_[ sizeof(AST*) ];
|
||||||
Code Value;
|
Code Value;
|
||||||
@ -393,6 +401,7 @@ struct AST_Struct
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
char _PAD_SPECS_ [ sizeof(AST*) ];
|
char _PAD_SPECS_ [ sizeof(AST*) ];
|
||||||
CodeType ParentType;
|
CodeType ParentType;
|
||||||
@ -416,7 +425,7 @@ struct AST_Template
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) * 3 ];
|
char _PAD_PROPERTIES_[ sizeof(AST*) * 4 ];
|
||||||
CodeParam Params;
|
CodeParam Params;
|
||||||
Code Declaration;
|
Code Declaration;
|
||||||
};
|
};
|
||||||
@ -437,6 +446,7 @@ struct AST_Type
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
char _PAD_CMT_[ sizeof(AST*) ];
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
CodeSpecifiers Specs;
|
CodeSpecifiers Specs;
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) * 2 ];
|
char _PAD_PROPERTIES_[ sizeof(AST*) * 2 ];
|
||||||
@ -458,6 +468,7 @@ struct AST_Typedef
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) * 2 ];
|
char _PAD_PROPERTIES_[ sizeof(AST*) * 2 ];
|
||||||
Code UnderlyingType;
|
Code UnderlyingType;
|
||||||
char _PAD_PROPERTIES_2_[ sizeof(AST*) * 2 ];
|
char _PAD_PROPERTIES_2_[ sizeof(AST*) * 2 ];
|
||||||
@ -479,6 +490,7 @@ struct AST_Union
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
char _PAD_INLINE_CMT_[ sizeof(AST*) ];
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
char _PAD_PROPERTIES_[ sizeof(AST*) * 3 ];
|
char _PAD_PROPERTIES_[ sizeof(AST*) * 3 ];
|
||||||
CodeBody Body;
|
CodeBody Body;
|
||||||
@ -500,6 +512,7 @@ struct AST_Using
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
char _PAD_SPECS_ [ sizeof(AST*) ];
|
char _PAD_SPECS_ [ sizeof(AST*) ];
|
||||||
CodeType UnderlyingType;
|
CodeType UnderlyingType;
|
||||||
@ -522,6 +535,7 @@ struct AST_Var
|
|||||||
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
char _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
CodeComment InlineCmt;
|
||||||
CodeAttributes Attributes;
|
CodeAttributes Attributes;
|
||||||
CodeSpecifiers Specs;
|
CodeSpecifiers Specs;
|
||||||
CodeType ValueType;
|
CodeType ValueType;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
// This file was generated automatially by gen.bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
// This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
||||||
|
|
||||||
#pragma region generated code inline implementation
|
#pragma region generated code inline implementation
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// This file was generated automatially by gen.bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
// This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
||||||
|
|
||||||
namespace ECode
|
namespace ECode
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// This file was generated automatially by gen.bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
// This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
||||||
|
|
||||||
namespace EOperator
|
namespace EOperator
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// This file was generated automatially by gen.bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
// This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
||||||
|
|
||||||
namespace ESpecifier
|
namespace ESpecifier
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// This file was generated automatially by gen.bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
// This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp)
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ namespace Parser
|
|||||||
{ sizeof( "]" ), "]" },
|
{ sizeof( "]" ), "]" },
|
||||||
{ sizeof( "(" ), "(" },
|
{ sizeof( "(" ), "(" },
|
||||||
{ sizeof( ")" ), ")" },
|
{ sizeof( ")" ), ")" },
|
||||||
{ sizeof( "__comemnt__" ), "__comemnt__" },
|
{ sizeof( "__comment__" ), "__comment__" },
|
||||||
{ sizeof( "__comment_end__" ), "__comment_end__" },
|
{ sizeof( "__comment_end__" ), "__comment_end__" },
|
||||||
{ sizeof( "__comment_start__" ), "__comment_start__" },
|
{ sizeof( "__comment_start__" ), "__comment_start__" },
|
||||||
{ sizeof( "__character__" ), "__character__" },
|
{ sizeof( "__character__" ), "__character__" },
|
||||||
|
@ -67,22 +67,22 @@ namespace Parser
|
|||||||
|
|
||||||
bool __eat( TokType type );
|
bool __eat( TokType type );
|
||||||
|
|
||||||
Token& current( bool skip_new_lines = true )
|
Token& current( bool skip_formatting = true )
|
||||||
{
|
{
|
||||||
if ( skip_new_lines )
|
if ( skip_formatting )
|
||||||
{
|
{
|
||||||
while ( Arr[Idx].Type == TokType::NewLine )
|
while ( Arr[Idx].Type == TokType::NewLine || Arr[Idx].Type == TokType::Comment )
|
||||||
Idx++;
|
Idx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Arr[Idx];
|
return Arr[Idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
Token& previous( bool skip_new_lines = false )
|
Token& previous( bool skip_formatting = false )
|
||||||
{
|
{
|
||||||
s32 idx = this->Idx;
|
s32 idx = this->Idx;
|
||||||
|
|
||||||
if ( skip_new_lines )
|
if ( skip_formatting )
|
||||||
{
|
{
|
||||||
while ( Arr[idx].Type == TokType::NewLine )
|
while ( Arr[idx].Type == TokType::NewLine )
|
||||||
idx--;
|
idx--;
|
||||||
@ -93,11 +93,11 @@ namespace Parser
|
|||||||
return Arr[idx - 1];
|
return Arr[idx - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
Token& next( bool skip_new_lines = false )
|
Token& next( bool skip_formatting = false )
|
||||||
{
|
{
|
||||||
s32 idx = this->Idx;
|
s32 idx = this->Idx;
|
||||||
|
|
||||||
if ( skip_new_lines )
|
if ( skip_formatting )
|
||||||
{
|
{
|
||||||
while ( Arr[idx].Type == TokType::NewLine )
|
while ( Arr[idx].Type == TokType::NewLine )
|
||||||
idx++;
|
idx++;
|
||||||
@ -114,7 +114,7 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr bool dont_skip_new_lines = false;
|
constexpr bool dont_skip_formatting = false;
|
||||||
|
|
||||||
struct StackNode
|
struct StackNode
|
||||||
{
|
{
|
||||||
@ -200,7 +200,8 @@ namespace Parser
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( Arr[Idx].Type == TokType::NewLine && type != TokType::NewLine )
|
if ( Arr[ Idx ].Type == TokType::NewLine && type != TokType::NewLine
|
||||||
|
|| Arr[ Idx ].Type == TokType::Comment && type != TokType::Comment )
|
||||||
{
|
{
|
||||||
Idx++;
|
Idx++;
|
||||||
}
|
}
|
||||||
@ -879,57 +880,53 @@ namespace Parser
|
|||||||
|
|
||||||
if ( current == '/' )
|
if ( current == '/' )
|
||||||
{
|
{
|
||||||
token.Type = TokType::Comment_Start;
|
token.Type = TokType::Comment;
|
||||||
token.Length = 2;
|
token.Length = 2;
|
||||||
Tokens.append( token );
|
|
||||||
|
|
||||||
move_forward();
|
move_forward();
|
||||||
Token content = { scanner, 1, TokType::Comment, line, column, false };
|
token.Length++;
|
||||||
|
|
||||||
while ( left && current != '\n' && current != '\r' )
|
while ( left && current != '\n' && current != '\r' )
|
||||||
{
|
{
|
||||||
move_forward();
|
move_forward();
|
||||||
content.Length++;
|
token.Length++;
|
||||||
}
|
}
|
||||||
Tokens.append( content );
|
|
||||||
|
|
||||||
if ( current == '\r' )
|
if ( current == '\r' )
|
||||||
{
|
{
|
||||||
move_forward();
|
move_forward();
|
||||||
|
token.Length++;
|
||||||
}
|
}
|
||||||
if ( current == '\n' )
|
if ( current == '\n' )
|
||||||
{
|
{
|
||||||
move_forward();
|
move_forward();
|
||||||
|
token.Length++;
|
||||||
}
|
}
|
||||||
|
Tokens.append( token );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if ( current == '*' )
|
else if ( current == '*' )
|
||||||
{
|
{
|
||||||
token.Type = TokType::Comment_Start;
|
token.Type = TokType::Comment;
|
||||||
token.Length = 2;
|
token.Length = 2;
|
||||||
Tokens.append( token );
|
|
||||||
|
|
||||||
Token content = { token.Text, 0, TokType::Comment, line, column, false };
|
|
||||||
move_forward();
|
move_forward();
|
||||||
content.Length++;
|
token.Length++;
|
||||||
|
|
||||||
bool star = current == '*';
|
bool star = current == '*';
|
||||||
bool slash = scanner[1] == '/';
|
bool slash = scanner[1] == '/';
|
||||||
bool at_end = star && slash;
|
bool at_end = star && slash;
|
||||||
while ( left && ! at_end )
|
while ( left && ! at_end )
|
||||||
{
|
{
|
||||||
move_forward();
|
move_forward();
|
||||||
content.Length++;
|
token.Length++;
|
||||||
|
|
||||||
star = current == '*';
|
star = current == '*';
|
||||||
slash = scanner[1] == '/';
|
slash = scanner[1] == '/';
|
||||||
at_end = star && slash;
|
at_end = star && slash;
|
||||||
}
|
}
|
||||||
content.Length += 3;
|
token.Length += 3;
|
||||||
Tokens.append( content );
|
Tokens.append( token );
|
||||||
|
|
||||||
Token end = { scanner, 2, TokType::Comment_End, line, column, false };
|
|
||||||
Tokens.append( end );
|
|
||||||
move_forward();
|
move_forward();
|
||||||
move_forward();
|
move_forward();
|
||||||
|
|
||||||
@ -1141,7 +1138,7 @@ if ( def.Ptr == nullptr ) \
|
|||||||
return CodeInvalid; \
|
return CodeInvalid; \
|
||||||
}
|
}
|
||||||
|
|
||||||
# define currtok_noskip Context.Tokens.current( dont_skip_new_lines )
|
# define currtok_noskip Context.Tokens.current( dont_skip_formatting )
|
||||||
# define currtok Context.Tokens.current()
|
# define currtok Context.Tokens.current()
|
||||||
# define prevtok Context.Tokens.previous()
|
# define prevtok Context.Tokens.previous()
|
||||||
# define nexttok Context.Tokens.next()
|
# define nexttok Context.Tokens.next()
|
||||||
@ -1185,20 +1182,16 @@ internal
|
|||||||
CodeComment parse_comment()
|
CodeComment parse_comment()
|
||||||
{
|
{
|
||||||
using namespace Parser;
|
using namespace Parser;
|
||||||
push_scope();
|
StackNode scope { nullptr, currtok_noskip, NullToken, txt( __func__ ) };
|
||||||
|
Context.push( & scope );
|
||||||
eat( TokType::Comment_Start );
|
|
||||||
|
|
||||||
CodeComment
|
CodeComment
|
||||||
result = (CodeComment) make_code();
|
result = (CodeComment) make_code();
|
||||||
result->Type = ECode::Comment;
|
result->Type = ECode::Comment;
|
||||||
result->Content = get_cached_string( currtok );
|
result->Content = get_cached_string( currtok_noskip );
|
||||||
result->Name = result->Content;
|
result->Name = result->Content;
|
||||||
eat( TokType::Comment );
|
eat( TokType::Comment );
|
||||||
|
|
||||||
if ( check( TokType::Comment_End ) )
|
|
||||||
eat( TokType::Comment_End );
|
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -1804,7 +1797,8 @@ CodeFn parse_function_after_name(
|
|||||||
eat( currtok.Type );
|
eat( currtok.Type );
|
||||||
}
|
}
|
||||||
|
|
||||||
CodeBody body = { nullptr };
|
CodeBody body = NoCode;
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
if ( check( TokType::BraceCurly_Open ) )
|
if ( check( TokType::BraceCurly_Open ) )
|
||||||
{
|
{
|
||||||
body = parse_function_body();
|
body = parse_function_body();
|
||||||
@ -1816,7 +1810,11 @@ CodeFn parse_function_after_name(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type && TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
}
|
}
|
||||||
|
|
||||||
using namespace ECode;
|
using namespace ECode;
|
||||||
@ -1857,6 +1855,9 @@ CodeFn parse_function_after_name(
|
|||||||
|
|
||||||
if ( params )
|
if ( params )
|
||||||
result->Params = params;
|
result->Params = params;
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
@ -2126,7 +2127,8 @@ CodeOperator parse_operator_after_ret_type(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse Body
|
// Parse Body
|
||||||
CodeBody body = { nullptr };
|
CodeBody body = { nullptr };
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
if ( check( TokType::BraceCurly_Open ) )
|
if ( check( TokType::BraceCurly_Open ) )
|
||||||
{
|
{
|
||||||
body = parse_function_body();
|
body = parse_function_body();
|
||||||
@ -2138,11 +2140,19 @@ CodeOperator parse_operator_after_ret_type(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpValidateResult check_result = operator__validate( op, params, ret_type, specifiers );
|
// OpValidateResult check_result = operator__validate( op, params, ret_type, specifiers );
|
||||||
CodeOperator result = def_operator( op, nspace, params, ret_type, body, specifiers, attributes, mflags );
|
CodeOperator result = def_operator( op, nspace, params, ret_type, body, specifiers, attributes, mflags );
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -2230,8 +2240,18 @@ CodeVar parse_variable_after_name(
|
|||||||
expr_tok.Length = ( (sptr)prevtok.Text + prevtok.Length ) - (sptr)expr_tok.Text;
|
expr_tok.Length = ( (sptr)prevtok.Text + prevtok.Length ) - (sptr)expr_tok.Text;
|
||||||
bitfield_expr = untyped_str( expr_tok );
|
bitfield_expr = untyped_str( expr_tok );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
// Check for inline comment : <type> <identifier> = <expression>; // <inline comment>
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
|
if ( left
|
||||||
|
&& ( currtok_noskip.Type == TokType::Comment )
|
||||||
|
&& currtok_noskip.Line == stmt_end.Line )
|
||||||
|
{
|
||||||
|
inline_cmt = parse_comment();
|
||||||
|
}
|
||||||
|
|
||||||
using namespace ECode;
|
using namespace ECode;
|
||||||
|
|
||||||
@ -2257,6 +2277,9 @@ CodeVar parse_variable_after_name(
|
|||||||
|
|
||||||
if ( expr )
|
if ( expr )
|
||||||
result->Value = expr;
|
result->Value = expr;
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
@ -2294,7 +2317,11 @@ Code parse_simple_preprocess( Parser::TokType which )
|
|||||||
{
|
{
|
||||||
if ( check( TokType::Statement_End ))
|
if ( check( TokType::Statement_End ))
|
||||||
{
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
eat( TokType::Comment );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2306,7 +2333,11 @@ Code parse_simple_preprocess( Parser::TokType which )
|
|||||||
{
|
{
|
||||||
if ( check( TokType::Statement_End ))
|
if ( check( TokType::Statement_End ))
|
||||||
{
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
eat( TokType::Comment );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2382,7 +2413,6 @@ Code parse_operator_function_or_variable( bool expects_function, CodeAttributes
|
|||||||
if ( check( TokType::Capture_Start) )
|
if ( check( TokType::Capture_Start) )
|
||||||
{
|
{
|
||||||
// Dealing with a function
|
// Dealing with a function
|
||||||
|
|
||||||
result = parse_function_after_name( ModuleFlag::None, attributes, specifiers, type, name );
|
result = parse_function_after_name( ModuleFlag::None, attributes, specifiers, type, name );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2575,7 +2605,7 @@ CodeBody parse_class_struct_body( Parser::TokType which, Parser::Token name = Pa
|
|||||||
eat( TokType::NewLine );
|
eat( TokType::NewLine );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TokType::Comment_Start:
|
case TokType::Comment:
|
||||||
member = parse_comment();
|
member = parse_comment();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2880,14 +2910,24 @@ Code parse_class_struct( Parser::TokType which, bool inplace_def = false )
|
|||||||
body = parse_class_struct_body( which, name );
|
body = parse_class_struct_body( which, name );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
if ( ! inplace_def )
|
if ( ! inplace_def )
|
||||||
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
|
}
|
||||||
|
|
||||||
if ( which == TokType::Decl_Class )
|
if ( which == TokType::Decl_Class )
|
||||||
result = def_class( name, body, parent, access, attributes, mflags );
|
result = def_class( name, body, parent, access, attributes, mflags );
|
||||||
|
|
||||||
else
|
else
|
||||||
result = def_struct( name, body, (CodeType)parent, access, attributes, mflags );
|
result = def_struct( name, body, (CodeType)parent, access, attributes, mflags );
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
interfaces.free();
|
interfaces.free();
|
||||||
return result;
|
return result;
|
||||||
@ -2972,7 +3012,7 @@ CodeBody parse_global_nspace( CodeT which )
|
|||||||
eat( TokType::NewLine );
|
eat( TokType::NewLine );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TokType::Comment_Start:
|
case TokType::Comment:
|
||||||
member = parse_comment();
|
member = parse_comment();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -3232,10 +3272,11 @@ CodeConstructor parse_constructor()
|
|||||||
using namespace Parser;
|
using namespace Parser;
|
||||||
push_scope();
|
push_scope();
|
||||||
|
|
||||||
Token identifier = parse_identifier();
|
Token identifier = parse_identifier();
|
||||||
CodeParam params = parse_params();
|
CodeParam params = parse_params();
|
||||||
Code initializer_list = { nullptr };
|
Code initializer_list = NoCode;
|
||||||
CodeBody body = { nullptr };
|
CodeBody body = NoCode;
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
|
|
||||||
if ( check( TokType::Assign_Classifer ) )
|
if ( check( TokType::Assign_Classifer ) )
|
||||||
{
|
{
|
||||||
@ -3263,6 +3304,14 @@ CodeConstructor parse_constructor()
|
|||||||
{
|
{
|
||||||
body = parse_function_body();
|
body = parse_function_body();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
|
}
|
||||||
|
|
||||||
CodeConstructor result = (CodeConstructor) make_code();
|
CodeConstructor result = (CodeConstructor) make_code();
|
||||||
|
|
||||||
@ -3279,6 +3328,9 @@ CodeConstructor parse_constructor()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
result->Type = ECode::Constructor_Fwd;
|
result->Type = ECode::Constructor_Fwd;
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
@ -3321,8 +3373,8 @@ CodeDestructor parse_destructor( CodeSpecifiers specifiers )
|
|||||||
return CodeInvalid;
|
return CodeInvalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
Token identifier = parse_identifier();
|
Token identifier = parse_identifier();
|
||||||
CodeBody body = { nullptr };
|
CodeBody body = { nullptr };
|
||||||
|
|
||||||
eat( TokType::Capture_Start );
|
eat( TokType::Capture_Start );
|
||||||
eat( TokType::Capture_End );
|
eat( TokType::Capture_End );
|
||||||
@ -3343,9 +3395,19 @@ CodeDestructor parse_destructor( CodeSpecifiers specifiers )
|
|||||||
return CodeInvalid;
|
return CodeInvalid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
|
|
||||||
if ( check( TokType::BraceCurly_Open ) )
|
if ( check( TokType::BraceCurly_Open ) )
|
||||||
body = parse_function_body();
|
body = parse_function_body();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
|
}
|
||||||
|
|
||||||
CodeDestructor result = (CodeDestructor) make_code();
|
CodeDestructor result = (CodeDestructor) make_code();
|
||||||
|
|
||||||
@ -3359,6 +3421,9 @@ CodeDestructor parse_destructor( CodeSpecifiers specifiers )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
result->Type = ECode::Destructor_Fwd;
|
result->Type = ECode::Destructor_Fwd;
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
@ -3452,7 +3517,7 @@ CodeEnum parse_enum( bool inplace_def )
|
|||||||
eat( TokType::NewLine );
|
eat( TokType::NewLine );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TokType::Comment_Start:
|
case TokType::Comment:
|
||||||
member = parse_comment();
|
member = parse_comment();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -3528,8 +3593,16 @@ CodeEnum parse_enum( bool inplace_def )
|
|||||||
eat( TokType::BraceCurly_Close );
|
eat( TokType::BraceCurly_Close );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
|
|
||||||
if ( ! inplace_def )
|
if ( ! inplace_def )
|
||||||
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
|
}
|
||||||
|
|
||||||
using namespace ECode;
|
using namespace ECode;
|
||||||
|
|
||||||
@ -3553,6 +3626,9 @@ CodeEnum parse_enum( bool inplace_def )
|
|||||||
|
|
||||||
if ( type )
|
if ( type )
|
||||||
result->UnderlyingType = type;
|
result->UnderlyingType = type;
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
@ -3690,8 +3766,13 @@ CodeFriend parse_friend()
|
|||||||
if ( params )
|
if ( params )
|
||||||
function->Params = params;
|
function->Params = params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
|
|
||||||
CodeFriend
|
CodeFriend
|
||||||
result = (CodeFriend) make_code();
|
result = (CodeFriend) make_code();
|
||||||
@ -3702,6 +3783,9 @@ CodeFriend parse_friend()
|
|||||||
|
|
||||||
else
|
else
|
||||||
result->Declaration = type;
|
result->Declaration = type;
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
@ -3949,7 +4033,7 @@ CodeOpCast parse_operator_cast( CodeSpecifiers specifiers )
|
|||||||
using namespace Parser;
|
using namespace Parser;
|
||||||
push_scope();
|
push_scope();
|
||||||
|
|
||||||
// Specifiers attributed to the cast
|
// TODO : Specifiers attributed to the cast
|
||||||
|
|
||||||
// Operator's namespace if not within same class.
|
// Operator's namespace if not within same class.
|
||||||
Token name = NullToken;
|
Token name = NullToken;
|
||||||
@ -3987,7 +4071,8 @@ CodeOpCast parse_operator_cast( CodeSpecifiers specifiers )
|
|||||||
eat( TokType::Spec_Const );
|
eat( TokType::Spec_Const );
|
||||||
}
|
}
|
||||||
|
|
||||||
Code body = { nullptr };
|
Code body = NoCode;
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
|
|
||||||
if ( check( TokType::BraceCurly_Open) )
|
if ( check( TokType::BraceCurly_Open) )
|
||||||
{
|
{
|
||||||
@ -4014,7 +4099,11 @@ CodeOpCast parse_operator_cast( CodeSpecifiers specifiers )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
}
|
}
|
||||||
|
|
||||||
CodeOpCast result = (CodeOpCast) make_code();
|
CodeOpCast result = (CodeOpCast) make_code();
|
||||||
@ -4542,8 +4631,13 @@ CodeTypedef parse_typedef()
|
|||||||
}
|
}
|
||||||
|
|
||||||
array_expr = parse_array_decl();
|
array_expr = parse_array_decl();
|
||||||
|
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
inline_cmt = parse_comment();
|
||||||
|
|
||||||
using namespace ECode;
|
using namespace ECode;
|
||||||
|
|
||||||
@ -4567,6 +4661,9 @@ CodeTypedef parse_typedef()
|
|||||||
|
|
||||||
if ( type->Type == Typename && array_expr && array_expr->Type != Invalid )
|
if ( type->Type == Typename && array_expr && array_expr->Type != Invalid )
|
||||||
type.cast<CodeType>()->ArrExpr = array_expr;
|
type.cast<CodeType>()->ArrExpr = array_expr;
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
return result;
|
return result;
|
||||||
@ -4633,7 +4730,7 @@ CodeUnion parse_union( bool inplace_def )
|
|||||||
eat( TokType::NewLine );
|
eat( TokType::NewLine );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TokType::Comment_Start:
|
case TokType::Comment:
|
||||||
member = parse_comment();
|
member = parse_comment();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -4778,7 +4875,14 @@ CodeUsing parse_using()
|
|||||||
|
|
||||||
array_expr = parse_array_decl();
|
array_expr = parse_array_decl();
|
||||||
|
|
||||||
|
Token stmt_end = currtok;
|
||||||
eat( TokType::Statement_End );
|
eat( TokType::Statement_End );
|
||||||
|
|
||||||
|
CodeComment inline_cmt = NoCode;
|
||||||
|
if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line )
|
||||||
|
{
|
||||||
|
inline_cmt = parse_comment();
|
||||||
|
}
|
||||||
|
|
||||||
using namespace ECode;
|
using namespace ECode;
|
||||||
|
|
||||||
@ -4803,6 +4907,9 @@ CodeUsing parse_using()
|
|||||||
|
|
||||||
if ( attributes )
|
if ( attributes )
|
||||||
result->Attributes = attributes;
|
result->Attributes = attributes;
|
||||||
|
|
||||||
|
if ( inline_cmt )
|
||||||
|
result->InlineCmt = inline_cmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
Context.pop();
|
Context.pop();
|
||||||
|
@ -415,11 +415,41 @@ CodeComment def_comment( StrC content )
|
|||||||
return CodeInvalid;
|
return CodeInvalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char line[ MaxCommentLineLength ];
|
||||||
|
|
||||||
|
String cmt_formatted = String::make_reserve( GlobalAllocator, kilobytes(1) );
|
||||||
|
char const* end = content.Ptr + content.Len;
|
||||||
|
char const* scanner = content.Ptr;
|
||||||
|
s32 curr = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
char const* next = scanner;
|
||||||
|
s32 length = 0;
|
||||||
|
while ( next != end && scanner[ length ] != '\n' )
|
||||||
|
{
|
||||||
|
next = scanner + length;
|
||||||
|
length++;
|
||||||
|
}
|
||||||
|
length++;
|
||||||
|
|
||||||
|
str_copy( line, scanner, length );
|
||||||
|
cmt_formatted.append_fmt( "//%.*s", length, line );
|
||||||
|
mem_set( line, 0, MaxCommentLineLength );
|
||||||
|
|
||||||
|
scanner += length;
|
||||||
|
}
|
||||||
|
while ( scanner <= end );
|
||||||
|
|
||||||
|
if ( cmt_formatted.back() != '\n' )
|
||||||
|
cmt_formatted.append( "\n" );
|
||||||
|
|
||||||
Code
|
Code
|
||||||
result = make_code();
|
result = make_code();
|
||||||
result->Type = ECode::Comment;
|
result->Type = ECode::Comment;
|
||||||
result->Name = get_cached_string( content );
|
result->Name = get_cached_string( cmt_formatted );
|
||||||
result->Content = result->Name;
|
result->Content = result->Name;
|
||||||
|
|
||||||
|
cmt_formatted.free();
|
||||||
|
|
||||||
return (CodeComment) result;
|
return (CodeComment) result;
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ BraceSquare_Open, "["
|
|||||||
BraceSquare_Close, "]"
|
BraceSquare_Close, "]"
|
||||||
Capture_Start, "("
|
Capture_Start, "("
|
||||||
Capture_End, ")"
|
Capture_End, ")"
|
||||||
Comment, "__comemnt__"
|
Comment, "__comment__"
|
||||||
Comment_End, "__comment_end__"
|
Comment_End, "__comment_end__"
|
||||||
Comment_Start, "__comment_start__"
|
Comment_Start, "__comment_start__"
|
||||||
Char, "__character__"
|
Char, "__character__"
|
||||||
|
|
@ -17,7 +17,7 @@ GEN_NS_END
|
|||||||
using namespace gen;
|
using namespace gen;
|
||||||
|
|
||||||
constexpr char const* generation_notice =
|
constexpr char const* generation_notice =
|
||||||
"// This file was generated automatially by gen.bootstrap.cpp "
|
"// This file was generated automatially by gencpp's singleheader.cpp"
|
||||||
"(See: https://github.com/Ed94/gencpp)\n\n";
|
"(See: https://github.com/Ed94/gencpp)\n\n";
|
||||||
|
|
||||||
constexpr StrC implementation_guard_start = txt(R"(
|
constexpr StrC implementation_guard_start = txt(R"(
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "gen.builder.cpp"
|
#include "gen.builder.cpp"
|
||||||
#include "sanity.cpp"
|
#include "sanity.cpp"
|
||||||
#include "SOA.cpp"
|
#include "SOA.cpp"
|
||||||
#include "test.singleheader.cpp"
|
#include "validate.singleheader.cpp"
|
||||||
|
|
||||||
int gen_main()
|
int gen_main()
|
||||||
{
|
{
|
||||||
@ -18,7 +18,7 @@ int gen_main()
|
|||||||
|
|
||||||
// check_SOA();
|
// check_SOA();
|
||||||
|
|
||||||
// check_singleheader_ast();
|
check_singleheader_ast();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user