mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-30 22:40:54 -07:00 
			
		
		
		
	Compare commits
	
		
			12 Commits
		
	
	
		
			v0.11-Alph
			...
			v0.15-Alph
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 912cc6b538 | |||
| 3dd5482a46 | |||
| 632fa10027 | |||
| 6498b13658 | |||
| 7f562cd77f | |||
| 3a0e971ebf | |||
| 4997cb5878 | |||
| 729c891cbd | |||
| 754bcfb31e | |||
| a8708abf8b | |||
| 4b48b96a79 | |||
| 9495fc2985 | 
							
								
								
									
										15
									
								
								Readme.md
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								Readme.md
									
									
									
									
									
								
							| @@ -5,14 +5,19 @@ An attempt at simple staged metaprogramming for c/c++. | |||||||
| The library API is a composition of code element constructors.   | The library API is a composition of code element constructors.   | ||||||
| These build up a code AST to then serialize with a file builder. | These build up a code AST to then serialize with a file builder. | ||||||
|  |  | ||||||
| This code base attempts follow the [handmade philosophy](https://handmade.network/manifesto),   | This code base attempts follow the [handmade philosophy](https://handmade.network/manifesto).   | ||||||
| its not meant to be a black box metaprogramming utility, it should be easy to intergrate into a user's project domain. | Its not meant to be a black box metaprogramming utility, it should be easy to intergrate into a user's project domain.   | ||||||
|  |  | ||||||
| ## Notes | ## Notes | ||||||
|  |  | ||||||
| The project has reached an *alpha* state, all the current functionality works for the test cases but it will most likely break in many other cases.   | **On Partial Hiatus: Working on handmade hero for now. Only fixes will be pushed as I come across them until I get what I want done from the series** | ||||||
|  |  | ||||||
| A `natvis` and `natstepfilter` are provided in the scripts directory. | This project is still in development (very much an alpha state), so expect bugs and missing features.   | ||||||
|  | See [issues](https://github.com/Ed94/gencpp/issues) for a list of known bugs or todos. | ||||||
|  |  | ||||||
|  | The library can already be used to generate code just fine, but the parser is where the most work is needed. If your C++ isn't "down to earth" expect issues. | ||||||
|  |  | ||||||
|  | A `natvis` and `natstepfilter` are provided in the scripts directory (its outdated, I'll update this readme when its not). | ||||||
|  |  | ||||||
| ***The editor and scanner have not been implemented yet. The scanner will come first, then the editor.*** | ***The editor and scanner have not been implemented yet. The scanner will come first, then the editor.*** | ||||||
|  |  | ||||||
| @@ -123,7 +128,7 @@ struct ArrayHeader | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| **Note: The formatting shown here is not how it will look. For your desired formatting its recommended to run a pass through the files with an auto-formatter.** | **Note: The formatting shown here is not how it will look. For your desired formatting its recommended to run a pass through the files with an auto-formatter.** | ||||||
| *(The library currently uses clang-format for formatting, beaware its pretty slow...)* | *(The library currently uses clang-format for formatting, beware its pretty slow...)* | ||||||
|  |  | ||||||
| ## Building | ## Building | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								docs/AST_Design.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								docs/AST_Design.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | # Forward | ||||||
|  |  | ||||||
|  | Was never satisfied with how I did the wrap of the management of the AST.   | ||||||
|  | For C++, the current design may be as good as it gets for the limitations of the langauge. | ||||||
|  |  | ||||||
|  | I'll at least try in this issue to brainstorm something simpiler without losing ergonomics.   | ||||||
|  | This will also be a good place to document the current design. | ||||||
|  |  | ||||||
|  | ## Current Design | ||||||
|  |  | ||||||
|  | `AST` is the actual managed node object for the library.   | ||||||
|  | Its raw and really not meant to be used directly. | ||||||
|  |  | ||||||
|  | All user interaction must be with its pointer so the type they deal with is `AST*`.   | ||||||
|  | For user-facing code, they should never be giveen a nullptr. Instead, they should be given a designated `Invalid` AST node. | ||||||
|  |  | ||||||
|  | In order to abstract away constant use of `AST*`, I wanted to provide a wrapper for it. | ||||||
|  |  | ||||||
|  | The simpliest being just a type alias. | ||||||
|  |  | ||||||
|  | ```cpp | ||||||
|  | using Code = AST*; | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | This is what the genc library would have to use due to its constraints of a langauge. | ||||||
|  | Anything else and it would either be an unergonomic mess of struct wrapping with a mess of macros & procedures to interface with it. | ||||||
|  |  | ||||||
|  | Further, to provide intuitive filters on the AST, there are AST types (covered in [AST_Types.md](AST_Types.md)). | ||||||
|  |  | ||||||
|  | These are pure PODS that just have the lay members relevant to the type of AST node they represent.   | ||||||
|  | Each of them has a Code type alias specific to it. | ||||||
|  |  | ||||||
|  | Again, the simpliest case for these would be a type alias. | ||||||
|  |  | ||||||
|  | ```cpp | ||||||
|  | using struct AST_Typedef CodeTypedef; | ||||||
|  | ``` | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| # ASTs Documentation | # AST Types Documentation | ||||||
| 
 | 
 | ||||||
| While the Readme for docs covers the data layout per AST, this will focus on the AST types avaialble, and their nuances. | While the Readme for docs covers the data layout per AST, this will focus on the AST types avaialble, and their nuances. | ||||||
| 
 | 
 | ||||||
| @@ -95,12 +95,12 @@ The upfront constructor: `def_comment` expects to recieve a comment without the | |||||||
| Fields: | Fields: | ||||||
| 
 | 
 | ||||||
| ```cpp | ```cpp | ||||||
| CodeComment    InlineCmt; // Only supported by forward declarations | CodeComment    InlineCmt;  // Only supported by forward declarations | ||||||
| CodeAttributes Attributes; | CodeAttributes Attributes; | ||||||
| CodeType       ParentType; | CodeType       ParentType; | ||||||
| CodeBody       Body; | CodeBody       Body; | ||||||
| CodeType       Last; // Used to store references to interfaces | CodeType       Prev;       // Used to store references to interfaces | ||||||
| CodeType       Next; // Used to store references to interfaces | CodeType       Next;       // Used to store references to interfaces | ||||||
| Code           Parent; | Code           Parent; | ||||||
| StringCached   Name; | StringCached   Name; | ||||||
| CodeT          Type; | CodeT          Type; | ||||||
| @@ -115,7 +115,7 @@ Serialization: | |||||||
| <ModuleFlags> <class/struct> <Name>; <InlineCmt> | <ModuleFlags> <class/struct> <Name>; <InlineCmt> | ||||||
| 
 | 
 | ||||||
| // Class | // Class | ||||||
| <ModuleFlags> <class/struct> <Attributes> <Name> : <ParentAccess> <ParentType>, public <Next>, ...<Last> | <ModuleFlags> <class/struct> <Attributes> <Name> : <ParentAccess> <ParentType>, public <ParentType->Next>, ... <InlineCmt> | ||||||
| { | { | ||||||
|     <Body> |     <Body> | ||||||
| }; | }; | ||||||
| @@ -145,7 +145,8 @@ Serialization: | |||||||
| <Specs> <Parent->Name>( <Params> ); <InlineCmt> | <Specs> <Parent->Name>( <Params> ); <InlineCmt> | ||||||
| 
 | 
 | ||||||
| // Constructor | // Constructor | ||||||
| <Specs> <Parent->Name>( <Params> ): <InitializerList> | <Specs> <Parent->Name>( <Params> ) <InlineCmt> | ||||||
|  |     : <InitializerList> | ||||||
| { | { | ||||||
|     <Body> |     <Body> | ||||||
| } | } | ||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| The library features a naive parser tailored for only what the library needs to construct the supported syntax of C++ into its AST. | The library features a naive parser tailored for only what the library needs to construct the supported syntax of C++ into its AST. | ||||||
|  |  | ||||||
| This parser does not, and should not do the compiler's job. By only supporting this minimal set of features, the parser is kept (so far) around 5000 loc. | This parser does not, and should not do the compiler's job. By only supporting this minimal set of features, the parser is kept (so far) around 5500 loc. I hope to keep it under 10k loc worst case. | ||||||
|  |  | ||||||
| You can think of this parser of a frontend parser vs a semantic parser. Its intuitively similar to WYSIWYG. What you precerive as the syntax from the user-side before the compiler gets a hold of it, is what you get. | You can think of this parser of a frontend parser vs a semantic parser. Its intuitively similar to WYSIWYG. What you precerive as the syntax from the user-side before the compiler gets a hold of it, is what you get. | ||||||
|  |  | ||||||
| @@ -60,13 +60,13 @@ Exceptions: | |||||||
| * typedefs allow for a preprocessed macro: `typedef MACRO();` | * typedefs allow for a preprocessed macro: `typedef MACRO();` | ||||||
|   * Disable with: `#define GEN_PARSER_DISABLE_MACRO_TYPEDEF` |   * Disable with: `#define GEN_PARSER_DISABLE_MACRO_TYPEDEF` | ||||||
|  |  | ||||||
|  | *(Exceptions are added on an on-demand basis)* | ||||||
| *(See functions `parse_operator_function_or_variable` and `parse_typedef` )* | *(See functions `parse_operator_function_or_variable` and `parse_typedef` )* | ||||||
|  |  | ||||||
| Adding your own exceptions is possible by simply modifying the parser to allow for the syntax you need. | Adding your own exceptions is possible by simply modifying the parser to allow for the syntax you need. | ||||||
|  |  | ||||||
| *Note: You could interpret this strictness as a feature. This would allow the user to see if their codebase or a third-party's codebase some some egregious preprocessor abuse.* | *Note: You could interpret this strictness as a feature. This would allow the user to see if their codebase or a third-party's codebase some some egregious preprocessor abuse.* | ||||||
|  |  | ||||||
|  |  | ||||||
| The lexing and parsing takes shortcuts from whats expected in the standard. | The lexing and parsing takes shortcuts from whats expected in the standard. | ||||||
|  |  | ||||||
| * Numeric literals are not checked for validity. | * Numeric literals are not checked for validity. | ||||||
| @@ -79,4 +79,3 @@ The lexing and parsing takes shortcuts from whats expected in the standard. | |||||||
| * Parsing attributes can be extended to support user defined macros by defining `GEN_DEFINE_ATTRIBUTE_TOKENS` (see `gen.hpp` for the formatting) | * Parsing attributes can be extended to support user defined macros by defining `GEN_DEFINE_ATTRIBUTE_TOKENS` (see `gen.hpp` for the formatting) | ||||||
|  |  | ||||||
| Empty lines used throughout the file are preserved for formatting purposes during ast serialization. | Empty lines used throughout the file are preserved for formatting purposes during ast serialization. | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										100
									
								
								docs/Readme.md
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								docs/Readme.md
									
									
									
									
									
								
							| @@ -32,7 +32,7 @@ Two generic templated containers are used throughout the library: | |||||||
| * `template< class Type> struct Array` | * `template< class Type> struct Array` | ||||||
| * `template< class Type> struct HashTable` | * `template< class Type> struct HashTable` | ||||||
|  |  | ||||||
| Both Code and AST definitions have a `template< class Type> Code/AST cast()`. Its just an alternative way to explicitly cast to each other. | Both Code and AST definitions have a `template< class Type> Code/AST :: cast()`. Its just an alternative way to explicitly cast to each other. | ||||||
|  |  | ||||||
| `template< class Type> swap( Type& a, Type& b)` is used over a macro. | `template< class Type> swap( Type& a, Type& b)` is used over a macro. | ||||||
|  |  | ||||||
| @@ -42,6 +42,7 @@ Otherwise the library is free of any templates. | |||||||
|  |  | ||||||
| **There is no support for validating expressions.**   | **There is no support for validating expressions.**   | ||||||
| Its difficult to parse without enough benefits (At the metaprogramming level).   | Its difficult to parse without enough benefits (At the metaprogramming level).   | ||||||
|  | I plan to add this only at the tail of the project parsing milestone. | ||||||
|  |  | ||||||
| **Only trivial template support is provided.**   | **Only trivial template support is provided.**   | ||||||
| The intention is for only simple, non-recursive substitution.   | The intention is for only simple, non-recursive substitution.   | ||||||
| @@ -70,28 +71,36 @@ Data layout of AST struct: | |||||||
| 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, Typename, Variable | ||||||
|         union { |         union { | ||||||
|             AST*  InitializerList; // Constructor, Destructor |             AST*  InitializerList; // Constructor | ||||||
|             AST*  ParentType;      // Class, Struct |             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*  UnderlyingType;  // Enum, Typedef | ||||||
|             AST*  ValueType;       // Parameter, Variable |             AST*  ValueType;       // Parameter, Variable | ||||||
|         }; |         }; | ||||||
|         union { |         union { | ||||||
|             AST*  BitfieldSize;    // Varaiable (Class/Struct Data Member) |             AST*  BitfieldSize;    // Variable (Class/Struct Data Member) | ||||||
|             AST*  Params;          // Function, Operator, Template |             AST*  Params;          // Constructor, Function, Operator, Template, Typename | ||||||
|         }; |         }; | ||||||
|         union { |         union { | ||||||
|             AST*  ArrExpr;         // Type Symbol |             AST*  ArrExpr;          // Typename | ||||||
|             AST*  Body;            // Class, Constructr, Destructor, Enum, Function, Namespace, Struct, Union |             AST*  Body;             // Class, Constructr, Destructor, Enum, Function, Namespace, Struct, Union | ||||||
|             AST*  Declaration;     // Friend, Template |             AST*  Declaration;      // Friend, Template | ||||||
|             AST*  Value;           // Parameter, Variable |             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 |     StringCached  Content;          // Attributes, Comment, Execution, Include | ||||||
|     SpecifierT    ArrSpecs[AST::ArrSpecs_Cap]; // Specifiers |     struct { | ||||||
|  |         SpecifierT ArrSpecs[AST::ArrSpecs_Cap]; // Specifiers | ||||||
|  |         AST*       NextSpecs;                   // Specifiers | ||||||
|  |     }; | ||||||
| }; | }; | ||||||
| union { | union { | ||||||
|     AST* Prev; |     AST* Prev; | ||||||
| @@ -107,11 +116,13 @@ StringCached      Name; | |||||||
| CodeT             Type; | CodeT             Type; | ||||||
| ModuleFlag        ModuleFlags; | ModuleFlag        ModuleFlags; | ||||||
| union { | union { | ||||||
|     b32           IsFunction; // Used by typedef to not serialize the name field. |     b32           IsFunction;  // Used by typedef to not serialize the name field. | ||||||
|  |     b32           IsParamPack; // Used by typename to know if type should be considered a parameter pack. | ||||||
|     OperatorT     Op; |     OperatorT     Op; | ||||||
|     AccessSpec    ParentAccess; |     AccessSpec    ParentAccess; | ||||||
|     s32           NumEntries; |     s32           NumEntries; | ||||||
| }; | }; | ||||||
|  | s32               Token;       // Handle to the token, stored in the CodeFile (Otherwise unretrivable) | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| *`CodeT` is a typedef for `ECode::Type` which has an underlying type of `u32`*   | *`CodeT` is a typedef for `ECode::Type` which has an underlying type of `u32`*   | ||||||
| @@ -142,6 +153,13 @@ Data Notes: | |||||||
|  |  | ||||||
| * The allocator definitions used are exposed to the user incase they want to dictate memory usage | * The allocator definitions used are exposed to the user incase they want to dictate memory usage | ||||||
|   * You'll find the memory handling in `init`, `deinit`, `reset`, `gen_string_allocator`, `get_cached_string`, `make_code`. |   * You'll find the memory handling in `init`, `deinit`, `reset`, `gen_string_allocator`, `get_cached_string`, `make_code`. | ||||||
|  |   * Allocators are defined with the `AllocatorInfo` structure found in `dependencies\memory.hpp` | ||||||
|  |   * Most of the work is just defining the allocation procedure: | ||||||
|  |  | ||||||
|  | ```cpp | ||||||
|  |     void* ( void* allocator_data, AllocType type, sw size, sw alignment, void* old_memory, sw old_size, u64 flags ); | ||||||
|  | ``` | ||||||
|  |  | ||||||
| * ASTs are wrapped for the user in a Code struct which is a wrapper for a AST* type. | * ASTs are wrapped for the user in a Code struct which is a wrapper for a AST* type. | ||||||
| * Both AST and Code have member symbols but their data layout is enforced to be POD types. | * Both AST and Code have member symbols but their data layout is enforced to be POD types. | ||||||
| * This library treats memory failures as fatal. | * This library treats memory failures as fatal. | ||||||
| @@ -233,6 +251,7 @@ Interface :`` | |||||||
| * def_operator_cast | * def_operator_cast | ||||||
| * def_param | * def_param | ||||||
| * def_params | * def_params | ||||||
|  | * def_pragma | ||||||
| * def_preprocess_cond | * def_preprocess_cond | ||||||
| * def_specifier | * def_specifier | ||||||
| * def_specifiers | * def_specifiers | ||||||
| @@ -382,8 +401,8 @@ The following are provided predefined by the library as they are commonly used: | |||||||
| * `module_global_fragment` | * `module_global_fragment` | ||||||
| * `module_private_fragment` | * `module_private_fragment` | ||||||
| * `fmt_newline` | * `fmt_newline` | ||||||
| * `pragma_once` |  | ||||||
| * `param_varaidc` (Used for varadic definitions) | * `param_varaidc` (Used for varadic definitions) | ||||||
|  | * `pragma_once` | ||||||
| * `preprocess_else` | * `preprocess_else` | ||||||
| * `preprocess_endif` | * `preprocess_endif` | ||||||
| * `spec_const` | * `spec_const` | ||||||
| @@ -392,6 +411,7 @@ The following are provided predefined by the library as they are commonly used: | |||||||
| * `spec_constinit` | * `spec_constinit` | ||||||
| * `spec_extern_linkage` (extern) | * `spec_extern_linkage` (extern) | ||||||
| * `spec_final` | * `spec_final` | ||||||
|  | * `spec_forceinline` | ||||||
| * `spec_global` (global macro) | * `spec_global` (global macro) | ||||||
| * `spec_inline` | * `spec_inline` | ||||||
| * `spec_internal_linkage` (internal macro) | * `spec_internal_linkage` (internal macro) | ||||||
| @@ -429,8 +449,8 @@ Optionally the following may be defined if `GEN_DEFINE_LIBRARY_CODE_CONSTANTS` i | |||||||
| * `t_u16` | * `t_u16` | ||||||
| * `t_u32` | * `t_u32` | ||||||
| * `t_u64` | * `t_u64` | ||||||
| * `t_sw` | * `t_sw` (ssize_t) | ||||||
| * `t_uw` | * `t_uw` (size_t) | ||||||
| * `t_f32` | * `t_f32` | ||||||
| * `t_f64` | * `t_f64` | ||||||
|  |  | ||||||
| @@ -458,50 +478,10 @@ Editor and Scanner are disabled by default, use `GEN_FEATURE_EDITOR` and `GEN_FE | |||||||
| ### Builder is a similar object to the jai language's string_builder | ### Builder is a similar object to the jai language's string_builder | ||||||
|  |  | ||||||
| * The purpose of it is to generate a file. | * The purpose of it is to generate a file. | ||||||
| * A file is specified and opened for writing using the open( file_path) ) function. | * A file is specified and opened for writing using the open( file_path) function. | ||||||
| * The code is provided via print( code ) function  will be serialized to its buffer. | * The code is provided via print( code ) function  will be serialized to its buffer. | ||||||
| * When all serialization is finished, use the write() command to write the buffer to the file. | * When all serialization is finished, use the write() command to write the buffer to the file. | ||||||
|  |  | ||||||
| ### Editor is for editing a series of files/asts based on a set of requests provided to it | ### Scanner Auxillary Interface | ||||||
|  |  | ||||||
| **Note: Not implemented yet** | Provides *(eventually)* `scan_file` to automatically populate a CodeFile which contains a parsed AST (`Code`) of the file, with any contextual failures that are reported from the parser. | ||||||
|  |  | ||||||
| * The purpose is to overrite a specific file, it places its contents in a buffer to scan. |  | ||||||
| * If editing an AST it will generate a new ast as a result (ASTs are not edited). |  | ||||||
| * Requests are populated using the following interface: |  | ||||||
|   * add : Add code. |  | ||||||
|   * remove : Remove code. |  | ||||||
|   * replace: Replace code. |  | ||||||
|  |  | ||||||
| All three have the same parameters with exception to remove which only has SymbolInfo and Policy: |  | ||||||
|  |  | ||||||
| * SymbolInfo: |  | ||||||
|   * File      : The file the symbol resides in. Leave null to indicate to search all files. Leave null to indicated all-file search. |  | ||||||
|   * Marker    : #define symbol that indicates a location or following signature is valid to manipulate. Leave null to indicate the signature should only be used. |  | ||||||
|   * Signature : Use a Code symbol to find a valid location to manipulate, can be further filtered with the marker. Leave null to indicate the marker should only be used. |  | ||||||
|  |  | ||||||
| * Policy : Additional policy info for completing the request (empty for now) |  | ||||||
| * Code   : Code to inject if adding, or replace existing code with. |  | ||||||
|  |  | ||||||
| Additionally if `GEN_FEATURE_EDITOR_REFACTOR` is defined, refactor( file_path, specification_path ) wil be made available.   |  | ||||||
| Refactor is based of the refactor library and uses its interface.   |  | ||||||
| It will on call add a request to the queue to run the refactor script on the file. |  | ||||||
|  |  | ||||||
| ### Scanner allows the user to sift through a series of files/asts based on a set of requests provided to it |  | ||||||
|  |  | ||||||
| **Note: Not implemented yet** |  | ||||||
|  |  | ||||||
| * The purpose is to grab definitions to generate metadata or generate new code from these definitions. |  | ||||||
| * Requests are populated using the add( SymbolInfo, Policy ) function. The symbol info is the same as the one used for the editor. So is the case with Policy. |  | ||||||
|  |  | ||||||
| The file will only be read from, no writing supported. |  | ||||||
|  |  | ||||||
| ### Additional Info (Editor and Scanner) |  | ||||||
|  |  | ||||||
| When all requests have been populated, call process_requests().   |  | ||||||
| It will provide an output of receipt data of the results when it completes. |  | ||||||
|  |  | ||||||
| Files may be added to the Editor and Scanner additionally with add_files( num, files ).   |  | ||||||
| This is intended for when you have requests that are for multiple files. |  | ||||||
|  |  | ||||||
| Request queue in both Editor and Scanner are cleared once process_requests completes. |  | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								gencpp.10x
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								gencpp.10x
									
									
									
									
									
								
							| @@ -8,21 +8,22 @@ | |||||||
| 		<ShowEmptyFolders>true</ShowEmptyFolders> | 		<ShowEmptyFolders>true</ShowEmptyFolders> | ||||||
| 		<IsVirtual>false</IsVirtual> | 		<IsVirtual>false</IsVirtual> | ||||||
| 		<IsFolder>false</IsFolder> | 		<IsFolder>false</IsFolder> | ||||||
| 		<BuildCommand>powershell ./scripts/test.gen_run.ps1</BuildCommand> | 		<BuildCommand>pwsh ./scripts/build.ps1 msvc debug bootstrap</BuildCommand> | ||||||
| 		<RebuildCommand></RebuildCommand> | 		<RebuildCommand></RebuildCommand> | ||||||
| 		<BuildFileCommand></BuildFileCommand> | 		<BuildFileCommand></BuildFileCommand> | ||||||
| 		<CleanCommand>powershell ./scripts/clean.ps1</CleanCommand> | 		<CleanCommand>psh ./scripts/clean.ps1</CleanCommand> | ||||||
| 		<BuildWorkingDirectory></BuildWorkingDirectory> | 		<BuildWorkingDirectory></BuildWorkingDirectory> | ||||||
| 		<CancelBuild></CancelBuild> | 		<CancelBuild></CancelBuild> | ||||||
| 		<RunCommand>./test/gen/build/gencpp.exe</RunCommand> | 		<RunCommand>./test/gen/build/gencpp.exe</RunCommand> | ||||||
| 		<RunCommandWorkingDirectory></RunCommandWorkingDirectory> | 		<RunCommandWorkingDirectory></RunCommandWorkingDirectory> | ||||||
| 		<DebugCommand>powershell ./scripts/build.ps1</DebugCommand> | 		<DebugCommand>pwsh ./scripts/build.ps1</DebugCommand> | ||||||
| 		<ExePathCommand>./test/gen/build/gencpp.exe</ExePathCommand> | 		<ExePathCommand>./test/gen/build/gencpp.exe</ExePathCommand> | ||||||
| 		<DebugSln>gencpp.sln</DebugSln> | 		<DebugSln></DebugSln> | ||||||
| 		<UseVisualStudioEnvBat>false</UseVisualStudioEnvBat> | 		<UseVisualStudioEnvBat>true</UseVisualStudioEnvBat> | ||||||
| 		<Configurations> | 		<Configurations> | ||||||
| 			<Configuration>Debug</Configuration> | 			<Configuration>Debug</Configuration> | ||||||
| 			<Configuration>Release</Configuration> | 			<Configuration>Release</Configuration> | ||||||
|  | 			<Configuration>bootstrap debug</Configuration> | ||||||
| 		</Configurations> | 		</Configurations> | ||||||
| 		<Platforms> | 		<Platforms> | ||||||
| 			<Platform>x64</Platform> | 			<Platform>x64</Platform> | ||||||
| @@ -31,16 +32,17 @@ | |||||||
| 			<AdditionalIncludePath>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.36.32532\include</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.36.32532\include</AdditionalIncludePath> | ||||||
| 			<AdditionalIncludePath>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.36.32532\ATLMFC\include</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.36.32532\ATLMFC\include</AdditionalIncludePath> | ||||||
| 			<AdditionalIncludePath>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\VS\include</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\VS\include</AdditionalIncludePath> | ||||||
| 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt</AdditionalIncludePath> | ||||||
| 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\um</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\um</AdditionalIncludePath> | ||||||
| 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\shared</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\shared</AdditionalIncludePath> | ||||||
| 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\winrt</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\winrt</AdditionalIncludePath> | ||||||
| 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\cppwinrt</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\cppwinrt</AdditionalIncludePath> | ||||||
| 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um</AdditionalIncludePath> | 			<AdditionalIncludePath>C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um</AdditionalIncludePath> | ||||||
| 		</AdditionalIncludePaths> | 		</AdditionalIncludePaths> | ||||||
| 		<Defines> | 		<Defines> | ||||||
| 			<Define>GEN_TIME</Define> | 			<Define>GEN_TIME</Define> | ||||||
| 			<Define>GEN_SYSTEM_WINDOWS</Define> | 			<Define>GEN_SYSTEM_WINDOWS</Define> | ||||||
|  | 			<Define>GEN_INTELLISENSE_DIRECTIVES</Define> | ||||||
| 		</Defines> | 		</Defines> | ||||||
| 		<ConfigProperties> | 		<ConfigProperties> | ||||||
| 			<ConfigAndPlatform> | 			<ConfigAndPlatform> | ||||||
| @@ -48,10 +50,19 @@ | |||||||
| 				<Defines></Defines> | 				<Defines></Defines> | ||||||
| 				<ForceIncludes></ForceIncludes> | 				<ForceIncludes></ForceIncludes> | ||||||
| 			</ConfigAndPlatform> | 			</ConfigAndPlatform> | ||||||
|  | 			<ConfigAndPlatform> | ||||||
|  | 				<Name>bootstrap debug:x64</Name> | ||||||
|  | 				<Defines></Defines> | ||||||
|  | 				<ForceIncludes></ForceIncludes> | ||||||
|  | 			</ConfigAndPlatform> | ||||||
| 			<Config> | 			<Config> | ||||||
| 				<Name>Debug</Name> | 				<Name>Debug</Name> | ||||||
| 				<Defines></Defines> | 				<Defines></Defines> | ||||||
| 			</Config> | 			</Config> | ||||||
|  | 			<Config> | ||||||
|  | 				<Name>bootstrap debug</Name> | ||||||
|  | 				<Defines></Defines> | ||||||
|  | 			</Config> | ||||||
| 			<Platform> | 			<Platform> | ||||||
| 				<Name>x64</Name> | 				<Name>x64</Name> | ||||||
| 				<Defines></Defines> | 				<Defines></Defines> | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								gencpp.sln
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								gencpp.sln
									
									
									
									
									
								
							| @@ -7,20 +7,37 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencpp", "gencpp.vcxproj", | |||||||
| EndProject | EndProject | ||||||
| Global | Global | ||||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
| 		Debug|x64 = Debug|x64 | 		bootstrap debug|x64 = bootstrap debug|x64 | ||||||
| 		Debug|x86 = Debug|x86 | 		bootstrap debug|x86 = bootstrap debug|x86 | ||||||
| 		Release|x64 = Release|x64 | 		bootstrap release|x64 = bootstrap release|x64 | ||||||
| 		Release|x86 = Release|x86 | 		bootstrap release|x86 = bootstrap release|x86 | ||||||
|  | 		singleheader debug|x64 = singleheader debug|x64 | ||||||
|  | 		singleheader debug|x86 = singleheader debug|x86 | ||||||
|  | 		singleheader release|x64 = singleheader release|x64 | ||||||
|  | 		singleheader release|x86 = singleheader release|x86 | ||||||
|  | 		test debug|x64 = test debug|x64 | ||||||
|  | 		test debug|x86 = test debug|x86 | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
| 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.Debug|x64.ActiveCfg = Debug|x64 | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.bootstrap debug|x64.ActiveCfg = bootstrap release|x64 | ||||||
| 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.Debug|x64.Build.0 = Debug|x64 | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.bootstrap debug|x64.Build.0 = bootstrap release|x64 | ||||||
| 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.Debug|x86.ActiveCfg = Debug|Win32 | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.bootstrap debug|x86.ActiveCfg = bootstrap debug|Win32 | ||||||
| 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.Debug|x86.Build.0 = Debug|Win32 | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.bootstrap debug|x86.Build.0 = bootstrap debug|Win32 | ||||||
| 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.Release|x64.ActiveCfg = Release|x64 | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.bootstrap release|x64.ActiveCfg = bootstrap release|x64 | ||||||
| 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.Release|x64.Build.0 = Release|x64 | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.bootstrap release|x86.ActiveCfg = bootstrap release|Win32 | ||||||
| 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.Release|x86.ActiveCfg = Release|Win32 | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.bootstrap release|x86.Build.0 = bootstrap release|Win32 | ||||||
| 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.Release|x86.Build.0 = Release|Win32 | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.singleheader debug|x64.ActiveCfg = singleheader debug|x64 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.singleheader debug|x64.Build.0 = singleheader debug|x64 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.singleheader debug|x86.ActiveCfg = singleheader debug|Win32 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.singleheader debug|x86.Build.0 = singleheader debug|Win32 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.singleheader release|x64.ActiveCfg = bootstrap debug|x64 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.singleheader release|x64.Build.0 = bootstrap debug|x64 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.singleheader release|x86.ActiveCfg = singleheader release|Win32 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.singleheader release|x86.Build.0 = singleheader release|Win32 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.test debug|x64.ActiveCfg = test debug|x64 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.test debug|x64.Build.0 = test debug|x64 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.test debug|x86.ActiveCfg = test debug|Win32 | ||||||
|  | 		{53AF600D-C09C-4F39-83E0-E022AA9479F2}.test debug|x86.Build.0 = test debug|Win32 | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(SolutionProperties) = preSolution | 	GlobalSection(SolutionProperties) = preSolution | ||||||
| 		HideSolutionNode = FALSE | 		HideSolutionNode = FALSE | ||||||
|   | |||||||
							
								
								
									
										235
									
								
								gencpp.vcxproj
									
									
									
									
									
								
							
							
						
						
									
										235
									
								
								gencpp.vcxproj
									
									
									
									
									
								
							| @@ -1,20 +1,44 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|   <ItemGroup Label="ProjectConfigurations"> |   <ItemGroup Label="ProjectConfigurations"> | ||||||
|     <ProjectConfiguration Include="Debug|Win32"> |     <ProjectConfiguration Include="bootstrap debug|Win32"> | ||||||
|       <Configuration>Debug</Configuration> |       <Configuration>bootstrap debug</Configuration> | ||||||
|       <Platform>Win32</Platform> |       <Platform>Win32</Platform> | ||||||
|     </ProjectConfiguration> |     </ProjectConfiguration> | ||||||
|     <ProjectConfiguration Include="Release|Win32"> |     <ProjectConfiguration Include="bootstrap debug|x64"> | ||||||
|       <Configuration>Release</Configuration> |       <Configuration>bootstrap debug</Configuration> | ||||||
|       <Platform>Win32</Platform> |  | ||||||
|     </ProjectConfiguration> |  | ||||||
|     <ProjectConfiguration Include="Debug|x64"> |  | ||||||
|       <Configuration>Debug</Configuration> |  | ||||||
|       <Platform>x64</Platform> |       <Platform>x64</Platform> | ||||||
|     </ProjectConfiguration> |     </ProjectConfiguration> | ||||||
|     <ProjectConfiguration Include="Release|x64"> |     <ProjectConfiguration Include="bootstrap release|Win32"> | ||||||
|       <Configuration>Release</Configuration> |       <Configuration>bootstrap release</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="bootstrap release|x64"> | ||||||
|  |       <Configuration>bootstrap release</Configuration> | ||||||
|  |       <Platform>x64</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="singleheader debug|Win32"> | ||||||
|  |       <Configuration>singleheader debug</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="singleheader debug|x64"> | ||||||
|  |       <Configuration>singleheader debug</Configuration> | ||||||
|  |       <Platform>x64</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="singleheader release|Win32"> | ||||||
|  |       <Configuration>singleheader release</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="singleheader release|x64"> | ||||||
|  |       <Configuration>singleheader release</Configuration> | ||||||
|  |       <Platform>x64</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="test debug|Win32"> | ||||||
|  |       <Configuration>test debug</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="test debug|x64"> | ||||||
|  |       <Configuration>test debug</Configuration> | ||||||
|       <Platform>x64</Platform> |       <Platform>x64</Platform> | ||||||
|     </ProjectConfiguration> |     </ProjectConfiguration> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
| @@ -25,24 +49,54 @@ | |||||||
|     <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> |     <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap debug|Win32'" Label="Configuration"> | ||||||
|     <ConfigurationType>Makefile</ConfigurationType> |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|     <UseDebugLibraries>true</UseDebugLibraries> |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|     <PlatformToolset>v143</PlatformToolset> |     <PlatformToolset>v143</PlatformToolset> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='test debug|Win32'" Label="Configuration"> | ||||||
|     <ConfigurationType>Makefile</ConfigurationType> |  | ||||||
|     <UseDebugLibraries>false</UseDebugLibraries> |  | ||||||
|     <PlatformToolset>v143</PlatformToolset> |  | ||||||
|   </PropertyGroup> |  | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> |  | ||||||
|     <ConfigurationType>Makefile</ConfigurationType> |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|     <UseDebugLibraries>true</UseDebugLibraries> |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|     <PlatformToolset>v143</PlatformToolset> |     <PlatformToolset>v143</PlatformToolset> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader debug|Win32'" Label="Configuration"> | ||||||
|     <ConfigurationType>Makefile</ConfigurationType> |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|     <UseDebugLibraries>false</UseDebugLibraries> |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v143</PlatformToolset> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader release|Win32'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v143</PlatformToolset> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap release|Win32'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v143</PlatformToolset> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap debug|x64'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v143</PlatformToolset> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='test debug|x64'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v143</PlatformToolset> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader debug|x64'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v143</PlatformToolset> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader release|x64'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <PlatformToolset>v143</PlatformToolset> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap release|x64'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Makefile</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|     <PlatformToolset>v143</PlatformToolset> |     <PlatformToolset>v143</PlatformToolset> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||||||
| @@ -50,61 +104,145 @@ | |||||||
|   </ImportGroup> |   </ImportGroup> | ||||||
|   <ImportGroup Label="Shared"> |   <ImportGroup Label="Shared"> | ||||||
|   </ImportGroup> |   </ImportGroup> | ||||||
|   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap debug|Win32'" Label="PropertySheets"> | ||||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|   </ImportGroup> |   </ImportGroup> | ||||||
|   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='test debug|Win32'" Label="PropertySheets"> | ||||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|   </ImportGroup> |   </ImportGroup> | ||||||
|   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='singleheader debug|Win32'" Label="PropertySheets"> | ||||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|   </ImportGroup> |   </ImportGroup> | ||||||
|   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='singleheader release|Win32'" Label="PropertySheets"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap release|Win32'" Label="PropertySheets"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap debug|x64'" Label="PropertySheets"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='test debug|x64'" Label="PropertySheets"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='singleheader debug|x64'" Label="PropertySheets"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='singleheader release|x64'" Label="PropertySheets"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap release|x64'" Label="PropertySheets"> | ||||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|   </ImportGroup> |   </ImportGroup> | ||||||
|   <PropertyGroup Label="UserMacros" /> |   <PropertyGroup Label="UserMacros" /> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap debug|Win32'"> | ||||||
|     <NMakeBuildCommandLine>./scripts/build.ps1</NMakeBuildCommandLine> |     <NMakeBuildCommandLine>./scripts/build.ps1</NMakeBuildCommandLine> | ||||||
|     <NMakeCleanCommandLine>./scripts/clean.ps1</NMakeCleanCommandLine> |     <NMakeCleanCommandLine>./scripts/clean.ps1</NMakeCleanCommandLine> | ||||||
|     <NMakeReBuildCommandLine>./scripts/build.ps1</NMakeReBuildCommandLine> |     <NMakeReBuildCommandLine>./scripts/build.ps1</NMakeReBuildCommandLine> | ||||||
|     <NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> |     <NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='test debug|Win32'"> | ||||||
|     <NMakeBuildCommandLine>./scripts/build.ps1</NMakeBuildCommandLine> |     <NMakeBuildCommandLine>./scripts/build.ps1</NMakeBuildCommandLine> | ||||||
|     <NMakeCleanCommandLine>./scripts/clean.ps1</NMakeCleanCommandLine> |     <NMakeCleanCommandLine>./scripts/clean.ps1</NMakeCleanCommandLine> | ||||||
|     <NMakeReBuildCommandLine>./scripts/build.ps1</NMakeReBuildCommandLine> |     <NMakeReBuildCommandLine>./scripts/build.ps1</NMakeReBuildCommandLine> | ||||||
|     <NMakePreprocessorDefinitions>WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> |     <NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader debug|Win32'"> | ||||||
|     <NMakeBuildCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1"</NMakeBuildCommandLine> |     <NMakeBuildCommandLine>./scripts/build.ps1</NMakeBuildCommandLine> | ||||||
|     <NMakeReBuildCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1"</NMakeReBuildCommandLine> |     <NMakeCleanCommandLine>./scripts/clean.ps1</NMakeCleanCommandLine> | ||||||
|     <NMakeCleanCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine> |     <NMakeReBuildCommandLine>./scripts/build.ps1</NMakeReBuildCommandLine> | ||||||
|     <NMakePreprocessorDefinitions>GEN_TIME;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> |     <NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|     <IncludePath>$(ProjectDir)thirdparty;$(ProjectDir)project;$(ProjectDir)test;$(IncludePath)</IncludePath> |  | ||||||
|     <SourcePath>$(ProjectDir)project;$(ProjectDir)test;$(SourcePath)</SourcePath> |  | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader release|Win32'"> | ||||||
|     <NMakeBuildCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1"</NMakeBuildCommandLine> |     <NMakeBuildCommandLine>./scripts/build.ps1</NMakeBuildCommandLine> | ||||||
|     <NMakeReBuildCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1"</NMakeReBuildCommandLine> |     <NMakeCleanCommandLine>./scripts/clean.ps1</NMakeCleanCommandLine> | ||||||
|     <NMakeCleanCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine> |     <NMakeReBuildCommandLine>./scripts/build.ps1</NMakeReBuildCommandLine> | ||||||
|     <NMakePreprocessorDefinitions>GEN_TIME;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> |     <NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|     <IncludePath>$(ProjectDir)thirdparty;$(ProjectDir)project;$(ProjectDir)test;$(IncludePath)</IncludePath> |  | ||||||
|     <SourcePath>$(ProjectDir)project;$(ProjectDir)test;$(SourcePath)</SourcePath> |  | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap release|Win32'"> | ||||||
|  |     <NMakeBuildCommandLine>./scripts/build.ps1</NMakeBuildCommandLine> | ||||||
|  |     <NMakeCleanCommandLine>./scripts/clean.ps1</NMakeCleanCommandLine> | ||||||
|  |     <NMakeReBuildCommandLine>./scripts/build.ps1</NMakeReBuildCommandLine> | ||||||
|  |     <NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap debug|x64'"> | ||||||
|  |     <NMakeBuildCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1" msvc debug bootstrap</NMakeBuildCommandLine> | ||||||
|  |     <NMakeReBuildCommandLine> | ||||||
|  |     </NMakeReBuildCommandLine> | ||||||
|  |     <NMakeCleanCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine> | ||||||
|  |     <NMakePreprocessorDefinitions>GEN_INTELLISENSE_DIRECTIVES;GEN_TIME;GEN_BENCHMARK;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|  |     <IncludePath>$(ProjectDir)project;$(IncludePath)</IncludePath> | ||||||
|  |     <SourcePath>$(ProjectDir)project;$(SourcePath)</SourcePath> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='test debug|x64'"> | ||||||
|  |     <NMakeBuildCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1" msvc debug test</NMakeBuildCommandLine> | ||||||
|  |     <NMakeReBuildCommandLine /> | ||||||
|  |     <NMakeCleanCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine> | ||||||
|  |     <NMakePreprocessorDefinitions>GEN_INTELLISENSE_DIRECTIVES;GEN_TIME;GEN_BENCHMARK;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|  |     <IncludePath>$(ProjectDir)project;$(ProjectDir)test;$(IncludePath)</IncludePath> | ||||||
|  |     <SourcePath>$(ProjectDir)project;$(SourcePath)</SourcePath> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader debug|x64'"> | ||||||
|  |     <NMakeBuildCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1" msvc debug singleheader</NMakeBuildCommandLine> | ||||||
|  |     <NMakeReBuildCommandLine> | ||||||
|  |     </NMakeReBuildCommandLine> | ||||||
|  |     <NMakeCleanCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine> | ||||||
|  |     <NMakePreprocessorDefinitions>GEN_INTELLISENSE_DIRECTIVES;GEN_TIME;GEN_BENCHMARK;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|  |     <IncludePath>$(ProjectDir)project;$(ProjectDir)test;$(IncludePath)</IncludePath> | ||||||
|  |     <SourcePath>$(ProjectDir)project;$(SourcePath)</SourcePath> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader release|x64'"> | ||||||
|  |     <NMakeBuildCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1" msvc release singleheader</NMakeBuildCommandLine> | ||||||
|  |     <NMakeReBuildCommandLine> | ||||||
|  |     </NMakeReBuildCommandLine> | ||||||
|  |     <NMakeCleanCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine> | ||||||
|  |     <NMakePreprocessorDefinitions>GEN_INTELLISENSE_DIRECTIVES;GEN_TIME;GEN_BENCHMARK;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|  |     <IncludePath>$(ProjectDir)project;$(ProjectDir)test;$(IncludePath)</IncludePath> | ||||||
|  |     <SourcePath>$(ProjectDir)project;$(SourcePath)</SourcePath> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap release|x64'"> | ||||||
|  |     <NMakeBuildCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1" msvc release bootstrap</NMakeBuildCommandLine> | ||||||
|  |     <NMakeReBuildCommandLine> | ||||||
|  |     </NMakeReBuildCommandLine> | ||||||
|  |     <NMakeCleanCommandLine>pwsh.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine> | ||||||
|  |     <NMakePreprocessorDefinitions>GEN_INTELLISENSE_DIRECTIVES;GEN_TIME;GEN_BENCHMARK;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions> | ||||||
|  |     <IncludePath>$(ProjectDir)project;$(ProjectDir)test;$(IncludePath)</IncludePath> | ||||||
|  |     <SourcePath>$(ProjectDir)project;$(SourcePath)</SourcePath> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap debug|x64'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <LanguageStandard_C>stdc11</LanguageStandard_C> | ||||||
|  |     </ClCompile> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='test debug|x64'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <LanguageStandard_C>stdc11</LanguageStandard_C> | ||||||
|  |     </ClCompile> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='singleheader debug|x64'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <LanguageStandard_C>stdc11</LanguageStandard_C> | ||||||
|  |     </ClCompile> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='singleheader release|x64'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <LanguageStandard_C>stdc11</LanguageStandard_C> | ||||||
|  |     </ClCompile> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap release|x64'"> | ||||||
|     <ClCompile> |     <ClCompile> | ||||||
|       <LanguageStandard_C>stdc11</LanguageStandard_C> |       <LanguageStandard_C>stdc11</LanguageStandard_C> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|   </ItemDefinitionGroup> |   </ItemDefinitionGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <None Include=".editorconfig" /> |     <None Include=".editorconfig" /> | ||||||
|     <None Include="project\components\temp\Readme.md" /> |  | ||||||
|     <None Include="project\enums\AttributeTokens.csv" /> |     <None Include="project\enums\AttributeTokens.csv" /> | ||||||
|     <None Include="project\enums\ECode.csv" /> |     <None Include="project\enums\ECode.csv" /> | ||||||
|     <None Include="project\enums\EOperator.csv" /> |     <None Include="project\enums\EOperator.csv" /> | ||||||
|     <None Include="project\enums\ESpecifier.csv" /> |     <None Include="project\enums\ESpecifier.csv" /> | ||||||
|     <None Include="project\enums\ETokType.csv" /> |     <None Include="project\enums\ETokType.csv" /> | ||||||
|     <None Include="Readme.md" /> |     <None Include="Readme.md" /> | ||||||
|  |     <None Include="scripts\.clang-format" /> | ||||||
|     <None Include="scripts\build.ci.ps1" /> |     <None Include="scripts\build.ci.ps1" /> | ||||||
|     <None Include="scripts\build.ps1" /> |     <None Include="scripts\build.ps1" /> | ||||||
|     <None Include="scripts\clean.ps1" /> |     <None Include="scripts\clean.ps1" /> | ||||||
| @@ -124,14 +262,14 @@ | |||||||
|     <ClInclude Include="project\auxillary\scanner.hpp" /> |     <ClInclude Include="project\auxillary\scanner.hpp" /> | ||||||
|     <ClInclude Include="project\components\ast.hpp" /> |     <ClInclude Include="project\components\ast.hpp" /> | ||||||
|     <ClInclude Include="project\components\ast_types.hpp" /> |     <ClInclude Include="project\components\ast_types.hpp" /> | ||||||
|  |     <ClInclude Include="project\components\gen\ast_inlines.hpp" /> | ||||||
|  |     <ClInclude Include="project\components\gen\ecode.hpp" /> | ||||||
|  |     <ClInclude Include="project\components\gen\eoperator.hpp" /> | ||||||
|  |     <ClInclude Include="project\components\gen\especifier.hpp" /> | ||||||
|     <ClInclude Include="project\components\header_end.hpp" /> |     <ClInclude Include="project\components\header_end.hpp" /> | ||||||
|     <ClInclude Include="project\components\header_start.hpp" /> |     <ClInclude Include="project\components\header_start.hpp" /> | ||||||
|     <ClInclude Include="project\components\inlines.hpp" /> |     <ClInclude Include="project\components\inlines.hpp" /> | ||||||
|     <ClInclude Include="project\components\interface.hpp" /> |     <ClInclude Include="project\components\interface.hpp" /> | ||||||
|     <ClInclude Include="project\components\temp\ast_inlines.hpp" /> |  | ||||||
|     <ClInclude Include="project\components\temp\ecode.hpp" /> |  | ||||||
|     <ClInclude Include="project\components\temp\eoperator.hpp" /> |  | ||||||
|     <ClInclude Include="project\components\temp\especifier.hpp" /> |  | ||||||
|     <ClInclude Include="project\components\types.hpp" /> |     <ClInclude Include="project\components\types.hpp" /> | ||||||
|     <ClInclude Include="project\dependencies\basic_types.hpp" /> |     <ClInclude Include="project\dependencies\basic_types.hpp" /> | ||||||
|     <ClInclude Include="project\dependencies\containers.hpp" /> |     <ClInclude Include="project\dependencies\containers.hpp" /> | ||||||
| @@ -153,6 +291,7 @@ | |||||||
|     <ClInclude Include="project\helpers\push_ignores.inline.hpp" /> |     <ClInclude Include="project\helpers\push_ignores.inline.hpp" /> | ||||||
|     <ClInclude Include="project\helpers\undef.macros.hpp" /> |     <ClInclude Include="project\helpers\undef.macros.hpp" /> | ||||||
|     <ClInclude Include="singleheader\components\header_start.hpp" /> |     <ClInclude Include="singleheader\components\header_start.hpp" /> | ||||||
|  |     <ClInclude Include="test\CURSED_TYPEDEF.h" /> | ||||||
|     <ClInclude Include="test\DummyInclude.hpp" /> |     <ClInclude Include="test\DummyInclude.hpp" /> | ||||||
|     <ClInclude Include="test\Parsed\Buffer.Parsed.hpp" /> |     <ClInclude Include="test\Parsed\Buffer.Parsed.hpp" /> | ||||||
|     <ClInclude Include="test\Parsed\HashTable.Parsed.hpp" /> |     <ClInclude Include="test\Parsed\HashTable.Parsed.hpp" /> | ||||||
| @@ -174,14 +313,13 @@ | |||||||
|     <ClCompile Include="project\bootstrap.cpp" /> |     <ClCompile Include="project\bootstrap.cpp" /> | ||||||
|     <ClCompile Include="project\components\ast.cpp" /> |     <ClCompile Include="project\components\ast.cpp" /> | ||||||
|     <ClCompile Include="project\components\ast_case_macros.cpp" /> |     <ClCompile Include="project\components\ast_case_macros.cpp" /> | ||||||
|  |     <ClCompile Include="project\components\gen\etoktype.cpp" /> | ||||||
|     <ClCompile Include="project\components\interface.cpp" /> |     <ClCompile Include="project\components\interface.cpp" /> | ||||||
|     <ClCompile Include="project\components\interface.parsing.cpp" /> |     <ClCompile Include="project\components\interface.parsing.cpp" /> | ||||||
|     <ClCompile Include="project\components\interface.untyped.cpp" /> |     <ClCompile Include="project\components\interface.untyped.cpp" /> | ||||||
|     <ClCompile Include="project\components\interface.upfront.cpp" /> |     <ClCompile Include="project\components\interface.upfront.cpp" /> | ||||||
|     <ClCompile Include="project\components\src_start.cpp" /> |     <ClCompile Include="project\components\src_start.cpp" /> | ||||||
|     <ClCompile Include="project\components\static_data.cpp" /> |     <ClCompile Include="project\components\static_data.cpp" /> | ||||||
|     <ClCompile Include="project\components\temp\etoktype.cpp" /> |  | ||||||
|     <ClCompile Include="project\components\untyped.cpp" /> |  | ||||||
|     <ClCompile Include="project\dependencies\debug.cpp" /> |     <ClCompile Include="project\dependencies\debug.cpp" /> | ||||||
|     <ClCompile Include="project\dependencies\filesystem.cpp" /> |     <ClCompile Include="project\dependencies\filesystem.cpp" /> | ||||||
|     <ClCompile Include="project\dependencies\hashing.cpp" /> |     <ClCompile Include="project\dependencies\hashing.cpp" /> | ||||||
| @@ -192,6 +330,7 @@ | |||||||
|     <ClCompile Include="project\dependencies\strings.cpp" /> |     <ClCompile Include="project\dependencies\strings.cpp" /> | ||||||
|     <ClCompile Include="project\dependencies\string_ops.cpp" /> |     <ClCompile Include="project\dependencies\string_ops.cpp" /> | ||||||
|     <ClCompile Include="project\dependencies\timing.cpp" /> |     <ClCompile Include="project\dependencies\timing.cpp" /> | ||||||
|  |     <ClCompile Include="project\Example.cpp" /> | ||||||
|     <ClCompile Include="project\gen.cpp" /> |     <ClCompile Include="project\gen.cpp" /> | ||||||
|     <ClCompile Include="project\gen.dep.cpp" /> |     <ClCompile Include="project\gen.dep.cpp" /> | ||||||
|     <ClCompile Include="singleheader\singleheader.cpp" /> |     <ClCompile Include="singleheader\singleheader.cpp" /> | ||||||
|   | |||||||
| @@ -129,6 +129,9 @@ | |||||||
|     <ClCompile Include="project\components\interface.untyped.cpp"> |     <ClCompile Include="project\components\interface.untyped.cpp"> | ||||||
|       <Filter>Source Files</Filter> |       <Filter>Source Files</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="project\components\gen\etoktype.cpp"> | ||||||
|  |       <Filter>Source Files</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="project\gen.hpp"> |     <ClInclude Include="project\gen.hpp"> | ||||||
| @@ -275,6 +278,21 @@ | |||||||
|     <ClInclude Include="singleheader\components\header_start.hpp"> |     <ClInclude Include="singleheader\components\header_start.hpp"> | ||||||
|       <Filter>Header Files</Filter> |       <Filter>Header Files</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="project\components\gen\ast_inlines.hpp"> | ||||||
|  |       <Filter>Header Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|  |     <ClInclude Include="project\components\gen\ecode.hpp"> | ||||||
|  |       <Filter>Header Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|  |     <ClInclude Include="project\components\gen\eoperator.hpp"> | ||||||
|  |       <Filter>Header Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|  |     <ClInclude Include="project\components\gen\especifier.hpp"> | ||||||
|  |       <Filter>Header Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|  |     <ClInclude Include="test\CURSED_TYPEDEF.h"> | ||||||
|  |       <Filter>Header Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <None Include=".editorconfig" /> |     <None Include=".editorconfig" /> | ||||||
| @@ -297,6 +315,7 @@ | |||||||
|     <None Include="scripts\helpers\target_arch.psm1" /> |     <None Include="scripts\helpers\target_arch.psm1" /> | ||||||
|     <None Include="scripts\package_release.ps1" /> |     <None Include="scripts\package_release.ps1" /> | ||||||
|     <None Include="scripts\refactor.ps1" /> |     <None Include="scripts\refactor.ps1" /> | ||||||
|  |     <None Include="scripts\.clang-format" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Natvis Include=".vscode\gencpp.natvis" /> |     <Natvis Include=".vscode\gencpp.natvis" /> | ||||||
|   | |||||||
| @@ -3,14 +3,29 @@ | |||||||
|   <PropertyGroup> |   <PropertyGroup> | ||||||
|     <ShowAllFiles>true</ShowAllFiles> |     <ShowAllFiles>true</ShowAllFiles> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap debug|x64'"> | ||||||
|     <LocalDebuggerAttach>false</LocalDebuggerAttach> |     <LocalDebuggerAttach>false</LocalDebuggerAttach> | ||||||
|     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> |     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> | ||||||
|     <LocalDebuggerCommand>C:\projects\gencpp\test\gen\build\gencpp.exe</LocalDebuggerCommand> |     <LocalDebuggerCommand>$(ProjectDir)project\build\bootstrap.exe</LocalDebuggerCommand> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='test debug|x64'"> | ||||||
|     <LocalDebuggerAttach>false</LocalDebuggerAttach> |     <LocalDebuggerAttach>false</LocalDebuggerAttach> | ||||||
|     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> |     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> | ||||||
|     <LocalDebuggerCommand>C:\projects\gencpp\test\gen\build\gencpp.exe</LocalDebuggerCommand> |     <LocalDebuggerCommand>$(ProjectDir)project\build\bootstrap.exe</LocalDebuggerCommand> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader debug|x64'"> | ||||||
|  |     <LocalDebuggerAttach>false</LocalDebuggerAttach> | ||||||
|  |     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> | ||||||
|  |     <LocalDebuggerCommand>$(ProjectDir)project\build\bootstrap.exe</LocalDebuggerCommand> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='singleheader release|x64'"> | ||||||
|  |     <LocalDebuggerAttach>false</LocalDebuggerAttach> | ||||||
|  |     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> | ||||||
|  |     <LocalDebuggerCommand>$(ProjectDir)project\build\bootstrap.exe</LocalDebuggerCommand> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='bootstrap release|x64'"> | ||||||
|  |     <LocalDebuggerAttach>false</LocalDebuggerAttach> | ||||||
|  |     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> | ||||||
|  |     <LocalDebuggerCommand>$(ProjectDir)project\build\bootstrap.exe</LocalDebuggerCommand> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
| </Project> | </Project> | ||||||
| @@ -8,8 +8,7 @@ They contain includes for its various components: `components/<component_name>.< | |||||||
| Dependencies are bundled into `gen.dep.<hpp/cpp>`.   | Dependencies are bundled into `gen.dep.<hpp/cpp>`.   | ||||||
| Just like the `gen.<hpp/cpp>` they include their components: `dependencies/<dependency_name>.<hpp/cpp>` | Just like the `gen.<hpp/cpp>` they include their components: `dependencies/<dependency_name>.<hpp/cpp>` | ||||||
|  |  | ||||||
| The fle processors are in their own respective files. (Ex: `file_processors/<file_processor>.<hpp/cpp>` )   | Code not making up the core library is located in `auxiliary/<auxiliary_name>.<hpp/cpp>`. These are optional extensions or tools for the library. | ||||||
| They directly include `depedencies/file_handling.<hpp/cpp>` as the core library does not include file processing by defualt. |  | ||||||
|  |  | ||||||
| **TODO : Right now the library is not finished, as such the first self-hosting iteration is still WIP**   | **TODO : Right now the library is not finished, as such the first self-hosting iteration is still WIP**   | ||||||
| Both libraries use *pre-generated* (self-hosting I guess) version of the library to then generate the latest version of itself.   | Both libraries use *pre-generated* (self-hosting I guess) version of the library to then generate the latest version of itself.   | ||||||
| @@ -30,10 +29,11 @@ Feature Macros: | |||||||
| * `GEN_ENFORCE_STRONG_CODE_TYPES` : Enforces casts to filtered code types. | * `GEN_ENFORCE_STRONG_CODE_TYPES` : Enforces casts to filtered code types. | ||||||
| * `GEN_EXPOSE_BACKEND` : Will expose symbols meant for internal use only. | * `GEN_EXPOSE_BACKEND` : Will expose symbols meant for internal use only. | ||||||
| * `GEN_ROLL_OWN_DEPENDENCIES` : Optional override so that user may define the dependencies themselves. | * `GEN_ROLL_OWN_DEPENDENCIES` : Optional override so that user may define the dependencies themselves. | ||||||
|  | * `GEN_DONT_ALLOW_INVALID_CODE` (Not implemented yet) : Will fail when an invalid code is constructed, parsed, or serialized. | ||||||
|  |  | ||||||
| ## On multi-threading | ## On multi-threading | ||||||
|  |  | ||||||
| Currently unsupported. | Currently unsupported. I want the library to be *stable* and *correct*, with the addition of exhausting all basic single-threaded optimizations before I consider multi-threading. | ||||||
|  |  | ||||||
| ## Extending the library | ## Extending the library | ||||||
|  |  | ||||||
| @@ -51,5 +51,10 @@ Names or Content fields are interned strings and thus showed be cached using `ge | |||||||
| `def_operator` is the most sophisticated constructor as it has multiple permutations of definitions that could be created that are not trivial to determine if valid. | `def_operator` is the most sophisticated constructor as it has multiple permutations of definitions that could be created that are not trivial to determine if valid. | ||||||
|  |  | ||||||
| The library has its code segmented into component files, use it to help create a derived version without needing to have to rewrite a generated file directly or build on top of the header via composition or inheritance. | The library has its code segmented into component files, use it to help create a derived version without needing to have to rewrite a generated file directly or build on top of the header via composition or inheritance. | ||||||
| When the scanner is implemented, this will be even easier to customize. |  | ||||||
|  |  | ||||||
|  | The parser is documented under `docs/Parsing.md` and `docs/Parser_Algo.md`.   | ||||||
|  |  | ||||||
|  | ## A note on compilation and runtime generation speed | ||||||
|  |  | ||||||
|  | The library is designed to be fast to compile and generate code at runtime as fast as resonable possible on a debug build. | ||||||
|  | Its recommended that your metaprogam be compiled using a single translation unit (unity build). | ||||||
|   | |||||||
| @@ -120,45 +120,40 @@ Code scan_file( char const* path ) | |||||||
| } | } | ||||||
|  |  | ||||||
| #if 0 | #if 0 | ||||||
| struct Policy | struct CodeFile | ||||||
| { | { | ||||||
| 	// Nothing for now. | 	using namespace Parser; | ||||||
|  |  | ||||||
|  | 	String              FilePath; | ||||||
|  | 	TokArray            Tokens; | ||||||
|  | 	Array<ParseFailure> ParseFailures; | ||||||
|  | 	Code                CodeRoot; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct SymbolInfo | namespace Parser | ||||||
| { | { | ||||||
| 	StringCached File; | 	struct ParseFailure | ||||||
| 	char const*  Marker; |  | ||||||
| 	Code         Signature; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| struct Scanner |  | ||||||
| { |  | ||||||
| 	struct RequestEntry |  | ||||||
| 	{ | 	{ | ||||||
| 		SymbolInfo Info; | 		String Reason; | ||||||
|  | 		Code   Node; | ||||||
| 	}; | 	}; | ||||||
|  | } | ||||||
|  |  | ||||||
| 	struct Receipt | CodeFile scan_file( char const* path ) | ||||||
| 	{ | { | ||||||
| 		StringCached File; | 	using namespace Parser; | ||||||
| 		Code         Defintion; |  | ||||||
| 		bool         Result; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	AllocatorInfo MemAlloc; | 	CodeFile | ||||||
|  | 	result = {}; | ||||||
|  | 	result.FilePath = String::make( GlobalAllocator, path ); | ||||||
|  |  | ||||||
| 	static void set_allocator( AllocatorInfo allocator ); | 	Code code = scan_file( path ); | ||||||
|  | 	result.CodeRoot = code; | ||||||
|  |  | ||||||
| 	Array<FileInfo>     Files; | 	ParseContext context = parser_get_last_context(); | ||||||
| 	String              Buffer; | 	result.Tokens        = context.Tokens; | ||||||
| 	Array<RequestEntry> Requests; | 	result.ParseFailures = context.Failures; | ||||||
|  |  | ||||||
| 	void add_files( s32 num, char const** files ); | 	return result; | ||||||
|  | } | ||||||
| 	void add( SymbolInfo signature, Policy policy ); |  | ||||||
|  |  | ||||||
| 	bool process_requests( Array<Receipt> out_receipts ); |  | ||||||
| }; |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -97,6 +97,15 @@ int gen_main() | |||||||
| 		src.write(); | 		src.write(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	CodeBody gen_component_header = def_global_body( args( | ||||||
|  | 		def_preprocess_cond( PreprocessCond_IfDef, txt("GEN_INTELLISENSE_DIRECTIVES") ), | ||||||
|  | 		pragma_once, | ||||||
|  | 		def_include(txt("components/types.hpp")), | ||||||
|  | 		preprocess_endif, | ||||||
|  | 		fmt_newline, | ||||||
|  | 		untyped_str( to_str(generation_notice) ) | ||||||
|  | 	)); | ||||||
|  |  | ||||||
| 	// gen.hpp | 	// gen.hpp | ||||||
| 	{ | 	{ | ||||||
| 		Code header_start = scan_file( "components/header_start.hpp" ); | 		Code header_start = scan_file( "components/header_start.hpp" ); | ||||||
| @@ -145,14 +154,6 @@ int gen_main() | |||||||
| 		header.print( pop_ignores ); | 		header.print( pop_ignores ); | ||||||
| 		header.write(); | 		header.write(); | ||||||
|  |  | ||||||
| 		CodeBody gen_component_header = def_global_body( args( |  | ||||||
| 			def_preprocess_cond( PreprocessCond_IfDef, txt("GEN_INTELLISENSE_DIRECTIVES") ), |  | ||||||
| 			pragma_once, |  | ||||||
| 			preprocess_endif, |  | ||||||
| 			fmt_newline, |  | ||||||
| 			untyped_str( to_str(generation_notice) ) |  | ||||||
| 		)); |  | ||||||
|  |  | ||||||
| 		Builder | 		Builder | ||||||
| 		header_ecode = Builder::open( "components/gen/ecode.hpp" ); | 		header_ecode = Builder::open( "components/gen/ecode.hpp" ); | ||||||
| 		header_ecode.print( gen_component_header ); | 		header_ecode.print( gen_component_header ); | ||||||
| @@ -222,8 +223,7 @@ int gen_main() | |||||||
|  |  | ||||||
| 		Builder | 		Builder | ||||||
| 		src_etoktype = Builder::open( "components/gen/etoktype.cpp" ); | 		src_etoktype = Builder::open( "components/gen/etoktype.cpp" ); | ||||||
| 		src_etoktype.print_fmt( generation_notice ); | 		src_etoktype.print( gen_component_header ); | ||||||
| 		src_etoktype.print( pragma_once ); |  | ||||||
| 		src_etoktype.print( nspaced_etoktype ); | 		src_etoktype.print( nspaced_etoktype ); | ||||||
| 		src_etoktype.write(); | 		src_etoktype.write(); | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -6,33 +6,355 @@ | |||||||
| Code Code::Global; | Code Code::Global; | ||||||
| Code Code::Invalid; | Code Code::Invalid; | ||||||
|  |  | ||||||
|  | // This serializes all the data-members in a "debug" format, where each member is printed with its associated value. | ||||||
| char const* AST::debug_str() | char const* AST::debug_str() | ||||||
| { | { | ||||||
|  | 	String result = String::make_reserve( GlobalAllocator, kilobytes(1) ); | ||||||
|  |  | ||||||
| 	if ( Parent ) | 	if ( Parent ) | ||||||
|  | 		result.append_fmt( "\n\tParent       : %S %S", Parent->type_str(), Name ? Name : "" ); | ||||||
|  | 	else | ||||||
|  | 		result.append_fmt( "\n\tParent       : %S", "Null" ); | ||||||
|  |  | ||||||
|  | 	result.append_fmt( "\n\tName         : %S", Name ? Name : "Null" ); | ||||||
|  | 	result.append_fmt( "\n\tType         : %S", type_str() ); | ||||||
|  | 	result.append_fmt( "\n\tModule Flags : %S", to_str( ModuleFlags ) ); | ||||||
|  |  | ||||||
|  | 	switch ( Type ) | ||||||
| 	{ | 	{ | ||||||
| 		String | 		using namespace ECode; | ||||||
| 		result = String::make_reserve( GlobalAllocator, kilobytes(1) ); |  | ||||||
| 		result.append_fmt( |  | ||||||
| 				"\n\tType    : %s" |  | ||||||
| 				"\n\tParent  : %s %s" |  | ||||||
| 				"\n\tName    : %s" |  | ||||||
| 			, type_str() |  | ||||||
| 			, Parent->type_str() |  | ||||||
| 			, Parent->Name, Name ? Name : "" |  | ||||||
| 		); |  | ||||||
|  |  | ||||||
| 		return result; | 		case Invalid: | ||||||
|  | 		case NewLine: | ||||||
|  | 		case Access_Private: | ||||||
|  | 		case Access_Protected: | ||||||
|  | 		case Access_Public: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Untyped: | ||||||
|  | 		case Execution: | ||||||
|  | 		case Comment: | ||||||
|  | 		case PlatformAttributes: | ||||||
|  | 		case Preprocess_Define: | ||||||
|  | 		case Preprocess_Include: | ||||||
|  | 		case Preprocess_Pragma: | ||||||
|  | 		case Preprocess_If: | ||||||
|  | 		case Preprocess_ElIf: | ||||||
|  | 		case Preprocess_Else: | ||||||
|  | 		case Preprocess_IfDef: | ||||||
|  | 		case Preprocess_IfNotDef: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tContent: %S", Content ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Class: | ||||||
|  | 		case Struct: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmd   : %S", InlineCmt  ? InlineCmt->Content      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes  : %S", Attributes ? Attributes->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess )  : "No Parent" ); | ||||||
|  | 			result.append_fmt( "\n\tParentType  : %s", ParentType ? ParentType->type_str()  : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBody        : %S", Body       ? Body->debug_str()       : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Class_Fwd: | ||||||
|  | 		case Struct_Fwd: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmd   : %S", InlineCmt  ? InlineCmt->Content      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes  : %S", Attributes ? Attributes->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess )  : "No Parent" ); | ||||||
|  | 			result.append_fmt( "\n\tParentType  : %s", ParentType ? ParentType->type_str()  : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Constructor: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt      : %S", InlineCmt       ? InlineCmt->Content           : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs          : %S", Specs           ? Specs->to_string()           : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParams         : %S", Params          ? Params->to_string()          : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBody           : %S", Body            ? Body->debug_str()            : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Constructor_Fwd: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt      : %S", InlineCmt       ? InlineCmt->Content           : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs          : %S", Specs           ? Specs->to_string()           : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParams         : %S", Params          ? Params->to_string()          : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Destructor: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt      : %S", InlineCmt ? InlineCmt->Content : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs          : %S", Specs     ? Specs->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBody           : %S", Body      ? Body->debug_str()  : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Destructor_Fwd: | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Enum: | ||||||
|  | 		case Enum_Class: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt       : %S", InlineCmt      ? InlineCmt->Content          : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes      : %S", Attributes     ? Attributes->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBody            : %S", Body           ? Body->debug_str()           : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Enum_Fwd: | ||||||
|  | 		case Enum_Class_Fwd: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt       : %S", InlineCmt      ? InlineCmt->Content          : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes      : %S", Attributes     ? Attributes->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Extern_Linkage: | ||||||
|  | 		case Namespace: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tBody: %S", Body ? Body->debug_str() : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Friend: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt  : %S", InlineCmt   ? InlineCmt->Content       : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Function: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt : %S", InlineCmt  ? InlineCmt->Content      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs     : %S", Specs      ? Specs->to_string()      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParams    : %S", Params     ? Params->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBody      : %S", Body       ? Body->debug_str()       : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Function_Fwd: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt : %S", InlineCmt  ? InlineCmt->Content      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs     : %S", Specs      ? Specs->to_string()      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParams    : %S", Params     ? Params->to_string()     : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Module: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Operator: | ||||||
|  | 		case Operator_Member: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt : %S", InlineCmt  ? InlineCmt->Content      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs     : %S", Specs      ? Specs->to_string()      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParams    : %S", Params     ? Params->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBody      : %S", Body       ? Body->debug_str()       : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tOp        : %S", to_str( Op ) ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Operator_Fwd: | ||||||
|  | 		case Operator_Member_Fwd: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt : %S", InlineCmt  ? InlineCmt->Content      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs     : %S", Specs      ? Specs->to_string()      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParams    : %S", Params     ? Params->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tOp        : %S", to_str( Op ) ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Operator_Cast: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt : %S", InlineCmt  ? InlineCmt->Content     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs     : %S", Specs      ? Specs->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tValueType : %S", ValueType  ? ValueType->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBody      : %S", Body       ? Body->debug_str()      : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Operator_Cast_Fwd: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt : %S", InlineCmt  ? InlineCmt->Content     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs     : %S", Specs      ? Specs->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tValueType : %S", ValueType  ? ValueType->to_string() : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Parameters: | ||||||
|  | 			result.append_fmt( "\n\tNumEntries: %d", NumEntries ); | ||||||
|  | 			result.append_fmt( "\n\tLast      : %S", Last->Name ); | ||||||
|  | 			result.append_fmt( "\n\tNext      : %S", Next->Name ); | ||||||
|  | 			result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tValue     : %S", Value     ? Value->to_string()     : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Specifiers: | ||||||
|  | 		{ | ||||||
|  | 			result.append_fmt( "\n\tNumEntries: %d", NumEntries ); | ||||||
|  | 			result.append( "\n\tArrSpecs: " ); | ||||||
|  |  | ||||||
|  | 			s32 idx  = 0; | ||||||
|  | 			s32 left = NumEntries; | ||||||
|  | 			while ( left-- ) | ||||||
|  | 			{ | ||||||
|  | 				StrC spec = ESpecifier::to_str( ArrSpecs[idx] ); | ||||||
|  | 				result.append_fmt( "%.*s, ", spec.Len, spec.Ptr ); | ||||||
|  | 				idx++; | ||||||
|  | 			} | ||||||
|  | 			result.append_fmt( "\n\tNextSpecs: %S", NextSpecs ? NextSpecs->debug_str() : "Null" ); | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Template: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tParams     : %S", Params      ? Params->to_string()      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Typedef: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt     : %S", InlineCmt      ? InlineCmt->Content          : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Typename: | ||||||
|  | 			result.append_fmt( "\n\tAttributes     : %S", Attributes ? Attributes->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs          : %S", Specs      ? Specs->to_string()      : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tReturnType     : %S", ReturnType ? ReturnType->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tParams         : %S", Params     ? Params->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tArrExpr        : %S", ArrExpr    ? ArrExpr->to_string()    : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Union: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBody      : %S", Body       ? Body->debug_str()       : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Using: | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt     : %S", InlineCmt      ? InlineCmt->Content          : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes    : %S", Attributes     ? Attributes->to_string()     : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Variable: | ||||||
|  |  | ||||||
|  | 			if ( Parent && Parent->Type == Variable ) | ||||||
|  | 			{ | ||||||
|  | 				// Its a NextVar | ||||||
|  | 				result.append_fmt( "\n\tSpecs       : %S", Specs        ? Specs->to_string()        : "Null" ); | ||||||
|  | 				result.append_fmt( "\n\tValue       : %S", Value        ? Value->to_string()        : "Null" ); | ||||||
|  | 				result.append_fmt( "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" ); | ||||||
|  | 				result.append_fmt( "\n\tNextVar     : %S", NextVar      ? NextVar->debug_str()      : "Null" ); | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if ( Prev ) | ||||||
|  | 				result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  | 			if ( Next ) | ||||||
|  | 				result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n\tInlineCmt   : %S", InlineCmt    ? InlineCmt->Content        : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tAttributes  : %S", Attributes   ? Attributes->to_string()   : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tSpecs       : %S", Specs        ? Specs->to_string()        : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tValueType   : %S", ValueType    ? ValueType->to_string()    : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tValue       : %S", Value        ? Value->to_string()        : "Null" ); | ||||||
|  | 			result.append_fmt( "\n\tNextVar     : %S", NextVar      ? NextVar->debug_str()      : "Null" ); | ||||||
|  | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	String |  | ||||||
| 	result = String::make_reserve( GlobalAllocator, kilobytes(1) ); |  | ||||||
| 	result.append_fmt( |  | ||||||
| 			"\n\tType    : %s" |  | ||||||
| 			"\n\tName    : %s" |  | ||||||
| 		, type_str() |  | ||||||
| 		, Name ? Name : "" |  | ||||||
| 	); |  | ||||||
|  |  | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -61,7 +383,11 @@ String AST::to_string() | |||||||
| 		using namespace ECode; | 		using namespace ECode; | ||||||
|  |  | ||||||
| 		case Invalid: | 		case Invalid: | ||||||
|  | 		#ifdef GEN_DONT_ALLOW_INVALID_CODE | ||||||
| 			log_failure("Attempted to serialize invalid code! - %S", Parent ? Parent->debug_str() : Name ); | 			log_failure("Attempted to serialize invalid code! - %S", Parent ? Parent->debug_str() : Name ); | ||||||
|  | 		#else | ||||||
|  | 			result.append_fmt( "Invalid Code!" ); | ||||||
|  | 		#endif | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 		case NewLine: | 		case NewLine: | ||||||
| @@ -71,6 +397,7 @@ String AST::to_string() | |||||||
| 		case Untyped: | 		case Untyped: | ||||||
| 		case Execution: | 		case Execution: | ||||||
| 		case Comment: | 		case Comment: | ||||||
|  | 		case PlatformAttributes: | ||||||
| 			result.append( Content ); | 			result.append( Content ); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| @@ -80,51 +407,46 @@ String AST::to_string() | |||||||
| 			result.append( Name ); | 			result.append( Name ); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 		case PlatformAttributes: |  | ||||||
| 			result.append( Content ); |  | ||||||
|  |  | ||||||
| 		case Class: | 		case Class: | ||||||
| 		{ | 		{ | ||||||
| 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | ||||||
| 				result.append( "export " ); | 				result.append( "export " ); | ||||||
|  |  | ||||||
| 			if ( Attributes || ParentType ) | 			result.append( "class " ); | ||||||
|  |  | ||||||
|  | 			if ( Attributes ) | ||||||
| 			{ | 			{ | ||||||
| 				result.append( "class " ); | 				result.append_fmt( "%S ", Attributes->to_string() ); | ||||||
|  | 			} | ||||||
|  |  | ||||||
| 				if ( Attributes ) | 			if ( ParentType ) | ||||||
|  | 			{ | ||||||
|  | 				char const* access_level = to_str( ParentAccess ); | ||||||
|  |  | ||||||
|  | 				result.append_fmt( "%S : %s %S", Name, access_level, ParentType ); | ||||||
|  |  | ||||||
|  | 				CodeType interface = ParentType->Next->cast< CodeType >(); | ||||||
|  | 				if ( interface ) | ||||||
|  | 					result.append( "\n" ); | ||||||
|  |  | ||||||
|  | 				while ( interface ) | ||||||
| 				{ | 				{ | ||||||
| 					result.append_fmt( "%S ", Attributes->to_string() ); | 					result.append_fmt( ", %S", interface.to_string() ); | ||||||
| 				} | 					interface = interface->Next ? interface->Next->cast< CodeType >() : Code { nullptr }; | ||||||
|  |  | ||||||
| 				if ( ParentType ) |  | ||||||
| 				{ |  | ||||||
| 					char const* access_level = to_str( ParentAccess ); |  | ||||||
|  |  | ||||||
| 					result.append_fmt( "%S : %s %S", Name, access_level, ParentType ); |  | ||||||
|  |  | ||||||
| 					CodeType interface = ParentType->Next->cast< CodeType >(); |  | ||||||
| 					if ( interface ) |  | ||||||
| 						result.append( "\n" ); |  | ||||||
|  |  | ||||||
| 					while ( interface ) |  | ||||||
| 					{ |  | ||||||
| 						result.append_fmt( ", %S", interface.to_string() ); |  | ||||||
| 						interface = interface->Next ? interface->Next->cast< CodeType >() : Code { nullptr }; |  | ||||||
| 					} |  | ||||||
|  |  | ||||||
| 					result.append_fmt( "\n{\n%S\n}", Body->to_string() ); |  | ||||||
| 				} |  | ||||||
| 				else |  | ||||||
| 				{ |  | ||||||
| 					result.append_fmt( "%S \n{\n%S\n}", Name, Body->to_string() ); |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			else | 			else if ( Name ) | ||||||
| 			{ | 			{ | ||||||
| 				result.append_fmt( "class %S\n{\n%S\n}", Name, Body->to_string() ); | 				result.append( Name ); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			if ( InlineCmt ) | ||||||
|  | 			{ | ||||||
|  | 				result.append_fmt( " // %S", InlineCmt->Content ); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n{\n%S\n}", Body->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"); | 				result.append(";\n"); | ||||||
| 		} | 		} | ||||||
| @@ -163,6 +485,9 @@ String AST::to_string() | |||||||
| 			if ( InitializerList ) | 			if ( InitializerList ) | ||||||
| 				result.append_fmt( " : %S", InitializerList->to_string() ); | 				result.append_fmt( " : %S", InitializerList->to_string() ); | ||||||
|  |  | ||||||
|  | 			if ( InlineCmt ) | ||||||
|  | 				result.append_fmt( " // %S", InlineCmt->Content ); | ||||||
|  |  | ||||||
| 			result.append_fmt( "\n{\n%S\n}\n", Body->to_string() ); | 			result.append_fmt( "\n{\n%S\n}\n", Body->to_string() ); | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
| @@ -365,13 +690,25 @@ String AST::to_string() | |||||||
| 		case Function: | 		case Function: | ||||||
| 		{ | 		{ | ||||||
| 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | ||||||
| 				result.append( "export " ); | 				result.append( "export" ); | ||||||
|  |  | ||||||
| 			if ( Attributes ) | 			if ( Attributes ) | ||||||
| 				result.append_fmt( "%S ", Attributes->to_string() ); | 				result.append_fmt( " %S ", Attributes->to_string() ); | ||||||
|  |  | ||||||
| 			if ( Specs ) | 			if ( Specs ) | ||||||
| 				result.append_fmt( "%S", Specs->to_string() ); | 			{ | ||||||
|  | 				for ( SpecifierT spec : Specs->cast<CodeSpecifiers>() ) | ||||||
|  | 				{ | ||||||
|  | 					if ( ! ESpecifier::is_trailing( spec ) ) | ||||||
|  | 					{ | ||||||
|  | 						StrC spec_str = ESpecifier::to_str( spec ); | ||||||
|  | 						result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if ( Attributes || Specs ) | ||||||
|  | 				result.append( "\n" ); | ||||||
|  |  | ||||||
| 			if ( ReturnType ) | 			if ( ReturnType ) | ||||||
| 				result.append_fmt( "%S %S(", ReturnType->to_string(), Name ); | 				result.append_fmt( "%S %S(", ReturnType->to_string(), Name ); | ||||||
| @@ -410,7 +747,21 @@ String AST::to_string() | |||||||
| 				result.append_fmt( "%S ", Attributes->to_string() ); | 				result.append_fmt( "%S ", Attributes->to_string() ); | ||||||
|  |  | ||||||
| 			if ( Specs ) | 			if ( Specs ) | ||||||
| 				result.append_fmt( "%S", Specs->to_string() ); | 			{ | ||||||
|  | 				for ( SpecifierT spec : Specs->cast<CodeSpecifiers>() ) | ||||||
|  | 				{ | ||||||
|  | 					if ( ! ESpecifier::is_trailing( spec ) ) | ||||||
|  | 					{ | ||||||
|  | 						StrC spec_str = ESpecifier::to_str( spec ); | ||||||
|  | 						result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if ( Attributes || Specs ) | ||||||
|  | 			{ | ||||||
|  | 				result.append("\n" ); | ||||||
|  | 			} | ||||||
|  |  | ||||||
| 			if ( ReturnType ) | 			if ( ReturnType ) | ||||||
| 				result.append_fmt( "%S %S(", ReturnType->to_string(), Name ); | 				result.append_fmt( "%S %S(", ReturnType->to_string(), Name ); | ||||||
| @@ -470,7 +821,24 @@ String AST::to_string() | |||||||
| 				result.append_fmt( "%S ", Attributes->to_string() ); | 				result.append_fmt( "%S ", Attributes->to_string() ); | ||||||
|  |  | ||||||
| 			if ( Attributes ) | 			if ( Attributes ) | ||||||
| 				result.append_fmt( "%S\n", Attributes->to_string() ); | 				result.append_fmt( "%S ", Attributes->to_string() ); | ||||||
|  |  | ||||||
|  | 			if ( Specs ) | ||||||
|  | 			{ | ||||||
|  | 				for ( SpecifierT spec : Specs->cast<CodeSpecifiers>() ) | ||||||
|  | 				{ | ||||||
|  | 					if ( ! ESpecifier::is_trailing( spec ) ) | ||||||
|  | 					{ | ||||||
|  | 						StrC spec_str = ESpecifier::to_str( spec ); | ||||||
|  | 						result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if ( Attributes || Specs ) | ||||||
|  | 			{ | ||||||
|  | 				result.append("\n" ); | ||||||
|  | 			} | ||||||
|  |  | ||||||
| 			if ( ReturnType ) | 			if ( ReturnType ) | ||||||
| 				result.append_fmt( "%S %S (", ReturnType->to_string(), Name ); | 				result.append_fmt( "%S %S (", ReturnType->to_string(), Name ); | ||||||
| @@ -509,7 +877,21 @@ String AST::to_string() | |||||||
| 				result.append_fmt( "%S\n", Attributes->to_string() ); | 				result.append_fmt( "%S\n", Attributes->to_string() ); | ||||||
|  |  | ||||||
| 			if ( Specs ) | 			if ( Specs ) | ||||||
| 				result.append_fmt( "%S\n", Specs->to_string() ); | 			{ | ||||||
|  | 				for ( SpecifierT spec : Specs->cast<CodeSpecifiers>() ) | ||||||
|  | 				{ | ||||||
|  | 					if ( ! ESpecifier::is_trailing( spec ) ) | ||||||
|  | 					{ | ||||||
|  | 						StrC spec_str = ESpecifier::to_str( spec ); | ||||||
|  | 						result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if ( Attributes || Specs ) | ||||||
|  | 			{ | ||||||
|  | 				result.append("\n" ); | ||||||
|  | 			} | ||||||
|  |  | ||||||
| 			result.append_fmt( "%S %S (", ReturnType->to_string(), Name ); | 			result.append_fmt( "%S %S (", ReturnType->to_string(), Name ); | ||||||
|  |  | ||||||
| @@ -666,12 +1048,6 @@ String AST::to_string() | |||||||
| 			s32 left = NumEntries; | 			s32 left = NumEntries; | ||||||
| 			while ( left-- ) | 			while ( left-- ) | ||||||
| 			{ | 			{ | ||||||
| 				if ( ESpecifier::is_trailing( ArrSpecs[idx]) && ArrSpecs[idx] != ESpecifier::Const ) |  | ||||||
| 				{ |  | ||||||
| 					idx++; |  | ||||||
| 					continue; |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				StrC spec = ESpecifier::to_str( ArrSpecs[idx] ); | 				StrC spec = ESpecifier::to_str( ArrSpecs[idx] ); | ||||||
| 				result.append_fmt( "%.*s ", spec.Len, spec.Ptr ); | 				result.append_fmt( "%.*s ", spec.Len, spec.Ptr ); | ||||||
| 				idx++; | 				idx++; | ||||||
| @@ -684,56 +1060,43 @@ String AST::to_string() | |||||||
| 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | ||||||
| 				result.append( "export " ); | 				result.append( "export " ); | ||||||
|  |  | ||||||
| 			if ( Name == nullptr) | 			result.append( "struct " ); | ||||||
|  |  | ||||||
|  | 			if ( Attributes ) | ||||||
| 			{ | 			{ | ||||||
| 				result.append_fmt( "struct\n{\n%S\n};\n", Body->to_string() ); | 				result.append_fmt( "%S ", Attributes->to_string() ); | ||||||
| 				break; |  | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if ( Attributes || ParentType ) | 			if ( ParentType ) | ||||||
| 			{ | 			{ | ||||||
| 				result.append( "struct " ); | 				char const* access_level = to_str( ParentAccess ); | ||||||
|  |  | ||||||
| 				if ( Attributes ) | 				result.append_fmt( "%S : %s %S", Name, access_level, ParentType ); | ||||||
| 					result.append_fmt( "%S ", Attributes->to_string() ); |  | ||||||
|  |  | ||||||
| 				if ( ParentType ) | 				CodeType interface = ParentType->Next->cast< CodeType >(); | ||||||
|  | 				if ( interface ) | ||||||
|  | 					result.append( "\n" ); | ||||||
|  |  | ||||||
|  | 				while ( interface ) | ||||||
| 				{ | 				{ | ||||||
| 					char const* access_level = to_str( ParentAccess ); | 					result.append_fmt( ", %S", interface.to_string() ); | ||||||
|  | 					interface = interface->Next ? interface->Next->cast< CodeType >() : Code { nullptr }; | ||||||
| 					result.append_fmt( "%S : %s %S", Name, access_level, ParentType ); |  | ||||||
|  |  | ||||||
| 					CodeType interface = ParentType->Next->cast< CodeType >(); |  | ||||||
| 					if ( interface ) |  | ||||||
| 						result.append( "\n" ); |  | ||||||
|  |  | ||||||
| 					while ( interface ) |  | ||||||
| 					{ |  | ||||||
| 						result.append_fmt( ", %S", interface.to_string() ); |  | ||||||
|  |  | ||||||
| 						interface = interface->Next ? interface->Next->cast< CodeType >() : Code { nullptr }; |  | ||||||
| 					} |  | ||||||
|  |  | ||||||
| 					result.append_fmt( "\n{\n%S\n}", Body->to_string() ); |  | ||||||
| 				} |  | ||||||
| 				else |  | ||||||
| 				{ |  | ||||||
| 					if ( Name ) |  | ||||||
| 						result.append_fmt( "%S \n{\n%S\n}", Name, Body->to_string() ); |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			else | 			else if ( Name ) | ||||||
| 			{ | 			{ | ||||||
| 				result.append_fmt( "struct %S\n{\n%S\n}", Name, Body->to_string() ); | 				result.append( Name ); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			if ( InlineCmt ) | ||||||
|  | 			{ | ||||||
|  | 				result.append_fmt( " // %S", InlineCmt->Content ); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			result.append_fmt( "\n{\n%S\n}", Body->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; | ||||||
|  |  | ||||||
| @@ -762,7 +1125,10 @@ String AST::to_string() | |||||||
| 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | ||||||
| 				result.append( "export " ); | 				result.append( "export " ); | ||||||
|  |  | ||||||
| 			result.append_fmt( "template< %S >\n%S", Params->to_string(), Declaration->to_string() ); | 			if ( Params ) | ||||||
|  | 				result.append_fmt( "template< %S >\n%S", Params->to_string(), Declaration->to_string() ); | ||||||
|  | 			else | ||||||
|  | 				result.append_fmt( "template<>\n%S", Declaration->to_string() ); | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,10 +41,10 @@ struct CodeBody; | |||||||
| // These are to offer ease of use and optionally strong type safety for the AST. | // These are to offer ease of use and optionally strong type safety for the AST. | ||||||
| struct CodeAttributes; | struct CodeAttributes; | ||||||
| struct CodeComment; | struct CodeComment; | ||||||
| struct CodeConstructor; |  | ||||||
| struct CodeDestructor; |  | ||||||
| struct CodeClass; | struct CodeClass; | ||||||
|  | struct CodeConstructor; | ||||||
| struct CodeDefine; | struct CodeDefine; | ||||||
|  | struct CodeDestructor; | ||||||
| struct CodeEnum; | struct CodeEnum; | ||||||
| struct CodeExec; | struct CodeExec; | ||||||
| struct CodeExtern; | struct CodeExtern; | ||||||
| @@ -67,6 +67,11 @@ struct CodeUnion; | |||||||
| struct CodeUsing; | struct CodeUsing; | ||||||
| struct CodeVar; | struct CodeVar; | ||||||
|  |  | ||||||
|  | namespace Parser | ||||||
|  | { | ||||||
|  | 	struct Token; | ||||||
|  | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
| 	AST* wrapper | 	AST* wrapper | ||||||
| 	- Not constantly have to append the '*' as this is written often.. | 	- Not constantly have to append the '*' as this is written often.. | ||||||
| @@ -82,7 +87,7 @@ struct Code | |||||||
| 	static Code Invalid; | 	static Code Invalid; | ||||||
| #	pragma endregion Statics | #	pragma endregion Statics | ||||||
|  |  | ||||||
| #	define Using_Code( Typename )         \ | #	define Using_Code( Typename )          \ | ||||||
| 	char const* debug_str();               \ | 	char const* debug_str();               \ | ||||||
| 	Code        duplicate();			   \ | 	Code        duplicate();			   \ | ||||||
| 	bool        is_equal( Code other );    \ | 	bool        is_equal( Code other );    \ | ||||||
| @@ -108,7 +113,7 @@ struct Code | |||||||
| 		return ast; | 		return ast; | ||||||
| 	} | 	} | ||||||
| 	Code& operator ++(); | 	Code& operator ++(); | ||||||
| 	Code& operator*() | 	auto& operator*() | ||||||
| 	{ | 	{ | ||||||
| 		return *this; | 		return *this; | ||||||
| 	} | 	} | ||||||
| @@ -157,7 +162,7 @@ struct Code_POD | |||||||
| static_assert( sizeof(Code) == sizeof(Code_POD), "ERROR: Code is not POD" ); | static_assert( sizeof(Code) == sizeof(Code_POD), "ERROR: Code is not POD" ); | ||||||
|  |  | ||||||
| // Desired width of the AST data structure. | // Desired width of the AST data structure. | ||||||
| constexpr u32 AST_POD_Size = 128; | constexpr int const AST_POD_Size = 128; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| 	Simple AST POD with functionality to seralize into C++ syntax. | 	Simple AST POD with functionality to seralize into C++ syntax. | ||||||
| @@ -214,17 +219,18 @@ struct AST | |||||||
| #	pragma endregion Member Functions | #	pragma endregion Member Functions | ||||||
|  |  | ||||||
| 	constexpr static | 	constexpr static | ||||||
| 	uw ArrSpecs_Cap = | 	int ArrSpecs_Cap = | ||||||
| 	( | 	( | ||||||
| 			AST_POD_Size | 			AST_POD_Size | ||||||
| 			- sizeof(AST*) * 3 | 			- sizeof(AST*) * 3 | ||||||
|  | 			- sizeof(Parser::Token*) | ||||||
|  | 			- sizeof(AST*) | ||||||
| 			- sizeof(StringCached) | 			- sizeof(StringCached) | ||||||
| 			- sizeof(CodeT) | 			- sizeof(CodeT) | ||||||
| 			- sizeof(ModuleFlag) | 			- sizeof(ModuleFlag) | ||||||
| 			- sizeof(u32) | 			- sizeof(int) | ||||||
| 			- sizeof(s32) |  | ||||||
| 	) | 	) | ||||||
| 	/ sizeof(SpecifierT) - 1; // -1 for 4 extra bytes | 	/ sizeof(int) - 1; // -1 for 4 extra bytes | ||||||
|  |  | ||||||
| 	union { | 	union { | ||||||
| 		struct | 		struct | ||||||
| @@ -251,11 +257,14 @@ struct AST | |||||||
| 			}; | 			}; | ||||||
| 			union { | 			union { | ||||||
| 				AST*  NextVar;          // Variable; Possible way to handle comma separated variables declarations. ( , NextVar->Specs NextVar->Name NextVar->ArrExpr = NextVar->Value ) | 				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. | 				AST*  SuffixSpecs;      // Only used with typenames, to store the function suffix if typename is function signature. ( May not be needed ) | ||||||
| 			}; | 			}; | ||||||
| 		}; | 		}; | ||||||
| 		StringCached  Content;          // Attributes, Comment, Execution, Include | 		StringCached  Content;          // Attributes, Comment, Execution, Include | ||||||
| 		SpecifierT    ArrSpecs[AST::ArrSpecs_Cap]; // Specifiers | 		struct { | ||||||
|  | 			SpecifierT ArrSpecs[ArrSpecs_Cap]; // Specifiers | ||||||
|  | 			AST*       NextSpecs;                   // Specifiers; If ArrSpecs is full, then NextSpecs is used. | ||||||
|  | 		}; | ||||||
| 	}; | 	}; | ||||||
| 	union { | 	union { | ||||||
| 		AST* Prev; | 		AST* Prev; | ||||||
| @@ -266,6 +275,7 @@ struct AST | |||||||
| 		AST* Next; | 		AST* Next; | ||||||
| 		AST* Back; | 		AST* Back; | ||||||
| 	}; | 	}; | ||||||
|  | 	Parser::Token*    Token; // Reference to starting token, only avaialble if it was derived from parsing. | ||||||
| 	AST*              Parent; | 	AST*              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| @@ -277,7 +287,6 @@ struct AST | |||||||
| 		AccessSpec    ParentAccess; | 		AccessSpec    ParentAccess; | ||||||
| 		s32           NumEntries; | 		s32           NumEntries; | ||||||
| 	}; | 	}; | ||||||
| 	s32               Token;       // Handle to the token, stored in the CodeFile (Otherwise unretrivable) |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct AST_POD | struct AST_POD | ||||||
| @@ -307,11 +316,14 @@ struct AST_POD | |||||||
| 			}; | 			}; | ||||||
| 			union { | 			union { | ||||||
| 				AST*  NextVar;          // Variable; Possible way to handle comma separated variables declarations. ( , NextVar->Specs NextVar->Name NextVar->ArrExpr = NextVar->Value ) | 				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. | 				AST*  SuffixSpecs;      // Only used with typenames, to store the function suffix if typename is function signature. ( May not be needed ) | ||||||
| 			}; | 			}; | ||||||
| 		}; | 		}; | ||||||
| 		StringCached  Content;         // Attributes, Comment, Execution, Include | 		StringCached  Content;          // Attributes, Comment, Execution, Include | ||||||
| 		SpecifierT    ArrSpecs[AST::ArrSpecs_Cap]; // Specifiers | 		struct { | ||||||
|  | 			SpecifierT ArrSpecs[AST::ArrSpecs_Cap]; // Specifiers | ||||||
|  | 			AST*       NextSpecs;                   // Specifiers; If ArrSpecs is full, then NextSpecs is used. | ||||||
|  | 		}; | ||||||
| 	}; | 	}; | ||||||
| 	union { | 	union { | ||||||
| 		AST* Prev; | 		AST* Prev; | ||||||
| @@ -322,6 +334,7 @@ struct AST_POD | |||||||
| 		AST* Next; | 		AST* Next; | ||||||
| 		AST* Back; | 		AST* Back; | ||||||
| 	}; | 	}; | ||||||
|  | 	Parser::Token*    Token; // Reference to starting token, only avaialble if it was derived from parsing. | ||||||
| 	AST*              Parent; | 	AST*              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| @@ -333,9 +346,15 @@ struct AST_POD | |||||||
| 		AccessSpec    ParentAccess; | 		AccessSpec    ParentAccess; | ||||||
| 		s32           NumEntries; | 		s32           NumEntries; | ||||||
| 	}; | 	}; | ||||||
| 	s32               Token;       // Handle to the token, stored in the CodeFile (Otherwise unretrivable) |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | struct test { | ||||||
|  | 	SpecifierT ArrSpecs[AST::ArrSpecs_Cap]; // Specifiers | ||||||
|  | 	AST* NextSpecs;                   // Specifiers; If ArrSpecs is full, then NextSpecs is used. | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | constexpr int pls = sizeof(test); | ||||||
|  |  | ||||||
| // Its intended for the AST to have equivalent size to its POD. | // Its intended for the AST to have equivalent size to its POD. | ||||||
| // All extra functionality within the AST namespace should just be syntatic sugar. | // All extra functionality within the AST namespace should just be syntatic sugar. | ||||||
| static_assert( sizeof(AST)     == sizeof(AST_POD), "ERROR: AST IS NOT POD" ); | static_assert( sizeof(AST)     == sizeof(AST_POD), "ERROR: AST IS NOT POD" ); | ||||||
|   | |||||||
| @@ -12,54 +12,54 @@ | |||||||
|  |  | ||||||
| struct AST_Body | struct AST_Body | ||||||
| { | { | ||||||
| 	char              _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 	char              _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 	Code              Front; | 	Code              Front; | ||||||
| 	Code              Back; | 	Code              Back; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) ]; | 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) ]; | ||||||
| 	s32 			  NumEntries; | 	s32 			  NumEntries; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Body) == sizeof(AST), "ERROR: AST_Filtered is not the same size as AST"); | static_assert( sizeof(AST_Body) == sizeof(AST), "ERROR: AST_Body is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Attributes | struct AST_Attributes | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		StringCached  Content; | 		StringCached  Content; | ||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Attributes) == sizeof(AST), "ERROR: AST_Attributes is not the same size as AST"); | static_assert( sizeof(AST_Attributes) == sizeof(AST), "ERROR: AST_Attributes is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Comment | struct AST_Comment | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		StringCached  Content; | 		StringCached  Content; | ||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Comment) == sizeof(AST), "ERROR: AST_Comment is not the same size as AST"); | static_assert( sizeof(AST_Comment) == sizeof(AST), "ERROR: AST_Comment is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Class | struct AST_Class | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char                _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char                _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment     InlineCmt; // Only supported by forward declarations | 			CodeComment     InlineCmt; // Only supported by forward declarations | ||||||
| @@ -71,21 +71,21 @@ struct AST_Class | |||||||
| 			char 	        _PAD_PROPERTIES_2_[ sizeof(AST*) ]; | 			char 	        _PAD_PROPERTIES_2_[ sizeof(AST*) ]; | ||||||
| 		}; | 		}; | ||||||
| 	}; | 	}; | ||||||
| 	CodeType                Last; | 	CodeType                Prev; | ||||||
| 	CodeType                Next; | 	CodeType                Next; | ||||||
|  | 	Parser::Token*          Token; | ||||||
| 	Code                    Parent; | 	Code                    Parent; | ||||||
| 	StringCached            Name; | 	StringCached            Name; | ||||||
| 	CodeT                   Type; | 	CodeT                   Type; | ||||||
| 	ModuleFlag              ModuleFlags; | 	ModuleFlag              ModuleFlags; | ||||||
| 	AccessSpec              ParentAccess; | 	AccessSpec              ParentAccess; | ||||||
| 	s32                     Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Class) == sizeof(AST), "ERROR: AST_Class is not the same size as AST"); | static_assert( sizeof(AST_Class) == sizeof(AST), "ERROR: AST_Class is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Constructor | struct AST_Constructor | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment    InlineCmt; // Only supported by forward declarations | 			CodeComment    InlineCmt; // Only supported by forward declarations | ||||||
| @@ -99,34 +99,34 @@ struct AST_Constructor | |||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	char              _PAD_NAME_[ sizeof(StringCached) ]; | 	char              _PAD_NAME_[ sizeof(StringCached) ]; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Constructor) == sizeof(AST), "ERROR: AST_Constructor is not the same size as AST"); | static_assert( sizeof(AST_Constructor) == sizeof(AST), "ERROR: AST_Constructor is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Define | struct AST_Define | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		  _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		StringCached  Content; | 		StringCached  Content; | ||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| 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_Destructor | struct AST_Destructor | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment    InlineCmt; | 			CodeComment    InlineCmt; | ||||||
| @@ -139,18 +139,18 @@ struct AST_Destructor | |||||||
| 	}; | 	}; | ||||||
| 	Code                   Prev; | 	Code                   Prev; | ||||||
| 	Code                   Next; | 	Code                   Next; | ||||||
|  | 	Parser::Token*         Token; | ||||||
| 	Code                   Parent; | 	Code                   Parent; | ||||||
| 	char                   _PAD_NAME_[ sizeof(StringCached) ]; | 	char                   _PAD_NAME_[ sizeof(StringCached) ]; | ||||||
| 	CodeT                  Type; | 	CodeT                  Type; | ||||||
| 	char                   _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char                   _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32                    Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Destructor) == sizeof(AST), "ERROR: AST_Destructor is not the same size as AST"); | static_assert( sizeof(AST_Destructor) == sizeof(AST), "ERROR: AST_Destructor is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Enum | struct AST_Enum | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char                _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment    InlineCmt; | 			CodeComment    InlineCmt; | ||||||
| @@ -164,35 +164,35 @@ struct AST_Enum | |||||||
| 	}; | 	}; | ||||||
| 	Code                   Prev; | 	Code                   Prev; | ||||||
| 	Code                   Next; | 	Code                   Next; | ||||||
|  | 	Parser::Token*         Token; | ||||||
| 	Code                   Parent; | 	Code                   Parent; | ||||||
| 	StringCached           Name; | 	StringCached           Name; | ||||||
| 	CodeT                  Type; | 	CodeT                  Type; | ||||||
| 	ModuleFlag             ModuleFlags; | 	ModuleFlag             ModuleFlags; | ||||||
| 	char 			       _PAD_UNUSED_[ sizeof(u32) ]; | 	char 			       _PAD_UNUSED_[ sizeof(u32) ]; | ||||||
| 	s32                    Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Enum) == sizeof(AST), "ERROR: AST_Enum is not the same size as AST"); | static_assert( sizeof(AST_Enum) == sizeof(AST), "ERROR: AST_Enum is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Exec | struct AST_Exec | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		StringCached  Content; | 		StringCached  Content; | ||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char              _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Exec) == sizeof(AST), "ERROR: AST_Exec is not the same size as AST"); | static_assert( sizeof(AST_Exec) == sizeof(AST), "ERROR: AST_Exec is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Extern | struct AST_Extern | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			char      _PAD_PROPERTIES_[ sizeof(AST*) * 5 ]; | 			char      _PAD_PROPERTIES_[ sizeof(AST*) * 5 ]; | ||||||
| @@ -202,34 +202,34 @@ struct AST_Extern | |||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Extern) == sizeof(AST), "ERROR: AST_Extern is not the same size as AST"); | static_assert( sizeof(AST_Extern) == sizeof(AST), "ERROR: AST_Extern is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Include | struct AST_Include | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		StringCached  Content; | 		StringCached  Content; | ||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Include) == sizeof(AST), "ERROR: AST_Include is not the same size as AST"); | static_assert( sizeof(AST_Include) == sizeof(AST), "ERROR: AST_Include is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Friend | struct AST_Friend | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char            _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment InlineCmt; | 			CodeComment InlineCmt; | ||||||
| @@ -240,18 +240,18 @@ struct AST_Friend | |||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Friend) == sizeof(AST), "ERROR: AST_Friend is not the same size as AST"); | static_assert( sizeof(AST_Friend) == sizeof(AST), "ERROR: AST_Friend is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Fn | struct AST_Fn | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char                _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment     InlineCmt; | 			CodeComment     InlineCmt; | ||||||
| @@ -264,34 +264,34 @@ struct AST_Fn | |||||||
| 		}; | 		}; | ||||||
| 	}; | 	}; | ||||||
| 	Code                    Prev; | 	Code                    Prev; | ||||||
| 	Code                    Parent; |  | ||||||
| 	Code                    Next; | 	Code                    Next; | ||||||
|  | 	Parser::Token*          Token; | ||||||
|  | 	Code                    Parent; | ||||||
| 	StringCached            Name; | 	StringCached            Name; | ||||||
| 	CodeT                   Type; | 	CodeT                   Type; | ||||||
| 	ModuleFlag              ModuleFlags; | 	ModuleFlag              ModuleFlags; | ||||||
| 	char 			        _PAD_UNUSED_[ sizeof(u32) ]; | 	char 			        _PAD_UNUSED_[ sizeof(u32) ]; | ||||||
| 	s32                     Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Fn) == sizeof(AST), "ERROR: AST_Fn is not the same size as AST"); | static_assert( sizeof(AST_Fn) == sizeof(AST), "ERROR: AST_Fn is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Module | struct AST_Module | ||||||
| { | { | ||||||
| 	char              _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 	char              _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	ModuleFlag        ModuleFlags; | 	ModuleFlag        ModuleFlags; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Module) == sizeof(AST), "ERROR: AST_Module is not the same size as AST"); | static_assert( sizeof(AST_Module) == sizeof(AST), "ERROR: AST_Module is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_NS | struct AST_NS | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct { | 		struct { | ||||||
| 			char 	  _PAD_PROPERTIES_[ sizeof(AST*) * 5 ]; | 			char 	  _PAD_PROPERTIES_[ sizeof(AST*) * 5 ]; | ||||||
| 			CodeBody  Body; | 			CodeBody  Body; | ||||||
| @@ -300,19 +300,19 @@ struct AST_NS | |||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	ModuleFlag        ModuleFlags; | 	ModuleFlag        ModuleFlags; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_NS) == sizeof(AST), "ERROR: AST_NS is not the same size as AST"); | static_assert( sizeof(AST_NS) == sizeof(AST), "ERROR: AST_NS is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Operator | struct AST_Operator | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char                _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char                _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment     InlineCmt; | 			CodeComment     InlineCmt; | ||||||
| @@ -324,21 +324,21 @@ struct AST_Operator | |||||||
| 			char 	        _PAD_PROPERTIES_ [ sizeof(AST*) ]; | 			char 	        _PAD_PROPERTIES_ [ sizeof(AST*) ]; | ||||||
| 		}; | 		}; | ||||||
| 	}; | 	}; | ||||||
| 	Code                    Prev; | 	Code           Prev; | ||||||
| 	Code                    Next; | 	Code           Next; | ||||||
| 	Code                    Parent; | 	Parser::Token* Token; | ||||||
| 	StringCached            Name; | 	Code           Parent; | ||||||
| 	CodeT                   Type; | 	StringCached   Name; | ||||||
| 	ModuleFlag              ModuleFlags; | 	CodeT          Type; | ||||||
| 	OperatorT               Op; | 	ModuleFlag     ModuleFlags; | ||||||
| 	s32                     Token; | 	OperatorT      Op; | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Operator) == sizeof(AST), "ERROR: AST_Operator is not the same size as AST"); | static_assert( sizeof(AST_Operator) == sizeof(AST), "ERROR: AST_Operator is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_OpCast | struct AST_OpCast | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment    InlineCmt; | 			CodeComment    InlineCmt; | ||||||
| @@ -352,18 +352,18 @@ struct AST_OpCast | |||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_OpCast) == sizeof(AST), "ERROR: AST_OpCast is not the same size as AST"); | static_assert( sizeof(AST_OpCast) == sizeof(AST), "ERROR: AST_OpCast is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Param | struct AST_Param | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		  _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			char 	  _PAD_PROPERTIES_2_[ sizeof(AST*) * 3 ]; | 			char 	  _PAD_PROPERTIES_2_[ sizeof(AST*) * 3 ]; | ||||||
| @@ -375,65 +375,66 @@ struct AST_Param | |||||||
| 	}; | 	}; | ||||||
| 	CodeParam         Last; | 	CodeParam         Last; | ||||||
| 	CodeParam         Next; | 	CodeParam         Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) ]; | ||||||
| 	s32               NumEntries; | 	s32               NumEntries; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Param) == sizeof(AST), "ERROR: AST_Param is not the same size as AST"); | static_assert( sizeof(AST_Param) == sizeof(AST), "ERROR: AST_Param is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Pragma | struct AST_Pragma | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		  _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		StringCached  Content; | 		StringCached  Content; | ||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Pragma) == sizeof(AST), "ERROR: AST_Pragma is not the same size as AST"); | static_assert( sizeof(AST_Pragma) == sizeof(AST), "ERROR: AST_Pragma is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_PreprocessCond | struct AST_PreprocessCond | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		  _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char          _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		StringCached  Content; | 		StringCached  Content; | ||||||
| 	}; | 	}; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) + sizeof(u32) ]; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_PreprocessCond) == sizeof(AST), "ERROR: AST_PreprocessCond is not the same size as AST"); | static_assert( sizeof(AST_PreprocessCond) == sizeof(AST), "ERROR: AST_PreprocessCond is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Specifiers | struct AST_Specifiers | ||||||
| { | { | ||||||
| 	SpecifierT        ArrSpecs[ AST::ArrSpecs_Cap ]; | 	SpecifierT        ArrSpecs[ AST::ArrSpecs_Cap ]; | ||||||
|  | 	CodeSpecifiers    NextSpecs; | ||||||
| 	Code              Prev; | 	Code              Prev; | ||||||
| 	Code              Next; | 	Code              Next; | ||||||
|  | 	Parser::Token*    Token; | ||||||
| 	Code              Parent; | 	Code              Parent; | ||||||
| 	StringCached      Name; | 	StringCached      Name; | ||||||
| 	CodeT             Type; | 	CodeT             Type; | ||||||
| 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) ]; | 	char 			  _PAD_UNUSED_[ sizeof(ModuleFlag) ]; | ||||||
| 	s32               NumEntries; | 	s32               NumEntries; | ||||||
| 	s32               Token; |  | ||||||
| }; | }; | ||||||
| 	static_assert( sizeof(AST_Specifiers) == sizeof(AST), "ERROR: AST_Specifier is not the same size as AST"); | 	static_assert( sizeof(AST_Specifiers) == sizeof(AST), "ERROR: AST_Specifier is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Struct | struct AST_Struct | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment    InlineCmt; | 			CodeComment    InlineCmt; | ||||||
| @@ -445,21 +446,21 @@ struct AST_Struct | |||||||
| 			char 	       _PAD_PROPERTIES_2_[ sizeof(AST*) ]; | 			char 	       _PAD_PROPERTIES_2_[ sizeof(AST*) ]; | ||||||
| 		}; | 		}; | ||||||
| 	}; | 	}; | ||||||
| 	CodeType               Last; | 	CodeType               Prev; | ||||||
| 	CodeType               Next; | 	CodeType               Next; | ||||||
|  | 	Parser::Token*         Token; | ||||||
| 	Code                   Parent; | 	Code                   Parent; | ||||||
| 	StringCached           Name; | 	StringCached           Name; | ||||||
| 	CodeT                  Type; | 	CodeT                  Type; | ||||||
| 	ModuleFlag             ModuleFlags; | 	ModuleFlag             ModuleFlags; | ||||||
| 	AccessSpec             ParentAccess; | 	AccessSpec             ParentAccess; | ||||||
| 	s32                    Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Struct) == sizeof(AST), "ERROR: AST_Struct is not the same size as AST"); | static_assert( sizeof(AST_Struct) == sizeof(AST), "ERROR: AST_Struct is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Template | struct AST_Template | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		       _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			char 	       _PAD_PROPERTIES_[ sizeof(AST*) * 4 ]; | 			char 	       _PAD_PROPERTIES_[ sizeof(AST*) * 4 ]; | ||||||
| @@ -470,19 +471,19 @@ struct AST_Template | |||||||
| 	}; | 	}; | ||||||
| 	Code                   Prev; | 	Code                   Prev; | ||||||
| 	Code                   Next; | 	Code                   Next; | ||||||
|  | 	Parser::Token*         Token; | ||||||
| 	Code                   Parent; | 	Code                   Parent; | ||||||
| 	StringCached           Name; | 	StringCached           Name; | ||||||
| 	CodeT                  Type; | 	CodeT                  Type; | ||||||
| 	ModuleFlag             ModuleFlags; | 	ModuleFlag             ModuleFlags; | ||||||
| 	char 			       _PAD_UNUSED_[ sizeof(u32) ]; | 	char 			       _PAD_UNUSED_[ sizeof(u32) ]; | ||||||
| 	s32                    Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Template) == sizeof(AST), "ERROR: AST_Template is not the same size as AST"); | static_assert( sizeof(AST_Template) == sizeof(AST), "ERROR: AST_Template is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Type | struct AST_Type | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		       _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			char           _PAD_INLINE_CMT_[ sizeof(AST*) ]; | 			char           _PAD_INLINE_CMT_[ sizeof(AST*) ]; | ||||||
| @@ -496,19 +497,19 @@ struct AST_Type | |||||||
| 	}; | 	}; | ||||||
| 	Code                   Prev; | 	Code                   Prev; | ||||||
| 	Code                   Next; | 	Code                   Next; | ||||||
|  | 	Parser::Token*         Token; | ||||||
| 	Code                   Parent; | 	Code                   Parent; | ||||||
| 	StringCached           Name; | 	StringCached           Name; | ||||||
| 	CodeT                  Type; | 	CodeT                  Type; | ||||||
| 	char 			       _PAD_UNUSED_[ sizeof(ModuleFlag) ]; | 	char 			       _PAD_UNUSED_[ sizeof(ModuleFlag) ]; | ||||||
| 	b32                    IsParamPack; | 	b32                    IsParamPack; | ||||||
| 	s32                    Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Type) == sizeof(AST), "ERROR: AST_Type is not the same size as AST"); | static_assert( sizeof(AST_Type) == sizeof(AST), "ERROR: AST_Type is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Typedef | struct AST_Typedef | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		       _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment    InlineCmt; | 			CodeComment    InlineCmt; | ||||||
| @@ -519,19 +520,19 @@ struct AST_Typedef | |||||||
| 	}; | 	}; | ||||||
| 	Code                   Prev; | 	Code                   Prev; | ||||||
| 	Code                   Next; | 	Code                   Next; | ||||||
|  | 	Parser::Token*         Token; | ||||||
| 	Code                   Parent; | 	Code                   Parent; | ||||||
| 	StringCached           Name; | 	StringCached           Name; | ||||||
| 	CodeT                  Type; | 	CodeT                  Type; | ||||||
| 	ModuleFlag             ModuleFlags; | 	ModuleFlag             ModuleFlags; | ||||||
| 	b32                    IsFunction; | 	b32                    IsFunction; | ||||||
| 	s32                    Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Typedef) == sizeof(AST), "ERROR: AST_Typedef is not the same size as AST"); | static_assert( sizeof(AST_Typedef) == sizeof(AST), "ERROR: AST_Typedef is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Union | struct AST_Union | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		       _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			char           _PAD_INLINE_CMT_[ sizeof(AST*) ]; | 			char           _PAD_INLINE_CMT_[ sizeof(AST*) ]; | ||||||
| @@ -543,19 +544,19 @@ struct AST_Union | |||||||
| 	}; | 	}; | ||||||
| 	Code                   Prev; | 	Code                   Prev; | ||||||
| 	Code                   Next; | 	Code                   Next; | ||||||
|  | 	Parser::Token*         Token; | ||||||
| 	Code                   Parent; | 	Code                   Parent; | ||||||
| 	StringCached           Name; | 	StringCached           Name; | ||||||
| 	CodeT                  Type; | 	CodeT                  Type; | ||||||
| 	ModuleFlag             ModuleFlags; | 	ModuleFlag             ModuleFlags; | ||||||
| 	char 			       _PAD_UNUSED_[ sizeof(u32) ]; | 	char 			       _PAD_UNUSED_[ sizeof(u32) ]; | ||||||
| 	s32                    Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Union) == sizeof(AST), "ERROR: AST_Union is not the same size as AST"); | static_assert( sizeof(AST_Union) == sizeof(AST), "ERROR: AST_Union is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Using | struct AST_Using | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char 		        _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char                _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment     InlineCmt; | 			CodeComment     InlineCmt; | ||||||
| @@ -567,19 +568,19 @@ struct AST_Using | |||||||
| 	}; | 	}; | ||||||
| 	Code                    Prev; | 	Code                    Prev; | ||||||
| 	Code                    Next; | 	Code                    Next; | ||||||
|  | 	Parser::Token*          Token; | ||||||
| 	Code                    Parent; | 	Code                    Parent; | ||||||
| 	StringCached            Name; | 	StringCached            Name; | ||||||
| 	CodeT                   Type; | 	CodeT                   Type; | ||||||
| 	ModuleFlag              ModuleFlags; | 	ModuleFlag              ModuleFlags; | ||||||
| 	char 			        _PAD_UNUSED_[ sizeof(u32) ]; | 	char 			        _PAD_UNUSED_[ sizeof(u32) ]; | ||||||
| 	s32                     Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Using) == sizeof(AST), "ERROR: AST_Using is not the same size as AST"); | static_assert( sizeof(AST_Using) == sizeof(AST), "ERROR: AST_Using is not the same size as AST"); | ||||||
|  |  | ||||||
| struct AST_Var | struct AST_Var | ||||||
| { | { | ||||||
| 	union { | 	union { | ||||||
| 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap ]; | 		char               _PAD_[ sizeof(SpecifierT) * AST::ArrSpecs_Cap + sizeof(AST*) ]; | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			CodeComment    InlineCmt; | 			CodeComment    InlineCmt; | ||||||
| @@ -593,12 +594,12 @@ struct AST_Var | |||||||
| 	}; | 	}; | ||||||
| 	Code                   Prev; | 	Code                   Prev; | ||||||
| 	Code                   Next; | 	Code                   Next; | ||||||
|  | 	Parser::Token*         Token; | ||||||
| 	Code                   Parent; | 	Code                   Parent; | ||||||
| 	StringCached           Name; | 	StringCached           Name; | ||||||
| 	CodeT                  Type; | 	CodeT                  Type; | ||||||
| 	ModuleFlag             ModuleFlags; | 	ModuleFlag             ModuleFlags; | ||||||
| 	char 			       _PAD_UNUSED_[ sizeof(u32) ]; | 	char 			       _PAD_UNUSED_[ sizeof(u32) ]; | ||||||
| 	s32                    Token; |  | ||||||
| }; | }; | ||||||
| static_assert( sizeof(AST_Var) == sizeof(AST), "ERROR: AST_Var is not the same size as AST"); | static_assert( sizeof(AST_Var) == sizeof(AST), "ERROR: AST_Var is not the same size as AST"); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| #ifdef GEN_INTELLISENSE_DIRECTIVES | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
| #pragma once | #pragma once | ||||||
|  | #include "components/types.hpp" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| #ifdef GEN_INTELLISENSE_DIRECTIVES | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
| #pragma once | #pragma once | ||||||
|  | #include "components/types.hpp" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| #ifdef GEN_INTELLISENSE_DIRECTIVES | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
| #pragma once | #pragma once | ||||||
|  | #include "components/types.hpp" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| #ifdef GEN_INTELLISENSE_DIRECTIVES | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
| #pragma once | #pragma once | ||||||
|  | #include "components/types.hpp" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | ||||||
|   | |||||||
| @@ -1,6 +1,9 @@ | |||||||
| // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  | #include "components/types.hpp" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp) | ||||||
|  |  | ||||||
| namespace Parser | namespace Parser | ||||||
| { | { | ||||||
|   | |||||||
| @@ -86,6 +86,7 @@ extern CodeSpecifiers spec_internal_linkage; | |||||||
| extern CodeSpecifiers spec_local_persist; | extern CodeSpecifiers spec_local_persist; | ||||||
| extern CodeSpecifiers spec_mutable; | extern CodeSpecifiers spec_mutable; | ||||||
| extern CodeSpecifiers spec_neverinline; | extern CodeSpecifiers spec_neverinline; | ||||||
|  | extern CodeSpecifiers spec_noexcept; | ||||||
| extern CodeSpecifiers spec_override; | extern CodeSpecifiers spec_override; | ||||||
| extern CodeSpecifiers spec_ptr; | extern CodeSpecifiers spec_ptr; | ||||||
| extern CodeSpecifiers spec_pure; | extern CodeSpecifiers spec_pure; | ||||||
|   | |||||||
| @@ -175,21 +175,21 @@ void define_constants() | |||||||
| #endif | #endif | ||||||
| #	undef def_constant_code_type | #	undef def_constant_code_type | ||||||
|  |  | ||||||
| #	pragma push_macro( "forceinline" ) |  | ||||||
| #	pragma push_macro( "global" ) |  | ||||||
| #	pragma push_macro( "internal" ) |  | ||||||
| #	pragma push_macro( "local_persist" ) |  | ||||||
| #	pragma push_macro( "neverinline" ) |  | ||||||
| #	undef forceinline |  | ||||||
| #	undef global |  | ||||||
| #	undef internal |  | ||||||
| #	undef local_persist |  | ||||||
| #	undef neverinline |  | ||||||
|  |  | ||||||
| #	define def_constant_spec( Type_, ... )                                  \ | #	define def_constant_spec( Type_, ... )                                  \ | ||||||
| 		spec_##Type_ = def_specifiers( num_args(__VA_ARGS__), __VA_ARGS__); \ | 		spec_##Type_ = def_specifiers( num_args(__VA_ARGS__), __VA_ARGS__); \ | ||||||
| 		spec_##Type_.set_global(); | 		spec_##Type_.set_global(); | ||||||
|  |  | ||||||
|  | #	pragma push_macro("forceinline") | ||||||
|  | #	pragma push_macro("global") | ||||||
|  | #	pragma push_macro("internal") | ||||||
|  | #	pragma push_macro("local_persist") | ||||||
|  | #	pragma push_macro("neverinline") | ||||||
|  | #	undef forceinline | ||||||
|  | #	undef global | ||||||
|  | #	undef internal | ||||||
|  | #	undef local_persist | ||||||
|  | #	undef neverinline | ||||||
| 	def_constant_spec( const,            ESpecifier::Const ); | 	def_constant_spec( const,            ESpecifier::Const ); | ||||||
| 	def_constant_spec( consteval,        ESpecifier::Consteval ); | 	def_constant_spec( consteval,        ESpecifier::Consteval ); | ||||||
| 	def_constant_spec( constexpr,        ESpecifier::Constexpr ); | 	def_constant_spec( constexpr,        ESpecifier::Constexpr ); | ||||||
| @@ -203,6 +203,7 @@ void define_constants() | |||||||
| 	def_constant_spec( local_persist,    ESpecifier::Local_Persist ); | 	def_constant_spec( local_persist,    ESpecifier::Local_Persist ); | ||||||
| 	def_constant_spec( mutable,          ESpecifier::Mutable ); | 	def_constant_spec( mutable,          ESpecifier::Mutable ); | ||||||
| 	def_constant_spec( neverinline,      ESpecifier::NeverInline ); | 	def_constant_spec( neverinline,      ESpecifier::NeverInline ); | ||||||
|  | 	def_constant_spec( noexcept,         ESpecifier::NoExceptions ); | ||||||
| 	def_constant_spec( override,         ESpecifier::Override ); | 	def_constant_spec( override,         ESpecifier::Override ); | ||||||
| 	def_constant_spec( ptr,              ESpecifier::Ptr ); | 	def_constant_spec( ptr,              ESpecifier::Ptr ); | ||||||
| 	def_constant_spec( pure,             ESpecifier::Pure ) | 	def_constant_spec( pure,             ESpecifier::Pure ) | ||||||
| @@ -217,11 +218,11 @@ void define_constants() | |||||||
| 	spec_local_persist = def_specifiers( 1, ESpecifier::Local_Persist ); | 	spec_local_persist = def_specifiers( 1, ESpecifier::Local_Persist ); | ||||||
| 	spec_local_persist.set_global(); | 	spec_local_persist.set_global(); | ||||||
|  |  | ||||||
| #	pragma pop_macro( "forceinline" ) | #	pragma pop_macro("forceinline") | ||||||
| #	pragma pop_macro( "global" ) | #	pragma pop_macro("global") | ||||||
| #	pragma pop_macro( "internal" ) | #	pragma pop_macro("internal") | ||||||
| #	pragma pop_macro( "local_persist" ) | #	pragma pop_macro("local_persist") | ||||||
| #	pragma pop_macro( "neverinline" ) | #	pragma pop_macro("neverinline") | ||||||
|  |  | ||||||
| #	undef def_constant_spec | #	undef def_constant_spec | ||||||
| } | } | ||||||
| @@ -418,15 +419,15 @@ Code make_code() | |||||||
| 	// mem_set( result.ast, 0, sizeof(AST) ); | 	// mem_set( result.ast, 0, sizeof(AST) ); | ||||||
| 	result->Type = ECode::Invalid; | 	result->Type = ECode::Invalid; | ||||||
|  |  | ||||||
| 	result->Content         = { nullptr }; | 	result->Content     = { nullptr }; | ||||||
| 	result->Prev            = { nullptr }; | 	result->Prev        = { nullptr }; | ||||||
| 	result->Next			= { nullptr }; | 	result->Next        = { nullptr }; | ||||||
| 	result->Parent          = { nullptr }; | 	result->Token		= nullptr; | ||||||
| 	result->Name            = { nullptr }; | 	result->Parent      = { nullptr }; | ||||||
| 	result->Type            = ECode::Invalid; | 	result->Name        = { nullptr }; | ||||||
| 	result->ModuleFlags     = ModuleFlag::Invalid; | 	result->Type        = ECode::Invalid; | ||||||
| 	result->NumEntries      = 0; | 	result->ModuleFlags = ModuleFlag::Invalid; | ||||||
| 	result->Token		    = -1; | 	result->NumEntries  = 0; | ||||||
|  |  | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,6 +6,18 @@ | |||||||
|  |  | ||||||
| namespace Parser | namespace Parser | ||||||
| { | { | ||||||
|  | 	enum TokFlags : u32 | ||||||
|  | 	{ | ||||||
|  | 		TF_Operator		   = bit(0), | ||||||
|  | 		TF_Assign          = bit(0), | ||||||
|  | 		TF_Preprocess      = bit(1), | ||||||
|  | 		TF_Comment         = bit(2), | ||||||
|  | 		TF_Attribute       = bit(3), | ||||||
|  | 		TF_AccessSpecifier = bit(4), | ||||||
|  | 		TF_Specifier 	   = bit(5), | ||||||
|  | 		TF_EndDefinition   = bit(6), // Either ; or } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 	struct Token | 	struct Token | ||||||
| 	{ | 	{ | ||||||
| 		char const* Text; | 		char const* Text; | ||||||
| @@ -251,11 +263,6 @@ namespace Parser | |||||||
| 		return true; | 		return true; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	enum TokFlags : u32 |  | ||||||
| 	{ |  | ||||||
| 		IsAssign = bit(0), |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	global Array<Token> Tokens; | 	global Array<Token> Tokens; | ||||||
|  |  | ||||||
| 	neverinline | 	neverinline | ||||||
| @@ -502,6 +509,8 @@ namespace Parser | |||||||
| 							); | 							); | ||||||
| 							return { { nullptr }, 0 }; | 							return { { nullptr }, 0 }; | ||||||
| 						} | 						} | ||||||
|  | 						move_forward(); | ||||||
|  | 						content.Length++; | ||||||
|  |  | ||||||
| 						while ( left && current != '"' && current != '>' ) | 						while ( left && current != '"' && current != '>' ) | ||||||
| 						{ | 						{ | ||||||
| @@ -766,6 +775,18 @@ namespace Parser | |||||||
|  |  | ||||||
| 					if (left) | 					if (left) | ||||||
| 						move_forward(); | 						move_forward(); | ||||||
|  |  | ||||||
|  | 					if ( current == '=' ) | ||||||
|  | 					{ | ||||||
|  | 						token.Length++; | ||||||
|  | 						token.IsAssign = true; | ||||||
|  | 						// token.Flags |= TokFlags::Assignment; | ||||||
|  | 						// token.Type = TokType::Assign_Multiply; | ||||||
|  |  | ||||||
|  | 						if ( left ) | ||||||
|  | 							move_forward(); | ||||||
|  | 					} | ||||||
|  |  | ||||||
| 					goto FoundToken; | 					goto FoundToken; | ||||||
| 				} | 				} | ||||||
| 				case ';': | 				case ';': | ||||||
| @@ -964,7 +985,14 @@ namespace Parser | |||||||
|  |  | ||||||
| 					if ( left ) | 					if ( left ) | ||||||
| 					{ | 					{ | ||||||
| 						if ( current == '/' ) | 						if ( current == '=' ) | ||||||
|  | 						{ | ||||||
|  | 							// token.Type = TokeType::Assign_Divide; | ||||||
|  | 							move_forward(); | ||||||
|  | 							token.Length++; | ||||||
|  | 							token.IsAssign = true; | ||||||
|  | 						} | ||||||
|  | 						else if ( current == '/' ) | ||||||
| 						{ | 						{ | ||||||
| 							token.Type = TokType::Comment; | 							token.Type = TokType::Comment; | ||||||
| 							token.Length = 2; | 							token.Length = 2; | ||||||
| @@ -1638,6 +1666,7 @@ CodeAttributes parse_attributes() | |||||||
| 	{ | 	{ | ||||||
| 		eat( TokType::Attribute_Open); | 		eat( TokType::Attribute_Open); | ||||||
|  |  | ||||||
|  | 		start = currtok; | ||||||
| 		while ( left && currtok.Type != TokType::Attribute_Close ) | 		while ( left && currtok.Type != TokType::Attribute_Close ) | ||||||
| 		{ | 		{ | ||||||
| 			eat( currtok.Type ); | 			eat( currtok.Type ); | ||||||
| @@ -1653,6 +1682,7 @@ CodeAttributes parse_attributes() | |||||||
| 		eat(TokType::Capture_Start); | 		eat(TokType::Capture_Start); | ||||||
| 		eat(TokType::Capture_Start); | 		eat(TokType::Capture_Start); | ||||||
|  |  | ||||||
|  | 		start = currtok; | ||||||
| 		while ( left && currtok.Type != TokType::Capture_End ) | 		while ( left && currtok.Type != TokType::Capture_End ) | ||||||
| 		{ | 		{ | ||||||
| 			eat(currtok.Type); | 			eat(currtok.Type); | ||||||
| @@ -1669,6 +1699,7 @@ CodeAttributes parse_attributes() | |||||||
| 		eat( TokType::Decl_MSVC_Attribute ); | 		eat( TokType::Decl_MSVC_Attribute ); | ||||||
| 		eat( TokType::Capture_Start); | 		eat( TokType::Capture_Start); | ||||||
|  |  | ||||||
|  | 		start = currtok; | ||||||
| 		while ( left && currtok.Type != TokType::Capture_End ) | 		while ( left && currtok.Type != TokType::Capture_End ) | ||||||
| 		{ | 		{ | ||||||
| 			eat(currtok.Type); | 			eat(currtok.Type); | ||||||
| @@ -1697,6 +1728,7 @@ CodeAttributes parse_attributes() | |||||||
| 		result->Type    = ECode::PlatformAttributes; | 		result->Type    = ECode::PlatformAttributes; | ||||||
| 		result->Name    = get_cached_string( name_stripped ); | 		result->Name    = get_cached_string( name_stripped ); | ||||||
| 		result->Content = result->Name; | 		result->Content = result->Name; | ||||||
|  | 		// result->Token   =  | ||||||
|  |  | ||||||
| 		return (CodeAttributes) result; | 		return (CodeAttributes) result; | ||||||
| 	} | 	} | ||||||
| @@ -1717,6 +1749,7 @@ CodeComment parse_comment() | |||||||
| 	result->Type    = ECode::Comment; | 	result->Type    = ECode::Comment; | ||||||
| 	result->Content = get_cached_string( currtok_noskip ); | 	result->Content = get_cached_string( currtok_noskip ); | ||||||
| 	result->Name    = result->Content; | 	result->Name    = result->Content; | ||||||
|  | 	// result->Token   = currtok_noskip; | ||||||
| 	eat( TokType::Comment ); | 	eat( TokType::Comment ); | ||||||
|  |  | ||||||
| 	Context.pop(); | 	Context.pop(); | ||||||
| @@ -2284,6 +2317,7 @@ CodeFn parse_function_after_name( | |||||||
|  |  | ||||||
| 	CodeParam params = parse_params(); | 	CodeParam params = parse_params(); | ||||||
|  |  | ||||||
|  | 	// These have to be kept separate from the return type's specifiers. | ||||||
| 	while ( left && currtok.is_specifier() ) | 	while ( left && currtok.is_specifier() ) | ||||||
| 	{ | 	{ | ||||||
| 		if ( specifiers.ast == nullptr ) | 		if ( specifiers.ast == nullptr ) | ||||||
| @@ -2805,7 +2839,7 @@ CodeOperator parse_operator_after_ret_type( | |||||||
| 			if ( currtok.Text[1] == '=' ) | 			if ( currtok.Text[1] == '=' ) | ||||||
| 				op = Assign_Add; | 				op = Assign_Add; | ||||||
|  |  | ||||||
| 			if ( currtok.Text[1] == '+' ) | 			else if ( currtok.Text[1] == '+' ) | ||||||
| 				op = Increment; | 				op = Increment; | ||||||
|  |  | ||||||
| 			else | 			else | ||||||
| @@ -2825,7 +2859,7 @@ CodeOperator parse_operator_after_ret_type( | |||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if ( currtok.Text[1] == '=' ) | 			else if ( currtok.Text[1] == '=' ) | ||||||
| 				op = Assign_Subtract; | 				op = Assign_Subtract; | ||||||
|  |  | ||||||
| 			else | 			else | ||||||
| @@ -3181,6 +3215,12 @@ CodeParam parse_params( bool use_template_capture ) | |||||||
| 		Context.pop(); | 		Context.pop(); | ||||||
| 		return { nullptr }; | 		return { nullptr }; | ||||||
| 	} | 	} | ||||||
|  | 	else if ( check ( TokType::Operator ) && currtok.Text[0] == '>' ) | ||||||
|  | 	{ | ||||||
|  | 		eat( TokType::Operator ); | ||||||
|  | 		Context.pop(); | ||||||
|  | 		return { nullptr }; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	CodeType type  = { nullptr }; | 	CodeType type  = { nullptr }; | ||||||
| 	Code     value = { nullptr }; | 	Code     value = { nullptr }; | ||||||
| @@ -3909,7 +3949,7 @@ CodeEnum parse_enum( bool inplace_def ) | |||||||
|  |  | ||||||
| 		while ( left && currtok_noskip.Type != TokType::BraceCurly_Close ) | 		while ( left && currtok_noskip.Type != TokType::BraceCurly_Close ) | ||||||
| 		{ | 		{ | ||||||
| 			if ( currtok.Type == TokType::Preprocess_Hash ) | 			if ( currtok_noskip.Type == TokType::Preprocess_Hash ) | ||||||
| 				eat( TokType::Preprocess_Hash ); | 				eat( TokType::Preprocess_Hash ); | ||||||
|  |  | ||||||
| 			switch ( currtok_noskip.Type ) | 			switch ( currtok_noskip.Type ) | ||||||
| @@ -4772,7 +4812,7 @@ CodeType parse_type( bool* typedef_is_function ) | |||||||
| #if 0 | #if 0 | ||||||
| 	else if ( currtok.Type == TokType::DeclType ) | 	else if ( currtok.Type == TokType::DeclType ) | ||||||
| 	{ | 	{ | ||||||
| 		// Will have a capture and its own parsing rules, were going to just shove everything in a string. | 		// Will have a capture and its own parsing rules, were going to just shove everything in a string (for now). | ||||||
| 		name = currtok; | 		name = currtok; | ||||||
| 		eat( TokType::DeclType ); | 		eat( TokType::DeclType ); | ||||||
|  |  | ||||||
| @@ -5050,8 +5090,9 @@ CodeType parse_type( bool* typedef_is_function ) | |||||||
| 	using namespace ECode; | 	using namespace ECode; | ||||||
|  |  | ||||||
| 	CodeType | 	CodeType | ||||||
| 	result       = (CodeType) make_code(); | 	result        = (CodeType) make_code(); | ||||||
| 	result->Type = Typename; | 	result->Type  = Typename; | ||||||
|  | 	// result->Token = Context.Scope->Start; | ||||||
|  |  | ||||||
| 	// Need to wait until were using the new parsing method to do this. | 	// Need to wait until were using the new parsing method to do this. | ||||||
| 	String name_stripped = strip_formatting( name, strip_formatting_dont_preserve_newlines ); | 	String name_stripped = strip_formatting( name, strip_formatting_dont_preserve_newlines ); | ||||||
| @@ -5606,7 +5647,7 @@ CodeVar parse_variable() | |||||||
|  |  | ||||||
| 		// Ignore const specifiers, they're handled by the type | 		// Ignore const specifiers, they're handled by the type | ||||||
| 		if ( spec == ESpecifier::Const ) | 		if ( spec == ESpecifier::Const ) | ||||||
| 			continue; | 			break; | ||||||
|  |  | ||||||
| 		specs_found[NumSpecifiers] = spec; | 		specs_found[NumSpecifiers] = spec; | ||||||
| 		NumSpecifiers++; | 		NumSpecifiers++; | ||||||
|   | |||||||
| @@ -35,17 +35,17 @@ OpValidateResult operator__validate( OperatorT op, CodeParam params_code, CodeTy | |||||||
| 		return OpValidateResult::Fail;                                                                    \ | 		return OpValidateResult::Fail;                                                                    \ | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #	define check_param_eq_ret()                                                                    \ | #	define check_param_eq_ret()                                                                     \ | ||||||
| 	if ( ! is_member_symbol && params_code->ValueType != ret_type )                                \ | 	if ( ! is_member_symbol && ! params_code->ValueType.is_equal( ret_type) )                       \ | ||||||
| 	{                                                                                              \ | 	{                                                                                               \ | ||||||
| 		log_failure("gen_def_operator: operator%s requires first parameter to equal return type\n" \ | 		log_failure("gen::def_operator: operator%s requires first parameter to equal return type\n" \ | ||||||
| 			"param types: %s\n"                                                                    \ | 			"param types: %s\n"                                                                     \ | ||||||
| 			"return type: %s",                                                                     \ | 			"return type: %s",                                                                      \ | ||||||
| 			to_str(op),                                                                            \ | 			to_str(op).Ptr,                                                                         \ | ||||||
| 			params_code.debug_str(),                                                               \ | 			params_code.debug_str(),                                                                \ | ||||||
| 			ret_type.debug_str()                                                                   \ | 			ret_type.debug_str()                                                                    \ | ||||||
| 		);                                                                                         \ | 		);                                                                                          \ | ||||||
| 		return OpValidateResult::Fail;                                                             \ | 		return OpValidateResult::Fail;                                                              \ | ||||||
| 	} | 	} | ||||||
| #pragma endregion Helper Macros | #pragma endregion Helper Macros | ||||||
|  |  | ||||||
| @@ -861,8 +861,8 @@ CodeInclude def_include( StrC path, bool foreign ) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	StrC content = foreign ? | 	StrC content = foreign ? | ||||||
| 			to_str( str_fmt_buf( "<%.*s>\n", path.Len, path.Ptr )) | 			to_str( str_fmt_buf( "<%.*s>", path.Len, path.Ptr )) | ||||||
| 		:	to_str( str_fmt_buf( "\"%.*s\"\n", path.Len, path.Ptr )); | 		:	to_str( str_fmt_buf( "\"%.*s\"", path.Len, path.Ptr )); | ||||||
|  |  | ||||||
| 	Code | 	Code | ||||||
| 	result          = make_code(); | 	result          = make_code(); | ||||||
| @@ -947,6 +947,7 @@ CodeOperator def_operator( OperatorT op, StrC nspace | |||||||
| 	result              = (CodeOperator) make_code(); | 	result              = (CodeOperator) make_code(); | ||||||
| 	result->Name        = get_cached_string( { str_len(name), name } ); | 	result->Name        = get_cached_string( { str_len(name), name } ); | ||||||
| 	result->ModuleFlags = mflags; | 	result->ModuleFlags = mflags; | ||||||
|  | 	result->Op          = op; | ||||||
|  |  | ||||||
| 	if ( body ) | 	if ( body ) | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
| @@ -58,6 +58,7 @@ global CodeSpecifiers spec_inline; | |||||||
| global CodeSpecifiers spec_internal_linkage; | global CodeSpecifiers spec_internal_linkage; | ||||||
| global CodeSpecifiers spec_local_persist; | global CodeSpecifiers spec_local_persist; | ||||||
| global CodeSpecifiers spec_mutable; | global CodeSpecifiers spec_mutable; | ||||||
|  | global CodeSpecifiers spec_noexcept; | ||||||
| global CodeSpecifiers spec_neverinline; | global CodeSpecifiers spec_neverinline; | ||||||
| global CodeSpecifiers spec_override; | global CodeSpecifiers spec_override; | ||||||
| global CodeSpecifiers spec_ptr; | global CodeSpecifiers spec_ptr; | ||||||
|   | |||||||
| @@ -41,6 +41,15 @@ char const* to_str( AccessSpec type ) | |||||||
| 	return lookup[ (u32)type ]; | 	return lookup[ (u32)type ]; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | enum CodeFlag : u32 | ||||||
|  | { | ||||||
|  | 	FunctionType  = bit(0), | ||||||
|  | 	ParamPack     = bit(1), | ||||||
|  | 	Module_Export = bit(2), | ||||||
|  | 	Module_Import = bit(3), | ||||||
|  | }; | ||||||
|  |  | ||||||
| // Used to indicate if enum definitoin is an enum class or regular enum. | // Used to indicate if enum definitoin is an enum class or regular enum. | ||||||
| enum class EnumT : u8 | enum class EnumT : u8 | ||||||
| { | { | ||||||
| @@ -56,12 +65,26 @@ enum class ModuleFlag : u32 | |||||||
| 	None    = 0, | 	None    = 0, | ||||||
| 	Export  = bit(0), | 	Export  = bit(0), | ||||||
| 	Import  = bit(1), | 	Import  = bit(1), | ||||||
| 	// Private = bit(2), |  | ||||||
|  |  | ||||||
| 	Num_ModuleFlags, | 	Num_ModuleFlags, | ||||||
| 	Invalid, | 	Invalid, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | StrC to_str( ModuleFlag flag ) | ||||||
|  | { | ||||||
|  | 	local_persist | ||||||
|  | 	StrC lookup[ (u32)ModuleFlag::Num_ModuleFlags ] = { | ||||||
|  | 		{ sizeof("__none__"), "__none__" }, | ||||||
|  | 		{ sizeof("export"), "export" }, | ||||||
|  | 		{ sizeof("import"), "import" }, | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	if ( flag > ModuleFlag::Import ) | ||||||
|  | 		return { sizeof("invalid"), "invalid" }; | ||||||
|  |  | ||||||
|  | 	return lookup[ (u32)flag ]; | ||||||
|  | } | ||||||
|  |  | ||||||
| ModuleFlag operator|( ModuleFlag A, ModuleFlag B) | ModuleFlag operator|( ModuleFlag A, ModuleFlag B) | ||||||
| { | { | ||||||
| 	return (ModuleFlag)( (u32)A | (u32)B ); | 	return (ModuleFlag)( (u32)A | (u32)B ); | ||||||
|   | |||||||
| @@ -1,5 +1,8 @@ | |||||||
| #ifdef GEN_INTELLISENSE_DIRECTIVES | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
| #	pragma once | #	pragma once | ||||||
|  | #	include "debug.hpp" | ||||||
|  | #	include "basic_types.hpp" | ||||||
|  | #   include "src_start.cpp" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #pragma region Debug | #pragma region Debug | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| #ifdef GEN_INTELLISENSE_DIRECTIVESj | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
| #	pragma once | #	pragma once | ||||||
| #	include "basic_types.hpp" | #	include "basic_types.hpp" | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| #ifdef GEN_INTELLISENSE_DIRECTIVES | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
| #	pragma once | #	pragma once | ||||||
|  | #	include "filesystem.hpp" | ||||||
|  | #	include "strings.hpp" | ||||||
| #	include "string_ops.cpp" | #	include "string_ops.cpp" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,7 @@ | |||||||
|  | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
|  | #	include "header_start.hpp" | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #pragma region Macros and Includes | #pragma region Macros and Includes | ||||||
|  |  | ||||||
| #	include <stdio.h> | #	include <stdio.h> | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| #ifdef GEN_INTELLISENSE_DIRECTIVES | #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||||
| #	pragma once | #	pragma once | ||||||
|  | #	include "string_ops.hpp" | ||||||
| #	include "debug.cpp" | #	include "debug.cpp" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ CodeBody gen_ecode( char const* path ) | |||||||
|  |  | ||||||
| 	CodeEnum enum_code = parse_enum(gen::token_fmt_impl((3 + 1) / 2, "entries", (StrC)enum_entries, "enum Type : u32 { <entries> NumTypes };")); | 	CodeEnum enum_code = parse_enum(gen::token_fmt_impl((3 + 1) / 2, "entries", (StrC)enum_entries, "enum Type : u32 { <entries> NumTypes };")); | ||||||
|  |  | ||||||
| #pragma push_macro( "local_persist" ) | #pragma push_macro("local_persist") | ||||||
| #undef local_persist | #undef local_persist | ||||||
| 	CodeFn to_str = parse_function( token_fmt( "entries", (StrC)to_str_entries, stringize( | 	CodeFn to_str = parse_function( token_fmt( "entries", (StrC)to_str_entries, stringize( | ||||||
| 		StrC to_str( Type type ) | 		StrC to_str( Type type ) | ||||||
| @@ -45,7 +45,7 @@ CodeBody gen_ecode( char const* path ) | |||||||
| 			return lookup[ type ]; | 			return lookup[ type ]; | ||||||
| 		} | 		} | ||||||
| 	))); | 	))); | ||||||
| #pragma pop_macro( "local_persist" ) | #pragma pop_macro("local_persist") | ||||||
|  |  | ||||||
| 	CodeNS    nspace = def_namespace( name(ECode), def_namespace_body( args( enum_code, to_str ) ) ); | 	CodeNS    nspace = def_namespace( name(ECode), def_namespace_body( args( enum_code, to_str ) ) ); | ||||||
| 	CodeUsing code_t = def_using( name(CodeT), def_type( name(ECode::Type) ) ); | 	CodeUsing code_t = def_using( name(CodeT), def_type( name(ECode::Type) ) ); | ||||||
| @@ -86,7 +86,7 @@ CodeBody gen_eoperator( char const* path ) | |||||||
| 		}; | 		}; | ||||||
| 	))); | 	))); | ||||||
|  |  | ||||||
| #pragma push_macro( "local_persist" ) | #pragma push_macro("local_persist") | ||||||
| #undef local_persist | #undef local_persist | ||||||
| 	CodeFn to_str = parse_function(token_fmt("entries", (StrC)to_str_entries, stringize( | 	CodeFn to_str = parse_function(token_fmt("entries", (StrC)to_str_entries, stringize( | ||||||
| 		StrC to_str( Type op ) | 		StrC to_str( Type op ) | ||||||
| @@ -99,7 +99,7 @@ CodeBody gen_eoperator( char const* path ) | |||||||
| 			return lookup[ op ]; | 			return lookup[ op ]; | ||||||
| 		} | 		} | ||||||
| 	))); | 	))); | ||||||
| #pragma pop_macro( "local_persist" ) | #pragma pop_macro("local_persist") | ||||||
|  |  | ||||||
| 	CodeNS nspace = def_namespace( name(EOperator), def_namespace_body( args( enum_code, to_str ) ) ); | 	CodeNS nspace = def_namespace( name(EOperator), def_namespace_body( args( enum_code, to_str ) ) ); | ||||||
|  |  | ||||||
| @@ -148,11 +148,11 @@ CodeBody gen_especifier( char const* path ) | |||||||
| 		} | 		} | ||||||
| 	))); | 	))); | ||||||
|  |  | ||||||
| #pragma push_macro( "local_persist" ) | #pragma push_macro("local_persist") | ||||||
| #pragma push_macro( "do_once_start" ) | #pragma push_macro("do_once_start") | ||||||
| #pragma push_macro( "do_once_end" ) | #pragma push_macro("do_once_end") | ||||||
| #pragma push_macro( "forceinline" ) | #pragma push_macro("forceinline") | ||||||
| #pragma push_macro( "neverinline" ) | #pragma push_macro("neverinline") | ||||||
| #undef local_persist | #undef local_persist | ||||||
| #undef do_once_start | #undef do_once_start | ||||||
| #undef do_once_end | #undef do_once_end | ||||||
| @@ -197,11 +197,11 @@ CodeBody gen_especifier( char const* path ) | |||||||
| 			return Invalid; | 			return Invalid; | ||||||
| 		} | 		} | ||||||
| 	))); | 	))); | ||||||
| #pragma pop_macro( "local_persist" ) | #pragma pop_macro("local_persist") | ||||||
| #pragma pop_macro( "do_once_start" ) | #pragma pop_macro("do_once_start") | ||||||
| #pragma pop_macro( "do_once_end" ) | #pragma pop_macro("do_once_end") | ||||||
| #pragma pop_macro( "forceinline" ) | #pragma pop_macro("forceinline") | ||||||
| #pragma pop_macro( "neverinline" ) | #pragma pop_macro("neverinline") | ||||||
|  |  | ||||||
| 	CodeNS nspace = def_namespace( name(ESpecifier), def_namespace_body( args( enum_code, is_trailing, to_str, to_type ) ) ); | 	CodeNS nspace = def_namespace( name(ESpecifier), def_namespace_body( args( enum_code, is_trailing, to_str, to_type ) ) ); | ||||||
|  |  | ||||||
| @@ -260,10 +260,10 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path ) | |||||||
| 			attribute_define_entries.append( "\n"); | 			attribute_define_entries.append( "\n"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #pragma push_macro( "GEN_DEFINE_ATTRIBUTE_TOKENS" ) | #pragma push_macro("GEN_DEFINE_ATTRIBUTE_TOKENS") | ||||||
| #undef GEN_DEFINE_ATTRIBUTE_TOKENS | #undef GEN_DEFINE_ATTRIBUTE_TOKENS | ||||||
| 	CodeDefine attribute_entires_def = def_define( name(GEN_DEFINE_ATTRIBUTE_TOKENS), attribute_define_entries  ); | 	CodeDefine attribute_entires_def = def_define( name(GEN_DEFINE_ATTRIBUTE_TOKENS), attribute_define_entries  ); | ||||||
| #pragma pop_macro( "GEN_DEFINE_ATTRIBUTE_TOKENS" ) | #pragma pop_macro("GEN_DEFINE_ATTRIBUTE_TOKENS") | ||||||
|  |  | ||||||
| 	CodeEnum enum_code = parse_enum(token_fmt("entries", (StrC)enum_entries, "attribute_toks", (StrC)attribute_entries, stringize( | 	CodeEnum enum_code = parse_enum(token_fmt("entries", (StrC)enum_entries, "attribute_toks", (StrC)attribute_entries, stringize( | ||||||
| 		enum Type : u32 | 		enum Type : u32 | ||||||
| @@ -274,9 +274,9 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path ) | |||||||
| 		}; | 		}; | ||||||
| 	))); | 	))); | ||||||
|  |  | ||||||
| #pragma push_macro( "local_persist" ) | #pragma push_macro("local_persist") | ||||||
| #pragma push_macro( "do_once_start" ) | #pragma push_macro("do_once_start") | ||||||
| #pragma push_macro( "do_once_end" ) | #pragma push_macro("do_once_end") | ||||||
| #undef local_persist | #undef local_persist | ||||||
| #undef do_once_start | #undef do_once_start | ||||||
| #undef do_once_end | #undef do_once_end | ||||||
| @@ -320,9 +320,9 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path ) | |||||||
| 			return Invalid; | 			return Invalid; | ||||||
| 		} | 		} | ||||||
| 	))); | 	))); | ||||||
| #pragma pop_macro( "local_persist" ) | #pragma pop_macro("local_persist") | ||||||
| #pragma pop_macro( "do_once_start" ) | #pragma pop_macro("do_once_start") | ||||||
| #pragma pop_macro( "do_once_end" ) | #pragma pop_macro("do_once_end") | ||||||
|  |  | ||||||
| 	CodeNS    nspace     = def_namespace( name(ETokType), def_namespace_body( args( attribute_entires_def, enum_code, to_str, to_type ) ) ); | 	CodeNS    nspace     = def_namespace( name(ETokType), def_namespace_body( args( attribute_entires_def, enum_code, to_str, to_type ) ) ); | ||||||
| 	CodeUsing td_toktype = def_using( name(TokType), def_type( name(ETokType::Type) ) ); | 	CodeUsing td_toktype = def_using( name(TokType), def_type( name(ETokType::Type) ) ); | ||||||
|   | |||||||
| @@ -86,7 +86,7 @@ CompactNamespaces: true | |||||||
| ConstructorInitializerAllOnOneLineOrOnePerLine: true | ConstructorInitializerAllOnOneLineOrOnePerLine: true | ||||||
| ConstructorInitializerIndentWidth : 4 | ConstructorInitializerIndentWidth : 4 | ||||||
|  |  | ||||||
| ContinuationIndentWidth: 0 | ContinuationIndentWidth: 4 | ||||||
|  |  | ||||||
| Cpp11BracedListStyle: false | Cpp11BracedListStyle: false | ||||||
|  |  | ||||||
|   | |||||||
| @@ -113,6 +113,39 @@ function run-linker | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function run-compile-and-link | ||||||
|  | { | ||||||
|  | 	param( $vendor, $unit, $compiler_args, $linker_args ) | ||||||
|  |  | ||||||
|  | 	write-host "`Compiling & Linking $unit" | ||||||
|  | 	write-host "Compiler config:" | ||||||
|  | 	$compiler_args | ForEach-Object { | ||||||
|  | 		write-host $_ -ForegroundColor Cyan | ||||||
|  | 	} | ||||||
|  | 	write-host "Linker config:" | ||||||
|  | 	$linker_args | ForEach-Object { | ||||||
|  | 		write-host $_ -ForegroundColor Cyan | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$time_taken = Measure-Command { | ||||||
|  | 		& $vendor $compiler_args $linker_args 2>&1 | ForEach-Object { | ||||||
|  | 			$color = 'White' | ||||||
|  | 			switch ($_){ | ||||||
|  | 				{ $_ -match "error"   } { $color = 'Red'   ; break } | ||||||
|  | 				{ $_ -match "warning" } { $color = 'Yellow'; break } | ||||||
|  | 			} | ||||||
|  | 			write-host `t $_ -ForegroundColor $color | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	# if ( Test-Path($binary) ) { | ||||||
|  | 	# 	write-host "$binary compile & link finished in $($time_taken.TotalMilliseconds) ms" | ||||||
|  | 	# } | ||||||
|  | 	# else { | ||||||
|  | 	# 	write-host "Compile & Link failed for $binary" -ForegroundColor Red | ||||||
|  | 	# } | ||||||
|  | } | ||||||
|  |  | ||||||
| if ( $vendor -match "clang" ) | if ( $vendor -match "clang" ) | ||||||
| { | { | ||||||
| 	# https://clang.llvm.org/docs/ClangCommandLineReference.html | 	# https://clang.llvm.org/docs/ClangCommandLineReference.html | ||||||
| @@ -173,7 +206,8 @@ if ( $vendor -match "clang" ) | |||||||
| 			$flag_wall, | 			$flag_wall, | ||||||
| 			$flag_preprocess_non_intergrated, | 			$flag_preprocess_non_intergrated, | ||||||
| 			( $flag_define + 'GEN_TIME' ), | 			( $flag_define + 'GEN_TIME' ), | ||||||
| 			( $flag_path_output + $object ), | 			# ( $flag_path_output + $object ), | ||||||
|  | 			( $flag_path_output + $executable ) | ||||||
| 			( $flag_include + $includes ) | 			( $flag_include + $includes ) | ||||||
| 		) | 		) | ||||||
| 		if ( $release -eq $false ) { | 		if ( $release -eq $false ) { | ||||||
| @@ -188,8 +222,8 @@ if ( $vendor -match "clang" ) | |||||||
|  |  | ||||||
| 		# $compiler_args += $flag_preprocess | 		# $compiler_args += $flag_preprocess | ||||||
|  |  | ||||||
| 		$compiler_args += $flag_compile, $unit | 		# $compiler_args += $flag_compile, $unit | ||||||
| 		run-compiler $compiler $unit $compiler_args | 		# run-compiler $compiler $unit $compiler_args | ||||||
|  |  | ||||||
| 		$linker_args = @( | 		$linker_args = @( | ||||||
| 			$flag_link_win_subsystem_console, | 			$flag_link_win_subsystem_console, | ||||||
| @@ -207,8 +241,12 @@ if ( $vendor -match "clang" ) | |||||||
| 			$linker_args += $_ + '.lib' | 			$linker_args += $_ + '.lib' | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		$linker_args += $object | 		# $linker_args += $object | ||||||
| 		run-linker $linker $executable $linker_args | 		# run-linker $linker $executable $linker_args | ||||||
|  |  | ||||||
|  | 		$compiler_args += $unit | ||||||
|  | 		# $linker_args += $object | ||||||
|  | 		run-compile-and-link $compiler $unit $compiler_args | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	$compiler = 'clang++' | 	$compiler = 'clang++' | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user