From 959717fafd64ea314e683fc4a0cedbf1162eae4b Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sat, 7 Mar 2026 17:23:08 +0200 Subject: [PATCH] Object Literals AKA 'dict' Phase #2: Nested Dicts --- .../interpreter/ObjectLiteralParser.java | 35 ++++++++++++------- .../script/interpreter/ScriptDocument.java | 2 +- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ObjectLiteralParser.java b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ObjectLiteralParser.java index 8be088cc5..a396a6402 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ObjectLiteralParser.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ObjectLiteralParser.java @@ -306,18 +306,7 @@ public final class ObjectLiteralParser { TypeInfo valueType = null; if (inferTypes && typeResolver != null) { String valueExpr = src.substring(valueStart, valueEnd).trim(); - if (!valueExpr.isEmpty()) { - char vc = valueExpr.charAt(0); - if (vc == '{' || vc == '[') { - // Nested object/array literals degrade to 'any' - valueType = TypeInfo.ANY; - } else { - TypeInfo inferred = typeResolver.resolve(valueExpr, absBase + valueStart); - valueType = (inferred != null) ? inferred : TypeInfo.ANY; - } - } else { - valueType = TypeInfo.ANY; - } + valueType = inferValueType(valueExpr, absBase + valueStart, typeResolver); } int keyStartAbs = absBase + keyStart; @@ -548,6 +537,28 @@ public final class ObjectLiteralParser { return new DynamicFieldResult(receiver, access.propertyName, receiver.getFieldInfo(access.propertyName)); } + private static TypeInfo inferValueType(String valueExpr, int valueStartAbs, ExpressionTypeResolverFn typeResolver) { + if (valueExpr == null || valueExpr.isEmpty()) { + return TypeInfo.ANY; + } + + char first = valueExpr.charAt(0); + if (first == '{') { + ObjectLiteralAnalysis nested = parse(valueExpr, valueStartAbs, true, false, typeResolver); + if (nested != null && nested.supportsInference && nested.inferredType != null) { + return nested.inferredType; + } + return TypeInfo.ANY; + } + + if (first == '[') { + return TypeInfo.ANY; + } + + TypeInfo inferred = typeResolver.resolve(valueExpr, valueStartAbs); + return (inferred != null) ? inferred : TypeInfo.ANY; + } + // ────────────────────────────────────────────────────────────────────────── // Scanning / parsing utilities (package-private static, used by analyzer) // ────────────────────────────────────────────────────────────────────────── diff --git a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ScriptDocument.java b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ScriptDocument.java index 7f2a564cb..b489f8107 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ScriptDocument.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ScriptDocument.java @@ -3249,7 +3249,7 @@ public class ScriptDocument { } } - i = end; + i = brace + 1; } }