Skip to content

Commit

Permalink
Merge pull request #1 from dragomirtitian/nullish-coalescing-operator
Browse files Browse the repository at this point in the history
Nullish coalescing operator
  • Loading branch information
Kingwl authored Aug 16, 2019
2 parents fb0d3c9 + 65b2008 commit e4497b8
Show file tree
Hide file tree
Showing 11 changed files with 369 additions and 4 deletions.
6 changes: 5 additions & 1 deletion src/compiler/transformers/esnext.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
/*@internal*/
namespace ts {
export function transformESNext(context: TransformationContext) {
const {
hoistVariableDeclaration,
} = context;

return chainBundle(transformSourceFile);

function transformSourceFile(node: SourceFile) {
Expand Down Expand Up @@ -40,7 +44,7 @@ namespace ts {
const expressions: Expression[] = [];
let left = visitNode(node.left, visitor, isExpression);
if (!isIdentifier(left)) {
const temp = createTempVariable(/*recordTempVariable*/ undefined);
const temp = createTempVariable(hoistVariableDeclaration);
expressions.push(createAssignment(temp, left));
left = temp;
}
Expand Down
3 changes: 2 additions & 1 deletion tests/baselines/reference/nullishCoalescingOperator3.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ const aa1 = a1 ?? a2 ?? a3 ?? a4 ?? a5 ?? a6 ?? 'whatever'


//// [nullishCoalescingOperator3.js]
var _a, _b, _c, _d, _e;
"use strict";
var aa1 = (_a = (_b = (_c = (_d = (_e = typeof a1 !== "undefined" && a1 !== null ? a1 : a2, _e !== void 0 && _e !== null ? _e : a3), _d !== void 0 && _d !== null ? _d : a4), _c !== void 0 && _c !== null ? _c : a5), _b !== void 0 && _b !== null ? _b : a6), _a !== void 0 && _a !== null ? _a : 'whatever');
var aa1 = (_e = (_d = (_c = (_b = (_a = typeof a1 !== "undefined" && a1 !== null ? a1 : a2, _a !== void 0 && _a !== null ? _a : a3), _b !== void 0 && _b !== null ? _b : a4), _c !== void 0 && _c !== null ? _c : a5), _d !== void 0 && _d !== null ? _d : a6), _e !== void 0 && _e !== null ? _e : 'whatever');
1 change: 1 addition & 0 deletions tests/baselines/reference/nullishCoalescingOperator5.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ a && (b ?? c);


//// [nullishCoalescingOperator5.js]
var _a, _b, _c, _d;
"use strict";
// should be a syntax error
typeof a !== "undefined" && a !== null ? a : b || c;
Expand Down
16 changes: 16 additions & 0 deletions tests/baselines/reference/nullishCoalescingOperator8.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//// [nullishCoalescingOperator8.ts]
declare const a: { p: string | undefined, m(): string | undefined };
declare const b: { p: string | undefined, m(): string | undefined };

const n1 = a.p ?? "default";
const n2 = a.m() ?? "default";
const n3 = a.m() ?? b.p ?? b.m() ?? "default";;


//// [nullishCoalescingOperator8.js]
var _a, _b, _c, _d, _e;
"use strict";
var n1 = (_a = a.p, _a !== void 0 && _a !== null ? _a : "default");
var n2 = (_b = a.m(), _b !== void 0 && _b !== null ? _b : "default");
var n3 = (_e = (_d = (_c = a.m(), _c !== void 0 && _c !== null ? _c : b.p), _d !== void 0 && _d !== null ? _d : b.m()), _e !== void 0 && _e !== null ? _e : "default");
;
35 changes: 35 additions & 0 deletions tests/baselines/reference/nullishCoalescingOperator8.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
=== tests/cases/conformance/expressions/nullishCoalescingOperator/nullishCoalescingOperator8.ts ===
declare const a: { p: string | undefined, m(): string | undefined };
>a : Symbol(a, Decl(nullishCoalescingOperator8.ts, 0, 13))
>p : Symbol(p, Decl(nullishCoalescingOperator8.ts, 0, 18))
>m : Symbol(m, Decl(nullishCoalescingOperator8.ts, 0, 41))

declare const b: { p: string | undefined, m(): string | undefined };
>b : Symbol(b, Decl(nullishCoalescingOperator8.ts, 1, 13))
>p : Symbol(p, Decl(nullishCoalescingOperator8.ts, 1, 18))
>m : Symbol(m, Decl(nullishCoalescingOperator8.ts, 1, 41))

const n1 = a.p ?? "default";
>n1 : Symbol(n1, Decl(nullishCoalescingOperator8.ts, 3, 5))
>a.p : Symbol(p, Decl(nullishCoalescingOperator8.ts, 0, 18))
>a : Symbol(a, Decl(nullishCoalescingOperator8.ts, 0, 13))
>p : Symbol(p, Decl(nullishCoalescingOperator8.ts, 0, 18))

const n2 = a.m() ?? "default";
>n2 : Symbol(n2, Decl(nullishCoalescingOperator8.ts, 4, 5))
>a.m : Symbol(m, Decl(nullishCoalescingOperator8.ts, 0, 41))
>a : Symbol(a, Decl(nullishCoalescingOperator8.ts, 0, 13))
>m : Symbol(m, Decl(nullishCoalescingOperator8.ts, 0, 41))

const n3 = a.m() ?? b.p ?? b.m() ?? "default";;
>n3 : Symbol(n3, Decl(nullishCoalescingOperator8.ts, 5, 5))
>a.m : Symbol(m, Decl(nullishCoalescingOperator8.ts, 0, 41))
>a : Symbol(a, Decl(nullishCoalescingOperator8.ts, 0, 13))
>m : Symbol(m, Decl(nullishCoalescingOperator8.ts, 0, 41))
>b.p : Symbol(p, Decl(nullishCoalescingOperator8.ts, 1, 18))
>b : Symbol(b, Decl(nullishCoalescingOperator8.ts, 1, 13))
>p : Symbol(p, Decl(nullishCoalescingOperator8.ts, 1, 18))
>b.m : Symbol(m, Decl(nullishCoalescingOperator8.ts, 1, 41))
>b : Symbol(b, Decl(nullishCoalescingOperator8.ts, 1, 13))
>m : Symbol(m, Decl(nullishCoalescingOperator8.ts, 1, 41))

46 changes: 46 additions & 0 deletions tests/baselines/reference/nullishCoalescingOperator8.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
=== tests/cases/conformance/expressions/nullishCoalescingOperator/nullishCoalescingOperator8.ts ===
declare const a: { p: string | undefined, m(): string | undefined };
>a : { p: string | undefined; m(): string | undefined; }
>p : string | undefined
>m : () => string | undefined

declare const b: { p: string | undefined, m(): string | undefined };
>b : { p: string | undefined; m(): string | undefined; }
>p : string | undefined
>m : () => string | undefined

const n1 = a.p ?? "default";
>n1 : string
>a.p ?? "default" : string
>a.p : string | undefined
>a : { p: string | undefined; m(): string | undefined; }
>p : string | undefined
>"default" : "default"

const n2 = a.m() ?? "default";
>n2 : string
>a.m() ?? "default" : string
>a.m() : string | undefined
>a.m : () => string | undefined
>a : { p: string | undefined; m(): string | undefined; }
>m : () => string | undefined
>"default" : "default"

const n3 = a.m() ?? b.p ?? b.m() ?? "default";;
>n3 : string
>a.m() ?? b.p ?? b.m() ?? "default" : string
>a.m() ?? b.p ?? b.m() : string | undefined
>a.m() ?? b.p : string | undefined
>a.m() : string | undefined
>a.m : () => string | undefined
>a : { p: string | undefined; m(): string | undefined; }
>m : () => string | undefined
>b.p : string | undefined
>b : { p: string | undefined; m(): string | undefined; }
>p : string | undefined
>b.m() : string | undefined
>b.m : () => string | undefined
>b : { p: string | undefined; m(): string | undefined; }
>m : () => string | undefined
>"default" : "default"

31 changes: 30 additions & 1 deletion tests/baselines/reference/nullishCoalescingOperator_esnext.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,24 @@ const aa5 = a5 ?? 'whatever'
const aa6 = a6 ?? 'whatever'
const aa7 = a7 ?? 'whatever'
const aa8 = a8 ?? 'whatever'
const aa9 = a9 ?? 'whatever'
const aa9 = a9 ?? 'whatever'


declare let a: any, b: any, c: any;

let x1 = (a ?? b as any) || c;
let x2 = c || (a ?? b as any);
let x3 = ((a ?? b) as any) || c;
let x4 = c || ((a ?? b) as any);
let x5 = (a ?? b) as any || c;
let x6 = c || (a ?? b) as any;

let y1 = (a ?? b as any) && c;
let y2 = c && (a ?? b as any);
let y3 = ((a ?? b) as any) && c;
let y4 = c && ((a ?? b) as any);
let y5 = (a ?? b) as any && c;
let y6 = c && (a ?? b) as any;

//// [nullishCoalescingOperator_esnext.js]
"use strict";
Expand All @@ -31,3 +48,15 @@ const aa6 = a6 ?? 'whatever';
const aa7 = a7 ?? 'whatever';
const aa8 = a8 ?? 'whatever';
const aa9 = a9 ?? 'whatever';
let x1 = (a ?? b) || c;
let x2 = c || (a ?? b);
let x3 = (a ?? b) || c;
let x4 = c || (a ?? b);
let x5 = (a ?? b) || c;
let x6 = c || (a ?? b);
let y1 = (a ?? b) && c;
let y2 = c && (a ?? b);
let y3 = (a ?? b) && c;
let y4 = c && (a ?? b);
let y5 = (a ?? b) && c;
let y6 = c && (a ?? b);
78 changes: 78 additions & 0 deletions tests/baselines/reference/nullishCoalescingOperator_esnext.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,81 @@ const aa9 = a9 ?? 'whatever'
>aa9 : Symbol(aa9, Decl(nullishCoalescingOperator_esnext.ts, 19, 5))
>a9 : Symbol(a9, Decl(nullishCoalescingOperator_esnext.ts, 8, 13))


declare let a: any, b: any, c: any;
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))

let x1 = (a ?? b as any) || c;
>x1 : Symbol(x1, Decl(nullishCoalescingOperator_esnext.ts, 24, 3))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))

