Skip to content

Commit 02c7d78

Browse files
Merge pull request #8 from NotHyper-474/feat/nullsafe-assign
[FEATURE] Null-safe field assign
2 parents 1790d83 + 1fdede2 commit 02c7d78

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
@@ -844,26 +844,38 @@ class Parser {
844844
case TQuestionDot:
845845
var field = getIdent();
846846
var tmp = "__a_" + (uid++);
847+
var t = token();
848+
inline function pushBack() { push(t); return null; }
849+
var eOp = switch (t) {
850+
case TOp(s): if (!opRightAssoc.exists(s)) pushBack(); else s;
851+
case TPOpen: '';
852+
default: pushBack();
853+
}
854+
855+
if (eOp != null && eOp.length > 0) {
856+
var e2 = parseExpr();
857+
var e =
858+
mk(EBlock([
859+
mk(EVar(tmp, null, e1)),
860+
mk(ETernary(
861+
mk(EBinop("!=", mk(EIdent(tmp), pmin(e1), pmax(e1)), mk(EIdent("null"), pmin(e1), pmax(e1))), pmin(e1), pmax(e1)),
862+
mk(EBinop(eOp, mk(EField(mk(EIdent(tmp), pmin(e1), pmax(e1)),field), pmin(e1), pmax(e1)), e2), pmin(e1), pmax(e2)),
863+
mk(EIdent("null"), pmin(e2), pmax(e2))),
864+
pmin(e1), pmax(e2))
865+
]), pmin(e1));
866+
return parseExprNext(e);
867+
}
868+
847869
var e = mk(EBlock([
848870
mk(EVar(tmp, null, e1), pmin(e1), pmax(e1)),
849871
mk(ETernary(
850872
mk(EBinop("==", mk(EIdent(tmp),pmin(e1),pmax(e1)), mk(EIdent("null"),pmin(e1),pmax(e1)))),
851873
mk(EIdent("null"),pmin(e1),pmax(e1)),
874+
(eOp != null && eOp.length == 0) ? mk(ECall(mk(EField(mk(EIdent(tmp),pmin(e1),pmax(e1)),field),pmin(e1)),parseExprList(TPClose)),pmin(e1)) :
852875
mk(EField(mk(EIdent(tmp),pmin(e1),pmax(e1)),field),pmin(e1))
853876
))
854877
]),pmin(e1));
855878

856-
if ( maybe(TPOpen) ) {
857-
e = mk(EBlock([
858-
mk(EVar(tmp, null, e1), pmin(e1), pmax(e1)),
859-
mk(ETernary(
860-
mk(EBinop("==", mk(EIdent(tmp),pmin(e1),pmax(e1)), mk(EIdent("null"),pmin(e1),pmax(e1)))),
861-
mk(EIdent("null"),pmin(e1),pmax(e1)),
862-
mk(ECall(mk(EField(mk(EIdent(tmp),pmin(e1),pmax(e1)),field),pmin(e1)),parseExprList(TPClose)),pmin(e1))
863-
))
864-
]),pmin(e1));
865-
}
866-
867879
return parseExprNext(e);
868880
case TPOpen:
869881
return parseExprNext(mk(ECall(e1,parseExprList(TPClose)),pmin(e1)));

0 commit comments

Comments
 (0)