Skip to content

Commit 1fdede2

Browse files
committed
feat: Null-safe field assign
1 parent d60bb29 commit 1fdede2

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

hscript/Parser.hx

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -823,26 +823,38 @@ class Parser {
823823
case TQuestionDot:
824824
var field = getIdent();
825825
var tmp = "__a_" + (uid++);
826+
var t = token();
827+
inline function pushBack() { push(t); return null; }
828+
var eOp = switch (t) {
829+
case TOp(s): if (!opRightAssoc.exists(s)) pushBack(); else s;
830+
case TPOpen: '';
831+
default: pushBack();
832+
}
833+
834+
if (eOp != null && eOp.length > 0) {
835+
var e2 = parseExpr();
836+
var e =
837+
mk(EBlock([
838+
mk(EVar(tmp, null, e1)),
839+
mk(ETernary(
840+
mk(EBinop("!=", mk(EIdent(tmp), pmin(e1), pmax(e1)), mk(EIdent("null"), pmin(e1), pmax(e1))), pmin(e1), pmax(e1)),
841+
mk(EBinop(eOp, mk(EField(mk(EIdent(tmp), pmin(e1), pmax(e1)),field), pmin(e1), pmax(e1)), e2), pmin(e1), pmax(e2)),
842+
mk(EIdent("null"), pmin(e2), pmax(e2))),
843+
pmin(e1), pmax(e2))
844+
]), pmin(e1));
845+
return parseExprNext(e);
846+
}
847+
826848
var e = mk(EBlock([
827849
mk(EVar(tmp, null, e1), pmin(e1), pmax(e1)),
828850
mk(ETernary(
829851
mk(EBinop("==", mk(EIdent(tmp),pmin(e1),pmax(e1)), mk(EIdent("null"),pmin(e1),pmax(e1)))),
830852
mk(EIdent("null"),pmin(e1),pmax(e1)),
853+
(eOp != null && eOp.length == 0) ? mk(ECall(mk(EField(mk(EIdent(tmp),pmin(e1),pmax(e1)),field),pmin(e1)),parseExprList(TPClose)),pmin(e1)) :
831854
mk(EField(mk(EIdent(tmp),pmin(e1),pmax(e1)),field),pmin(e1))
832855
))
833856
]),pmin(e1));
834857

835-
if ( maybe(TPOpen) ) {
836-
e = mk(EBlock([
837-
mk(EVar(tmp, null, e1), pmin(e1), pmax(e1)),
838-
mk(ETernary(
839-
mk(EBinop("==", mk(EIdent(tmp),pmin(e1),pmax(e1)), mk(EIdent("null"),pmin(e1),pmax(e1)))),
840-
mk(EIdent("null"),pmin(e1),pmax(e1)),
841-
mk(ECall(mk(EField(mk(EIdent(tmp),pmin(e1),pmax(e1)),field),pmin(e1)),parseExprList(TPClose)),pmin(e1))
842-
))
843-
]),pmin(e1));
844-
}
845-
846858
return parseExprNext(e);
847859
case TPOpen:
848860
return parseExprNext(mk(ECall(e1,parseExprList(TPClose)),pmin(e1)));

0 commit comments

Comments
 (0)