Skip to content

Commit 3b7f21e

Browse files
committed
Add "??=" operator
1 parent a84dfa1 commit 3b7f21e

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

TestHScript.hx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,18 @@ class TestHScript extends TestCase {
137137
ptnull: null,
138138
pt: pt,
139139
pt2null: {pt: null},
140-
pt2: {pt: pt}
140+
pt2: {pt: pt},
141+
valuenull: null,
142+
value: 10
141143
}
142144
assertScript("ptnull?.x ?? 5", 5, vars);
143145
assertScript("pt?.x ?? 5", 10, vars);
144146
assertScript("pt2null?.pt ?? 5", 5, vars);
145147
assertScript("pt2null?.pt?.x ?? 5", 5, vars);
146148
assertScript("pt2?.pt ?? 5", pt, vars);
147149
assertScript("pt2?.pt?.x ?? 5", 10, vars);
150+
assertScript("valuenull ??= 5; valuenull", 5, vars);
151+
assertScript("value ??= 5; value", 10, vars);
148152
}
149153

150154
function testIsOperator():Void {

hscript/Interp.hx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ class Interp {
122122
assignOp("*=",function(v1:Float,v2:Float) return v1 * v2);
123123
assignOp("/=",function(v1:Float,v2:Float) return v1 / v2);
124124
assignOp("%=",function(v1:Float,v2:Float) return v1 % v2);
125+
assignOp("??=",function(v1:Dynamic,v2:Dynamic) if ( v1 == null ) return v1 = v2 else return v1);
125126
assignOp("&=",function(v1,v2) return v1 & v2);
126127
assignOp("|=",function(v1,v2) return v1 | v2);
127128
assignOp("^=",function(v1,v2) return v1 ^ v2);

hscript/Parser.hx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class Parser {
128128
["..."],
129129
["&&"],
130130
["||"],
131-
["=","+=","-=","*=","/=","%=","<<=",">>=",">>>=","|=","&=","^=","=>"],
131+
["=","+=","-=","*=","/=","%=","??=","<<=",">>=",">>>=","|=","&=","^=","=>"],
132132
["->"]
133133
];
134134
#if haxe3
@@ -1521,8 +1521,12 @@ class Parser {
15211521
char = readChar();
15221522
if( char == ".".code )
15231523
return TQuestionDot;
1524-
else if ( char == "?".code )
1524+
else if ( char == "?".code ) {
1525+
char = readChar();
1526+
if ( char == "=".code )
1527+
return TOp("??=");
15251528
return TQuestionQuestion;
1529+
}
15261530
this.char = char;
15271531
return TQuestion;
15281532
case ":".code: return TDoubleDot;

0 commit comments

Comments
 (0)