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..8e47b964 100644 --- a/polymod/hscript/_internal/Parser.hx +++ b/polymod/hscript/_internal/Parser.hx @@ -1197,20 +1197,45 @@ 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; 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 +1475,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 +1494,7 @@ class Parser meta: meta, params: params, isPrivate: isPrivate, + extensions: extensions, t: t, }); case "enum":