diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index 96c0e0178a7..8004e7bc4de 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -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( diff --git a/tests/baselines/reference/logicalAssignment2(target=es2015).js b/tests/baselines/reference/logicalAssignment2(target=es2015).js new file mode 100644 index 00000000000..f07da1575f2 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=es2015).js @@ -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); diff --git a/tests/baselines/reference/logicalAssignment2(target=es2015).symbols b/tests/baselines/reference/logicalAssignment2(target=es2015).symbols new file mode 100644 index 00000000000..7fe47ddad40 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=es2015).symbols @@ -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)) + + diff --git a/tests/baselines/reference/logicalAssignment2(target=es2015).types b/tests/baselines/reference/logicalAssignment2(target=es2015).types new file mode 100644 index 00000000000..e0940ed6806 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=es2015).types @@ -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 + + diff --git a/tests/baselines/reference/logicalAssignment2(target=es2020).js b/tests/baselines/reference/logicalAssignment2(target=es2020).js new file mode 100644 index 00000000000..258de5d01e3 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=es2020).js @@ -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); diff --git a/tests/baselines/reference/logicalAssignment2(target=es2020).symbols b/tests/baselines/reference/logicalAssignment2(target=es2020).symbols new file mode 100644 index 00000000000..7fe47ddad40 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=es2020).symbols @@ -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)) + + diff --git a/tests/baselines/reference/logicalAssignment2(target=es2020).types b/tests/baselines/reference/logicalAssignment2(target=es2020).types new file mode 100644 index 00000000000..e0940ed6806 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=es2020).types @@ -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 + + diff --git a/tests/baselines/reference/logicalAssignment2(target=esnext).js b/tests/baselines/reference/logicalAssignment2(target=esnext).js new file mode 100644 index 00000000000..69b06e5a01d --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=esnext).js @@ -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; diff --git a/tests/baselines/reference/logicalAssignment2(target=esnext).symbols b/tests/baselines/reference/logicalAssignment2(target=esnext).symbols new file mode 100644 index 00000000000..7fe47ddad40 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=esnext).symbols @@ -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)) + + diff --git a/tests/baselines/reference/logicalAssignment2(target=esnext).types b/tests/baselines/reference/logicalAssignment2(target=esnext).types new file mode 100644 index 00000000000..e0940ed6806 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment2(target=esnext).types @@ -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 + + diff --git a/tests/baselines/reference/logicalAssignment3(target=es2015).js b/tests/baselines/reference/logicalAssignment3(target=es2015).js new file mode 100644 index 00000000000..24012130a53 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=es2015).js @@ -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); diff --git a/tests/baselines/reference/logicalAssignment3(target=es2015).symbols b/tests/baselines/reference/logicalAssignment3(target=es2015).symbols new file mode 100644 index 00000000000..5d17ac406b6 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=es2015).symbols @@ -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)) + + diff --git a/tests/baselines/reference/logicalAssignment3(target=es2015).types b/tests/baselines/reference/logicalAssignment3(target=es2015).types new file mode 100644 index 00000000000..c18cad97c33 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=es2015).types @@ -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 + + diff --git a/tests/baselines/reference/logicalAssignment3(target=es2020).js b/tests/baselines/reference/logicalAssignment3(target=es2020).js new file mode 100644 index 00000000000..854fa156713 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=es2020).js @@ -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); diff --git a/tests/baselines/reference/logicalAssignment3(target=es2020).symbols b/tests/baselines/reference/logicalAssignment3(target=es2020).symbols new file mode 100644 index 00000000000..5d17ac406b6 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=es2020).symbols @@ -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)) + + diff --git a/tests/baselines/reference/logicalAssignment3(target=es2020).types b/tests/baselines/reference/logicalAssignment3(target=es2020).types new file mode 100644 index 00000000000..c18cad97c33 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=es2020).types @@ -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 + + diff --git a/tests/baselines/reference/logicalAssignment3(target=esnext).js b/tests/baselines/reference/logicalAssignment3(target=esnext).js new file mode 100644 index 00000000000..113bdd39d3f --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=esnext).js @@ -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; diff --git a/tests/baselines/reference/logicalAssignment3(target=esnext).symbols b/tests/baselines/reference/logicalAssignment3(target=esnext).symbols new file mode 100644 index 00000000000..5d17ac406b6 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=esnext).symbols @@ -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)) + + diff --git a/tests/baselines/reference/logicalAssignment3(target=esnext).types b/tests/baselines/reference/logicalAssignment3(target=esnext).types new file mode 100644 index 00000000000..c18cad97c33 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment3(target=esnext).types @@ -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 + + diff --git a/tests/baselines/reference/logicalAssignment4(target=es2015).js b/tests/baselines/reference/logicalAssignment4(target=es2015).js new file mode 100644 index 00000000000..57478da71ac --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=es2015).js @@ -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); +} diff --git a/tests/baselines/reference/logicalAssignment4(target=es2015).symbols b/tests/baselines/reference/logicalAssignment4(target=es2015).symbols new file mode 100644 index 00000000000..7d114427014 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=es2015).symbols @@ -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, --, --)) +} diff --git a/tests/baselines/reference/logicalAssignment4(target=es2015).types b/tests/baselines/reference/logicalAssignment4(target=es2015).types new file mode 100644 index 00000000000..da48e3848b8 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=es2015).types @@ -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 +} diff --git a/tests/baselines/reference/logicalAssignment4(target=es2020).js b/tests/baselines/reference/logicalAssignment4(target=es2020).js new file mode 100644 index 00000000000..91d60e88aa9 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=es2020).js @@ -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); +} diff --git a/tests/baselines/reference/logicalAssignment4(target=es2020).symbols b/tests/baselines/reference/logicalAssignment4(target=es2020).symbols new file mode 100644 index 00000000000..7d114427014 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=es2020).symbols @@ -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, --, --)) +} diff --git a/tests/baselines/reference/logicalAssignment4(target=es2020).types b/tests/baselines/reference/logicalAssignment4(target=es2020).types new file mode 100644 index 00000000000..da48e3848b8 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=es2020).types @@ -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 +} diff --git a/tests/baselines/reference/logicalAssignment4(target=esnext).js b/tests/baselines/reference/logicalAssignment4(target=esnext).js new file mode 100644 index 00000000000..3b749b6d8c7 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=esnext).js @@ -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); +} diff --git a/tests/baselines/reference/logicalAssignment4(target=esnext).symbols b/tests/baselines/reference/logicalAssignment4(target=esnext).symbols new file mode 100644 index 00000000000..7d114427014 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=esnext).symbols @@ -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, --, --)) +} diff --git a/tests/baselines/reference/logicalAssignment4(target=esnext).types b/tests/baselines/reference/logicalAssignment4(target=esnext).types new file mode 100644 index 00000000000..da48e3848b8 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment4(target=esnext).types @@ -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 +} diff --git a/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts new file mode 100644 index 00000000000..4bf3dd3581a --- /dev/null +++ b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts @@ -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 + diff --git a/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts new file mode 100644 index 00000000000..ea6085ece80 --- /dev/null +++ b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment3.ts @@ -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; + diff --git a/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts new file mode 100644 index 00000000000..69cd3aad50b --- /dev/null +++ b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment4.ts @@ -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); +} \ No newline at end of file