Typedefs for Custom Classes
Only works as an import method, for example: `typedef OtherShader = funkin.backend.shaders.CustomShader;`.
This commit is contained in:
+1
-1
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -50,8 +50,8 @@ class CustomClassDecl implements IHScriptCustomAccessBehaviour {
|
||||
}
|
||||
|
||||
cacheImports();
|
||||
cacheFields();
|
||||
processUsings();
|
||||
cacheFields();
|
||||
if(classDecl.extend != null)
|
||||
buildSuperClass();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user