From 0a64bca9ce8414d51a011b3ebea5445c0ccdbc8b Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Fri, 31 Mar 2023 21:41:34 +0200 Subject: [PATCH] custom class progress --- hscript/CustomClassHandler.hx | 25 +++++++++++++ hscript/Expr.hx | 1 + hscript/Interp.hx | 68 ++++++++++++++++------------------- hscript/Printer.hx | 1 + 4 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 hscript/CustomClassHandler.hx diff --git a/hscript/CustomClassHandler.hx b/hscript/CustomClassHandler.hx new file mode 100644 index 0000000..ebedaa4 --- /dev/null +++ b/hscript/CustomClassHandler.hx @@ -0,0 +1,25 @@ +package hscript; + +class CustomClassHandler implements IHScriptCustomConstructor { + public var ogInterp:Interp; + public var name:String; + public var fields:Array; + public var extend:String; + public var interfaces:Array; + + public function new(ogInterp:Interp, name:String, fields:Array, ?extend:String, ?interfaces:Array) { + this.ogInterp = ogInterp; + this.name = name; + this.fields = fields; + this.extend = extend; + this.interfaces = interfaces; + } + + public function hnew(args:Array):Dynamic { + return name; // TODO!!! only for testing here + } + + public function toString():String { + return name; + } +} \ No newline at end of file diff --git a/hscript/Expr.hx b/hscript/Expr.hx index edf2903..671a4af 100644 --- a/hscript/Expr.hx +++ b/hscript/Expr.hx @@ -121,6 +121,7 @@ enum Error { EInvalidAccess( f : String ); ECustom( msg : String ); EInvalidClass( className : String); + EAlreadyExistingClass( className : String); } diff --git a/hscript/Interp.hx b/hscript/Interp.hx index cdb0386..c28772b 100644 --- a/hscript/Interp.hx +++ b/hscript/Interp.hx @@ -52,6 +52,7 @@ class Interp { public var errorHandler:Error->Void; public var importFailedCallback:Array->Bool; #if haxe3 + public var customClasses:Map; public var variables:Map; public var publicVariables:Map; public var staticVariables:Map; @@ -59,6 +60,7 @@ class Interp { var locals:Map; var binops:MapExpr->Dynamic>; #else + public var customClasses:Hash; public var variables:Hash; public var publicVariables:Hash; public var staticVariables:Hash; @@ -101,10 +103,12 @@ class Interp { private function resetVariables() { #if haxe3 + customClasses = new Map(); variables = new Map(); publicVariables = new Map(); staticVariables = new Map(); #else + customClasses = new Hash(); variables = new Hash(); publicVariables = new Hash(); staticVariables = new Hash(); @@ -174,6 +178,7 @@ class Interp { assignOp("<<=", function(v1, v2) return v1 << v2); assignOp(">>=", function(v1, v2) return v1 >> v2); assignOp(">>>=", function(v1, v2) return v1 >>> v2); + assignOp("is", function(v1, v2) return Std.isOfType(v1, v2)); } function setVar(name:String, v:Dynamic) { @@ -407,36 +412,32 @@ class Interp { } function resolve(id:String, doException:Bool = true):Dynamic { + id = StringTools.trim(id); var l = locals.get(id); if (l != null) return l.r; var v = variables.get(id); - // !publicVariables.exists(id) - if (staticVariables.exists(id)) { - return staticVariables.get(id); - } else if (publicVariables.exists(id)) { - return publicVariables.get(id); - } else if (variables.exists(id)) { - return variables.get(id); - } else { - if (scriptObject != null) { - // search in object - if (id == "this") { - return scriptObject; - } else if ((Type.typeof(scriptObject) == TObject) && Reflect.hasField(scriptObject, id)) { - return Reflect.field(scriptObject, id); - } else { - if (__instanceFields.contains(id)) { - return Reflect.getProperty(scriptObject, id); - } else if (__instanceFields.contains('get_$id')) { // getter - return Reflect.getProperty(scriptObject, 'get_$id')(); - } + for(map in [customClasses, staticVariables, publicVariables, variables]) + if (map.exists(id)) + return map[id]; + + if (scriptObject != null) { + // search in object + if (id == "this") { + return scriptObject; + } else if ((Type.typeof(scriptObject) == TObject) && Reflect.hasField(scriptObject, id)) { + return Reflect.field(scriptObject, id); + } else { + if (__instanceFields.contains(id)) { + return Reflect.getProperty(scriptObject, id); + } else if (__instanceFields.contains('get_$id')) { // getter + return Reflect.getProperty(scriptObject, 'get_$id')(); } } - if (doException) - error(EUnknownVariable(id)); } + if (doException) + error(EUnknownVariable(id)); return v; } @@ -448,10 +449,12 @@ class Interp { switch (e) { case EClass(name, fields, extend, interfaces): trace(fields); - //trace(Printer.toString(fields)); for(field in fields) { trace(Printer.toString(field)); } + if (customClasses.exists(name)) + error(EAlreadyExistingClass(name)); + customClasses.set(name, new CustomClassHandler(this, name, fields, extend, interfaces)); case EImport(c): if (!importEnabled) return null; @@ -965,24 +968,13 @@ class Interp { function cnew(cl:String, args:Array):Dynamic { var cl:String = cast cl; - var c = Type.resolveClass(cl); - if (c == null) { - c = resolve(cl); - - //if ((c is TemplateClassGenerator)) { - // return Reflect.callMethod(c, c._hnew, args); - //} - } - return Type.createInstance(c, args); + var c:Dynamic = resolve(cl); + if (c == null) + c = Type.resolveClass(cl); + return (c is IHScriptCustomConstructor) ? cast(c, IHScriptCustomConstructor).hnew(args) : Type.createInstance(c, args); } } class TemplateClass { -} - -class TemplateClassGenerator { - function _hnew() { - - } } \ No newline at end of file diff --git a/hscript/Printer.hx b/hscript/Printer.hx index 856c1be..bd9d481 100644 --- a/hscript/Printer.hx +++ b/hscript/Printer.hx @@ -359,6 +359,7 @@ class Printer { case EInvalidAccess(f): "Invalid access to field " + f; case ECustom(msg): msg; case EInvalidClass(cla): "Invalid class: " + cla + " was not found."; + case EAlreadyExistingClass(cla): 'Custom Class named $cla already exists.'; }; #if hscriptPos return e.origin + ":" + e.line + ": " + message;