Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nullish coalescing operator #1

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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