add support for the new assign expression in TypeScript 4

This commit is contained in:
Erik Krogh Kristensen
2020-08-11 13:55:01 +02:00
parent 2f34990ae6
commit d2c87d0a2e
5 changed files with 54 additions and 3 deletions

View File

@@ -77,6 +77,9 @@ public class ExprKinds {
binOpKinds.put("**", 87); binOpKinds.put("**", 87);
binOpKinds.put("**=", 88); binOpKinds.put("**=", 88);
binOpKinds.put("??", 107); binOpKinds.put("??", 107);
binOpKinds.put("&&=", 116);
binOpKinds.put("||=", 117);
binOpKinds.put("??=", 118);
} }
private static final Map<String, Integer> unOpKinds = new LinkedHashMap<String, Integer>(); private static final Map<String, Integer> unOpKinds = new LinkedHashMap<String, Integer>();

View File

@@ -1851,7 +1851,7 @@ class AssignExpr extends @assignexpr, Assignment {
private class TCompoundAssignExpr = private class TCompoundAssignExpr =
@assignaddexpr or @assignsubexpr or @assignmulexpr or @assigndivexpr or @assignmodexpr or @assignaddexpr or @assignsubexpr or @assignmulexpr or @assigndivexpr or @assignmodexpr or
@assignexpexpr or @assignlshiftexpr or @assignrshiftexpr or @assignurshiftexpr or @assignexpexpr or @assignlshiftexpr or @assignrshiftexpr or @assignurshiftexpr or
@assignorexpr or @assignxorexpr or @assignandexpr; @assignorexpr or @assignxorexpr or @assignandexpr or @assignlogandexpr or @assignlogorexpr or @assignnullishcoalescingexpr;
/** /**
* A compound assign expression. * A compound assign expression.
@@ -1997,6 +1997,39 @@ class AssignXOrExpr extends @assignxorexpr, CompoundAssignExpr { }
*/ */
class AssignAndExpr extends @assignandexpr, CompoundAssignExpr { } class AssignAndExpr extends @assignandexpr, CompoundAssignExpr { }
/**
* A logical-'or'-assign expression.
*
* Example:
*
* ```
* x ||= y
* ```
*/
class AssignLogOrExpr extends @assignlogandexpr, CompoundAssignExpr { }
/**
* A logical-'and'-assign expression.
*
* Example:
*
* ```
* x &&= y
* ```
*/
class AssignLogAndExpr extends @assignlogorexpr, CompoundAssignExpr { }
/**
* A 'nullish-coalescing'-assign expression.
*
* Example:
*
* ```
* x ??= y
* ```
*/
class AssignNullishCoalescingExpr extends @assignnullishcoalescingexpr, CompoundAssignExpr { }
/** /**
* An update expression, that is, an increment or decrement expression. * An update expression, that is, an increment or decrement expression.
* *

View File

@@ -351,6 +351,9 @@ case @expr.kind of
| 113 = @e4x_xml_dynamic_qualident | 113 = @e4x_xml_dynamic_qualident
| 114 = @e4x_xml_dotdotexpr | 114 = @e4x_xml_dotdotexpr
| 115 = @importmetaexpr | 115 = @importmetaexpr
| 116 = @assignlogandexpr
| 117 = @assignlogorexpr
| 118 = @assignnullishcoalescingexpr
; ;
@varaccess = @proper_varaccess | @export_varaccess; @varaccess = @proper_varaccess | @export_varaccess;
@@ -372,7 +375,7 @@ case @expr.kind of
@binaryexpr = @comparison | @lshiftexpr | @rshiftexpr | @urshiftexpr | @addexpr | @subexpr | @mulexpr | @divexpr | @modexpr | @expexpr | @bitorexpr | @xorexpr | @bitandexpr | @inexpr | @instanceofexpr | @logandexpr | @logorexpr | @nullishcoalescingexpr; @binaryexpr = @comparison | @lshiftexpr | @rshiftexpr | @urshiftexpr | @addexpr | @subexpr | @mulexpr | @divexpr | @modexpr | @expexpr | @bitorexpr | @xorexpr | @bitandexpr | @inexpr | @instanceofexpr | @logandexpr | @logorexpr | @nullishcoalescingexpr;
@assignment = @assignexpr | @assignaddexpr | @assignsubexpr | @assignmulexpr | @assigndivexpr | @assignmodexpr | @assignexpexpr | @assignlshiftexpr | @assignrshiftexpr | @assignurshiftexpr | @assignorexpr | @assignxorexpr | @assignandexpr; @assignment = @assignexpr | @assignaddexpr | @assignsubexpr | @assignmulexpr | @assigndivexpr | @assignmodexpr | @assignexpexpr | @assignlshiftexpr | @assignrshiftexpr | @assignurshiftexpr | @assignorexpr | @assignxorexpr | @assignandexpr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr;
@updateexpr = @preincexpr | @postincexpr | @predecexpr | @postdecexpr; @updateexpr = @preincexpr | @postincexpr | @predecexpr | @postdecexpr;

View File

@@ -113,6 +113,9 @@ test_VariableTypes
| tst.ts:164:56:164:59 | arr2 | arr2 | tst.ts:164:62:164:62 | U | | tst.ts:164:56:164:59 | arr2 | arr2 | tst.ts:164:62:164:62 | U |
| tst.ts:169:31:169:31 | x | x | tst.ts:169:34:169:64 | [first: ... number] | | tst.ts:169:31:169:31 | x | x | tst.ts:169:34:169:64 | [first: ... number] |
| tst.ts:180:5:180:7 | foo | foo | tst.ts:180:10:180:21 | StrStrNumNum | | tst.ts:180:5:180:7 | foo | foo | tst.ts:180:10:180:21 | StrStrNumNum |
| tst.ts:184:7:184:8 | a1 | a1 | tst.ts:184:12:184:17 | number |
| tst.ts:185:7:185:8 | a2 | a2 | tst.ts:185:12:185:17 | number |
| tst.ts:186:7:186:8 | a3 | a3 | tst.ts:186:12:186:17 | number |
test_QualifiedTypeAccess test_QualifiedTypeAccess
| tst.ts:63:19:63:21 | N.I | tst.ts:63:19:63:19 | N | tst.ts:63:21:63:21 | I | | tst.ts:63:19:63:21 | N.I | tst.ts:63:19:63:19 | N | tst.ts:63:21:63:21 | I |
| tst.ts:64:20:64:24 | N.M.I | tst.ts:64:20:64:22 | N.M | tst.ts:64:24:64:24 | I | | tst.ts:64:20:64:24 | N.M.I | tst.ts:64:20:64:22 | N.M | tst.ts:64:24:64:24 | I |

View File

@@ -177,4 +177,13 @@ type Numbers = [number, number];
// [string, string, number, number] // [string, string, number, number]
type StrStrNumNum = [...Strings, ...Numbers]; type StrStrNumNum = [...Strings, ...Numbers];
var foo: StrStrNumNum; var foo: StrStrNumNum;
// Short-Circuiting Assignment Operators
function shortAssignment() {
let a1 : number = parseInt("foo");
let a2 : number = parseInt("bar");
let a3 : number = a1 ||= a2;
let a4 = a2 &&= a3;
let a5 = a3 ??= a4;
}