Add more case

This commit is contained in:
kingwl
2020-04-01 11:37:58 +08:00
parent 1d93db81cc
commit da16b3e30b
31 changed files with 1626 additions and 10 deletions

View File

@@ -1,10 +1,6 @@
/*@internal*/
namespace ts {
export function transformESNext(context: TransformationContext) {
const {
hoistVariableDeclaration
} = context;
return chainBundle(transformSourceFile);
function transformSourceFile(node: SourceFile) {
@@ -37,14 +33,9 @@ namespace ts {
const nonAssignmentOperator = getNonAssignmentOperatorForCompoundAssignment(operator.kind);
const left = visitNode(binaryExpression.left, visitor, isExpression);
const right = visitNode(binaryExpression.right, visitor, isExpression);
let cond = left;
if (shouldCaptureInTempVariable(left)) {
const temp = createTempVariable(hoistVariableDeclaration);
cond = createAssignment(temp, left);
}
return createBinary(
cond,
left,
nonAssignmentOperator,
createParen(
createAssignment(

View File

@@ -0,0 +1,42 @@
//// [logicalAssignment2.ts]
interface A {
foo: {
bar(): {
baz: 0 | 1 | 42 | undefined | ''
}
baz: 0 | 1 | 42 | undefined | ''
}
baz: 0 | 1 | 42 | undefined | ''
}
declare const result: A
declare const a: A
declare const b: A
declare const c: A
a.baz &&= result.baz
b.baz ||= result.baz
c.baz ??= result.baz
a.foo["baz"] &&= result.foo.baz
b.foo["baz"] &&= result.foo.baz
c.foo["baz"] &&= result.foo.baz
a.foo.bar().baz &&= result.foo.bar().baz
b.foo.bar().baz ||= result.foo.bar().baz
c.foo.bar().baz ??= result.foo.bar().baz
//// [logicalAssignment2.js]
"use strict";
var _a, _b;
a.baz && (a.baz = result.baz);
b.baz || (b.baz = result.baz);
(_a = c.baz) !== null && _a !== void 0 ? _a : (c.baz = result.baz);
a.foo["baz"] && (a.foo["baz"] = result.foo.baz);
b.foo["baz"] && (b.foo["baz"] = result.foo.baz);
c.foo["baz"] && (c.foo["baz"] = result.foo.baz);
a.foo.bar().baz && (a.foo.bar().baz = result.foo.bar().baz);
b.foo.bar().baz || (b.foo.bar().baz = result.foo.bar().baz);
(_b = c.foo.bar().baz) !== null && _b !== void 0 ? _b : (c.foo.bar().baz = result.foo.bar().baz);

View File

@@ -0,0 +1,142 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts ===
interface A {
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
foo: {
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
bar(): {
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
}
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
}
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
}
declare const result: A
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const a: A
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const b: A
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const c: A
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
a.baz &&= result.baz
>a.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
b.baz ||= result.baz
>b.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
c.baz ??= result.baz
>c.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
a.foo["baz"] &&= result.foo.baz
>a.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
b.foo["baz"] &&= result.foo.baz
>b.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
c.foo["baz"] &&= result.foo.baz
>c.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
a.foo.bar().baz &&= result.foo.bar().baz
>a.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>a.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>a.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
b.foo.bar().baz ||= result.foo.bar().baz
>b.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>b.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>b.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
c.foo.bar().baz ??= result.foo.bar().baz
>c.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>c.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>c.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))

View File

@@ -0,0 +1,154 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts ===
interface A {
foo: {
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
bar(): {
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
declare const result: A
>result : A
declare const a: A
>a : A
declare const b: A
>b : A
declare const c: A
>c : A
a.baz &&= result.baz
>a.baz &&= result.baz : "" | 0 | 1 | 42 | undefined
>a.baz : string | number | undefined
>a : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
b.baz ||= result.baz
>b.baz ||= result.baz : string | number | undefined
>b.baz : string | number | undefined
>b : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
c.baz ??= result.baz
>c.baz ??= result.baz : string | number | undefined
>c.baz : string | number | undefined
>c : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
a.foo["baz"] &&= result.foo.baz
>a.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>a.foo["baz"] : string | number | undefined
>a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>a : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
b.foo["baz"] &&= result.foo.baz
>b.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>b.foo["baz"] : string | number | undefined
>b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>b : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
c.foo["baz"] &&= result.foo.baz
>c.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>c.foo["baz"] : string | number | undefined
>c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>c : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
a.foo.bar().baz &&= result.foo.bar().baz
>a.foo.bar().baz &&= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>a.foo.bar().baz : string | number | undefined
>a.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>a.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>a : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
b.foo.bar().baz ||= result.foo.bar().baz
>b.foo.bar().baz ||= result.foo.bar().baz : string | number | undefined
>b.foo.bar().baz : string | number | undefined
>b.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>b.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>b : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
c.foo.bar().baz ??= result.foo.bar().baz
>c.foo.bar().baz ??= result.foo.bar().baz : string | number | undefined
>c.foo.bar().baz : string | number | undefined
>c.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>c.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>c : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined

View File

@@ -0,0 +1,41 @@
//// [logicalAssignment2.ts]
interface A {
foo: {
bar(): {
baz: 0 | 1 | 42 | undefined | ''
}
baz: 0 | 1 | 42 | undefined | ''
}
baz: 0 | 1 | 42 | undefined | ''
}
declare const result: A
declare const a: A
declare const b: A
declare const c: A
a.baz &&= result.baz
b.baz ||= result.baz
c.baz ??= result.baz
a.foo["baz"] &&= result.foo.baz
b.foo["baz"] &&= result.foo.baz
c.foo["baz"] &&= result.foo.baz
a.foo.bar().baz &&= result.foo.bar().baz
b.foo.bar().baz ||= result.foo.bar().baz
c.foo.bar().baz ??= result.foo.bar().baz
//// [logicalAssignment2.js]
"use strict";
a.baz && (a.baz = result.baz);
b.baz || (b.baz = result.baz);
c.baz ?? (c.baz = result.baz);
a.foo["baz"] && (a.foo["baz"] = result.foo.baz);
b.foo["baz"] && (b.foo["baz"] = result.foo.baz);
c.foo["baz"] && (c.foo["baz"] = result.foo.baz);
a.foo.bar().baz && (a.foo.bar().baz = result.foo.bar().baz);
b.foo.bar().baz || (b.foo.bar().baz = result.foo.bar().baz);
c.foo.bar().baz ?? (c.foo.bar().baz = result.foo.bar().baz);

View File

@@ -0,0 +1,142 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts ===
interface A {
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
foo: {
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
bar(): {
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
}
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
}
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
}
declare const result: A
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const a: A
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const b: A
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const c: A
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
a.baz &&= result.baz
>a.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
b.baz ||= result.baz
>b.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
c.baz ??= result.baz
>c.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
a.foo["baz"] &&= result.foo.baz
>a.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
b.foo["baz"] &&= result.foo.baz
>b.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
c.foo["baz"] &&= result.foo.baz
>c.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
a.foo.bar().baz &&= result.foo.bar().baz
>a.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>a.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>a.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
b.foo.bar().baz ||= result.foo.bar().baz
>b.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>b.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>b.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
c.foo.bar().baz ??= result.foo.bar().baz
>c.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>c.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>c.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))

View File

@@ -0,0 +1,154 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts ===
interface A {
foo: {
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
bar(): {
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
declare const result: A
>result : A
declare const a: A
>a : A
declare const b: A
>b : A
declare const c: A
>c : A
a.baz &&= result.baz
>a.baz &&= result.baz : "" | 0 | 1 | 42 | undefined
>a.baz : string | number | undefined
>a : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
b.baz ||= result.baz
>b.baz ||= result.baz : string | number | undefined
>b.baz : string | number | undefined
>b : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
c.baz ??= result.baz
>c.baz ??= result.baz : string | number | undefined
>c.baz : string | number | undefined
>c : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
a.foo["baz"] &&= result.foo.baz
>a.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>a.foo["baz"] : string | number | undefined
>a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>a : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
b.foo["baz"] &&= result.foo.baz
>b.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>b.foo["baz"] : string | number | undefined
>b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>b : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
c.foo["baz"] &&= result.foo.baz
>c.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>c.foo["baz"] : string | number | undefined
>c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>c : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
a.foo.bar().baz &&= result.foo.bar().baz
>a.foo.bar().baz &&= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>a.foo.bar().baz : string | number | undefined
>a.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>a.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>a : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
b.foo.bar().baz ||= result.foo.bar().baz
>b.foo.bar().baz ||= result.foo.bar().baz : string | number | undefined
>b.foo.bar().baz : string | number | undefined
>b.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>b.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>b : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
c.foo.bar().baz ??= result.foo.bar().baz
>c.foo.bar().baz ??= result.foo.bar().baz : string | number | undefined
>c.foo.bar().baz : string | number | undefined
>c.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>c.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>c : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined

View File

@@ -0,0 +1,41 @@
//// [logicalAssignment2.ts]
interface A {
foo: {
bar(): {
baz: 0 | 1 | 42 | undefined | ''
}
baz: 0 | 1 | 42 | undefined | ''
}
baz: 0 | 1 | 42 | undefined | ''
}
declare const result: A
declare const a: A
declare const b: A
declare const c: A
a.baz &&= result.baz
b.baz ||= result.baz
c.baz ??= result.baz
a.foo["baz"] &&= result.foo.baz
b.foo["baz"] &&= result.foo.baz
c.foo["baz"] &&= result.foo.baz
a.foo.bar().baz &&= result.foo.bar().baz
b.foo.bar().baz ||= result.foo.bar().baz
c.foo.bar().baz ??= result.foo.bar().baz
//// [logicalAssignment2.js]
"use strict";
a.baz &&= result.baz;
b.baz ||= result.baz;
c.baz ??= result.baz;
a.foo["baz"] &&= result.foo.baz;
b.foo["baz"] &&= result.foo.baz;
c.foo["baz"] &&= result.foo.baz;
a.foo.bar().baz &&= result.foo.bar().baz;
b.foo.bar().baz ||= result.foo.bar().baz;
c.foo.bar().baz ??= result.foo.bar().baz;

View File

@@ -0,0 +1,142 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts ===
interface A {
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
foo: {
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
bar(): {
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
}
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
}
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
}
declare const result: A
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const a: A
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const b: A
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
declare const c: A
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
a.baz &&= result.baz
>a.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
b.baz ||= result.baz
>b.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
c.baz ??= result.baz
>c.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
a.foo["baz"] &&= result.foo.baz
>a.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
b.foo["baz"] &&= result.foo.baz
>b.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
c.foo["baz"] &&= result.foo.baz
>c.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
a.foo.bar().baz &&= result.foo.bar().baz
>a.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>a.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>a.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
b.foo.bar().baz ||= result.foo.bar().baz
>b.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>b.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>b.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
c.foo.bar().baz ??= result.foo.bar().baz
>c.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>c.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>c.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))

View File

@@ -0,0 +1,154 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts ===
interface A {
foo: {
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
bar(): {
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
declare const result: A
>result : A
declare const a: A
>a : A
declare const b: A
>b : A
declare const c: A
>c : A
a.baz &&= result.baz
>a.baz &&= result.baz : "" | 0 | 1 | 42 | undefined
>a.baz : string | number | undefined
>a : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
b.baz ||= result.baz
>b.baz ||= result.baz : string | number | undefined
>b.baz : string | number | undefined
>b : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
c.baz ??= result.baz
>c.baz ??= result.baz : string | number | undefined
>c.baz : string | number | undefined
>c : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
a.foo["baz"] &&= result.foo.baz
>a.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>a.foo["baz"] : string | number | undefined
>a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>a : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
b.foo["baz"] &&= result.foo.baz
>b.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>b.foo["baz"] : string | number | undefined
>b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>b : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
c.foo["baz"] &&= result.foo.baz
>c.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
>c.foo["baz"] : string | number | undefined
>c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>c : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>"baz" : "baz"
>result.foo.baz : "" | 0 | 1 | 42 | undefined
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
a.foo.bar().baz &&= result.foo.bar().baz
>a.foo.bar().baz &&= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>a.foo.bar().baz : string | number | undefined
>a.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>a.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>a : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
b.foo.bar().baz ||= result.foo.bar().baz
>b.foo.bar().baz ||= result.foo.bar().baz : string | number | undefined
>b.foo.bar().baz : string | number | undefined
>b.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>b.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>b : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined
c.foo.bar().baz ??= result.foo.bar().baz
>c.foo.bar().baz ??= result.foo.bar().baz : string | number | undefined
>c.foo.bar().baz : string | number | undefined
>c.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>c.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>c : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : string | number | undefined
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>result : A
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
>baz : "" | 0 | 1 | 42 | undefined

View File

@@ -0,0 +1,22 @@
//// [logicalAssignment3.ts]
interface A {
baz: 0 | 1 | 42 | undefined | ''
}
declare const result: A;
declare const a: A;
declare const b: A;
declare const c: A;
(a.baz) &&= result.baz;
(b.baz) ||= result.baz;
(c.baz) ??= result.baz;
//// [logicalAssignment3.js]
"use strict";
var _a;
(a.baz) && ((a.baz) = result.baz);
(b.baz) || ((b.baz) = result.baz);
(_a = (c.baz)) !== null && _a !== void 0 ? _a : ((c.baz) = result.baz);

View File

@@ -0,0 +1,49 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts ===
interface A {
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
}
declare const result: A;
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const a: A;
>a : Symbol(a, Decl(logicalAssignment3.ts, 5, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const b: A;
>b : Symbol(b, Decl(logicalAssignment3.ts, 6, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const c: A;
>c : Symbol(c, Decl(logicalAssignment3.ts, 7, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
(a.baz) &&= result.baz;
>a.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment3.ts, 5, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
(b.baz) ||= result.baz;
>b.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment3.ts, 6, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
(c.baz) ??= result.baz;
>c.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment3.ts, 7, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))

View File

@@ -0,0 +1,49 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts ===
interface A {
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
declare const result: A;
>result : A
declare const a: A;
>a : A
declare const b: A;
>b : A
declare const c: A;
>c : A
(a.baz) &&= result.baz;
>(a.baz) &&= result.baz : "" | 0 | 1 | 42 | undefined
>(a.baz) : string | number | undefined
>a.baz : string | number | undefined
>a : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
(b.baz) ||= result.baz;
>(b.baz) ||= result.baz : string | number | undefined
>(b.baz) : string | number | undefined
>b.baz : string | number | undefined
>b : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
(c.baz) ??= result.baz;
>(c.baz) ??= result.baz : string | number | undefined
>(c.baz) : string | number | undefined
>c.baz : string | number | undefined
>c : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined

View File

@@ -0,0 +1,21 @@
//// [logicalAssignment3.ts]
interface A {
baz: 0 | 1 | 42 | undefined | ''
}
declare const result: A;
declare const a: A;
declare const b: A;
declare const c: A;
(a.baz) &&= result.baz;
(b.baz) ||= result.baz;
(c.baz) ??= result.baz;
//// [logicalAssignment3.js]
"use strict";
(a.baz) && ((a.baz) = result.baz);
(b.baz) || ((b.baz) = result.baz);
(c.baz) ?? ((c.baz) = result.baz);

View File

@@ -0,0 +1,49 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts ===
interface A {
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
}
declare const result: A;
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const a: A;
>a : Symbol(a, Decl(logicalAssignment3.ts, 5, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const b: A;
>b : Symbol(b, Decl(logicalAssignment3.ts, 6, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const c: A;
>c : Symbol(c, Decl(logicalAssignment3.ts, 7, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
(a.baz) &&= result.baz;
>a.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment3.ts, 5, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
(b.baz) ||= result.baz;
>b.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment3.ts, 6, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
(c.baz) ??= result.baz;
>c.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment3.ts, 7, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))

View File

@@ -0,0 +1,49 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts ===
interface A {
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
declare const result: A;
>result : A
declare const a: A;
>a : A
declare const b: A;
>b : A
declare const c: A;
>c : A
(a.baz) &&= result.baz;
>(a.baz) &&= result.baz : "" | 0 | 1 | 42 | undefined
>(a.baz) : string | number | undefined
>a.baz : string | number | undefined
>a : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
(b.baz) ||= result.baz;
>(b.baz) ||= result.baz : string | number | undefined
>(b.baz) : string | number | undefined
>b.baz : string | number | undefined
>b : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
(c.baz) ??= result.baz;
>(c.baz) ??= result.baz : string | number | undefined
>(c.baz) : string | number | undefined
>c.baz : string | number | undefined
>c : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined

View File

@@ -0,0 +1,21 @@
//// [logicalAssignment3.ts]
interface A {
baz: 0 | 1 | 42 | undefined | ''
}
declare const result: A;
declare const a: A;
declare const b: A;
declare const c: A;
(a.baz) &&= result.baz;
(b.baz) ||= result.baz;
(c.baz) ??= result.baz;
//// [logicalAssignment3.js]
"use strict";
(a.baz) &&= result.baz;
(b.baz) ||= result.baz;
(c.baz) ??= result.baz;

View File

@@ -0,0 +1,49 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts ===
interface A {
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
baz: 0 | 1 | 42 | undefined | ''
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
}
declare const result: A;
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const a: A;
>a : Symbol(a, Decl(logicalAssignment3.ts, 5, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const b: A;
>b : Symbol(b, Decl(logicalAssignment3.ts, 6, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
declare const c: A;
>c : Symbol(c, Decl(logicalAssignment3.ts, 7, 13))
>A : Symbol(A, Decl(logicalAssignment3.ts, 0, 0))
(a.baz) &&= result.baz;
>a.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>a : Symbol(a, Decl(logicalAssignment3.ts, 5, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
(b.baz) ||= result.baz;
>b.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>b : Symbol(b, Decl(logicalAssignment3.ts, 6, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
(c.baz) ??= result.baz;
>c.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>c : Symbol(c, Decl(logicalAssignment3.ts, 7, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result.baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))
>result : Symbol(result, Decl(logicalAssignment3.ts, 4, 13))
>baz : Symbol(A.baz, Decl(logicalAssignment3.ts, 0, 13))

View File

@@ -0,0 +1,49 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts ===
interface A {
baz: 0 | 1 | 42 | undefined | ''
>baz : "" | 0 | 1 | 42 | undefined
}
declare const result: A;
>result : A
declare const a: A;
>a : A
declare const b: A;
>b : A
declare const c: A;
>c : A
(a.baz) &&= result.baz;
>(a.baz) &&= result.baz : "" | 0 | 1 | 42 | undefined
>(a.baz) : string | number | undefined
>a.baz : string | number | undefined
>a : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
(b.baz) ||= result.baz;
>(b.baz) ||= result.baz : string | number | undefined
>(b.baz) : string | number | undefined
>b.baz : string | number | undefined
>b : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined
(c.baz) ??= result.baz;
>(c.baz) ??= result.baz : string | number | undefined
>(c.baz) : string | number | undefined
>c.baz : string | number | undefined
>c : A
>baz : string | number | undefined
>result.baz : "" | 0 | 1 | 42 | undefined
>result : A
>baz : "" | 0 | 1 | 42 | undefined

View File

@@ -0,0 +1,17 @@
//// [logicalAssignment4.ts]
function foo1(results: number[] | undefined) {
(results ||= []).push(100);
}
function foo2(results: number[] | undefined) {
(results ??= []).push(100);
}
//// [logicalAssignment4.js]
"use strict";
function foo1(results) {
(results || (results = [])).push(100);
}
function foo2(results) {
(results !== null && results !== void 0 ? results : (results = [])).push(100);
}

View File

@@ -0,0 +1,20 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts ===
function foo1(results: number[] | undefined) {
>foo1 : Symbol(foo1, Decl(logicalAssignment4.ts, 0, 0))
>results : Symbol(results, Decl(logicalAssignment4.ts, 0, 14))
(results ||= []).push(100);
>(results ||= []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
>results : Symbol(results, Decl(logicalAssignment4.ts, 0, 14))
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
}
function foo2(results: number[] | undefined) {
>foo2 : Symbol(foo2, Decl(logicalAssignment4.ts, 2, 1))
>results : Symbol(results, Decl(logicalAssignment4.ts, 4, 14))
(results ??= []).push(100);
>(results ??= []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
>results : Symbol(results, Decl(logicalAssignment4.ts, 4, 14))
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
}

View File

@@ -0,0 +1,30 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts ===
function foo1(results: number[] | undefined) {
>foo1 : (results: number[] | undefined) => void
>results : number[] | undefined
(results ||= []).push(100);
>(results ||= []).push(100) : number
>(results ||= []).push : (...items: number[]) => number
>(results ||= []) : number[]
>results ||= [] : number[]
>results : number[] | undefined
>[] : never[]
>push : (...items: number[]) => number
>100 : 100
}
function foo2(results: number[] | undefined) {
>foo2 : (results: number[] | undefined) => void
>results : number[] | undefined
(results ??= []).push(100);
>(results ??= []).push(100) : number
>(results ??= []).push : (...items: number[]) => number
>(results ??= []) : number[]
>results ??= [] : number[]
>results : number[] | undefined
>[] : never[]
>push : (...items: number[]) => number
>100 : 100
}

View File

@@ -0,0 +1,17 @@
//// [logicalAssignment4.ts]
function foo1(results: number[] | undefined) {
(results ||= []).push(100);
}
function foo2(results: number[] | undefined) {
(results ??= []).push(100);
}
//// [logicalAssignment4.js]
"use strict";
function foo1(results) {
(results || (results = [])).push(100);
}
function foo2(results) {
(results ?? (results = [])).push(100);
}

View File

@@ -0,0 +1,20 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts ===
function foo1(results: number[] | undefined) {
>foo1 : Symbol(foo1, Decl(logicalAssignment4.ts, 0, 0))
>results : Symbol(results, Decl(logicalAssignment4.ts, 0, 14))
(results ||= []).push(100);
>(results ||= []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
>results : Symbol(results, Decl(logicalAssignment4.ts, 0, 14))
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
}
function foo2(results: number[] | undefined) {
>foo2 : Symbol(foo2, Decl(logicalAssignment4.ts, 2, 1))
>results : Symbol(results, Decl(logicalAssignment4.ts, 4, 14))
(results ??= []).push(100);
>(results ??= []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
>results : Symbol(results, Decl(logicalAssignment4.ts, 4, 14))
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
}

View File

@@ -0,0 +1,30 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts ===
function foo1(results: number[] | undefined) {
>foo1 : (results: number[] | undefined) => void
>results : number[] | undefined
(results ||= []).push(100);
>(results ||= []).push(100) : number
>(results ||= []).push : (...items: number[]) => number
>(results ||= []) : number[]
>results ||= [] : number[]
>results : number[] | undefined
>[] : never[]
>push : (...items: number[]) => number
>100 : 100
}
function foo2(results: number[] | undefined) {
>foo2 : (results: number[] | undefined) => void
>results : number[] | undefined
(results ??= []).push(100);
>(results ??= []).push(100) : number
>(results ??= []).push : (...items: number[]) => number
>(results ??= []) : number[]
>results ??= [] : number[]
>results : number[] | undefined
>[] : never[]
>push : (...items: number[]) => number
>100 : 100
}

View File

@@ -0,0 +1,17 @@
//// [logicalAssignment4.ts]
function foo1(results: number[] | undefined) {
(results ||= []).push(100);
}
function foo2(results: number[] | undefined) {
(results ??= []).push(100);
}
//// [logicalAssignment4.js]
"use strict";
function foo1(results) {
(results ||= []).push(100);
}
function foo2(results) {
(results ??= []).push(100);
}

View File

@@ -0,0 +1,20 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts ===
function foo1(results: number[] | undefined) {
>foo1 : Symbol(foo1, Decl(logicalAssignment4.ts, 0, 0))
>results : Symbol(results, Decl(logicalAssignment4.ts, 0, 14))
(results ||= []).push(100);
>(results ||= []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
>results : Symbol(results, Decl(logicalAssignment4.ts, 0, 14))
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
}
function foo2(results: number[] | undefined) {
>foo2 : Symbol(foo2, Decl(logicalAssignment4.ts, 2, 1))
>results : Symbol(results, Decl(logicalAssignment4.ts, 4, 14))
(results ??= []).push(100);
>(results ??= []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
>results : Symbol(results, Decl(logicalAssignment4.ts, 4, 14))
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
}

View File

@@ -0,0 +1,30 @@
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts ===
function foo1(results: number[] | undefined) {
>foo1 : (results: number[] | undefined) => void
>results : number[] | undefined
(results ||= []).push(100);
>(results ||= []).push(100) : number
>(results ||= []).push : (...items: number[]) => number
>(results ||= []) : number[]
>results ||= [] : number[]
>results : number[] | undefined
>[] : never[]
>push : (...items: number[]) => number
>100 : 100
}
function foo2(results: number[] | undefined) {
>foo2 : (results: number[] | undefined) => void
>results : number[] | undefined
(results ??= []).push(100);
>(results ??= []).push(100) : number
>(results ??= []).push : (...items: number[]) => number
>(results ??= []) : number[]
>results ??= [] : number[]
>results : number[] | undefined
>[] : never[]
>push : (...items: number[]) => number
>100 : 100
}

View File

@@ -0,0 +1,29 @@
// @strict: true
// @target: esnext, es2020, es2015
interface A {
foo: {
bar(): {
baz: 0 | 1 | 42 | undefined | ''
}
baz: 0 | 1 | 42 | undefined | ''
}
baz: 0 | 1 | 42 | undefined | ''
}
declare const result: A
declare const a: A
declare const b: A
declare const c: A
a.baz &&= result.baz
b.baz ||= result.baz
c.baz ??= result.baz
a.foo["baz"] &&= result.foo.baz
b.foo["baz"] &&= result.foo.baz
c.foo["baz"] &&= result.foo.baz
a.foo.bar().baz &&= result.foo.bar().baz
b.foo.bar().baz ||= result.foo.bar().baz
c.foo.bar().baz ??= result.foo.bar().baz

View File

@@ -0,0 +1,15 @@
// @strict: true
// @target: esnext, es2020, es2015
interface A {
baz: 0 | 1 | 42 | undefined | ''
}
declare const result: A;
declare const a: A;
declare const b: A;
declare const c: A;
(a.baz) &&= result.baz;
(b.baz) ||= result.baz;
(c.baz) ??= result.baz;

View File

@@ -0,0 +1,10 @@
// @strict: true
// @target: esnext, es2020, es2015
function foo1(results: number[] | undefined) {
(results ||= []).push(100);
}
function foo2(results: number[] | undefined) {
(results ??= []).push(100);
}