Typedefs for Custom Classes

Only works as an import method, for example: `typedef OtherShader = funkin.backend.shaders.CustomShader;`.
This commit is contained in:
Jaime Humberto Macias Bustamante
2025-05-04 20:13:01 -07:00
parent 34b07378fd
commit bf602f758b
6 changed files with 33 additions and 14 deletions
+1 -1
View File
@@ -165,8 +165,8 @@ enum ModuleDecl {
DPackage( path : Array<String> );
DImport( path : Array<String>, ?everything : Bool, ?asname:String );
DUsing( path : Array<String>);
DClass( c : ClassDecl );
DTypedef( c : TypeDecl );
DClass( c : ClassDecl );
}
typedef ModuleType = {
+19 -5
View File
@@ -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
}
}
}
+7
View File
@@ -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;
}
+4 -6
View File
@@ -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<Dynamic> {
//if(enumValues.exists(name)) return enumValues.get(name);
public function getEnumValue(name:String):Null<Dynamic> {
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;
}
}
+1 -1
View File
@@ -50,8 +50,8 @@ class CustomClassDecl implements IHScriptCustomAccessBehaviour {
}
cacheImports();
cacheFields();
processUsings();
cacheFields();
if(classDecl.extend != null)
buildSuperClass();
}
+1 -1
View File
@@ -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);
}