@@ -4,46 +4,75 @@ package funkin.backend.system.macros;
44import haxe .macro .Context ;
55import haxe .macro .Expr ;
66
7+ class FieldName
8+ {
9+ public var name : String ;
10+ public var saveField : String ;
11+
12+ public function new (name : String , saveField : String )
13+ {
14+ this .name = name ;
15+ this .saveField = saveField ;
16+ }
17+ }
18+
719/**
820 * Macro that automatically generates flush and load functions.
921 */
1022class FunkinSaveMacro {
1123 /**
1224 * Generates flush and load functions.
13- * @param saveFieldName Name of the save field (`save`)
25+ * @param saveFieldName Name of the save field (`save`) or `null` to not have a default save field
1426 * @param saveFuncName Name of the save func (`flush`)
1527 * @param loadFuncName Name of the load func (`load`)
1628 * @return Array<Field>
1729 */
1830 public static function build (saveFieldName : String = " save" , saveFuncName : String = " flush" , loadFuncName : String = " load" ): Array <Field > {
1931 var fields : Array <Field > = Context .getBuildFields ();
2032
21- var fieldNames : Array <String > = [];
22- for (field in fields ) {
23- if (! field .access .contains (AStatic )) continue ;
33+ var fieldNames : Array <FieldName > = [];
34+ for (field in fields ) {
35+ if (! field .access .contains (AStatic ))
36+ continue ;
2437
2538 switch (field .kind ) {
2639 case FVar (type , expr ):
27- if (field .name == saveFieldName ) continue ;
40+ if (saveFieldName != null && field .name == saveFieldName )
41+ continue ;
42+
2843 var valid : Bool = true ;
29- if (field .meta != null )
30- for (m in field .meta )
31- if (m .name == " :doNotSave" ) {
32- valid = false ;
33- break ;
34- }
35- if (valid )
36- fieldNames .push (field .name );
44+ var customSaveFieldName : Null <String > = saveFieldName ;
45+ if (field .meta != null ) for (m in field .meta ) {
46+ if (m .name == " :doNotSave" ) valid = false ;
47+ else if (m .name == " :saveField" ) customSaveFieldName = meta_extractIdent (m );
48+ }
49+ if (valid ) {
50+ if (customSaveFieldName == null )
51+ Context .error (" Field " + field .name + " is not marked with @:saveField" , field .pos );
52+
53+ fieldNames .push (new FieldName (field .name , customSaveFieldName ));
54+ }
3755 default :
3856 continue ;
3957 }
4058 }
4159
60+ var _allSaveFields : Array <String > = [for (f in fieldNames ) f .saveField ];
61+ if (saveFieldName != null ) _allSaveFields .push (saveFieldName );
62+ var __allSaveFields : Map <String , Bool > = [];
63+ for (f in _allSaveFields ) __allSaveFields .set (f , true );
64+ var allSaveFields : Array <String > = [];
65+ for (f in __allSaveFields .keys ()) allSaveFields .push (f );
66+
4267 /**
4368 * SAVE FUNCTION
4469 */
45- var saveFuncBlocks : Array <Expr > = [for (f in fieldNames ) macro $i {saveFieldName }.data .$f = $i {f }];
46- saveFuncBlocks .push (macro $i {saveFieldName }.flush ());
70+ var saveFuncBlocks : Array <Expr > = [for (f in fieldNames ) {
71+ var name : String = f .name ;
72+ macro $i {f .saveField }.data .$name = $i {name };
73+ }];
74+ for (f in allSaveFields )
75+ saveFuncBlocks .push (macro $i {f }.flush ());
4776
4877 fields .push ({
4978 pos : Context .currentPos (),
@@ -58,7 +87,10 @@ class FunkinSaveMacro {
5887 access : [APublic , AStatic ]
5988 });
6089
61- var loadFuncBlocks : Array <Expr > = [for (f in fieldNames ) macro if ($i {saveFieldName }.data .$f != null ) $i {f } = $i {saveFieldName }.data .$f ];
90+ var loadFuncBlocks : Array <Expr > = [for (f in fieldNames ) {
91+ var name : String = f .name ;
92+ macro if ($i {saveFieldName }.data .$name != null ) $i {name } = $i {saveFieldName }.data .$name ;
93+ }];
6294
6395 /**
6496 * LOAD FUNCTION
@@ -78,5 +110,16 @@ class FunkinSaveMacro {
78110
79111 return fields ;
80112 }
113+
114+ public static function meta_extractIdent (meta : MetadataEntry ): Null <String > {
115+ if (meta == null || meta .params == null || meta .params .length == 0 )
116+ throw " Expected an identifier" ;
117+ switch (meta .params [0 ].expr ) {
118+ case EConst (CIdent (s )):
119+ return s ;
120+ default :
121+ }
122+ throw " Expected an identifier" ;
123+ }
81124}
82125#end
0 commit comments