From bf602f758ba87eaaf5783d6371e0efac9c97a366 Mon Sep 17 00:00:00 2001 From: Jaime Humberto Macias Bustamante Date: Sun, 4 May 2025 20:13:01 -0700 Subject: [PATCH] Typedefs for Custom Classes Only works as an import method, for example: `typedef OtherShader = funkin.backend.shaders.CustomShader;`. --- hscript/Expr.hx | 2 +- hscript/Interp.hx | 24 +++++++++++++++++++----- hscript/Parser.hx | 7 +++++++ hscript/Tools.hx | 10 ++++------ hscript/customclass/CustomClassDecl.hx | 2 +- hscript/proxy/ProxyType.hx | 2 +- 6 files changed, 33 insertions(+), 14 deletions(-) diff --git a/hscript/Expr.hx b/hscript/Expr.hx index dfb93a7..0cfc5ef 100644 --- a/hscript/Expr.hx +++ b/hscript/Expr.hx @@ -165,8 +165,8 @@ enum ModuleDecl { DPackage( path : Array ); DImport( path : Array, ?everything : Bool, ?asname:String ); DUsing( path : Array); - DClass( c : ClassDecl ); DTypedef( c : TypeDecl ); + DClass( c : ClassDecl ); } typedef ModuleType = { diff --git a/hscript/Interp.hx b/hscript/Interp.hx index 5fc3206..4d8b1e4 100644 --- a/hscript/Interp.hx +++ b/hscript/Interp.hx @@ -1367,7 +1367,6 @@ class Interp { for (index => field in fields) { switch (field) { case ESimple(name): - //Reflect.setField(obj, name, new Tools.EnumValue(enumName, name, index, obj, null)); obj.setEnum(name, new EnumValue(enumName, name, index, obj, null)); case EConstructor(name, params): var hasOpt = false, minParams = 0; @@ -1403,11 +1402,9 @@ class Interp { }; var f = Reflect.makeVarArgs(f); - //Reflect.setField(obj, name, f); obj.setEnum(name, f); } } - variables.set(enumName, obj); } return null; @@ -1949,6 +1946,25 @@ class Interp { imports.set(hasAlias ? asname : importedClass.name, importedClass); case DUsing(path): usings.push(path.join(".")); + case DTypedef(td): + switch(td.t) { + case CTPath(path, params): + if (params != null && params.length > 1) + error(ECustom("Typedefs can't have parameters")); + if (path.length < 1) + error(ECustom("Typedefs can't be empty")); + + var last = path[path.length - 1]; + + var importedClass:CustomClassImport = { + name: last, + pkg: [for (e in path) e.trim()], + fullPath: path.join("."), + as: td.name + } + imports.set(td.name, importedClass); + default: + } case DClass(c): var extend = c.extend; if (extend != null) { @@ -1982,8 +1998,6 @@ class Interp { //customClassDecl.cacheFields(); registerCustomClass(customClassDecl, !regAlias ? as : null, _inCustomClass); if(as != null) regAlias = true; - case DTypedef(td): - // TODO: put this work } } } diff --git a/hscript/Parser.hx b/hscript/Parser.hx index 73b0f81..abc500e 100644 --- a/hscript/Parser.hx +++ b/hscript/Parser.hx @@ -1575,6 +1575,13 @@ class Parser { push(tk); decls.push(parseModuleDecl()); } + haxe.ds.ArraySort.sort(decls, (m1, m2) -> { + var i1 = Type.enumIndex(m1); + var i2 = Type.enumIndex(m2); + + if(i1 > i2) return 0; + return -1; + }); return decls; } diff --git a/hscript/Tools.hx b/hscript/Tools.hx index 82ca423..deb5f18 100644 --- a/hscript/Tools.hx +++ b/hscript/Tools.hx @@ -223,27 +223,25 @@ class EnumValue { } } -class HScriptEnum implements IHScriptCustomBehaviour{ +class HScriptEnum implements IHScriptCustomBehaviour { public var enumValues(default, null) = {}; public function new() {} public function setEnum(name:String, enumValue:Dynamic) { - //enumValues.set(name, enumValue); Reflect.setField(enumValues, name, enumValue); } - public function getEnum(name:String):Null { - //if(enumValues.exists(name)) return enumValues.get(name); + public function getEnumValue(name:String):Null { if(Reflect.hasField(enumValues, name)) return Reflect.field(enumValues, name); return null; } public function hget(name:String):Dynamic { - return getEnum(name); + return getEnumValue(name); } public function hset(name:String, val:Dynamic):Dynamic { - throw new haxe.exceptions.NotImplementedException(); + return null; } } \ No newline at end of file diff --git a/hscript/customclass/CustomClassDecl.hx b/hscript/customclass/CustomClassDecl.hx index cfd1d51..25fbdbf 100644 --- a/hscript/customclass/CustomClassDecl.hx +++ b/hscript/customclass/CustomClassDecl.hx @@ -50,8 +50,8 @@ class CustomClassDecl implements IHScriptCustomAccessBehaviour { } cacheImports(); - cacheFields(); processUsings(); + cacheFields(); if(classDecl.extend != null) buildSuperClass(); } diff --git a/hscript/proxy/ProxyType.hx b/hscript/proxy/ProxyType.hx index c043e5e..d7affb8 100644 --- a/hscript/proxy/ProxyType.hx +++ b/hscript/proxy/ProxyType.hx @@ -194,7 +194,7 @@ class ProxyType { var isScripted:Bool = Std.isOfType(e, HScriptEnum); if(isScripted) { var scriptEnum:HScriptEnum = cast e; - var enumToCreate = scriptEnum.getEnum(constr); + var enumToCreate = scriptEnum.getEnumValue(constr); if(Reflect.isFunction(enumToCreate)) { return Reflect.callMethod(null, enumToCreate, params); }