mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 07:44:45 -08:00
WIP (Not compiling prob): Started to overhaul macro handling
This commit is contained in:
parent
3c249d2fae
commit
76257123da
@ -26,6 +26,7 @@ struct AST_Constructor;
|
|||||||
// struct AST_BaseClass;
|
// struct AST_BaseClass;
|
||||||
struct AST_Class;
|
struct AST_Class;
|
||||||
struct AST_Define;
|
struct AST_Define;
|
||||||
|
struct AST_DefineParams;
|
||||||
struct AST_Destructor;
|
struct AST_Destructor;
|
||||||
struct AST_Enum;
|
struct AST_Enum;
|
||||||
struct AST_Exec;
|
struct AST_Exec;
|
||||||
@ -98,6 +99,7 @@ typedef AST_Comment* CodeComment;
|
|||||||
typedef AST_Class* CodeClass;
|
typedef AST_Class* CodeClass;
|
||||||
typedef AST_Constructor* CodeConstructor;
|
typedef AST_Constructor* CodeConstructor;
|
||||||
typedef AST_Define* CodeDefine;
|
typedef AST_Define* CodeDefine;
|
||||||
|
typedef AST_DefineParams* CodeDefineParams;
|
||||||
typedef AST_Destructor* CodeDestructor;
|
typedef AST_Destructor* CodeDestructor;
|
||||||
typedef AST_Enum* CodeEnum;
|
typedef AST_Enum* CodeEnum;
|
||||||
typedef AST_Exec* CodeExec;
|
typedef AST_Exec* CodeExec;
|
||||||
@ -120,6 +122,7 @@ struct CodeComment;
|
|||||||
struct CodeClass;
|
struct CodeClass;
|
||||||
struct CodeConstructor;
|
struct CodeConstructor;
|
||||||
struct CodeDefine;
|
struct CodeDefine;
|
||||||
|
struct CodeDefineParams;
|
||||||
struct CodeDestructor;
|
struct CodeDestructor;
|
||||||
struct CodeEnum;
|
struct CodeEnum;
|
||||||
struct CodeExec;
|
struct CodeExec;
|
||||||
@ -305,6 +308,7 @@ struct Code
|
|||||||
operator CodeClass() const;
|
operator CodeClass() const;
|
||||||
operator CodeConstructor() const;
|
operator CodeConstructor() const;
|
||||||
operator CodeDefine() const;
|
operator CodeDefine() const;
|
||||||
|
operator CodeDefineParams() const;
|
||||||
operator CodeDestructor() const;
|
operator CodeDestructor() const;
|
||||||
operator CodeExec() const;
|
operator CodeExec() const;
|
||||||
operator CodeEnum() const;
|
operator CodeEnum() const;
|
||||||
@ -365,6 +369,7 @@ int AST_ArrSpecs_Cap =
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Simple AST POD with functionality to seralize into C++ syntax.
|
Simple AST POD with functionality to seralize into C++ syntax.
|
||||||
|
TODO(Ed): Eventually haven't a transparent AST like this will longer be viable once statements & expressions are in (most likely....)
|
||||||
*/
|
*/
|
||||||
struct AST
|
struct AST
|
||||||
{
|
{
|
||||||
@ -372,7 +377,7 @@ struct AST
|
|||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
Code InlineCmt; // Class, Constructor, Destructor, Enum, Friend, Functon, Operator, OpCast, Struct, Typedef, Using, Variable
|
Code InlineCmt; // Class, Constructor, Destructor, Enum, Friend, Functon, Operator, OpCast, Struct, Typedef, Using, Variable
|
||||||
Code Attributes; // Class, Enum, Function, Struct, Typedef, Union, Using, Variable
|
Code Attributes; // Class, Enum, Function, Struct, Typedef, Union, Using, Variable // TODO(Ed): Parameters can have attributes
|
||||||
Code Specs; // Destructor, Function, Operator, Typename, Variable
|
Code Specs; // Destructor, Function, Operator, Typename, Variable
|
||||||
union {
|
union {
|
||||||
Code InitializerList; // Constructor
|
Code InitializerList; // Constructor
|
||||||
@ -384,12 +389,12 @@ struct AST
|
|||||||
union {
|
union {
|
||||||
Code Macro; // Parameter
|
Code Macro; // Parameter
|
||||||
Code BitfieldSize; // Variable (Class/Struct Data Member)
|
Code BitfieldSize; // Variable (Class/Struct Data Member)
|
||||||
Code Params; // Constructor, Function, Operator, Template, Typename
|
Code Params; // Constructor, Define, Function, Operator, Template, Typename
|
||||||
Code UnderlyingTypeMacro; // Enum
|
Code UnderlyingTypeMacro; // Enum
|
||||||
};
|
};
|
||||||
union {
|
union {
|
||||||
Code ArrExpr; // Typename
|
Code ArrExpr; // Typename
|
||||||
Code Body; // Class, Constructor, Destructor, Enum, Friend, Function, Namespace, Struct, Union
|
Code Body; // Class, Constructor, Define, Destructor, Enum, Friend, Function, Namespace, Struct, Union
|
||||||
Code Declaration; // Friend, Template
|
Code Declaration; // Friend, Template
|
||||||
Code Value; // Parameter, Variable
|
Code Value; // Parameter, Variable
|
||||||
};
|
};
|
||||||
|
@ -146,9 +146,15 @@ struct AST_Define
|
|||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
char _PAD_[ sizeof(Specifier) * AST_ArrSpecs_Cap + sizeof(AST*) ];
|
char _PAD_[ sizeof(Specifier) * AST_ArrSpecs_Cap + sizeof(AST*) ];
|
||||||
StrCached Content;
|
struct
|
||||||
|
{
|
||||||
|
char _PAD_PROPERTIES_ [ sizeof(AST*) * 4 ];
|
||||||
|
CodeDefineParams Params;
|
||||||
|
Code Body; // Should be completely serialized for now to a: StrCached Content.
|
||||||
|
char _PAD_PROPERTIES_ [ sizeof(AST*) * 1 ];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
StrCached Name;
|
StrCached Name;
|
||||||
Code Prev;
|
Code Prev;
|
||||||
Code Next;
|
Code Next;
|
||||||
Token* Tok;
|
Token* Tok;
|
||||||
@ -158,6 +164,22 @@ struct AST_Define
|
|||||||
};
|
};
|
||||||
static_assert( sizeof(AST_Define) == sizeof(AST), "ERROR: AST_Define is not the same size as AST");
|
static_assert( sizeof(AST_Define) == sizeof(AST), "ERROR: AST_Define is not the same size as AST");
|
||||||
|
|
||||||
|
struct AST_DefineParams
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
char _PAD_[ sizeof(Specifier) * AST_ArrSpecs_Cap + sizeof(AST*) ];
|
||||||
|
};
|
||||||
|
StrCached Name;
|
||||||
|
CodeDefineParams Last;
|
||||||
|
CodeDefineParams Next;
|
||||||
|
Token* Tok;
|
||||||
|
Code Parent;
|
||||||
|
CodeType Type;
|
||||||
|
char _PAD_UNUSED_[ sizeof(ModuleFlag) ];
|
||||||
|
s32 NumEntries;
|
||||||
|
};
|
||||||
|
static_assert( sizeof(AST_DefineParams) == sizeof(AST), "ERROR: AST_DefineParams is not the same size as AST");
|
||||||
|
|
||||||
struct AST_Destructor
|
struct AST_Destructor
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
@ -660,6 +682,7 @@ struct AST_Params
|
|||||||
char _PAD_[ sizeof(Specifier) * AST_ArrSpecs_Cap + sizeof(AST*) ];
|
char _PAD_[ sizeof(Specifier) * AST_ArrSpecs_Cap + sizeof(AST*) ];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
// TODO(Ed): Support attributes for parameters (Some prefix macros can be converted to that...)
|
||||||
char _PAD_PROPERTIES_2_[ sizeof(AST*) * 3 ];
|
char _PAD_PROPERTIES_2_[ sizeof(AST*) * 3 ];
|
||||||
CodeTypename ValueType;
|
CodeTypename ValueType;
|
||||||
Code Macro;
|
Code Macro;
|
||||||
@ -668,7 +691,7 @@ struct AST_Params
|
|||||||
// char _PAD_PROPERTIES_3_[sizeof( AST* )];
|
// char _PAD_PROPERTIES_3_[sizeof( AST* )];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
StrCached Name;
|
StrCached Name;
|
||||||
CodeParams Last;
|
CodeParams Last;
|
||||||
CodeParams Next;
|
CodeParams Next;
|
||||||
Token* Tok;
|
Token* Tok;
|
||||||
|
@ -32,7 +32,17 @@ GEN_API StrBuilder class_to_strbuilder ( CodeClass self );
|
|||||||
GEN_API void class_to_strbuilder_def( CodeClass self, StrBuilder* result );
|
GEN_API void class_to_strbuilder_def( CodeClass self, StrBuilder* result );
|
||||||
GEN_API void class_to_strbuilder_fwd( CodeClass self, StrBuilder* result );
|
GEN_API void class_to_strbuilder_fwd( CodeClass self, StrBuilder* result );
|
||||||
|
|
||||||
GEN_API void params_append (CodeParams params, CodeParams param );
|
GEN_API void define_params_append (CodeDefineParams appendee, CodeDefineParams other );
|
||||||
|
GEN_API CodeDefineParams define_params_get (CodeDefineParams params, s32 idx);
|
||||||
|
GEN_API bool define_params_has_entries (CodeDefineParams params );
|
||||||
|
GEN_API StrBuilder define_params_to_strbuilder (CodeDefineParams params );
|
||||||
|
GEN_API void define_params_to_strbuilder_ref(CodeDefineParams params, StrBuilder* result );
|
||||||
|
|
||||||
|
GEN_API CodeDefineParams begin_CodeDefineParams(CodeDefineParams params);
|
||||||
|
GEN_API CodeDefineParams end_CodeDefineParams (CodeDefineParams params);
|
||||||
|
GEN_API CodeDefineParams next_CodeDefineParams (CodeDefineParams params, CodeDefineParams entry_iter);
|
||||||
|
|
||||||
|
GEN_API void params_append (CodeParams appendee, CodeParams other );
|
||||||
GEN_API CodeParams params_get (CodeParams params, s32 idx);
|
GEN_API CodeParams params_get (CodeParams params, s32 idx);
|
||||||
GEN_API bool params_has_entries (CodeParams params );
|
GEN_API bool params_has_entries (CodeParams params );
|
||||||
GEN_API StrBuilder params_to_strbuilder (CodeParams params );
|
GEN_API StrBuilder params_to_strbuilder (CodeParams params );
|
||||||
@ -192,12 +202,11 @@ struct CodeParams
|
|||||||
{
|
{
|
||||||
#if ! GEN_C_LIKE_CPP
|
#if ! GEN_C_LIKE_CPP
|
||||||
Using_Code( CodeParams );
|
Using_Code( CodeParams );
|
||||||
forceinline void append( CodeParams other );
|
forceinline void append( CodeParams other ) { return params_append(* this, other) }
|
||||||
forceinline CodeParams get( s32 idx );
|
forceinline CodeParams get( s32 idx ) { return params_get( * this, idx); }
|
||||||
forceinline bool has_entries();
|
forceinline bool has_entries() { return params_has_entries(* this); }
|
||||||
forceinline StrBuilder to_strbuilder();
|
forceinline StrBuilder to_strbuilder() { return params_to_strbuilder(* this); }
|
||||||
forceinline void to_strbuilder( StrBuilder& result );
|
forceinline void to_strbuilder( StrBuilder& result ) { return params_to_strbuilder_ref(*this, & result); }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Using_CodeOps( CodeParams );
|
Using_CodeOps( CodeParams );
|
||||||
forceinline CodeParams begin() { return begin_CodeParams(* this); }
|
forceinline CodeParams begin() { return begin_CodeParams(* this); }
|
||||||
@ -212,6 +221,29 @@ struct CodeParams
|
|||||||
AST_Params* ast;
|
AST_Params* ast;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct CodeDefineParams
|
||||||
|
{
|
||||||
|
#if ! GEN_C_LIKE_CPP
|
||||||
|
Using_Code( CodeDefineParams );
|
||||||
|
forceinline void append( CodeDefineParams other ) { return params_append( cast(CodeParams, * this), other) }
|
||||||
|
forceinline CodeDefineParams get( s32 idx ) { return params_get( cast(CodeParams, * this), idx); }
|
||||||
|
forceinline bool has_entries() { return params_has_entries( cast(CodeParams, * this)); }
|
||||||
|
forceinline StrBuilder to_strbuilder() { return define_params_to_strbuilder(* this); }
|
||||||
|
forceinline void to_strbuilder( StrBuilder& result ) { return define_params_to_strbuilder_ref(* this, & result); }
|
||||||
|
#endif
|
||||||
|
Using_CodeOps( CodeDefineParams );
|
||||||
|
forceinline CodeDefineParams begin() { return begin_CodeParams( cast(CodeParams, * this)); }
|
||||||
|
forceinline CodeDefineParams end() { return end_CodeParams( cast(CodeParams, * this)); }
|
||||||
|
forceinline operator Code() { return { (AST*)ast }; }
|
||||||
|
forceinline CodeDefineParams operator *() { return * this; } // Required to support for-range iteration.
|
||||||
|
forceinline AST_DefineParams* operator->() {
|
||||||
|
GEN_ASSERT(ast);
|
||||||
|
return ast;
|
||||||
|
}
|
||||||
|
forceinline CodeDefineParams& operator++() { return cast(CodeParams, * this).operator ++() };
|
||||||
|
AST_DefineParams* ast;
|
||||||
|
};
|
||||||
|
|
||||||
struct CodeSpecifiers
|
struct CodeSpecifiers
|
||||||
{
|
{
|
||||||
#if ! GEN_C_LIKE_CPP
|
#if ! GEN_C_LIKE_CPP
|
||||||
@ -941,6 +973,7 @@ struct InvalidCode_ImplictCaster
|
|||||||
operator CodeClass () const { return cast(CodeClass, Code_Invalid); }
|
operator CodeClass () const { return cast(CodeClass, Code_Invalid); }
|
||||||
operator CodeConstructor () const { return cast(CodeConstructor, Code_Invalid); }
|
operator CodeConstructor () const { return cast(CodeConstructor, Code_Invalid); }
|
||||||
operator CodeDefine () const { return cast(CodeDefine, Code_Invalid); }
|
operator CodeDefine () const { return cast(CodeDefine, Code_Invalid); }
|
||||||
|
operator CodeDefineParams () const { return cast(CodeDefineParams, Code_Invalid); }
|
||||||
operator CodeDestructor () const { return cast(CodeDestructor, Code_Invalid); }
|
operator CodeDestructor () const { return cast(CodeDestructor, Code_Invalid); }
|
||||||
operator CodeExec () const { return cast(CodeExec, Code_Invalid); }
|
operator CodeExec () const { return cast(CodeExec, Code_Invalid); }
|
||||||
operator CodeEnum () const { return cast(CodeEnum, Code_Invalid); }
|
operator CodeEnum () const { return cast(CodeEnum, Code_Invalid); }
|
||||||
@ -974,6 +1007,7 @@ struct NullCode_ImplicitCaster
|
|||||||
operator CodeClass () const { return {nullptr}; }
|
operator CodeClass () const { return {nullptr}; }
|
||||||
operator CodeConstructor () const { return {nullptr}; }
|
operator CodeConstructor () const { return {nullptr}; }
|
||||||
operator CodeDefine () const { return {nullptr}; }
|
operator CodeDefine () const { return {nullptr}; }
|
||||||
|
operator CodeDefineParams () const { return {nullptr}; }
|
||||||
operator CodeDestructor () const { return {nullptr}; }
|
operator CodeDestructor () const { return {nullptr}; }
|
||||||
operator CodeExec () const { return {nullptr}; }
|
operator CodeExec () const { return {nullptr}; }
|
||||||
operator CodeEnum () const { return {nullptr}; }
|
operator CodeEnum () const { return {nullptr}; }
|
||||||
@ -1024,17 +1058,23 @@ forceinline StrBuilder to_strbuilder ( CodeClass self )
|
|||||||
forceinline void to_strbuilder_def( CodeClass self, StrBuilder& result ) { return class_to_strbuilder_def(self, & result); }
|
forceinline void to_strbuilder_def( CodeClass self, StrBuilder& result ) { return class_to_strbuilder_def(self, & result); }
|
||||||
forceinline void to_strbuilder_fwd( CodeClass self, StrBuilder& result ) { return class_to_strbuilder_fwd(self, & result); }
|
forceinline void to_strbuilder_fwd( CodeClass self, StrBuilder& result ) { return class_to_strbuilder_fwd(self, & result); }
|
||||||
|
|
||||||
forceinline void append (CodeParams params, CodeParams param ) { return params_append(params, param); }
|
forceinline void append (CodeDefineParams appendee, CodeDefineParams other ) { return params_append(cast(CodeParam, appendee), other); }
|
||||||
forceinline CodeParams get (CodeParams params, s32 idx) { return params_get(params, idx); }
|
forceinline CodeDefineParams get (CodeDefineParams params, s32 idx) { return params_get(cast(CodeParam, params), idx); }
|
||||||
forceinline bool has_entries (CodeParams params ) { return params_has_entries(params); }
|
forceinline bool has_entries (CodeDefineParams params ) { return params_has_entries(cast(CodeParam, params)); }
|
||||||
forceinline StrBuilder to_strbuilder(CodeParams params ) { return params_to_strbuilder(params); }
|
forceinline StrBuilder to_strbuilder(CodeDefineParams params ) { return define_params_to_strbuilder(params); }
|
||||||
forceinline void to_strbuilder(CodeParams params, StrBuilder& result ) { return params_to_strbuilder_ref(params, & result); }
|
forceinline void to_strbuilder(CodeDefineParams params, StrBuilder& result ) { return define_params_to_strbuilder_ref(params, & result); }
|
||||||
|
|
||||||
|
forceinline void append (CodeParams appendee, CodeParams other ) { return params_append(appendee, other); }
|
||||||
|
forceinline CodeParams get (CodeParams params, s32 idx) { return params_get(params, idx); }
|
||||||
|
forceinline bool has_entries (CodeParams params ) { return params_has_entries(params); }
|
||||||
|
forceinline StrBuilder to_strbuilder(CodeParams params ) { return params_to_strbuilder(params); }
|
||||||
|
forceinline void to_strbuilder(CodeParams params, StrBuilder& result ) { return params_to_strbuilder_ref(params, & result); }
|
||||||
|
|
||||||
forceinline bool append (CodeSpecifiers specifiers, Specifier spec) { return specifiers_append(specifiers, spec); }
|
forceinline bool append (CodeSpecifiers specifiers, Specifier spec) { return specifiers_append(specifiers, spec); }
|
||||||
forceinline s32 has (CodeSpecifiers specifiers, Specifier spec) { return specifiers_has(specifiers, spec); }
|
forceinline s32 has (CodeSpecifiers specifiers, Specifier spec) { return specifiers_has(specifiers, spec); }
|
||||||
forceinline s32 remove (CodeSpecifiers specifiers, Specifier to_remove ) { return specifiers_remove(specifiers, to_remove); }
|
forceinline s32 remove (CodeSpecifiers specifiers, Specifier to_remove ) { return specifiers_remove(specifiers, to_remove); }
|
||||||
forceinline StrBuilder to_strbuilder(CodeSpecifiers specifiers) { return specifiers_to_strbuilder(specifiers); }
|
forceinline StrBuilder to_strbuilder(CodeSpecifiers specifiers) { return specifiers_to_strbuilder(specifiers); }
|
||||||
forceinline void to_strbuilder(CodeSpecifiers specifiers, StrBuilder& result) { return specifiers_to_strbuilder_ref(specifiers, & result); }
|
forceinline void to_strbuilder(CodeSpecifiers specifiers, StrBuilder& result) { return specifiers_to_strbuilder_ref(specifiers, & result); }
|
||||||
|
|
||||||
forceinline void add_interface (CodeStruct self, CodeTypename interface) { return struct_add_interface(self, interface); }
|
forceinline void add_interface (CodeStruct self, CodeTypename interface) { return struct_add_interface(self, interface); }
|
||||||
forceinline StrBuilder to_strbuilder (CodeStruct self) { return struct_to_strbuilder(self); }
|
forceinline StrBuilder to_strbuilder (CodeStruct self) { return struct_to_strbuilder(self); }
|
||||||
|
@ -257,6 +257,16 @@ CodeParams next_CodeParams(CodeParams params, CodeParams param_iter)
|
|||||||
}
|
}
|
||||||
#pragma endregion CodeParams
|
#pragma endregion CodeParams
|
||||||
|
|
||||||
|
#pragma region CodeDefineParams
|
||||||
|
forceinline void define_params_append (CodeDefineParams appendee, CodeDefineParams other ) { params_append( cast(CodeParams, appendee), cast(CodeParams, other) ); }
|
||||||
|
forceinline CodeDefineParams define_params_get (CodeDefineParams self, s32 idx ) { return params_get( cast(CodeParams, self), idx); }
|
||||||
|
forceinline bool define_params_has_entries(CodeDefineParams self) { return params_has_entries( cast(CodeParams, self)); }
|
||||||
|
|
||||||
|
CodeDefineParams begin_CodeDefineParams(CodeDefineParams params) { return begin_CodeParams( cast(CodeParams, params)); }
|
||||||
|
CodeDefineParams end_CodeDefineParams (CodeDefineParams params) { return end_CodeParams ( cast(CodeParams, params)); }
|
||||||
|
CodeDefineParams next_CodeDefineParams (CodeDefineParams params, CodeDefineParams entry_iter) { return next_CodeParams ( cast(CodeParams, params), cast(CoeParams, entry_iter)); }
|
||||||
|
#pragma endregion CodeDefineParams
|
||||||
|
|
||||||
#pragma region CodeSpecifiers
|
#pragma region CodeSpecifiers
|
||||||
inline
|
inline
|
||||||
bool specifiers_append(CodeSpecifiers self, Specifier spec )
|
bool specifiers_append(CodeSpecifiers self, Specifier spec )
|
||||||
|
@ -354,7 +354,7 @@ void deinit(Context* ctx)
|
|||||||
array_free( ctx->CodePools);
|
array_free( ctx->CodePools);
|
||||||
array_free( ctx->StringArenas);
|
array_free( ctx->StringArenas);
|
||||||
|
|
||||||
arena_free(& ctx->LexArena);
|
// arena_free(& ctx->LexArena);
|
||||||
|
|
||||||
array_free(ctx->PreprocessorDefines);
|
array_free(ctx->PreprocessorDefines);
|
||||||
|
|
||||||
@ -463,10 +463,12 @@ Code make_code()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_preprocess_define( Str id, b32 is_functional ) {
|
PreprocessorMacro* lookup_preprocess_macro( Str name ) {
|
||||||
StrBuilder builder = strbuilder_make_str( _ctx->Allocator_Temp, id );
|
u32 key = crc32( name.Ptr, name.Len );
|
||||||
if (is_functional) {
|
return hashtable_get( _ctx->PreprocessorMacros, key );
|
||||||
strbuilder_append_char( & builder, '(' );
|
}
|
||||||
}
|
|
||||||
array_append( _ctx->PreprocessorDefines, cache_str( strbuilder_to_str(builder)) );
|
void register_preprocess_macro( PreprocessorMacro macro ) {
|
||||||
|
u32 key = crc32( macro.Name.Ptr, macro.Name.Len );
|
||||||
|
hashtable_set( _ctx->PreprocessorMacros, key, macro );
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ struct Context
|
|||||||
// Used by the lexer to persistently treat all these identifiers as preprocessor defines.
|
// Used by the lexer to persistently treat all these identifiers as preprocessor defines.
|
||||||
// Populate with strings via gen::cache_str.
|
// Populate with strings via gen::cache_str.
|
||||||
// Functional defines must have format: id( ;at minimum to indicate that the define is only valid with arguments.
|
// Functional defines must have format: id( ;at minimum to indicate that the define is only valid with arguments.
|
||||||
Array(StrCached) PreprocessorDefines;
|
HashTable(PreprocessorMacro) PreprocessorMacros;
|
||||||
|
|
||||||
// Backend
|
// Backend
|
||||||
|
|
||||||
@ -88,8 +88,8 @@ struct Context
|
|||||||
|
|
||||||
// TODO(Ed): This needs to be just handled by a parser context
|
// TODO(Ed): This needs to be just handled by a parser context
|
||||||
|
|
||||||
Arena LexArena;
|
// Arena LexArena;
|
||||||
StringTable Lexer_defines;
|
// StringTable Lexer_defines;
|
||||||
Array(Token) Lexer_Tokens;
|
Array(Token) Lexer_Tokens;
|
||||||
|
|
||||||
// TODO(Ed): Active parse context vs a parse result need to be separated conceptually
|
// TODO(Ed): Active parse context vs a parse result need to be separated conceptually
|
||||||
@ -109,9 +109,13 @@ GEN_API void reset(Context* ctx);
|
|||||||
|
|
||||||
GEN_API void set_context(Context* ctx);
|
GEN_API void set_context(Context* ctx);
|
||||||
|
|
||||||
|
// Mostly used to verify a macro entry exists for the given name
|
||||||
|
GEN_API PreprocessMacro* lookup_preprocess_macro( Str Name );
|
||||||
|
|
||||||
// Alternative way to add a preprocess define entry for the lexer & parser to utilize
|
// Alternative way to add a preprocess define entry for the lexer & parser to utilize
|
||||||
// if the user doesn't want to use def_define
|
// if the user doesn't want to use def_define
|
||||||
GEN_API void set_preprocess_define( Str id, b32 is_functional );
|
// Macros are tracked by name so if the name already exists the entry will be overwritten.
|
||||||
|
GEN_API void register_preprocess_macro( PreprocessorMacro macro );
|
||||||
|
|
||||||
// Used internally to retrive or make string allocations.
|
// Used internally to retrive or make string allocations.
|
||||||
// Strings are stored in a series of string arenas of fixed size (SizePer_StringArena)
|
// Strings are stored in a series of string arenas of fixed size (SizePer_StringArena)
|
||||||
@ -150,9 +154,11 @@ struct Opts_def_constructor {
|
|||||||
GEN_API CodeConstructor def_constructor( Opts_def_constructor opts GEN_PARAM_DEFAULT );
|
GEN_API CodeConstructor def_constructor( Opts_def_constructor opts GEN_PARAM_DEFAULT );
|
||||||
|
|
||||||
struct Opts_def_define {
|
struct Opts_def_define {
|
||||||
b32 dont_append_preprocess_defines;
|
MacroFlags flags;
|
||||||
|
CodeDefineParams params;
|
||||||
|
b32 dont_register_to_preprocess_macros;
|
||||||
};
|
};
|
||||||
GEN_API CodeDefine def_define( Str name, Str content, Opts_def_define opts GEN_PARAM_DEFAULT );
|
GEN_API CodeDefine def_define( Str name, MacroType type, Opts_def_define opts GEN_PARAM_DEFAULT );
|
||||||
|
|
||||||
struct Opts_def_destructor {
|
struct Opts_def_destructor {
|
||||||
Code body;
|
Code body;
|
||||||
|
@ -221,6 +221,9 @@ s32 lex_preprocessor_directive( LexContext* ctx )
|
|||||||
name.Text.Len = 1;
|
name.Text.Len = 1;
|
||||||
move_forward();
|
move_forward();
|
||||||
|
|
||||||
|
PreprocessorMacro* registered_macro = lookup_preprocess_macro(name.Text);
|
||||||
|
|
||||||
|
|
||||||
while ( ctx->left && ( char_is_alphanumeric((* ctx->scanner)) || (* ctx->scanner) == '_' ) )
|
while ( ctx->left && ( char_is_alphanumeric((* ctx->scanner)) || (* ctx->scanner) == '_' ) )
|
||||||
{
|
{
|
||||||
move_forward();
|
move_forward();
|
||||||
@ -477,23 +480,24 @@ TokArray lex( Str content )
|
|||||||
return null_array;
|
return null_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( StrCached* entry = array_begin(_ctx->PreprocessorDefines); entry != array_end(_ctx->PreprocessorDefines); entry = array_next(_ctx->PreprocessorDefines, entry))
|
// TODO(ED): Remove this when preprocess defines has been converted
|
||||||
{
|
// for ( StrCached* entry = array_begin(_ctx->PreprocessorDefines); entry != array_end(_ctx->PreprocessorDefines); entry = array_next(_ctx->PreprocessorDefines, entry))
|
||||||
s32 length = 0;
|
// {
|
||||||
char const* entry_scanner = (*entry).Ptr;
|
// s32 length = 0;
|
||||||
while ( entry->Len > length && (char_is_alphanumeric( *entry_scanner ) || *entry_scanner == '_') )
|
// char const* entry_scanner = (*entry).Ptr;
|
||||||
{
|
// while ( entry->Len > length && (char_is_alphanumeric( *entry_scanner ) || *entry_scanner == '_') )
|
||||||
entry_scanner++;
|
// {
|
||||||
length ++;
|
// entry_scanner++;
|
||||||
}
|
// length ++;
|
||||||
if ( entry_scanner[0] == '(' )
|
// }
|
||||||
{
|
// if ( entry_scanner[0] == '(' )
|
||||||
length++;
|
// {
|
||||||
}
|
// length++;
|
||||||
|
// }
|
||||||
|
|
||||||
u64 key = crc32( entry->Ptr, length );
|
// u64 key = crc32( entry->Ptr, length );
|
||||||
hashtable_set(c.defines, key, * entry );
|
// hashtable_set(c.defines, key, * entry );
|
||||||
}
|
// }
|
||||||
|
|
||||||
array_clear(_ctx->Lexer_Tokens);
|
array_clear(_ctx->Lexer_Tokens);
|
||||||
|
|
||||||
@ -1210,8 +1214,6 @@ TokArray lex( Str content )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hashtable_clear(_ctx->Lexer_defines);
|
|
||||||
// defines_map_arena.free();
|
|
||||||
TokArray result = { _ctx->Lexer_Tokens, 0 };
|
TokArray result = { _ctx->Lexer_Tokens, 0 };
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1774,7 +1774,7 @@ CodeBody parse_global_nspace( CodeType which )
|
|||||||
// <Attributes>
|
// <Attributes>
|
||||||
}
|
}
|
||||||
//! Fallthrough intentional
|
//! Fallthrough intentional
|
||||||
GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_TOK_SPECIFIERS_CASES:
|
GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_TOK_SPECIFIER_CASES:
|
||||||
{
|
{
|
||||||
Specifier specs_found[16] = { Spec_NumSpecifiers };
|
Specifier specs_found[16] = { Spec_NumSpecifiers };
|
||||||
s32 NumSpecifiers = 0;
|
s32 NumSpecifiers = 0;
|
||||||
@ -1787,7 +1787,7 @@ CodeBody parse_global_nspace( CodeType which )
|
|||||||
|
|
||||||
switch ( spec )
|
switch ( spec )
|
||||||
{
|
{
|
||||||
GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_SPECIFIERS_CASES:
|
GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_SPECIFIER_CASES:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Spec_Consteval:
|
case Spec_Consteval:
|
||||||
@ -2687,6 +2687,7 @@ CodeParams parse_params( bool use_template_capture )
|
|||||||
#define CheckEndParams() \
|
#define CheckEndParams() \
|
||||||
(use_template_capture ? (currtok.Text.Ptr[ 0 ] != '>') : (currtok.Type != Tok_Capture_End))
|
(use_template_capture ? (currtok.Text.Ptr[ 0 ] != '>') : (currtok.Type != Tok_Capture_End))
|
||||||
|
|
||||||
|
// TODO(Ed): Use expression macros or this? macro as attribute?
|
||||||
// Ex: Unreal has this type of macro: vvvvvvvvv
|
// Ex: Unreal has this type of macro: vvvvvvvvv
|
||||||
// COREUOBJECT_API void CallFunction( FFrame& Stack, RESULT_DECL, UFunction* Function );
|
// COREUOBJECT_API void CallFunction( FFrame& Stack, RESULT_DECL, UFunction* Function );
|
||||||
// and: vvvv
|
// and: vvvv
|
||||||
@ -2713,6 +2714,7 @@ CodeParams parse_params( bool use_template_capture )
|
|||||||
// ( <Macro> <ValueType> <Name>
|
// ( <Macro> <ValueType> <Name>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(Ed): Use expression macro for this?
|
||||||
// Unreal has yet another type of macro:
|
// Unreal has yet another type of macro:
|
||||||
// template<class T UE_REQUIRES(TPointerIsConvertibleFromTo<T, UInterface>::Value)>
|
// template<class T UE_REQUIRES(TPointerIsConvertibleFromTo<T, UInterface>::Value)>
|
||||||
// class T ... and then ^this^ UE_REQUIRES shows up
|
// class T ... and then ^this^ UE_REQUIRES shows up
|
||||||
|
@ -25,7 +25,7 @@ case Spec_Static: \
|
|||||||
case Spec_Volatile: \
|
case Spec_Volatile: \
|
||||||
case Spec_Virtual
|
case Spec_Virtual
|
||||||
|
|
||||||
#define GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_TOK_SPECIFIERS_CASES \
|
#define GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_TOK_SPECIFIER_CASES \
|
||||||
case Tok_Spec_Consteval: \
|
case Tok_Spec_Consteval: \
|
||||||
case Tok_Spec_Constexpr: \
|
case Tok_Spec_Constexpr: \
|
||||||
case Tok_Spec_Constinit: \
|
case Tok_Spec_Constinit: \
|
||||||
@ -37,7 +37,7 @@ case Tok_Spec_Internal_Linkage: \
|
|||||||
case Tok_Spec_NeverInline: \
|
case Tok_Spec_NeverInline: \
|
||||||
case Tok_Spec_Static
|
case Tok_Spec_Static
|
||||||
|
|
||||||
#define GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_SPECIFIERS_CASES \
|
#define GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_SPECIFIER_CASES \
|
||||||
case Spec_Constexpr: \
|
case Spec_Constexpr: \
|
||||||
case Spec_Constinit: \
|
case Spec_Constinit: \
|
||||||
case Spec_ForceInline: \
|
case Spec_ForceInline: \
|
||||||
|
@ -6,37 +6,49 @@
|
|||||||
#include "gen/especifier.hpp"
|
#include "gen/especifier.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum MacroFlags : u32
|
enum MacroTypes : u16
|
||||||
{
|
{
|
||||||
// Can only be one of these at a time (required)
|
MT_Block_Start, // Not Supported yet
|
||||||
MF_Block_Start = bit(0), // Start of a "block" scope
|
MT_Block_End, // Not Supported yet
|
||||||
MF_Block_End = bit(1), // End of a "block" scope
|
MT_Case_Statement, // Not Supported yet
|
||||||
MF_Case_Statement = bit(2), // Used as a case statement (not utilized by the parser yet)
|
MT_Expression,
|
||||||
MF_Expression = bit(3), // Used as an expresssion (not utilized by the parser yet)
|
MT_Statement,
|
||||||
MF_Statement = bit(4), // Used a statement (will expect to be a lone macro)
|
MT_Typename,
|
||||||
MF_Expects_Body = bit(5), // Expects to consume a braced scope
|
|
||||||
MF_Typename = bit(6), // Behaves as a typename
|
|
||||||
|
|
||||||
// Optional
|
MF_UnderlyingType = GEN_U16_Max,
|
||||||
MF_Functional = bit(7),
|
};
|
||||||
|
|
||||||
|
enum MacroFlags : u16
|
||||||
|
{
|
||||||
|
MF_Functional = bit(0), // Macro has parameters (args expected to be passed)
|
||||||
|
MF_Expects_Body = bit(1), // Expects to assign a braced scope to its body.
|
||||||
|
|
||||||
MF_Null = 0,
|
MF_Null = 0,
|
||||||
MF_UnderlyingType = GEN_U32_MAX,
|
MF_UnderlyingType = GEN_U16_Max,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PreprocessorMacro
|
||||||
|
{
|
||||||
|
StrCached Name;
|
||||||
|
MacroTypes Type;
|
||||||
|
MacroFlags Flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TokFlags : u32
|
enum TokFlags : u32
|
||||||
{
|
{
|
||||||
TF_Operator = bit(0),
|
TF_Operator = bit(0),
|
||||||
TF_Assign = bit(1),
|
TF_Assign = bit(1),
|
||||||
TF_Preprocess = bit(2),
|
TF_Preprocess = bit(2),
|
||||||
TF_Preprocess_Cond = bit(3),
|
TF_Preprocess_Cond = bit(3),
|
||||||
TF_Attribute = bit(6),
|
TF_Attribute = bit(6),
|
||||||
TF_AccessOperator = bit( 7 ),
|
TF_AccessOperator = bit(7),
|
||||||
TF_AccessSpecifier = bit( 8 ),
|
TF_AccessSpecifier = bit(8),
|
||||||
TF_Specifier = bit( 9 ),
|
TF_Specifier = bit(9),
|
||||||
TF_EndDefinition = bit( 10 ), // Either ; or }
|
TF_EndDefinition = bit(10), // Either ; or }
|
||||||
TF_Formatting = bit( 11 ),
|
TF_Formatting = bit(11),
|
||||||
TF_Literal = bit( 12 ),
|
TF_Literal = bit(12),
|
||||||
|
TF_Macro_Functional = bit(13),
|
||||||
|
TF_Macro_Expects_Body = bit(14),
|
||||||
|
|
||||||
TF_Null = 0,
|
TF_Null = 0,
|
||||||
TF_UnderlyingType = GEN_U32_MAX,
|
TF_UnderlyingType = GEN_U32_MAX,
|
||||||
@ -123,7 +135,7 @@ struct LexContext
|
|||||||
char const* scanner;
|
char const* scanner;
|
||||||
s32 line;
|
s32 line;
|
||||||
s32 column;
|
s32 column;
|
||||||
StringTable defines;
|
// StringTable defines;
|
||||||
Token token;
|
Token token;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ Operator_Member_Fwd, "operator"
|
|||||||
Operator_Cast, "operator"
|
Operator_Cast, "operator"
|
||||||
Operator_Cast_Fwd, "operator"
|
Operator_Cast_Fwd, "operator"
|
||||||
Parameters, "__NA__"
|
Parameters, "__NA__"
|
||||||
|
Parameters_Define, "__NA__"
|
||||||
Preprocess_Define, "define"
|
Preprocess_Define, "define"
|
||||||
Preprocess_Include, "include"
|
Preprocess_Include, "include"
|
||||||
Preprocess_If, "if"
|
Preprocess_If, "if"
|
||||||
|
|
@ -1,95 +1,97 @@
|
|||||||
Invalid, "__invalid__"
|
Invalid, "__invalid__"
|
||||||
Access_Private, "private"
|
Access_Private, "private"
|
||||||
Access_Protected, "protected"
|
Access_Protected, "protected"
|
||||||
Access_Public, "public"
|
Access_Public, "public"
|
||||||
Access_MemberSymbol, "."
|
Access_MemberSymbol, "."
|
||||||
Access_StaticSymbol, "::"
|
Access_StaticSymbol, "::"
|
||||||
Ampersand, "&"
|
Ampersand, "&"
|
||||||
Ampersand_DBL, "&&"
|
Ampersand_DBL, "&&"
|
||||||
Assign_Classifer, ":"
|
Assign_Classifer, ":"
|
||||||
Attribute_Open, "[["
|
Attribute_Open, "[["
|
||||||
Attribute_Close, "]]"
|
Attribute_Close, "]]"
|
||||||
BraceCurly_Open, "{"
|
BraceCurly_Open, "{"
|
||||||
BraceCurly_Close, "}"
|
BraceCurly_Close, "}"
|
||||||
BraceSquare_Open, "["
|
BraceSquare_Open, "["
|
||||||
BraceSquare_Close, "]"
|
BraceSquare_Close, "]"
|
||||||
Capture_Start, "("
|
Capture_Start, "("
|
||||||
Capture_End, ")"
|
Capture_End, ")"
|
||||||
Comment, "__comment__"
|
Comment, "__comment__"
|
||||||
Comment_End, "__comment_end__"
|
Comment_End, "__comment_end__"
|
||||||
Comment_Start, "__comment_start__"
|
Comment_Start, "__comment_start__"
|
||||||
Char, "__character__"
|
Char, "__character__"
|
||||||
Comma, ","
|
Comma, ","
|
||||||
Decl_Class, "class"
|
Decl_Class, "class"
|
||||||
Decl_GNU_Attribute, "__attribute__"
|
Decl_GNU_Attribute, "__attribute__"
|
||||||
Decl_MSVC_Attribute, "__declspec"
|
Decl_MSVC_Attribute, "__declspec"
|
||||||
Decl_Enum, "enum"
|
Decl_Enum, "enum"
|
||||||
Decl_Extern_Linkage, "extern"
|
Decl_Extern_Linkage, "extern"
|
||||||
Decl_Friend, "friend"
|
Decl_Friend, "friend"
|
||||||
Decl_Module, "module"
|
Decl_Module, "module"
|
||||||
Decl_Namespace, "namespace"
|
Decl_Namespace, "namespace"
|
||||||
Decl_Operator, "operator"
|
Decl_Operator, "operator"
|
||||||
Decl_Struct, "struct"
|
Decl_Struct, "struct"
|
||||||
Decl_Template, "template"
|
Decl_Template, "template"
|
||||||
Decl_Typedef, "typedef"
|
Decl_Typedef, "typedef"
|
||||||
Decl_Using, "using"
|
Decl_Using, "using"
|
||||||
Decl_Union, "union"
|
Decl_Union, "union"
|
||||||
Identifier, "__identifier__"
|
Identifier, "__identifier__"
|
||||||
Module_Import, "import"
|
Module_Import, "import"
|
||||||
Module_Export, "export"
|
Module_Export, "export"
|
||||||
NewLine, "__new_line__"
|
NewLine, "__new_line__"
|
||||||
Number, "__number__"
|
Number, "__number__"
|
||||||
Operator, "__operator__"
|
Operator, "__operator__"
|
||||||
Preprocess_Hash, "#"
|
Preprocess_Hash, "#"
|
||||||
Preprocess_Define, "define"
|
Preprocess_Define, "define"
|
||||||
Preprocess_If, "if"
|
Preprocess_If, "if"
|
||||||
Preprocess_IfDef, "ifdef"
|
Preprocess_IfDef, "ifdef"
|
||||||
Preprocess_IfNotDef, "ifndef"
|
Preprocess_IfNotDef, "ifndef"
|
||||||
Preprocess_ElIf, "elif"
|
Preprocess_ElIf, "elif"
|
||||||
Preprocess_Else, "else"
|
Preprocess_Else, "else"
|
||||||
Preprocess_EndIf, "endif"
|
Preprocess_EndIf, "endif"
|
||||||
Preprocess_Include, "include"
|
Preprocess_Include, "include"
|
||||||
Preprocess_Pragma, "pragma"
|
Preprocess_Pragma, "pragma"
|
||||||
Preprocess_Content, "__macro_content__"
|
Preprocess_Content, "__macro_content__"
|
||||||
Preprocess_Macro, "__macro__"
|
Preprocess_Macro_Expr, "__macro_expression__"
|
||||||
Preprocess_Unsupported, "__unsupported__"
|
Preprocess_Macro_Stmt, "__macro_statment__"
|
||||||
Spec_Alignas, "alignas"
|
Preprocess_Macro_Typename, "__macro_typename__"
|
||||||
Spec_Const, "const"
|
Preprocess_Unsupported, "__unsupported__"
|
||||||
Spec_Consteval, "consteval"
|
Spec_Alignas, "alignas"
|
||||||
Spec_Constexpr, "constexpr"
|
Spec_Const, "const"
|
||||||
Spec_Constinit, "constinit"
|
Spec_Consteval, "consteval"
|
||||||
Spec_Explicit, "explicit"
|
Spec_Constexpr, "constexpr"
|
||||||
Spec_Extern, "extern"
|
Spec_Constinit, "constinit"
|
||||||
Spec_Final, "final"
|
Spec_Explicit, "explicit"
|
||||||
Spec_ForceInline, "forceinline"
|
Spec_Extern, "extern"
|
||||||
Spec_Global, "global"
|
Spec_Final, "final"
|
||||||
Spec_Inline, "inline"
|
Spec_ForceInline, "forceinline"
|
||||||
Spec_Internal_Linkage, "internal"
|
Spec_Global, "global"
|
||||||
Spec_LocalPersist, "local_persist"
|
Spec_Inline, "inline"
|
||||||
Spec_Mutable, "mutable"
|
Spec_Internal_Linkage, "internal"
|
||||||
Spec_NeverInline, "neverinline"
|
Spec_LocalPersist, "local_persist"
|
||||||
Spec_Override, "override"
|
Spec_Mutable, "mutable"
|
||||||
Spec_Static, "static"
|
Spec_NeverInline, "neverinline"
|
||||||
Spec_ThreadLocal, "thread_local"
|
Spec_Override, "override"
|
||||||
Spec_Volatile, "volatile"
|
Spec_Static, "static"
|
||||||
Spec_Virtual, "virtual"
|
Spec_ThreadLocal, "thread_local"
|
||||||
Star, "*"
|
Spec_Volatile, "volatile"
|
||||||
Statement_End, ";"
|
Spec_Virtual, "virtual"
|
||||||
StaticAssert, "static_assert"
|
Star, "*"
|
||||||
String, "__string__"
|
Statement_End, ";"
|
||||||
Type_Typename, "typename"
|
StaticAssert, "static_assert"
|
||||||
Type_Unsigned, "unsigned"
|
String, "__string__"
|
||||||
Type_Signed, "signed"
|
Type_Typename, "typename"
|
||||||
Type_Short, "short"
|
Type_Unsigned, "unsigned"
|
||||||
Type_Long, "long"
|
Type_Signed, "signed"
|
||||||
Type_bool, "bool"
|
Type_Short, "short"
|
||||||
Type_char, "char"
|
Type_Long, "long"
|
||||||
Type_int, "int"
|
Type_bool, "bool"
|
||||||
Type_double, "double"
|
Type_char, "char"
|
||||||
Type_MS_int8, "__int8"
|
Type_int, "int"
|
||||||
Type_MS_int16, "__int16"
|
Type_double, "double"
|
||||||
Type_MS_int32, "__int32"
|
Type_MS_int8, "__int8"
|
||||||
Type_MS_int64, "__int64"
|
Type_MS_int16, "__int16"
|
||||||
Type_MS_W64, "_W64"
|
Type_MS_int32, "__int32"
|
||||||
Varadic_Argument, "..."
|
Type_MS_int64, "__int64"
|
||||||
__Attributes_Start, "__attrib_start__"
|
Type_MS_W64, "_W64"
|
||||||
|
Varadic_Argument, "..."
|
||||||
|
__Attributes_Start, "__attrib_start__"
|
||||||
|
|
@ -7,12 +7,13 @@ void convert_cpp_enum_to_c( CodeEnum to_convert, CodeBody to_append )
|
|||||||
{
|
{
|
||||||
#pragma push_macro("enum_underlying")
|
#pragma push_macro("enum_underlying")
|
||||||
#undef enum_underlying
|
#undef enum_underlying
|
||||||
|
StrCached type = to_convert->UnderlyingType ? to_convert->UnderlyingType : to_convert->Name
|
||||||
|
CodeTypedef tdef = parse_typedef(token_fmt("type", type, "name", to_convert->Name, stringize( typedef enum <type> <name>; )));
|
||||||
if (to_convert->UnderlyingType)
|
if (to_convert->UnderlyingType)
|
||||||
{
|
{
|
||||||
to_convert->UnderlyingTypeMacro = untyped_str(token_fmt("type", to_convert->UnderlyingType->Name, stringize(enum_underlying(<type>))));
|
to_convert->UnderlyingTypeMacro = untyped_str(token_fmt("type", to_convert->UnderlyingType->Name, stringize(enum_underlying(<type>))));
|
||||||
to_convert->UnderlyingType = CodeTypename{nullptr};
|
to_convert->UnderlyingType = CodeTypename{nullptr};
|
||||||
}
|
}
|
||||||
CodeTypedef tdef = parse_typedef(token_fmt("name", to_convert->Name, stringize( typedef enum <name> <name>; )));
|
|
||||||
to_append.append(to_convert);
|
to_append.append(to_convert);
|
||||||
to_append.append(tdef);
|
to_append.append(tdef);
|
||||||
#pragma pop_macro("enum_underlying")
|
#pragma pop_macro("enum_underlying")
|
||||||
|
@ -27,7 +27,7 @@ case Spec_Static: \
|
|||||||
case Spec_Volatile: \
|
case Spec_Volatile: \
|
||||||
case Spec_Virtual
|
case Spec_Virtual
|
||||||
|
|
||||||
#define GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_TOK_SPECIFIERS_CASES \
|
#define GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_TOK_SPECIFIER_CASES \
|
||||||
case Tok_Spec_Consteval: \
|
case Tok_Spec_Consteval: \
|
||||||
case Tok_Spec_Constexpr: \
|
case Tok_Spec_Constexpr: \
|
||||||
case Tok_Spec_Constinit: \
|
case Tok_Spec_Constinit: \
|
||||||
@ -40,7 +40,7 @@ case Tok_Spec_Internal_Linkage: \
|
|||||||
case Tok_Spec_NeverInline: \
|
case Tok_Spec_NeverInline: \
|
||||||
case Tok_Spec_Static
|
case Tok_Spec_Static
|
||||||
|
|
||||||
#define GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_SPECIFIERS_CASES \
|
#define GEN_PARSER_CLASS_GLOBAL_NSPACE_ALLOWED_MEMBER_SPECIFIER_CASES \
|
||||||
case Spec_Constexpr: \
|
case Spec_Constexpr: \
|
||||||
case Spec_Constinit: \
|
case Spec_Constinit: \
|
||||||
case Spec_ForceInline: \
|
case Spec_ForceInline: \
|
||||||
|
Loading…
Reference in New Issue
Block a user