From 7e70dc4ff3552ffb7d12649513e74c60e498026f Mon Sep 17 00:00:00 2001 From: ahmed7p Date: Tue, 3 Nov 2026 19:02:52 +0300 Subject: [PATCH] Support resolving class constructors using Class.new --- polymod/hscript/_internal/Expr.hx | 1 + polymod/hscript/_internal/Interp.hx | 16 ++++++++++++++++ polymod/hscript/_internal/Printer.hx | 1 + 3 files changed, 18 insertions(+) diff --git a/polymod/hscript/_internal/Expr.hx b/polymod/hscript/_internal/Expr.hx index 926178d0..d04caf96 100644 --- a/polymod/hscript/_internal/Expr.hx +++ b/polymod/hscript/_internal/Expr.hx @@ -192,6 +192,7 @@ enum Error EConflictingAccessModifier(access:String); EInvalidVariableAccessor(access:String); EInvalidStaticLocalInit(name:String, reason:String); + EInvalidConstructorCall(clsName:String); // Fallback error type. ECustom(msg:String); } diff --git a/polymod/hscript/_internal/Interp.hx b/polymod/hscript/_internal/Interp.hx index 42e2dc84..8d75f0ea 100644 --- a/polymod/hscript/_internal/Interp.hx +++ b/polymod/hscript/_internal/Interp.hx @@ -437,6 +437,12 @@ class Interp checkTypeForDeprecation(oScriptCls); checkFieldForDeprecation(oScriptCls, f); + if (f == "new" && (o is Class || o is PolymodStaticClassReference)) + { + var clsName = o is Class ? Type.getClassName(o) : cast(o, PolymodStaticClassReference).getFullyQualifiedName(); + return error(EInvalidConstructorCall(clsName)); + } + if (Std.isOfType(o, PolymodStaticAbstractReference)) { var ref:PolymodStaticAbstractReference = cast(o, PolymodStaticAbstractReference); @@ -3894,6 +3900,16 @@ class Interp } } + if (f == "new" && (o is Class || o is PolymodStaticClassReference)) + { + return Reflect.makeVarArgs((args:Array) -> { + if (o is Class) + return Type.createInstance(cast o, args); + else + return cast(o, PolymodStaticClassReference).instantiate(args); + }); + } + #if html5 if (o == Math) { diff --git a/polymod/hscript/_internal/Printer.hx b/polymod/hscript/_internal/Printer.hx index b77159f4..d8a18670 100644 --- a/polymod/hscript/_internal/Printer.hx +++ b/polymod/hscript/_internal/Printer.hx @@ -774,6 +774,7 @@ class Printer case EConflictingAccessModifier(access): 'Conflicting access modifier "$access"'; case EInvalidVariableAccessor(access): 'Invalid modifier: "$access" on variable'; case EInvalidStaticLocalInit(name, reason): 'Cannot initialize static variable "${name}": $reason'; + case EInvalidConstructorCall(clsName): 'Invalid constructor call, use "new ${clsName}()" instead'; case ECustom(msg): msg; }; #if hscriptPos