From 68b97e1bf7a79504fc17814464661833d7c9ccd3 Mon Sep 17 00:00:00 2001 From: ImVeryBad Date: Sun, 18 Jan 2026 11:14:34 +0100 Subject: [PATCH] Allow interfaces to be parsed and no longer throw errors when they exist in scripts. --- polymod/hscript/_internal/Expr.hx | 9 ++ polymod/hscript/_internal/Parser.hx | 112 +++++++++++++++++++ polymod/hscript/_internal/PolymodInterpEx.hx | 1 + 3 files changed, 122 insertions(+) diff --git a/polymod/hscript/_internal/Expr.hx b/polymod/hscript/_internal/Expr.hx index d6fe40b2..9a15d755 100644 --- a/polymod/hscript/_internal/Expr.hx +++ b/polymod/hscript/_internal/Expr.hx @@ -147,6 +147,7 @@ ECustom(msg:String); DClass(c:ClassDecl); DTypedef(c:TypeDecl); DEnum(e:EnumDecl); + DInterface(e:InterfaceDecl); } typedef ModuleType = @@ -190,6 +191,14 @@ typedef TypeDecl = var t:CType; } +typedef InterfaceDecl = +{ + > ModuleType, + var extend:Array; + var fields:Array; + var isExtern:Bool; +} + typedef FieldDecl = { var name:String; diff --git a/polymod/hscript/_internal/Parser.hx b/polymod/hscript/_internal/Parser.hx index c3f8c12d..0cdbe984 100644 --- a/polymod/hscript/_internal/Parser.hx +++ b/polymod/hscript/_internal/Parser.hx @@ -1475,6 +1475,39 @@ class Parser name: name, fields: fields }); + case "interface": + var name = getIdent(); + var params = parseParams(); + var extend = []; + + while (true) + { + var t = token(); + switch (t) + { + case TId("extends"): + extend.push(parseType()); + default: + push(t); + break; + } + } + + var fields = []; + ensure(TBrOpen); + while (!maybe(TBrClose)) + fields.push(parseInterfaceField()); + + return DInterface( + { + name: name, + meta: meta, + params: params, + isPrivate: isPrivate, + extend: extend, + fields: fields, + isExtern: isExtern, + }); default: unexpected(TId(ident)); } @@ -1563,6 +1596,85 @@ class Parser return null; } + function parseInterfaceField():FieldDecl + { + var meta = parseMetadata(); + var access = []; + while (true) + { + var id = getIdent(); + switch (id) + { + case "public": + access.push(APublic); + case "private": + access.push(APrivate); + case "static": + access.push(AStatic); + case "function": + var name = getIdent(); + ensure(TPOpen); + var args = parseFunctionArgs(); + var ret = null; + if (allowTypes) + { + var tk = token(); + if (tk != TDoubleDot) push(tk); + else + ret = parseType(); + } + ensure(TSemicolon); + return { + name: name, + meta: meta, + access: access, + kind: KFunction( + { + args: args, + expr: null, + ret: ret, + }), + }; + case "var", "final": + var name = getIdent(); + var get = null, set = null; + if (maybe(TPOpen)) + { + get = getIdent(); + ensure(TComma); + set = getIdent(); + ensure(TPClose); + } + var type = maybe(TDoubleDot) ? parseType() : null; + + if (type != null && type.match(CTAnon(_))) + { + maybe(TSemicolon); + } + else + ensure(TSemicolon); + + return { + name: name, + meta: meta, + access: access, + kind: KVar( + { + get: get, + set: set, + type: type, + expr: null, + isfinal: (id == "final") + }), + }; + default: + unexpected(TId(id)); + break; + } + } + return null; + } + function parseEnumField():EnumFieldDecl { var name = getIdent(); diff --git a/polymod/hscript/_internal/PolymodInterpEx.hx b/polymod/hscript/_internal/PolymodInterpEx.hx index db9c68e8..f3027ca8 100644 --- a/polymod/hscript/_internal/PolymodInterpEx.hx +++ b/polymod/hscript/_internal/PolymodInterpEx.hx @@ -2137,6 +2137,7 @@ public function registerModules(module:Array, ?origin:String = "hscr registerScriptEnum(enumDecl); case DTypedef(_): + case DInterface(_): } } }