From 644c75094ec1813d02ed8c1d45a144f796bfdb9a Mon Sep 17 00:00:00 2001 From: Ne_Eo Date: Tue, 3 Sep 2024 02:03:31 +0200 Subject: [PATCH] Added private syntax sugar, custom class fix --- hscript/CustomClassHandler.hx | 5 +++ hscript/Expr.hx | 6 ++-- hscript/Parser.hx | 67 +++++++++++++++++++++++++++++++++-- hscript/Tools.hx | 4 +-- 4 files changed, 74 insertions(+), 8 deletions(-) diff --git a/hscript/CustomClassHandler.hx b/hscript/CustomClassHandler.hx index 9961603..f311fd5 100644 --- a/hscript/CustomClassHandler.hx +++ b/hscript/CustomClassHandler.hx @@ -57,6 +57,11 @@ class CustomClassHandler implements IHScriptCustomConstructor { interp.variables.set(key, value); } } + for(key => value in ogInterp.customClasses) { + if(!disallowCopy.contains(key)) { + interp.customClasses.set(key, value); + } + } //trace("Before: " + [for(key => value in interp.variables) key]); diff --git a/hscript/Expr.hx b/hscript/Expr.hx index 269bc5e..897ab66 100644 --- a/hscript/Expr.hx +++ b/hscript/Expr.hx @@ -56,7 +56,7 @@ enum Expr { #end EConst( c : Const ); EIdent( v : String ); - EVar( n : String, ?t : CType, ?e : Expr, ?isPublic : Bool, ?isStatic : Bool ); + EVar( n : String, ?t : CType, ?e : Expr, ?isPublic : Bool, ?isStatic : Bool, ?isPrivate : Bool ); EParent( e : Expr ); EBlock( e : Array ); EField( e : Expr, f : String , ?safe : Bool ); @@ -68,7 +68,7 @@ enum Expr { EFor( v : String, it : Expr, e : Expr, ?ithv: String); EBreak; EContinue; - EFunction( args : Array, e : Expr, ?name : String, ?ret : CType, ?isPublic : Bool, ?isStatic : Bool, ?isOverride : Bool ); + EFunction( args : Array, e : Expr, ?name : String, ?ret : CType, ?isPublic : Bool, ?isStatic : Bool, ?isOverride : Bool, ?isPrivate : Bool ); EReturn( ?e : Expr ); EArray( e : Expr, index : Expr ); EArrayDecl( e : Array, ?wantedType: CType ); @@ -83,7 +83,7 @@ enum Expr { ECheckType( e : Expr, t : CType ); EImport( c : String, ?asname:String ); - EClass( name:String, fields:Array, ?extend:String, interfaces:Array ); + EClass( name:String, fields:Array, ?extend:String, interfaces:Array, ?isFinal:Bool, ?isPrivate:Bool ); } @:structInit diff --git a/hscript/Parser.hx b/hscript/Parser.hx index b4f6478..e6d3dba 100644 --- a/hscript/Parser.hx +++ b/hscript/Parser.hx @@ -598,6 +598,8 @@ class Parser { var nextIsOverride:Bool = false; var nextIsStatic:Bool = false; var nextIsPublic:Bool = false; + var nextIsPrivate:Bool = false; + var nextIsFinal:Bool = false; var nextType:CType = null; function parseStructure(id, ?oldPos:Int) { #if hscriptPos @@ -647,6 +649,10 @@ class Parser { var str = parseStructure("final"); // override final nextIsOverride = false; str; + case TId("private"): + var str = parseStructure("private"); // override private + nextIsOverride = false; + str; default: unexpected(nextToken); nextIsOverride = false; @@ -676,6 +682,10 @@ class Parser { var str = parseStructure("final"); // static final nextIsStatic = false; str; + case TId("private"): + var str = parseStructure("private"); // static private + nextIsStatic = false; + str; default: unexpected(nextToken); nextIsStatic = false; @@ -705,12 +715,63 @@ class Parser { var str = parseStructure("final"); // public final nextIsPublic = false; str; + case TId("class"): + var str = parseStructure("class"); // public class + nextIsPublic = false; + str; + //case TId("private"): + // var str = parseStructure("private"); // public private + // nextIsPublic = false; + // str; default: unexpected(nextToken); nextIsPublic = false; null; } + case "private": + nextIsPrivate = true; + var nextToken = token(); + switch(nextToken) { + case TId("static"): + var str = parseStructure("static"); // private static + nextIsPrivate = false; + str; + case TId("function"): + var str = parseStructure("function"); // private function + nextIsPrivate = false; + str; + case TId("override"): + var str = parseStructure("override"); // private override + nextIsPrivate = false; + str; + case TId("var"): + var str = parseStructure("var"); // private var + nextIsPrivate = false; + str; + case TId("final"): + var str = parseStructure("final"); // private final + nextIsPrivate = false; + str; + case TId("class"): + var str = parseStructure("class"); // private class + nextIsPrivate = false; + str; + default: + unexpected(nextToken); + nextIsPrivate = false; + null; + } case "var" | "final": + var nextToken = token(); + switch(nextToken) { + case TId("class"): + nextIsFinal = true; + var str = parseStructure("class"); // var class + nextIsFinal = false; + return str; + default: + push(nextToken); + } var ident = getIdent(); var tk = token(); var t = null; @@ -727,7 +788,7 @@ class Parser { else push(tk); nextType = null; - mk(EVar(ident, t, e, nextIsPublic, nextIsStatic), p1, (e == null) ? tokenMax : pmax(e)); + mk(EVar(ident, t, e, nextIsPublic, nextIsStatic, nextIsPrivate), p1, (e == null) ? tokenMax : pmax(e)); case "while": var econd = parseExpr(); var e = parseExpr(); @@ -776,7 +837,7 @@ class Parser { var tk = token(); push(tk); - mk(EFunction(inf.args, inf.body, name, inf.ret, nextIsPublic, nextIsStatic, nextIsOverride),p1,pmax(inf.body)); + mk(EFunction(inf.args, inf.body, name, inf.ret, nextIsPublic, nextIsStatic, nextIsOverride, nextIsPrivate),p1,pmax(inf.body)); case "import": var oldReadPos = readPos; var tk = token(); @@ -917,7 +978,7 @@ class Parser { var tk = token(); push(tk); - mk(EClass(name, fields, extend, interfaces), p1); + mk(EClass(name, fields, extend, interfaces, nextIsFinal, nextIsPrivate), p1); case "return": var tk = token(); diff --git a/hscript/Tools.hx b/hscript/Tools.hx index e2fd52b..2cab09f 100644 --- a/hscript/Tools.hx +++ b/hscript/Tools.hx @@ -66,7 +66,7 @@ class Tools { public static function map( e : Expr, f : Expr -> Expr ) { var edef = switch( expr(e) ) { case EConst(_), EIdent(_), EBreak, EContinue: expr(e); - case EVar(n, t, e): EVar(n, t, if( e != null ) f(e) else null); + case EVar(n, t, e, isPublic, isStatic, isPrivate): EVar(n, t, if( e != null ) f(e) else null, isPublic, isStatic, isPrivate); case EParent(e): EParent(f(e)); case EBlock(el): EBlock([for( e in el ) f(e)]); case EField(e, fi): EField(f(e),fi); @@ -77,7 +77,7 @@ class Tools { case EWhile(c, e): EWhile(f(c),f(e)); case EDoWhile(c, e): EDoWhile(f(c),f(e)); case EFor(v, it, e): EFor(v, f(it), f(e)); - case EFunction(args, e, name, t): EFunction(args, f(e), name, t); + case EFunction(args, e, name, t, isPublic, isStatic, isOverride, isPrivate): EFunction(args, f(e), name, t, isPublic, isStatic, isOverride, isPrivate); case EReturn(e): EReturn(if( e != null ) f(e) else null); case EArray(e, i): EArray(f(e),f(i)); case EArrayDecl(el): EArrayDecl([for( e in el ) f(e)]);