let x2 = c || (a ?? b as any);
>x2 : Symbol(x2, Decl(nullishCoalescingOperator_esnext.ts, 25, 3))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))

let x3 = ((a ?? b) as any) || c;
>x3 : Symbol(x3, Decl(nullishCoalescingOperator_esnext.ts, 26, 3))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))

let x4 = c || ((a ?? b) as any);
>x4 : Symbol(x4, Decl(nullishCoalescingOperator_esnext.ts, 27, 3))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))

let x5 = (a ?? b) as any || c;
>x5 : Symbol(x5, Decl(nullishCoalescingOperator_esnext.ts, 28, 3))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))

let x6 = c || (a ?? b) as any;
>x6 : Symbol(x6, Decl(nullishCoalescingOperator_esnext.ts, 29, 3))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))

let y1 = (a ?? b as any) && c;
>y1 : Symbol(y1, Decl(nullishCoalescingOperator_esnext.ts, 31, 3))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))

let y2 = c && (a ?? b as any);
>y2 : Symbol(y2, Decl(nullishCoalescingOperator_esnext.ts, 32, 3))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))

let y3 = ((a ?? b) as any) && c;
>y3 : Symbol(y3, Decl(nullishCoalescingOperator_esnext.ts, 33, 3))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))

let y4 = c && ((a ?? b) as any);
>y4 : Symbol(y4, Decl(nullishCoalescingOperator_esnext.ts, 34, 3))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))

