From 69553d2ede423722212c0acf0dd892f7fa420e92 Mon Sep 17 00:00:00 2001 From: ImVeryBad Date: Mon, 26 Jan 2026 17:09:23 +0100 Subject: [PATCH 1/2] Add extensions and optional fields parsing for typedefs. --- polymod/hscript/_internal/Expr.hx | 1 + polymod/hscript/_internal/Parser.hx | 30 ++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/polymod/hscript/_internal/Expr.hx b/polymod/hscript/_internal/Expr.hx index d6fe40b2..2b298f21 100644 --- a/polymod/hscript/_internal/Expr.hx +++ b/polymod/hscript/_internal/Expr.hx @@ -187,6 +187,7 @@ typedef EnumArgDecl = typedef TypeDecl = { > ModuleType, + var extensions:Array; var t:CType; } diff --git a/polymod/hscript/_internal/Parser.hx b/polymod/hscript/_internal/Parser.hx index c3f8c12d..3e1ae7b0 100644 --- a/polymod/hscript/_internal/Parser.hx +++ b/polymod/hscript/_internal/Parser.hx @@ -1201,16 +1201,31 @@ class Parser { case TBrClose: break; case TId("var"), TId("final"): + var isOpt = maybe(TQuestion); var name = getIdent(); ensure(TDoubleDot); + var type = parseType(); + if (isOpt) type = CTOpt(type); if (t.match(TId("final"))) { if (meta == null) meta = []; meta.push({name: ":final", params: []}); } - fields.push({name: name, t: parseType(), meta: meta}); + fields.push({name: name, t: type, meta: meta}); meta = null; ensure(TSemicolon); + case TQuestion: + var name = getIdent(); + ensure(TDoubleDot); + fields.push({name: name, t: CTOpt(parseType()), meta: meta}); + meta = null; + t = token(); + switch (t) + { + case TComma: + case TBrClose: break; + default: unexpected(t); + } case TId(name): ensure(TDoubleDot); fields.push({name: name, t: parseType(), meta: meta}); @@ -1450,6 +1465,18 @@ class Parser var name = getIdent(); var params = parseParams(); ensureToken(TOp("=")); + + var extensions = []; + if (maybe(TBrOpen)) + { + while (maybe(TOp(">"))) + { + extensions.push(parseType()); + maybe(TComma); + } + push(TBrOpen); + } + var t = parseType(); return DTypedef( { @@ -1457,6 +1484,7 @@ class Parser meta: meta, params: params, isPrivate: isPrivate, + extensions: extensions, t: t, }); case "enum": From 7fd526cb83f383c44e86df15f6a0764488e91153 Mon Sep 17 00:00:00 2001 From: ImVeryBad Date: Sat, 31 Jan 2026 13:46:48 +0100 Subject: [PATCH 2/2] Fix class syntax parsing for typedefs --- polymod/hscript/_internal/Parser.hx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/polymod/hscript/_internal/Parser.hx b/polymod/hscript/_internal/Parser.hx index 3e1ae7b0..8e47b964 100644 --- a/polymod/hscript/_internal/Parser.hx +++ b/polymod/hscript/_internal/Parser.hx @@ -1197,6 +1197,16 @@ class Parser while (true) { t = token(); + + // Skip modifiers to allow vars in typedefs to be parsed without issues + // Only handle field access when it gets implemented + switch(t) + { + case TId("public"), TId("private"): + t = token(); + default: + } + switch (t) { case TBrClose: break;