final classes + improved custom class aliases

This commit is contained in:
Jaime Humberto Macias Bustamante
2025-07-17 14:46:12 -07:00
parent 4f13f07071
commit 5232f069fb
3 changed files with 24 additions and 9 deletions
+9 -3
View File
@@ -10,6 +10,7 @@ class CustomClassHandler implements IHScriptCustomConstructor implements IHScrip
public var fields:Array<Expr>;
public var extend:Null<String>;
public var interfaces:Array<String>;
public final isFinal:Bool;
public var cl:Dynamic;
@@ -18,16 +19,21 @@ class CustomClassHandler implements IHScriptCustomConstructor implements IHScrip
public var __allowSetGet:Bool = true;
public function new(ogInterp:Interp, name:String, fields:Array<Expr>, ?extend:String, ?interfaces:Array<String>) {
public function new(ogInterp:Interp, name:String, fields:Array<Expr>, ?extend:String, ?interfaces:Array<String>, ?isFinal:Bool) {
this.ogInterp = ogInterp;
this.name = name;
this.fields = fields;
this.extend = extend;
this.interfaces = interfaces;
this.isFinal = isFinal != null ? isFinal : false;
if(extend != null) {
if(ogInterp.customClasses.exists(extend))
this.cl = ogInterp.customClasses.get(extend);
if(ogInterp.customClasses.exists(extend)) {
var customCls:CustomClassHandler = ogInterp.customClasses.get(extend);
if(customCls.isFinal)
ogInterp.error(ECustom('Cannot extend a final class'));
this.cl = customCls;
}
else
this.cl = Type.resolveClass('${extend}_HSX');
+11 -5
View File
@@ -702,9 +702,10 @@ class Interp {
var e = e.e;
#end
switch (e) {
case EClass(name, fields, extend, interfaces):
var hasAlias:Bool = (setAlias != null && beforeAlias == name);
var toSetName:String = hasAlias ? setAlias : name;
case EClass(name, fields, extend, interfaces, isFinal):
var oldName:String = name;
var hasAlias:Bool = (setAlias != null && beforeAlias == oldName);
var toSetName:String = hasAlias ? setAlias : oldName;
if (customClasses.exists(toSetName))
error(EAlreadyExistingClass(toSetName));
@@ -715,8 +716,13 @@ class Interp {
final variable:Class<Any> = variables.exists(thing) ? cast variables.get(thing) : null;
return variable == null ? thing : Type.getClassName(variable);
}
customClasses.set(toSetName, new CustomClassHandler(this, name, fields, importVar(extend), [for (i in interfaces) importVar(i)]));
if(hasAlias) setAlias = null;
var cls:CustomClassHandler = new CustomClassHandler(this, oldName, fields, importVar(extend), [for (i in interfaces) importVar(i)], isFinal);
customClasses.set(toSetName, cls);
if(hasAlias) {
customClasses.set(oldName, cls); // Allow usage in the same module
beforeAlias = null;
setAlias = null;
}
case EImport(c, n, isUsing):
if (!importEnabled)
return null;
+4 -1
View File
@@ -120,7 +120,10 @@ class Printer {
add('${u ? 'using' : 'import'} $c');
if(n != null)
add(' as $n');
case EClass(name, fields, extend, interfaces):
case EClass(name, fields, extend, interfaces, fnal):
var isFinal = fnal != null && fnal;
if(isFinal)
add('final ');
add('class $name');
if (extend != null)
add(' extends $extend');