let y5 = (a ?? b) as any && c;
>y5 : Symbol(y5, Decl(nullishCoalescingOperator_esnext.ts, 35, 3))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))

let y6 = c && (a ?? b) as any;
>y6 : Symbol(y6, Decl(nullishCoalescingOperator_esnext.ts, 36, 3))
>c : Symbol(c, Decl(nullishCoalescingOperator_esnext.ts, 22, 27))
>a : Symbol(a, Decl(nullishCoalescingOperator_esnext.ts, 22, 11))
>b : Symbol(b, Decl(nullishCoalescingOperator_esnext.ts, 22, 19))

130 changes: 130 additions & 0 deletions tests/baselines/reference/nullishCoalescingOperator_esnext.types
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,133 @@ const aa9 = a9 ?? 'whatever'
>a9 : any
>'whatever' : "whatever"


declare let a: any, b: any, c: any;
>a : any
>b : any
>c : any

let x1 = (a ?? b as any) || c;
>x1 : any
>(a ?? b as any) || c : any
>(a ?? b as any) : any
>a ?? b as any : any
>a : any
>b as any : any
>b : any
>c : any

let x2 = c || (a ?? b as any);
>x2 : any
>c || (a ?? b as any) : any
>c : any
>(a ?? b as any) : any
>a ?? b as any : any
>a : any
>b as any : any
>b : any

