From 0a410e2e6a6bb4be96e50a757a586c044b61614e Mon Sep 17 00:00:00 2001 From: HackDev <80620538+Hackx2@users.noreply.github.com> Date: Tue, 25 Nov 2025 19:31:52 +0000 Subject: [PATCH 1/7] Context variables improvements. --- docs/context.md | 4 +- rulescript/Context.hx | 32 ++++++------- rulescript/interps/RuleScriptInterp.hx | 47 +++++++++++-------- .../types/context/EVariableDeclarations.hx | 6 +++ .../types/context/EVariableModifiers.hx | 6 +++ 5 files changed, 56 insertions(+), 39 deletions(-) create mode 100644 rulescript/types/context/EVariableDeclarations.hx create mode 100644 rulescript/types/context/EVariableModifiers.hx diff --git a/docs/context.md b/docs/context.md index 7d77995..f689622 100644 --- a/docs/context.md +++ b/docs/context.md @@ -22,9 +22,7 @@ - `types` - Stores all previously `defined` types. -- `publicVariables` - **Public** variables, each entry in this array is added using the meta `@:contextValue('public')`, or the keyword `public`. - -- `staticVariables` - **Static** variables, each entry in this array is added using the meta `@:contextValue('static')`, or the keyword `static`. +- `variables` - **Public** & **Static** variables, each entry in this array is added using the meta `@:contextValue('public')`, or the keyword `public`. --- diff --git a/rulescript/Context.hx b/rulescript/Context.hx index f76d710..7a6320b 100644 --- a/rulescript/Context.hx +++ b/rulescript/Context.hx @@ -1,8 +1,10 @@ package rulescript; -import rulescript.scriptedClass.RuleScriptedClass.ScriptedClass; import rulescript.types.ScriptedAbstract; import rulescript.types.ScriptedType; +import rulescript.scriptedClass.RuleScriptedClass.ScriptedClass; +import rulescript.types.context.EVariableModifiers; +import rulescript.types.context.EVariableDeclarations; /** * The Context stores types to preserve repeated imports, @@ -10,39 +12,33 @@ import rulescript.types.ScriptedType; * * All script types automatically inherit the Context. */ -class Context -{ +class Context { public var types:Map = []; + public var variables:Map = []; - public var publicVariables:Map = []; - public var staticVariables:Map = []; + @:deprecated public var publicVariables(default, never):Map = []; + @:deprecated public var staticVariables(default, never):Map = []; public function new() {} - public function reset():Void - { + public function reset():Void { types = []; resetVariables(); } - public function resetVariables():Void - { - publicVariables = []; // yuhuh -orbl - staticVariables = []; + public function resetVariables():Void { + variables = []; // yuhuh -orbl } - public function resolveType(path:String):Dynamic - { + public function resolveType(path:String):Dynamic { if (types.exists(path)) return types[path]; - else - { + else { final t:Dynamic = Tools.resolveType(path, this); if (t is ScriptedType) - switch (cast(t, ScriptedType).__rulescript_type) - { + switch (cast(t, ScriptedType).__rulescript_type) { case CLASS: @:privateAccess cast(t, ScriptedClass).interp.access.context = this; case ABSTRACT: @@ -54,3 +50,5 @@ class Context }; } } + +typedef ContextVariable = {modifier:EVariableModifiers, declaration:EVariableDeclarations, value:Dynamic, ?parent:String}; diff --git a/rulescript/interps/RuleScriptInterp.hx b/rulescript/interps/RuleScriptInterp.hx index fc340dd..05be777 100644 --- a/rulescript/interps/RuleScriptInterp.hx +++ b/rulescript/interps/RuleScriptInterp.hx @@ -11,6 +11,8 @@ import rulescript.types.ScriptedEnum; import rulescript.types.ScriptedType; import rulescript.types.ScriptedTypeUtil; import rulescript.types.ScriptedTypedef; +import rulescript.types.context.EVariableModifiers; +import rulescript.types.context.EVariableDeclarations; using rulescript.Tools; @@ -96,13 +98,8 @@ class RuleScriptInterp extends hscript.Interp implements IInterp v = get(superInstance, id); // SHARED VARIABLES - if (v == null && context != null) - { - if (context.staticVariables.exists(id)) - v = context.staticVariables.get(id); - if (context.publicVariables.exists(id)) - v = context.publicVariables.get(id); - } + if (v == null && context != null && context.variables.exists(id)) + v = context.variables.get(id).value; if (v == null) error(EUnknownVariable(id)); // fixes - orbl @@ -151,10 +148,13 @@ class RuleScriptInterp extends hscript.Interp implements IInterp { if (superInstance != null && (superFields.contains(name) || superFields.contains('set_' + name))) Reflect.setProperty(superInstance, name, v); - else if (context != null && context.staticVariables.exists(name)) - context.staticVariables.set(name, v); - else if (context != null && context.publicVariables.exists(name)) - context.publicVariables.set(name, v); + else if (context != null && context.variables.exists(name)) { + final cv:rulescript.Context.ContextVariable = context.variables.get(name); + #if !DISABLE_OVERRIDABLE_RULESCRIPT_FINALS + if (cv.declaration == FINAL && cv.parent != scriptName) + error(ECustom('$name: Unable to override final variable defined by another script.')); + else #end context.variables.set(name, {modifier: cv.modifier, declaration:cv.declaration, value: v, parent: scriptName}); + } else { var lastValue = variables.get(name); @@ -242,7 +242,7 @@ class RuleScriptInterp extends hscript.Interp implements IInterp if ((!locals.exists(id) && !variables.exists(id)) && (!superFields.contains(id) && !superFields.contains('get_$id')) - && (context == null || !context.staticVariables.exists(id) && !context.publicVariables.exists(id))) + && (context == null || !context.variables.exists(id))) { final typePath:String = path.join('.'); @@ -278,14 +278,14 @@ class RuleScriptInterp extends hscript.Interp implements IInterp return switch (n) { case ':contextValue' if (context != null): - var isFunction:Bool = false; - + var isFunction:Bool = false, isFinal:Bool = false; final n:Null = switch (Tools.getExpr(e)) { case EFunction(_, _, n): isFunction = true; n; - case EProp(n, _), EVar(n, _): n; + case EProp(n, _): n; + case EVar(n, _,_,_,f): isFinal = f; n; default: null; }; @@ -293,13 +293,22 @@ class RuleScriptInterp extends hscript.Interp implements IInterp if (isFunction && depth == 0) { - return (isStatic ? context.staticVariables : context.publicVariables)[n] = this.expr(e); + return context.variables[n] = { + value: this.expr(e), + declaration: isFinal ? EVariableDeclarations.FINAL : EVariableDeclarations.VAR, + modifier: isStatic ? EVariableModifiers.STATIC : EVariableModifiers.PUBLIC, + parent: scriptName + }; } else if (depth == 0) { this.expr(e); - - (isStatic ? context.staticVariables : context.publicVariables).set(n, resolve(n)); + context.variables.set(n, { + value: resolve(n), + declaration: isFinal ? EVariableDeclarations.FINAL : EVariableDeclarations.VAR, + modifier: isStatic ? EVariableModifiers.STATIC : EVariableModifiers.PUBLIC, + parent: scriptName + }); } else { @@ -314,7 +323,7 @@ class RuleScriptInterp extends hscript.Interp implements IInterp case EVar(n, _, e, global, _): if (global) { - if (context == null || (!context.staticVariables.exists(n) && !context.publicVariables.exists(n))) + if (context == null || !context.variables.exists(n)) variables.set(n, (e == null) ? null : this.expr(e)); } else diff --git a/rulescript/types/context/EVariableDeclarations.hx b/rulescript/types/context/EVariableDeclarations.hx new file mode 100644 index 0000000..16155f7 --- /dev/null +++ b/rulescript/types/context/EVariableDeclarations.hx @@ -0,0 +1,6 @@ +package rulescript.types.context; + +enum EVariableDeclarations { + FINAL; + VAR; +} diff --git a/rulescript/types/context/EVariableModifiers.hx b/rulescript/types/context/EVariableModifiers.hx new file mode 100644 index 0000000..7dbc0b3 --- /dev/null +++ b/rulescript/types/context/EVariableModifiers.hx @@ -0,0 +1,6 @@ +package rulescript.types.context; + +enum EVariableModifiers { + PUBLIC; + STATIC; +} \ No newline at end of file From 6cd9f27092ef19cfc4c4db0bf95590bd6134d4bd Mon Sep 17 00:00:00 2001 From: HackDev <80620538+Hackx2@users.noreply.github.com> Date: Tue, 25 Nov 2025 19:34:09 +0000 Subject: [PATCH 2/7] changelog fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea09b8a..8826620 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Reworked shared variables. (see [#36](https://github.com/Kriptel/RuleScript/pull/36)) - Wildcard import. - ScriptedModule. - Shared variables between interps. (see [#29](https://github.com/Kriptel/RuleScript/pull/29)) From 7d41ae3ba16eaa88381f9834fd9bba7c7bade176 Mon Sep 17 00:00:00 2001 From: HackDev <80620538+Hackx2@users.noreply.github.com> Date: Tue, 25 Nov 2025 21:52:32 +0000 Subject: [PATCH 3/7] Use variable instead. --- rulescript/Context.hx | 1 + rulescript/interps/RuleScriptInterp.hx | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rulescript/Context.hx b/rulescript/Context.hx index 7a6320b..6cd0c33 100644 --- a/rulescript/Context.hx +++ b/rulescript/Context.hx @@ -15,6 +15,7 @@ import rulescript.types.context.EVariableDeclarations; class Context { public var types:Map = []; public var variables:Map = []; + public var overridableFinals:Bool = true; @:deprecated public var publicVariables(default, never):Map = []; @:deprecated public var staticVariables(default, never):Map = []; diff --git a/rulescript/interps/RuleScriptInterp.hx b/rulescript/interps/RuleScriptInterp.hx index 05be777..1d1cf89 100644 --- a/rulescript/interps/RuleScriptInterp.hx +++ b/rulescript/interps/RuleScriptInterp.hx @@ -150,10 +150,9 @@ class RuleScriptInterp extends hscript.Interp implements IInterp Reflect.setProperty(superInstance, name, v); else if (context != null && context.variables.exists(name)) { final cv:rulescript.Context.ContextVariable = context.variables.get(name); - #if !DISABLE_OVERRIDABLE_RULESCRIPT_FINALS - if (cv.declaration == FINAL && cv.parent != scriptName) + if (context.overridableFinals && cv.declaration == FINAL && cv.parent != scriptName) error(ECustom('$name: Unable to override final variable defined by another script.')); - else #end context.variables.set(name, {modifier: cv.modifier, declaration:cv.declaration, value: v, parent: scriptName}); + else context.variables.set(name, {modifier: cv.modifier, declaration:cv.declaration, value: v, parent: scriptName}); } else { From 88e6893addca8e374e10660bc65c2edba954821a Mon Sep 17 00:00:00 2001 From: HackDev <80620538+Hackx2@users.noreply.github.com> Date: Wed, 26 Nov 2025 00:29:17 +0000 Subject: [PATCH 4/7] remove `overridableFinals` --- rulescript/Context.hx | 1 - rulescript/interps/RuleScriptInterp.hx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/rulescript/Context.hx b/rulescript/Context.hx index 6cd0c33..7a6320b 100644 --- a/rulescript/Context.hx +++ b/rulescript/Context.hx @@ -15,7 +15,6 @@ import rulescript.types.context.EVariableDeclarations; class Context { public var types:Map = []; public var variables:Map = []; - public var overridableFinals:Bool = true; @:deprecated public var publicVariables(default, never):Map = []; @:deprecated public var staticVariables(default, never):Map = []; diff --git a/rulescript/interps/RuleScriptInterp.hx b/rulescript/interps/RuleScriptInterp.hx index 1d1cf89..44f9dae 100644 --- a/rulescript/interps/RuleScriptInterp.hx +++ b/rulescript/interps/RuleScriptInterp.hx @@ -150,7 +150,7 @@ class RuleScriptInterp extends hscript.Interp implements IInterp Reflect.setProperty(superInstance, name, v); else if (context != null && context.variables.exists(name)) { final cv:rulescript.Context.ContextVariable = context.variables.get(name); - if (context.overridableFinals && cv.declaration == FINAL && cv.parent != scriptName) + if (cv.declaration == FINAL && cv.parent != scriptName) error(ECustom('$name: Unable to override final variable defined by another script.')); else context.variables.set(name, {modifier: cv.modifier, declaration:cv.declaration, value: v, parent: scriptName}); } From a88593c5385ab8ad752c9a070ef5f9ec0975a0c5 Mon Sep 17 00:00:00 2001 From: HackDev <80620538+Hackx2@users.noreply.github.com> Date: Sat, 29 Nov 2025 16:56:09 +0000 Subject: [PATCH 5/7] oops --- docs/context.md | 4 +- rulescript/Context.hx | 16 ++++---- rulescript/interps/RuleScriptInterp.hx | 41 ++++++++++--------- .../types/context/EVariableModifiers.hx | 6 --- rulescript/types/context/TContextVariable.hx | 3 ++ 5 files changed, 35 insertions(+), 35 deletions(-) delete mode 100644 rulescript/types/context/EVariableModifiers.hx create mode 100644 rulescript/types/context/TContextVariable.hx diff --git a/docs/context.md b/docs/context.md index f689622..7d77995 100644 --- a/docs/context.md +++ b/docs/context.md @@ -22,7 +22,9 @@ - `types` - Stores all previously `defined` types. -- `variables` - **Public** & **Static** variables, each entry in this array is added using the meta `@:contextValue('public')`, or the keyword `public`. +- `publicVariables` - **Public** variables, each entry in this array is added using the meta `@:contextValue('public')`, or the keyword `public`. + +- `staticVariables` - **Static** variables, each entry in this array is added using the meta `@:contextValue('static')`, or the keyword `static`. --- diff --git a/rulescript/Context.hx b/rulescript/Context.hx index 7a6320b..b24046d 100644 --- a/rulescript/Context.hx +++ b/rulescript/Context.hx @@ -3,8 +3,8 @@ package rulescript; import rulescript.types.ScriptedAbstract; import rulescript.types.ScriptedType; import rulescript.scriptedClass.RuleScriptedClass.ScriptedClass; -import rulescript.types.context.EVariableModifiers; import rulescript.types.context.EVariableDeclarations; +import rulescript.types.context.TContextVariable; /** * The Context stores types to preserve repeated imports, @@ -14,10 +14,9 @@ import rulescript.types.context.EVariableDeclarations; */ class Context { public var types:Map = []; - public var variables:Map = []; - - @:deprecated public var publicVariables(default, never):Map = []; - @:deprecated public var staticVariables(default, never):Map = []; + + public var publicVariables:Map = new Map(); + public var staticVariables:Map = new Map(); public function new() {} @@ -28,7 +27,8 @@ class Context { } public function resetVariables():Void { - variables = []; // yuhuh -orbl + staticVariables = []; // yuhuh -orbl + publicVariables = []; } public function resolveType(path:String):Dynamic { @@ -49,6 +49,4 @@ class Context { return types[path] = t; }; } -} - -typedef ContextVariable = {modifier:EVariableModifiers, declaration:EVariableDeclarations, value:Dynamic, ?parent:String}; +} \ No newline at end of file diff --git a/rulescript/interps/RuleScriptInterp.hx b/rulescript/interps/RuleScriptInterp.hx index 44f9dae..9258c81 100644 --- a/rulescript/interps/RuleScriptInterp.hx +++ b/rulescript/interps/RuleScriptInterp.hx @@ -11,8 +11,8 @@ import rulescript.types.ScriptedEnum; import rulescript.types.ScriptedType; import rulescript.types.ScriptedTypeUtil; import rulescript.types.ScriptedTypedef; -import rulescript.types.context.EVariableModifiers; import rulescript.types.context.EVariableDeclarations; +import rulescript.types.context.TContextVariable; using rulescript.Tools; @@ -98,8 +98,12 @@ class RuleScriptInterp extends hscript.Interp implements IInterp v = get(superInstance, id); // SHARED VARIABLES - if (v == null && context != null && context.variables.exists(id)) - v = context.variables.get(id).value; + if (v == null && context != null) { + if (context.publicVariables.exists(id)) + v = context.publicVariables.get(id).value; + else if (context.staticVariables.exists(id)) + v = context.staticVariables.get(id).value; + } if (v == null) error(EUnknownVariable(id)); // fixes - orbl @@ -143,19 +147,18 @@ class RuleScriptInterp extends hscript.Interp implements IInterp } return v; } - - override function setVar(name:String, v:Dynamic) - { + override function setVar(name:String, v:Dynamic) { if (superInstance != null && (superFields.contains(name) || superFields.contains('set_' + name))) Reflect.setProperty(superInstance, name, v); - else if (context != null && context.variables.exists(name)) { - final cv:rulescript.Context.ContextVariable = context.variables.get(name); - if (cv.declaration == FINAL && cv.parent != scriptName) + else if (context != null && (context.staticVariables.exists(name) || context.publicVariables.exists(name))) { + final vg:Map = context.staticVariables.exists(name) ? context.staticVariables : context.publicVariables; + final cv:TContextVariable = vg.get(name); + if (cv.declaration == FINAL && cv.parent != scriptName) { error(ECustom('$name: Unable to override final variable defined by another script.')); - else context.variables.set(name, {modifier: cv.modifier, declaration:cv.declaration, value: v, parent: scriptName}); - } - else - { + } else { + vg.set(name, {declaration: cv.declaration, value: v, parent: scriptName}); + } + } else { var lastValue = variables.get(name); if (lastValue is Property) @@ -241,7 +244,7 @@ class RuleScriptInterp extends hscript.Interp implements IInterp if ((!locals.exists(id) && !variables.exists(id)) && (!superFields.contains(id) && !superFields.contains('get_$id')) - && (context == null || !context.variables.exists(id))) + && (context == null || !context.publicVariables.exists(id) || context.staticVariables.exists(id))) { final typePath:String = path.join('.'); @@ -292,20 +295,20 @@ class RuleScriptInterp extends hscript.Interp implements IInterp if (isFunction && depth == 0) { - return context.variables[n] = { + (isStatic ? context.staticVariables : context.publicVariables)[n] = { value: this.expr(e), declaration: isFinal ? EVariableDeclarations.FINAL : EVariableDeclarations.VAR, - modifier: isStatic ? EVariableModifiers.STATIC : EVariableModifiers.PUBLIC, parent: scriptName }; + + return (isStatic ? context.staticVariables : context.publicVariables)[n]; } else if (depth == 0) { this.expr(e); - context.variables.set(n, { + (isStatic ? context.staticVariables : context.publicVariables).set(n, { value: resolve(n), declaration: isFinal ? EVariableDeclarations.FINAL : EVariableDeclarations.VAR, - modifier: isStatic ? EVariableModifiers.STATIC : EVariableModifiers.PUBLIC, parent: scriptName }); } @@ -322,7 +325,7 @@ class RuleScriptInterp extends hscript.Interp implements IInterp case EVar(n, _, e, global, _): if (global) { - if (context == null || !context.variables.exists(n)) + if (context == null || (!context.staticVariables.exists(n) || !context.publicVariables.exists(n))) variables.set(n, (e == null) ? null : this.expr(e)); } else diff --git a/rulescript/types/context/EVariableModifiers.hx b/rulescript/types/context/EVariableModifiers.hx deleted file mode 100644 index 7dbc0b3..0000000 --- a/rulescript/types/context/EVariableModifiers.hx +++ /dev/null @@ -1,6 +0,0 @@ -package rulescript.types.context; - -enum EVariableModifiers { - PUBLIC; - STATIC; -} \ No newline at end of file diff --git a/rulescript/types/context/TContextVariable.hx b/rulescript/types/context/TContextVariable.hx new file mode 100644 index 0000000..0c9aa67 --- /dev/null +++ b/rulescript/types/context/TContextVariable.hx @@ -0,0 +1,3 @@ +package rulescript.types.context; + +typedef TContextVariable = {declaration:EVariableDeclarations, value:Dynamic, ?parent:String}; From e8a7cdb05677085419c0bd89c36829adacc14f55 Mon Sep 17 00:00:00 2001 From: HackDev <80620538+Hackx2@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:42:45 +0000 Subject: [PATCH 6/7] Revert "oops" This reverts commit a88593c5385ab8ad752c9a070ef5f9ec0975a0c5. --- docs/context.md | 4 +- rulescript/Context.hx | 16 ++++---- rulescript/interps/RuleScriptInterp.hx | 41 +++++++++---------- .../types/context/EVariableModifiers.hx | 6 +++ rulescript/types/context/TContextVariable.hx | 3 -- 5 files changed, 35 insertions(+), 35 deletions(-) create mode 100644 rulescript/types/context/EVariableModifiers.hx delete mode 100644 rulescript/types/context/TContextVariable.hx diff --git a/docs/context.md b/docs/context.md index 7d77995..f689622 100644 --- a/docs/context.md +++ b/docs/context.md @@ -22,9 +22,7 @@ - `types` - Stores all previously `defined` types. -- `publicVariables` - **Public** variables, each entry in this array is added using the meta `@:contextValue('public')`, or the keyword `public`. - -- `staticVariables` - **Static** variables, each entry in this array is added using the meta `@:contextValue('static')`, or the keyword `static`. +- `variables` - **Public** & **Static** variables, each entry in this array is added using the meta `@:contextValue('public')`, or the keyword `public`. --- diff --git a/rulescript/Context.hx b/rulescript/Context.hx index b24046d..7a6320b 100644 --- a/rulescript/Context.hx +++ b/rulescript/Context.hx @@ -3,8 +3,8 @@ package rulescript; import rulescript.types.ScriptedAbstract; import rulescript.types.ScriptedType; import rulescript.scriptedClass.RuleScriptedClass.ScriptedClass; +import rulescript.types.context.EVariableModifiers; import rulescript.types.context.EVariableDeclarations; -import rulescript.types.context.TContextVariable; /** * The Context stores types to preserve repeated imports, @@ -14,9 +14,10 @@ import rulescript.types.context.TContextVariable; */ class Context { public var types:Map = []; - - public var publicVariables:Map = new Map(); - public var staticVariables:Map = new Map(); + public var variables:Map = []; + + @:deprecated public var publicVariables(default, never):Map = []; + @:deprecated public var staticVariables(default, never):Map = []; public function new() {} @@ -27,8 +28,7 @@ class Context { } public function resetVariables():Void { - staticVariables = []; // yuhuh -orbl - publicVariables = []; + variables = []; // yuhuh -orbl } public function resolveType(path:String):Dynamic { @@ -49,4 +49,6 @@ class Context { return types[path] = t; }; } -} \ No newline at end of file +} + +typedef ContextVariable = {modifier:EVariableModifiers, declaration:EVariableDeclarations, value:Dynamic, ?parent:String}; diff --git a/rulescript/interps/RuleScriptInterp.hx b/rulescript/interps/RuleScriptInterp.hx index 9258c81..44f9dae 100644 --- a/rulescript/interps/RuleScriptInterp.hx +++ b/rulescript/interps/RuleScriptInterp.hx @@ -11,8 +11,8 @@ import rulescript.types.ScriptedEnum; import rulescript.types.ScriptedType; import rulescript.types.ScriptedTypeUtil; import rulescript.types.ScriptedTypedef; +import rulescript.types.context.EVariableModifiers; import rulescript.types.context.EVariableDeclarations; -import rulescript.types.context.TContextVariable; using rulescript.Tools; @@ -98,12 +98,8 @@ class RuleScriptInterp extends hscript.Interp implements IInterp v = get(superInstance, id); // SHARED VARIABLES - if (v == null && context != null) { - if (context.publicVariables.exists(id)) - v = context.publicVariables.get(id).value; - else if (context.staticVariables.exists(id)) - v = context.staticVariables.get(id).value; - } + if (v == null && context != null && context.variables.exists(id)) + v = context.variables.get(id).value; if (v == null) error(EUnknownVariable(id)); // fixes - orbl @@ -147,18 +143,19 @@ class RuleScriptInterp extends hscript.Interp implements IInterp } return v; } - override function setVar(name:String, v:Dynamic) { + + override function setVar(name:String, v:Dynamic) + { if (superInstance != null && (superFields.contains(name) || superFields.contains('set_' + name))) Reflect.setProperty(superInstance, name, v); - else if (context != null && (context.staticVariables.exists(name) || context.publicVariables.exists(name))) { - final vg:Map = context.staticVariables.exists(name) ? context.staticVariables : context.publicVariables; - final cv:TContextVariable = vg.get(name); - if (cv.declaration == FINAL && cv.parent != scriptName) { + else if (context != null && context.variables.exists(name)) { + final cv:rulescript.Context.ContextVariable = context.variables.get(name); + if (cv.declaration == FINAL && cv.parent != scriptName) error(ECustom('$name: Unable to override final variable defined by another script.')); - } else { - vg.set(name, {declaration: cv.declaration, value: v, parent: scriptName}); - } - } else { + else context.variables.set(name, {modifier: cv.modifier, declaration:cv.declaration, value: v, parent: scriptName}); + } + else + { var lastValue = variables.get(name); if (lastValue is Property) @@ -244,7 +241,7 @@ class RuleScriptInterp extends hscript.Interp implements IInterp if ((!locals.exists(id) && !variables.exists(id)) && (!superFields.contains(id) && !superFields.contains('get_$id')) - && (context == null || !context.publicVariables.exists(id) || context.staticVariables.exists(id))) + && (context == null || !context.variables.exists(id))) { final typePath:String = path.join('.'); @@ -295,20 +292,20 @@ class RuleScriptInterp extends hscript.Interp implements IInterp if (isFunction && depth == 0) { - (isStatic ? context.staticVariables : context.publicVariables)[n] = { + return context.variables[n] = { value: this.expr(e), declaration: isFinal ? EVariableDeclarations.FINAL : EVariableDeclarations.VAR, + modifier: isStatic ? EVariableModifiers.STATIC : EVariableModifiers.PUBLIC, parent: scriptName }; - - return (isStatic ? context.staticVariables : context.publicVariables)[n]; } else if (depth == 0) { this.expr(e); - (isStatic ? context.staticVariables : context.publicVariables).set(n, { + context.variables.set(n, { value: resolve(n), declaration: isFinal ? EVariableDeclarations.FINAL : EVariableDeclarations.VAR, + modifier: isStatic ? EVariableModifiers.STATIC : EVariableModifiers.PUBLIC, parent: scriptName }); } @@ -325,7 +322,7 @@ class RuleScriptInterp extends hscript.Interp implements IInterp case EVar(n, _, e, global, _): if (global) { - if (context == null || (!context.staticVariables.exists(n) || !context.publicVariables.exists(n))) + if (context == null || !context.variables.exists(n)) variables.set(n, (e == null) ? null : this.expr(e)); } else diff --git a/rulescript/types/context/EVariableModifiers.hx b/rulescript/types/context/EVariableModifiers.hx new file mode 100644 index 0000000..7dbc0b3 --- /dev/null +++ b/rulescript/types/context/EVariableModifiers.hx @@ -0,0 +1,6 @@ +package rulescript.types.context; + +enum EVariableModifiers { + PUBLIC; + STATIC; +} \ No newline at end of file diff --git a/rulescript/types/context/TContextVariable.hx b/rulescript/types/context/TContextVariable.hx deleted file mode 100644 index 0c9aa67..0000000 --- a/rulescript/types/context/TContextVariable.hx +++ /dev/null @@ -1,3 +0,0 @@ -package rulescript.types.context; - -typedef TContextVariable = {declaration:EVariableDeclarations, value:Dynamic, ?parent:String}; From dcd720bb63b8aee942eb0db7307cb122749478cd Mon Sep 17 00:00:00 2001 From: HackDev <80620538+Hackx2@users.noreply.github.com> Date: Thu, 4 Dec 2025 23:04:33 +0000 Subject: [PATCH 7/7] enum abstracts --- rulescript/types/context/EVariableDeclarations.hx | 8 ++++---- rulescript/types/context/EVariableModifiers.hx | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rulescript/types/context/EVariableDeclarations.hx b/rulescript/types/context/EVariableDeclarations.hx index 16155f7..b013e90 100644 --- a/rulescript/types/context/EVariableDeclarations.hx +++ b/rulescript/types/context/EVariableDeclarations.hx @@ -1,6 +1,6 @@ package rulescript.types.context; -enum EVariableDeclarations { - FINAL; - VAR; -} +enum abstract EVariableDeclarations(Int) { + var FINAL:EVariableDeclarations = 0; + var VAR:EVariableDeclarations = 1; +} \ No newline at end of file diff --git a/rulescript/types/context/EVariableModifiers.hx b/rulescript/types/context/EVariableModifiers.hx index 7dbc0b3..86508d2 100644 --- a/rulescript/types/context/EVariableModifiers.hx +++ b/rulescript/types/context/EVariableModifiers.hx @@ -1,6 +1,6 @@ package rulescript.types.context; -enum EVariableModifiers { - PUBLIC; - STATIC; +enum abstract EVariableModifiers(Int) { + var PUBLIC:EVariableModifiers = 0; + var STATIC:EVariableModifiers = 1; } \ No newline at end of file