End of gencpp experimentation. Parsed Scene and Actor component header + AttributeSet.h
This commit is contained in:
		| @@ -143,7 +143,8 @@ public: | ||||
|  | ||||
| #pragma region UObject | ||||
|  | ||||
| 	void GetLifetimeReplicatedProps( TArray< FLifetimeProperty >& OutLifetimeProps ) const override; | ||||
| 	void GetLifetimeReplicatedProps( TArray< FLifetimeProperty >& OutLifetimeProps ) const override = 0; | ||||
| 	; | ||||
| #pragma endregion UObject | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -9,9 +9,9 @@ | ||||
| using namespace gen; | ||||
|  | ||||
| #include "GasaGenCommon.cpp" | ||||
| #include "GasaGen_ue_parse_testing.cpp" | ||||
| #include "GasaGen_UGasaAttributeSet.cpp" | ||||
|  | ||||
|  | ||||
| int gen_main() | ||||
| { | ||||
| 	gen::init(); | ||||
| @@ -22,24 +22,23 @@ int gen_main() | ||||
| 	umeta_generated_body = code_str( GENERATED_BODY() ); | ||||
| 	gasa_api             = code_str( GASA_API ); | ||||
|  | ||||
| 	StrC str_generated_body                                        = txt("GENERATED_BODY("); | ||||
| 	StrC str_generated_uclass_body                                 = txt("GENERATED_UCLASS_BODY("); | ||||
| 	StrC str_property_binding_impl                                 = txt("PROPERTY_BINDING_IMPLEMENTATION"); | ||||
| 	StrC str_uclass                                                = txt("UCLASS("); | ||||
| 	StrC str_ufunction                                             = txt("UFUNCTION("); | ||||
| 	StrC str_uproperty                                             = txt("UPROPERTY("); | ||||
| 	StrC str_declare_log_category_extern                           = txt("DECLARE_LOG_CATEGORY_EXTERN("); | ||||
| 	StrC str_enum_class_flags                                      = txt("ENUM_CLASS_FLAGS("); | ||||
| 	StrC str_declare_class                                         = txt("DECLARE_CLASS("); | ||||
| 	StrC str_define_default_object_initializer_constructor_call    = txt("DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL("); | ||||
| 	StrC str_macro_text                                            = txt("TEXT("); | ||||
| 	StrC str_declare_multicast_delegate_one_parameter              = txt("DECLARE_MULTICAST_DELEGATE_OneParam("); | ||||
| 	StrC str_declare_multicast_delegate_two_parameter              = txt("DECLARE_MULTICAST_DELEGATE_TwoParams("); | ||||
| 	StrC str_declare_multicast_delegate_three_parameter            = txt("DECLARE_MULTICAST_DELEGATE_ThreeParams("); | ||||
| 	StrC str_declare_delegate_retval_one_param                     = txt("DECLARE_DELEGATE_RetVal_OneParam("); | ||||
| 	StrC str_declare_function                                      = txt("DECLARE_FUNCTION("); | ||||
| 	StrC str_result_decl                                           = txt("RESULT_DECL"); | ||||
| 	StrC str_property_binding_implementation                       = txt("PROPERTY_BINDING_IMPLEMENTATION("); | ||||
| 	StrC str_GENERATED_BODY                                        = txt("GENERATED_BODY("); | ||||
| 	StrC str_GENERATED_UCLASS_BODY                                 = txt("GENERATED_UCLASS_BODY("); | ||||
| 	StrC str_PROPERTY_BINDING_IMPLEMENTATION                       = txt("PROPERTY_BINDING_IMPLEMENTATION("); | ||||
| 	StrC str_UCLASS                                                = txt("UCLASS("); | ||||
| 	StrC str_UFUNCTION                                             = txt("UFUNCTION("); | ||||
| 	StrC str_UPROPERTY                                             = txt("UPROPERTY("); | ||||
| 	StrC str_DECLARE_LOG_CATEGORY_EXTERN                           = txt("DECLARE_LOG_CATEGORY_EXTERN("); | ||||
| 	StrC str_ENUM_CLASS_FLAGS                                      = txt("ENUM_CLASS_FLAGS("); | ||||
| 	StrC str_DECLARE_CLASS                                         = txt("DECLARE_CLASS("); | ||||
| 	StrC str_DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL    = txt("DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL("); | ||||
| 	StrC str_TEXT                                                  = txt("TEXT("); | ||||
| 	StrC str_DECLARE_MULTICAST_DELEGATE_OneParam                   = txt("DECLARE_MULTICAST_DELEGATE_OneParam("); | ||||
| 	StrC str_DECLARE_MULTICAST_DELEGATE_TwoParams                  = txt("DECLARE_MULTICAST_DELEGATE_TwoParams("); | ||||
| 	StrC str_DECLARE_MULTICAST_DELEGATE_ThreeParams                = txt("DECLARE_MULTICAST_DELEGATE_ThreeParams("); | ||||
| 	StrC str_DECLARE_DELEGATE_RetVal_OneParam                      = txt("DECLARE_DELEGATE_RetVal_OneParam("); | ||||
| 	StrC str_DECLARE_FUNCTION                                      = txt("DECLARE_FUNCTION("); | ||||
| 	StrC str_RESULT_DECL                                           = txt("RESULT_DECL"); | ||||
| 	StrC str_FORCEINLINE                                           = txt("FORCEINLINE"); | ||||
| 	StrC str_UENUM                                                 = txt("UENUM("); | ||||
| 	StrC str_UMETA                                                 = txt("UMETA("); | ||||
| @@ -57,28 +56,27 @@ int gen_main() | ||||
| 	StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam    = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam("); | ||||
| 	StrC str_UPARAM                                                = txt("UPARAM("); | ||||
| 	StrC str_FORCEINLINE_DEBUGGABLE                                = txt("FORCEINLINE_DEBUGGABLE"); | ||||
| 	StrC str_DECLARE_EVENT_ThreeParams                             = txt("DECLARE_EVENT_ThreeParams("); | ||||
| 	StrC str_USTRUCT                                               = txt("USTRUCT("); | ||||
| 	StrC str_GENERATED_USTRUCT_BODY                                = txt("GENERATED_USTRUCT_BODY("); | ||||
|  | ||||
| 	PreprocessorDefines.append( get_cached_string(str_generated_body)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_generated_uclass_body)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_property_binding_impl)); | ||||
| 	// PreprocessorDefines.append( get_cached_string(str_ue_deprecated)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_uclass)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_ufunction)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_uproperty)); | ||||
| 	// PreprocessorDefines.append( get_cached_string(str_umg_api)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_declare_log_category_extern)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_enum_class_flags)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_declare_class)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_define_default_object_initializer_constructor_call)); | ||||
| 	// PreprocessorDefines.append( get_cached_string(str_core_object_api)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_macro_text)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_declare_multicast_delegate_one_parameter)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_declare_multicast_delegate_two_parameter)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_declare_multicast_delegate_three_parameter)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_declare_delegate_retval_one_param)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_declare_function)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_result_decl)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_property_binding_implementation)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_GENERATED_BODY)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_GENERATED_UCLASS_BODY)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_PROPERTY_BINDING_IMPLEMENTATION)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_UCLASS)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_UFUNCTION)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_UPROPERTY)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_LOG_CATEGORY_EXTERN)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_ENUM_CLASS_FLAGS)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_CLASS)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_TEXT)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_OneParam)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_TwoParams)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_ThreeParams)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_RetVal_OneParam)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_FUNCTION)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_RESULT_DECL)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_FORCEINLINE)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_UENUM)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_UMETA)); | ||||
| @@ -89,7 +87,6 @@ int gen_main() | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_SixParams)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_EVENT_TwoParams)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_RetVal_ThreeParams)); | ||||
| 	// PreprocessorDefines.append( get_cached_string(str_ENGINE_API)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_PRAGMA_DISABLE_DEPRECATION_WARNINGS)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_PRAGMA_ENABLE_DEPRECATION_WARNINGS)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DEFINE_ACTORDESC_TYPE)); | ||||
| @@ -97,117 +94,13 @@ int gen_main() | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_UPARAM)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_FORCEINLINE_DEBUGGABLE)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_DECLARE_EVENT_ThreeParams)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_USTRUCT)); | ||||
| 	PreprocessorDefines.append( get_cached_string(str_GENERATED_USTRUCT_BODY)); | ||||
|  | ||||
| 	FileContents content; | ||||
| 	ue_parse_testing(); | ||||
|  | ||||
| #define path_UProgressBar \ | ||||
| 	"C:/projects/Unreal/Surgo/UE/Engine/Source/Runtime/UMG/Public/Components/ProgressBar.h" | ||||
|  | ||||
| #if 0 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_UProgressBar ); | ||||
| 	CodeBody parsed_uprogressbar = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	log_fmt("\n\n"); | ||||
| 	for ( Code gcode : parsed_uprogressbar ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 							// log_fmt("%s\n", class_code->to_string() ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| #define path_UObject \ | ||||
| 	R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\CoreUObject\Public\UObject\Object.h)" | ||||
|  | ||||
| #if 0 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_UObject ); | ||||
| 	CodeBody parsed_uobject = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	log_fmt("\n\n"); | ||||
| 	for ( Code gcode : parsed_uobject ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
| 			// log_fmt("%s\n", gcode->to_string() ); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Constructor: | ||||
| 					case CodeT::Constructor_Fwd: | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 							// log_fmt("%s\n", class_code->to_string() ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| #define path_AActor \ | ||||
| 	R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\Engine\Classes\GameFramework\Actor.h)" | ||||
|  | ||||
| #if 1 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_AActor ); | ||||
| 	CodeBody parsed_aactor = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	log_fmt("\n\n"); | ||||
| 	for ( Code gcode : parsed_aactor ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	// StrC str_gasa_api = txt("GASA_API"); | ||||
| 	StrC str_gasa_api = txt("GASA_API"); | ||||
|  | ||||
| 	gen_UGasaAttributeSet(); | ||||
| 	return 0; | ||||
|   | ||||
							
								
								
									
										213
									
								
								Project/Source/GasaGen/GasaGen_ue_parse_testing.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								Project/Source/GasaGen/GasaGen_ue_parse_testing.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,213 @@ | ||||
| void ue_parse_testing() | ||||
| { | ||||
| 	FileContents content; | ||||
|  | ||||
| #define path_UProgressBar \ | ||||
| 	"C:/projects/Unreal/Surgo/UE/Engine/Source/Runtime/UMG/Public/Components/ProgressBar.h" | ||||
|  | ||||
| #if 0 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_UProgressBar ); | ||||
| 	CodeBody parsed_uprogressbar = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	log_fmt("\n\n"); | ||||
| 	for ( Code gcode : parsed_uprogressbar ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 							// log_fmt("%s\n", class_code->to_string() ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| #define path_UObject \ | ||||
| 	R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\CoreUObject\Public\UObject\Object.h)" | ||||
|  | ||||
| #if 0 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_UObject ); | ||||
| 	CodeBody parsed_uobject = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	log_fmt("\n\n"); | ||||
| 	for ( Code gcode : parsed_uobject ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
| 			// log_fmt("%s\n", gcode->to_string() ); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Constructor: | ||||
| 					case CodeT::Constructor_Fwd: | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 							// log_fmt("%s\n", class_code->to_string() ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| #define path_AActor \ | ||||
| 	R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\Engine\Classes\GameFramework\Actor.h)" | ||||
|  | ||||
| #if 0 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_AActor ); | ||||
| 	CodeBody parsed_aactor = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	log_fmt("\n\n"); | ||||
| 	for ( Code gcode : parsed_aactor ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| #define path_ActorComponent \ | ||||
| 	R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\Engine\Classes\Components\ActorComponent.h)" | ||||
|  | ||||
| #if 0 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_ActorComponent ); | ||||
| 	CodeBody parsed_actor_component = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	for ( Code gcode : parsed_actor_component ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("\n\n"); | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| #define path_SceneComponent \ | ||||
| 	R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\Engine\Classes\Components\SceneComponent.h)" | ||||
|  | ||||
| #if 0 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_SceneComponent ); | ||||
| 	CodeBody parsed_scene_component = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	for ( Code gcode : parsed_scene_component ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("\n\n"); | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| #define path_AttributeSet \ | ||||
| 	R"(C:\projects\Unreal\Surgo\UE\Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Public\AttributeSet.h)" | ||||
|  | ||||
| #if 0 | ||||
| 	content = file_read_contents( GlobalAllocator, true, path_AttributeSet ); | ||||
| 	CodeBody parsed_attribute_set = parse_global_body( StrC { content.size, (char const*)content.data }); | ||||
|  | ||||
| 	for ( Code gcode : parsed_attribute_set ) | ||||
| 	{ | ||||
| 		if ( gcode->Type == CodeT::Class ) | ||||
| 		{ | ||||
| 			log_fmt("\n\n"); | ||||
| 			log_fmt("Class %S - Definitions:\n", gcode->Name); | ||||
|  | ||||
| 			if (gcode->Body->Type != CodeT::Class_Body) | ||||
| 				continue; | ||||
| 			for ( Code class_code : gcode->Body->cast<CodeBody>() ) | ||||
| 			{ | ||||
| 				switch ( class_code->Type ) | ||||
| 				{ | ||||
| 					case CodeT::Variable: | ||||
| 					case CodeT::Function: | ||||
| 					case CodeT::Function_Fwd: | ||||
| 						if ( class_code->Name ) | ||||
| 						{ | ||||
| 							log_fmt("%s\n", class_code->Name ); | ||||
| 						} | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
| } | ||||
| @@ -1742,6 +1742,8 @@ void CodeDestructor::to_string_fwd( String& result ) | ||||
|  | ||||
| 		if ( ast->Specs.has( ESpecifier::Pure ) ) | ||||
| 			result.append( " = 0;" ); | ||||
| 		else if (ast->Body) | ||||
| 			result.append_fmt( " = %S;", ast->Body.to_string() ); | ||||
| 	} | ||||
| 	else | ||||
| 		result.append_fmt( "~%S();", ast->Parent->Name ); | ||||
| @@ -1905,7 +1907,7 @@ void CodeFriend::to_string( String& result ) | ||||
| { | ||||
| 	result.append_fmt( "friend %S", ast->Declaration->to_string() ); | ||||
|  | ||||
| 	if ( result[ result.length() - 1 ] != ';' ) | ||||
| 	if ( ast->Declaration->Type != ECode::Function && result[ result.length() - 1 ] != ';' ) | ||||
| 	{ | ||||
| 		result.append( ";" ); | ||||
| 	} | ||||
| @@ -2023,7 +2025,7 @@ void CodeFn::to_string_fwd( String& result ) | ||||
| 	{ | ||||
| 		for ( SpecifierT spec : ast->Specs ) | ||||
| 		{ | ||||
| 			if ( ESpecifier::is_trailing( spec ) ) | ||||
| 			if ( ESpecifier::is_trailing( spec ) && ! spec != ESpecifier::Pure ) | ||||
| 			{ | ||||
| 				StrC spec_str = ESpecifier::to_str( spec ); | ||||
| 				result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); | ||||
| @@ -2031,6 +2033,11 @@ void CodeFn::to_string_fwd( String& result ) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if ( ast->Specs.has( ESpecifier::Pure ) ) | ||||
| 		result.append( " = 0;" ); | ||||
| 	else if (ast->Body) | ||||
| 		result.append_fmt( " = %S;", ast->Body.to_string() ); | ||||
|  | ||||
| 	if ( ast->InlineCmt ) | ||||
| 		result.append_fmt( ";  %S", ast->InlineCmt->Content ); | ||||
| 	else | ||||
| @@ -3408,7 +3415,6 @@ OpValidateResult operator__validate( OperatorT op, CodeParam params_code, CodeTy | ||||
|  | ||||
| 		case Unary_Plus : | ||||
| 		case Unary_Minus : | ||||
| 		case BNot : | ||||
| 			if ( ! params_code ) | ||||
| 				is_member_symbol = true; | ||||
|  | ||||
| @@ -3444,6 +3450,38 @@ OpValidateResult operator__validate( OperatorT op, CodeParam params_code, CodeTy | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 		case BNot: | ||||
| 		{ | ||||
| 			// Some compilers let you do this... | ||||
| 			// if ( ! ret_type.is_equal( t_bool) ) | ||||
| 			// { | ||||
| 			// 	log_failure( "gen::def_operator: return type is not a boolean - %s", params_code.debug_str() ); | ||||
| 			// 	return OpValidateResult::Fail; | ||||
| 			// } | ||||
|  | ||||
| 			if ( ! params_code ) | ||||
| 				is_member_symbol = true; | ||||
|  | ||||
| 			else | ||||
| 			{ | ||||
| 				if ( params_code->Type != ECode::Parameters ) | ||||
| 				{ | ||||
| 					log_failure( "gen::def_operator: params is not of Parameters type - %s", params_code.debug_str() ); | ||||
| 					return OpValidateResult::Fail; | ||||
| 				} | ||||
|  | ||||
| 				if ( params_code->NumEntries > 1 ) | ||||
| 				{ | ||||
| 					log_failure( | ||||
| 					    "gen::def_operator: operator%s may not have more than one parameter - param count: %d", | ||||
| 					    to_str( op ), | ||||
| 					    params_code->NumEntries | ||||
| 					); | ||||
| 					return OpValidateResult::Fail; | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		case Add : | ||||
| 		case Subtract : | ||||
| @@ -3578,6 +3616,11 @@ OpValidateResult operator__validate( OperatorT op, CodeParam params_code, CodeTy | ||||
| 		case Comma : | ||||
| 			check_params(); | ||||
| 			break; | ||||
|  | ||||
| 		case New: | ||||
| 		case Delete: | ||||
| 			// This library doesn't support validating new and delete yet. | ||||
| 			break; | ||||
| #undef specs | ||||
| 	} | ||||
|  | ||||
| @@ -5611,7 +5654,8 @@ namespace parser | ||||
| 	Entry( UMG_API, "UMG_API" ) \ | ||||
| 	Entry( COREUOBJECT_API, "COREUOBJECT_API" ) \ | ||||
| 	Entry( ENGINE_API, "ENGINE_API" ) \ | ||||
| 	Entry( GASA_API, "GASA_API" ) | ||||
| 	Entry( GASA_API, "GASA_API" ) \ | ||||
| 	Entry( GAMEPLAYABILITIES_API, "GAMEPLAYABILITIES_API" ) | ||||
|  | ||||
| 		enum Type : u32 | ||||
| 		{ | ||||
| @@ -5717,6 +5761,7 @@ namespace parser | ||||
| 			COREUOBJECT_API, | ||||
| 			ENGINE_API, | ||||
| 			GASA_API, | ||||
| 			GAMEPLAYABILITIES_API, | ||||
| 			NumTokens | ||||
| 		}; | ||||
|  | ||||
| @@ -5825,6 +5870,7 @@ namespace parser | ||||
| 				{ sizeof( "COREUOBJECT_API" ),     "COREUOBJECT_API"     }, | ||||
| 				{ sizeof( "ENGINE_API" ),          "ENGINE_API"          }, | ||||
| 				{ sizeof( "GASA_API" ),            "GASA_API"            }, | ||||
| 				{ sizeof( "GAMEPLAYABILITIES_API" ), "GAMEPLAYABILITIES_API" }, | ||||
| 			}; | ||||
| 			return lookup[ type ]; | ||||
| 		} | ||||
| @@ -5992,7 +6038,7 @@ namespace parser | ||||
| 				while ( Arr[ idx ].Type == TokType::NewLine ) | ||||
| 					idx++; | ||||
|  | ||||
| 				return Arr[ idx ]; | ||||
| 				return Arr[ idx + 1 ]; | ||||
| 			} | ||||
|  | ||||
| 			return Arr[ idx + 1 ]; | ||||
| @@ -8359,8 +8405,7 @@ namespace parser | ||||
| 		} | ||||
| 		if ( tok.Type == TokType::Identifier ) | ||||
| 		{ | ||||
| 			tok                 = tokens[ idx - 2 ]; | ||||
|  | ||||
| 			tok = tokens[ idx - 2 ]; | ||||
| 			bool is_indirection = tok.Type == TokType::Ampersand || tok.Type == TokType::Star; | ||||
| 			bool ok_to_parse    = false; | ||||
|  | ||||
| @@ -8378,10 +8423,12 @@ namespace parser | ||||
| 				ok_to_parse = true; | ||||
| 			} | ||||
| 			else if ( tok.Type == TokType::Assign_Classifer | ||||
| 				&& tokens[idx - 4].Type == TokType::Decl_Class | ||||
| 				&& tokens[idx - 5].Type == which ) | ||||
| 			&& (	( tokens[idx - 5].Type == which && tokens[idx - 4].Type == TokType::Decl_Class ) | ||||
| 				||	( tokens[idx - 4].Type == which)) | ||||
| 			) | ||||
| 			{ | ||||
| 				// Its a forward declaration of an enum class | ||||
| 				// Its a forward declaration of an enum | ||||
| 				// <enum>         <type_identifier> : <identifier>; | ||||
| 				// <enum> <class> <type_identifier> : <identifier>; | ||||
| 				ok_to_parse = true; | ||||
| 				Code result = parse_enum(); | ||||
| @@ -8407,6 +8454,27 @@ namespace parser | ||||
| 			Context.pop(); | ||||
| 			return result; | ||||
| 		} | ||||
| 		else if ( tok.Type >= TokType::Type_Unsigned && tok.Type <= TokType::Type_MS_W64 ) | ||||
| 		{ | ||||
| 			tok = tokens[ idx - 2 ]; | ||||
|  | ||||
| 			if ( tok.Type != TokType::Assign_Classifer | ||||
| 			|| (	( tokens[idx - 5].Type != which && tokens[idx - 4].Type != TokType::Decl_Class ) | ||||
| 				&&	( tokens[idx - 4].Type != which)) | ||||
| 			) | ||||
| 			{ | ||||
| 				log_failure( "Unsupported or bad member definition after %s declaration\n%s", to_str(which), Context.to_string() ); | ||||
| 				Context.pop(); | ||||
| 				return CodeInvalid; | ||||
| 			} | ||||
|  | ||||
| 			// Its a forward declaration of an enum class | ||||
| 			// <enum>         <type_identifier> : <identifier>; | ||||
| 			// <enum> <class> <type_identifier> : <identifier>; | ||||
| 			Code result = parse_enum(); | ||||
| 			Context.pop(); | ||||
| 			return result; | ||||
| 		} | ||||
| 		else if ( tok.Type == TokType::BraceCurly_Close ) | ||||
| 		{ | ||||
| 			// Its a definition | ||||
| @@ -8580,6 +8648,20 @@ namespace parser | ||||
| 			} | ||||
| 			// <Attributes> <Specifiers> <ReturnType> <Name> ( <Paraemters> ) <Specifiers> { <Body> } | ||||
| 		} | ||||
| 		else if ( check(TokType::Operator) && currtok.Text[0] == '=' ) | ||||
| 		{ | ||||
| 			eat(TokType::Operator); | ||||
| 			specifiers.append( ESpecifier::Pure ); | ||||
|  | ||||
| 			eat( TokType::Number); | ||||
| 			Token stmt_end = currtok; | ||||
| 			eat( TokType::Statement_End ); | ||||
| 			// <Attributes> <Specifiers> <ReturnType> <Name> ( <Paraemters> ) <Specifiers> = 0; | ||||
|  | ||||
| 			if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line ) | ||||
| 				inline_cmt = parse_comment(); | ||||
| 			// <Attributes> <Specifiers> <ReturnType> <Name> ( <Paraemters> ) <Specifiers>; <InlineCmt> | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			Token stmt_end = currtok; | ||||
| @@ -9111,6 +9193,8 @@ namespace parser | ||||
|  | ||||
| 		Context.Scope->Name = currtok; | ||||
|  | ||||
| 		bool was_new_or_delete = false; | ||||
|  | ||||
| 		OperatorT op        = Invalid; | ||||
| 		switch ( currtok.Text[ 0 ] ) | ||||
| 		{ | ||||
| @@ -9301,18 +9385,71 @@ namespace parser | ||||
| 			break; | ||||
| 			default : | ||||
| 			{ | ||||
| 				break; | ||||
| 				StrC str_new    = to_str(OperatorT::New); | ||||
| 				StrC str_delete = to_str(OperatorT::Delete); | ||||
| 				if ( str_compare( currtok.Text, str_new.Ptr, max(str_new.Len - 1, currtok.Length)) == 0) | ||||
| 				{ | ||||
| 					op = OperatorT::New; | ||||
| 					eat( ETokType::Identifier ); | ||||
| 					was_new_or_delete = true; | ||||
|  | ||||
| 					s32 idx = Context.Tokens.Idx + 1; | ||||
| 					{ | ||||
| 						while ( Context.Tokens[ idx ].Type == TokType::NewLine ) | ||||
| 							idx++; | ||||
| 					} | ||||
| 					Token next = Context.Tokens[idx]; | ||||
| 					if ( currtok.Type == TokType::Operator && str_compare(currtok.Text, "[]", 2) == 0) | ||||
| 					{ | ||||
| 						eat(ETokType::Operator); | ||||
| 						op = OperatorT::NewArray; | ||||
| 					} | ||||
| 					else if ( currtok.Type == TokType::BraceSquare_Open && next.Type == TokType::BraceSquare_Close) | ||||
| 					{ | ||||
| 						eat(ETokType::BraceSquare_Open); | ||||
| 						eat(ETokType::BraceSquare_Close); | ||||
| 						op = OperatorT::NewArray; | ||||
| 					} | ||||
| 				} | ||||
| 				else if ( str_compare( currtok.Text, str_delete.Ptr, max(str_delete.Len - 1, currtok.Length )) == 0) | ||||
| 				{ | ||||
| 					op = OperatorT::Delete; | ||||
| 					eat(ETokType::Identifier); | ||||
| 					was_new_or_delete = true; | ||||
|  | ||||
| 					s32 idx = Context.Tokens.Idx + 1; | ||||
| 					{ | ||||
| 						while ( Context.Tokens[ idx ].Type == TokType::NewLine ) | ||||
| 							idx++; | ||||
| 					} | ||||
| 					Token next = Context.Tokens[idx]; | ||||
| 					if ( currtok.Type == TokType::Operator && str_compare(currtok.Text, "[]", 2) == 0) | ||||
| 					{ | ||||
| 						eat(ETokType::Operator); | ||||
| 						op = OperatorT::DeleteArray; | ||||
| 					} | ||||
| 					else if ( currtok.Type == TokType::BraceSquare_Open && next.Type == TokType::BraceSquare_Close) | ||||
| 					{ | ||||
| 						eat(ETokType::BraceSquare_Open); | ||||
| 						eat(ETokType::BraceSquare_Close); | ||||
| 						op = OperatorT::DeleteArray; | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					if ( op == Invalid ) | ||||
| 					{ | ||||
| 						log_failure( "Invalid operator '%s'\n%s", prevtok.Text, Context.to_string() ); | ||||
| 						Context.pop(); | ||||
| 						return CodeInvalid; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		if ( op == Invalid ) | ||||
| 		{ | ||||
| 			log_failure( "Invalid operator '%s'\n%s", currtok.Text, Context.to_string() ); | ||||
| 			Context.pop(); | ||||
| 			return CodeInvalid; | ||||
| 		} | ||||
|  | ||||
| 		eat( currtok.Type ); | ||||
| 		if ( ! was_new_or_delete) | ||||
| 			eat( currtok.Type ); | ||||
| 		// <ExportFlag> <Attributes> <Specifiers> <ReturnType> <Qualifier::...> operator <Op> | ||||
|  | ||||
| 		// Parse Params | ||||
| @@ -10288,19 +10425,26 @@ namespace parser | ||||
|  | ||||
| 		if ( check( TokType::Operator ) && currtok.Text[ 0 ] == '=' ) | ||||
| 		{ | ||||
| 			eat( TokType::Operator ); | ||||
| 			// <Virtual Specifier> ~<Name>() = | ||||
|  | ||||
| 			if ( left && currtok.Text[ 0 ] == '0' ) | ||||
| 			bool skip_formatting = true; | ||||
| 			Token next = Context.Tokens.next(skip_formatting); | ||||
| 			if ( left && next.Text[ 0 ] == '0' ) | ||||
| 			{ | ||||
| 				eat( TokType::Operator ); | ||||
| 				eat( TokType::Number ); | ||||
| 				// <Virtual Specifier> ~<Name>() = 0 | ||||
|  | ||||
| 				specifiers.append( ESpecifier::Pure ); | ||||
| 			} | ||||
| 			else if ( left && str_compare( next.Text, "default", sizeof("default") - 1 ) == 0) | ||||
| 			{ | ||||
| 				body = parse_assignment_expression(); | ||||
| 				// <Virtual Specifier> ~< | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				log_failure( "Pure specifier expected due to '=' token\n%s", Context.to_string() ); | ||||
| 				log_failure( "Pure or default specifier expected due to '=' token\n%s", Context.to_string() ); | ||||
| 				return CodeInvalid; | ||||
| 			} | ||||
|  | ||||
| @@ -10326,7 +10470,7 @@ namespace parser | ||||
| 		if ( specifiers ) | ||||
| 			result->Specs = specifiers; | ||||
|  | ||||
| 		if ( body ) | ||||
| 		if ( body && body->Type == ECode::Function_Body ) | ||||
| 		{ | ||||
| 			result->Body = body; | ||||
| 			result->Type = ECode::Destructor; | ||||
| @@ -10640,36 +10784,40 @@ namespace parser | ||||
| 			Context.Scope->Name = name; | ||||
| 			// friend <ReturnType> <Name> | ||||
|  | ||||
| 			function = parse_function_after_name( ModuleFlag::None, NoCode, NoCode, type, name ); | ||||
|  | ||||
| 			// Parameter list | ||||
| 			CodeParam params = parse_params(); | ||||
| 			// CodeParam params = parse_params(); | ||||
| 			// friend <ReturnType> <Name> ( <Parameters> ) | ||||
|  | ||||
| 			function             = make_code(); | ||||
| 			function->Type       = Function_Fwd; | ||||
| 			function->Name       = get_cached_string( name ); | ||||
| 			function->ReturnType = type; | ||||
| 			// function             = make_code(); | ||||
| 			// function->Type       = Function_Fwd; | ||||
| 			// function->Name       = get_cached_string( name ); | ||||
| 			// function->ReturnType = type; | ||||
|  | ||||
| 			if ( params ) | ||||
| 				function->Params = params; | ||||
| 			// if ( params ) | ||||
| 				// function->Params = params; | ||||
| 		} | ||||
|  | ||||
| 		Token stmt_end = currtok; | ||||
| 		eat( TokType::Statement_End ); | ||||
| 		// friend <Type>; | ||||
| 		// friend <ReturnType> <Name> ( <Parameters> ); | ||||
|  | ||||
| 		CodeComment inline_cmt = NoCode; | ||||
| 		if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line ) | ||||
| 			inline_cmt = parse_comment(); | ||||
| 		// friend <Type>; <InlineCmt> | ||||
| 		// friend <ReturnType> <Name> ( <Parameters> ); <InlineCmt> | ||||
| 		if ( function && function->Type == ECode::Function_Fwd ) | ||||
| 		{ | ||||
| 			Token stmt_end = currtok; | ||||
| 			eat( TokType::Statement_End ); | ||||
| 			// friend <Type>; | ||||
| 			// friend <ReturnType> <Name> ( <Parameters> ); | ||||
|  | ||||
| 			if ( currtok_noskip.Type == TokType::Comment && currtok_noskip.Line == stmt_end.Line ) | ||||
| 				inline_cmt = parse_comment(); | ||||
| 			// friend <Type>; <InlineCmt> | ||||
| 			// friend <ReturnType> <Name> ( <Parameters> ); <InlineCmt> | ||||
| 		} | ||||
|  | ||||
| 		CodeFriend result = ( CodeFriend )make_code(); | ||||
| 		result->Type      = Friend; | ||||
|  | ||||
| 		if ( function ) | ||||
| 			result->Declaration = function; | ||||
|  | ||||
| 		else | ||||
| 			result->Declaration = type; | ||||
|  | ||||
|   | ||||
| @@ -339,55 +339,63 @@ namespace EOperator | ||||
| 		PtrToMemOfPtr, | ||||
| 		FunctionCall, | ||||
| 		Comma, | ||||
| 		New, | ||||
| 		NewArray, | ||||
| 		Delete, | ||||
| 		DeleteArray, | ||||
| 		NumOps | ||||
| 	}; | ||||
|  | ||||
| 	StrC to_str( Type op ) | ||||
| 	{ | ||||
| 		local_persist StrC lookup[] { | ||||
| 			{ sizeof( "INVALID" ), "INVALID" }, | ||||
| 			{ sizeof( "=" ),       "="       }, | ||||
| 			{ sizeof( "+=" ),      "+="      }, | ||||
| 			{ sizeof( "-=" ),      "-="      }, | ||||
| 			{ sizeof( "*=" ),      "*="      }, | ||||
| 			{ sizeof( "/=" ),      "/="      }, | ||||
| 			{ sizeof( "%=" ),      "%="      }, | ||||
| 			{ sizeof( "&=" ),      "&="      }, | ||||
| 			{ sizeof( "|=" ),      "|="      }, | ||||
| 			{ sizeof( "^=" ),      "^="      }, | ||||
| 			{ sizeof( "<<=" ),     "<<="     }, | ||||
| 			{ sizeof( ">>=" ),     ">>="     }, | ||||
| 			{ sizeof( "++" ),      "++"      }, | ||||
| 			{ sizeof( "--" ),      "--"      }, | ||||
| 			{ sizeof( "+" ),       "+"       }, | ||||
| 			{ sizeof( "-" ),       "-"       }, | ||||
| 			{ sizeof( "!" ),       "!"       }, | ||||
| 			{ sizeof( "+" ),       "+"       }, | ||||
| 			{ sizeof( "-" ),       "-"       }, | ||||
| 			{ sizeof( "*" ),       "*"       }, | ||||
| 			{ sizeof( "/" ),       "/"       }, | ||||
| 			{ sizeof( "%" ),       "%"       }, | ||||
| 			{ sizeof( "~" ),       "~"       }, | ||||
| 			{ sizeof( "&" ),       "&"       }, | ||||
| 			{ sizeof( "|" ),       "|"       }, | ||||
| 			{ sizeof( "^" ),       "^"       }, | ||||
| 			{ sizeof( "<<" ),      "<<"      }, | ||||
| 			{ sizeof( ">>" ),      ">>"      }, | ||||
| 			{ sizeof( "&&" ),      "&&"      }, | ||||
| 			{ sizeof( "||" ),      "||"      }, | ||||
| 			{ sizeof( "==" ),      "=="      }, | ||||
| 			{ sizeof( "!=" ),      "!="      }, | ||||
| 			{ sizeof( "<" ),       "<"       }, | ||||
| 			{ sizeof( ">" ),       ">"       }, | ||||
| 			{ sizeof( "<=" ),      "<="      }, | ||||
| 			{ sizeof( ">=" ),      ">="      }, | ||||
| 			{ sizeof( "[]" ),      "[]"      }, | ||||
| 			{ sizeof( "*" ),       "*"       }, | ||||
| 			{ sizeof( "&" ),       "&"       }, | ||||
| 			{ sizeof( "->" ),      "->"      }, | ||||
| 			{ sizeof( "->*" ),     "->*"     }, | ||||
| 			{ sizeof( "()" ),      "()"      }, | ||||
| 			{ sizeof( "," ),       ","       }, | ||||
| 			{ sizeof( "INVALID" ),  "INVALID"   }, | ||||
| 			{ sizeof( "=" ),        "="         }, | ||||
| 			{ sizeof( "+=" ),       "+="        }, | ||||
| 			{ sizeof( "-=" ),       "-="        }, | ||||
| 			{ sizeof( "*=" ),       "*="        }, | ||||
| 			{ sizeof( "/=" ),       "/="        }, | ||||
| 			{ sizeof( "%=" ),       "%="        }, | ||||
| 			{ sizeof( "&=" ),       "&="        }, | ||||
| 			{ sizeof( "|=" ),       "|="        }, | ||||
| 			{ sizeof( "^=" ),       "^="        }, | ||||
| 			{ sizeof( "<<=" ),      "<<="       }, | ||||
| 			{ sizeof( ">>=" ),      ">>="       }, | ||||
| 			{ sizeof( "++" ),       "++"        }, | ||||
| 			{ sizeof( "--" ),       "--"        }, | ||||
| 			{ sizeof( "+" ),        "+"         }, | ||||
| 			{ sizeof( "-" ),        "-"         }, | ||||
| 			{ sizeof( "!" ),        "!"         }, | ||||
| 			{ sizeof( "+" ),        "+"         }, | ||||
| 			{ sizeof( "-" ),        "-"         }, | ||||
| 			{ sizeof( "*" ),        "*"         }, | ||||
| 			{ sizeof( "/" ),        "/"         }, | ||||
| 			{ sizeof( "%" ),        "%"         }, | ||||
| 			{ sizeof( "~" ),        "~"         }, | ||||
| 			{ sizeof( "&" ),        "&"         }, | ||||
| 			{ sizeof( "|" ),        "|"         }, | ||||
| 			{ sizeof( "^" ),        "^"         }, | ||||
| 			{ sizeof( "<<" ),       "<<"        }, | ||||
| 			{ sizeof( ">>" ),       ">>"        }, | ||||
| 			{ sizeof( "&&" ),       "&&"        }, | ||||
| 			{ sizeof( "||" ),       "||"        }, | ||||
| 			{ sizeof( "==" ),       "=="        }, | ||||
| 			{ sizeof( "!=" ),       "!="        }, | ||||
| 			{ sizeof( "<" ),        "<"         }, | ||||
| 			{ sizeof( ">" ),        ">"         }, | ||||
| 			{ sizeof( "<=" ),       "<="        }, | ||||
| 			{ sizeof( ">=" ),       ">="        }, | ||||
| 			{ sizeof( "[]" ),       "[]"        }, | ||||
| 			{ sizeof( "*" ),        "*"         }, | ||||
| 			{ sizeof( "&" ),        "&"         }, | ||||
| 			{ sizeof( "->" ),       "->"        }, | ||||
| 			{ sizeof( "->*" ),      "->*"       }, | ||||
| 			{ sizeof( "()" ),       "()"        }, | ||||
| 			{ sizeof( "," ),        ","         }, | ||||
| 			{ sizeof( "new" ),      "new"       }, | ||||
| 			{ sizeof( "new[]" ),    "new[]"     }, | ||||
| 			{ sizeof( "delete" ),   "delete"    }, | ||||
| 			{ sizeof( "delete[]" ), "delete[]"  }, | ||||
| 		}; | ||||
| 		return lookup[ op ]; | ||||
| 	} | ||||
| @@ -822,7 +830,7 @@ struct AST | ||||
| 			union | ||||
| 			{ | ||||
| 				AST* ArrExpr;        // Typename | ||||
| 				AST* Body;           // Class, Constructr, Destructor, Enum, Function, Namespace, Struct, Union | ||||
| 				AST* Body;           // Class, Constructr, Destructor, Enum, Friend, Function, Namespace, Struct, Union | ||||
| 				AST* Declaration;    // Friend, Template | ||||
| 				AST* Value;          // Parameter, Variable | ||||
| 			}; | ||||
| @@ -902,7 +910,7 @@ struct AST_POD | ||||
| 			union | ||||
| 			{ | ||||
| 				AST* ArrExpr;        // Typename | ||||
| 				AST* Body;           // Class, Constructr, Destructor, Enum, Function, Namespace, Struct, Union | ||||
| 				AST* Body;           // Class, Constructr, Destructor, Enum, Friend, Function, Namespace, Struct, Union | ||||
| 				AST* Declaration;    // Friend, Template | ||||
| 				AST* Value;          // Parameter, Variable | ||||
| 			}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user