let x3 = ((a ?? b) as any) || c;
>x3 : any
>((a ?? b) as any) || c : any
>((a ?? b) as any) : any
>(a ?? b) as any : any
>(a ?? b) : any
>a ?? b : any
>a : any
>b : any
>c : any

let x4 = c || ((a ?? b) as any);
>x4 : any
>c || ((a ?? b) as any) : any
>c : any
>((a ?? b) as any) : any
>(a ?? b) as any : any
>(a ?? b) : any
>a ?? b : any
>a : any
>b : any

let x5 = (a ?? b) as any || c;
>x5 : any
>(a ?? b) as any || c : any
>(a ?? b) as any : any
>(a ?? b) : any
>a ?? b : any
>a : any
>b : any
>c : any

let x6 = c || (a ?? b) as any;
>x6 : any
>c || (a ?? b) as any : any
>c : any
>(a ?? b) as any : any
>(a ?? b) : any
>a ?? b : any
>a : any
>b : any

let y1 = (a ?? b as any) && c;
>y1 : any
>(a ?? b as any) && c : any
>(a ?? b as any) : any
>a ?? b as any : any
>a : any
>b as any : any
>b : any
>c : any

let y2 = c && (a ?? b as any);
>y2 : any
>c && (a ?? b as any) : any
>c : any
>(a ?? b as any) : any
>a ?? b as any : any
>a : any
>b as any : any
>b : any

let y3 = ((a ?? b) as any) && c;
>y3 : any
>((a ?? b) as any) && c : any
>((a ?? b) as any) : any
>(a ?? b) as any : any
>(a ?? b) : any
>a ?? b : any
>a : any
>b : any
>c : any

let y4 = c && ((a ?? b) as any);
>y4 : any
>c && ((a ?? b) as any) : any
>c : any
>((a ?? b) as any) : any
>(a ?? b) as any : any
>(a ?? b) : any
>a ?? b : any
>a : any
>b : any

let y5 = (a ?? b) as any && c;
>y5 : any
>(a ?? b) as any && c : any
>(a ?? b) as any : any
>(a ?? b) : any
>a ?? b : any
>a : any
>b : any
>c : any

let y6 = c && (a ?? b) as any;
>y6 : any
>c && (a ?? b) as any : any
>c : any
>(a ?? b) as any : any
>(a ?? b) : any
>a ?? b : any
>a : any
>b : any

Loading

0 comments on commit e4497b8

Please sign in to comment.